From 77c5ef1b8155e0d87468d9e9fccd18232d281a14 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 07 四月 2021 16:13:55 +0800
Subject: [PATCH] 8870 【BT2】【后端】战力、伤害、玩家生命的数值调整为大数值(buff值限制不超过20E)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py |  184 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 131 insertions(+), 53 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
index 1b2f8a6..dfab201 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -41,13 +41,12 @@
 import GameMap
 import collections
 import PassiveBuffEffMng
-import EffGetSet
+import ChEquip
 import SkillShell
 import FBCommon
 import IpyGameDataPY
 import PyGameData
 import EventShell
-#import EquipZhuXian
 #---------------------------------------------------------------------
 GameWorld.ImportAll("Script\\Skill\\" , "GameSkills")
 GameWorld.ImportAll("Script\\Skill\\" , "GameBuffs")
@@ -55,6 +54,7 @@
 
 # 记录客户端伤害 {(objID, objType):[HurtHP, AttackType]}
 g_ClientHurtDict = collections.OrderedDict()
+g_UseSkillPlayerID = 0  # 全服攻击为单线程 记录的是当前使用技能的玩家 用于判断g_ClientHurtDict的归属
 
 #---------------------------------------------------------------------
 ##C++调用函数, 重新读取所有技能
@@ -92,6 +92,10 @@
 def GetSkillFireAim(curSkill):
     return curSkill.GetTag()%10
 
+# 当前释放主动技能的玩家
+def GetUseSkillPlayerID():
+    global g_UseSkillPlayerID
+    return g_UseSkillPlayerID
 
 # 客户端伤血列表,修改了遍历对象和计算血量
 def GetClientHurtDict():
@@ -100,7 +104,9 @@
 
 def ClearClientHurtDict(curPlayer):
     global g_ClientHurtDict
+    global g_UseSkillPlayerID
     g_ClientHurtDict = collections.OrderedDict()
+    g_UseSkillPlayerID = 0
     
     
 def GetClientHurtByObj(objID, objType):
@@ -122,6 +128,7 @@
 # 技能开始初始化客户端伤血列表
 def InitClientHurtDict(curPlayer, curSkill, hurtList):
     global g_ClientHurtDict
+    global g_UseSkillPlayerID
     ClearClientHurtDict(curPlayer)
     
     #技能攻击最大数量
@@ -133,8 +140,9 @@
 #    mapType = GameWorld.GetMap().GetMapFBType()
     # 野外小怪或者其他指定的怪为了更及时的打击感,由客户端计算
     for hurobj in hurtList:
-        if hurobj.HurtHP == 0:
-            g_ClientHurtDict[(hurobj.ObjID, hurobj.ObjType)] = [hurobj.HurtHP, hurobj.AttackType]
+        hurtHP = hurobj.HurtHP + hurobj.HurtHPEx * ShareDefine.Def_PerPointValue
+        if hurtHP == 0:
+            g_ClientHurtDict[(hurobj.ObjID, hurobj.ObjType)] = [hurtHP, hurobj.AttackType]
             continue
         if hurobj.ObjType != IPY_GameWorld.gotNPC:
             # 非NPC
@@ -156,8 +164,9 @@
             # 重复对象
             return False
         
-        g_ClientHurtDict[(hurobj.ObjID, hurobj.ObjType)] = [hurobj.HurtHP, hurobj.AttackType]
-        
+        g_ClientHurtDict[(hurobj.ObjID, hurobj.ObjType)] = [hurtHP, hurobj.AttackType]
+    
+    g_UseSkillPlayerID = curPlayer.GetID()
     return True
 #---------------------------------------------------------------------    
 # 非客户端玩家释放的技能
@@ -169,11 +178,16 @@
         # 玩家普通也是技能,正常是不会走到这边
         return False
     
+    if GetUseSkillPlayerID() != attacker.GetID():
+        # 非释放者
+        return False
+    
     useSkillData = attacker.GetUseSkill()
     if useSkillData and curSkill.GetSkillTypeID() != useSkillData.GetSkillTypeID():
         # 默认群攻附加触发buff的对象与攻击对象一致
         if not SkillCommon.IsBuff(curSkill):
             return False
+    
     
     if not GetClientHurtDict():
         return False
@@ -193,7 +207,7 @@
         PlayerControl.NotifyCode(curPlayer , "Play_Attack_Null")
         return
     
-    if curPlayer.GetHP() <= 0:
+    if GameObj.GetHP(curPlayer) <= 0:
         #玩家已经死亡
         PlayerControl.NotifyCode(curPlayer, "PK_chenxin_612029")
         return False
@@ -245,7 +259,7 @@
 
     #还在冷却时间内无法释放
     if SkillCommon.RefreshSkillRemainTime(playerSkill, tick) != 0:
-        PlayerControl.NotifyCode(curPlayer, "UseSkillCDLimit")
+        #PlayerControl.NotifyCode(curPlayer, "UseSkillCDLimit")
         #AttackFailNotify(curPlayer, curSkill, ChConfig.SkillFail_CD)
         playerSkill.Sync_Skill()
         return False
@@ -277,7 +291,7 @@
 #    #7:检查玩家的HP是否足够
 #    curSkillNeedHP = curSkill.GetHP()
 #    
-#    if curSkillNeedHP > 0 and curPlayer.GetHP() < curSkillNeedHP:
+#    if curSkillNeedHP > 0 and GameObj.GetHP(curPlayer) < curSkillNeedHP:
 #        curPlayer.Notify_AttackFail(0, 0, 0, 0, IPY_GameWorld.afrHP)
 #        PlayerControl.NotifyCode(curPlayer, "PK_jin_0")
 #        GameWorld.DebugLog("检查玩家的HP是否足够")
@@ -566,6 +580,18 @@
     
     return True
 
+def IsNPCSkillResist(curNPC):
+    ## NPC是否技能抵抗,对应技能表中伤害类型HurtType为3的技能,即对boss无效的技能
+    
+    if curNPC.GetCurAction() == IPY_GameWorld.laNPCSkillWarning:
+        #GameWorld.DebugLog("预警状态下默认抵抗")
+        return True
+    
+    bossIpyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSInfo", curNPC.GetNPCID())
+    if bossIpyData and bossIpyData.GetSkillResist():
+        return True
+    
+    return False
 
 ##是否召唤兽对主人使用技能
 # @param curNPC NPC实例
@@ -762,7 +788,7 @@
     # NPC仇恨吸引,由客户端决定,适用于小怪
     # '''
     # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    # if curPlayer.GetHP() <= 0:
+    # if GameObj.GetHP(curPlayer) <= 0:
     #    return
     # 
     # if not curPlayer.GetVisible():
@@ -781,7 +807,7 @@
     #    npcAngry = npcObj.GetNPCAngry()
     #    angryValue = npcAngry.FindNPCAngry(playerID, IPY_GameWorld.gotPlayer)
     #    
-    #    if angryValue != None and angryValue.GetAngryValue() != 0 :
+    #    if angryValue != None and GameObj.GetAngryValue(angryValue) != 0 :
     #        #该对象已经在仇恨列表中,不重复添加
     #        continue
     #    
@@ -945,6 +971,7 @@
 #    DWORD        ObjID;
 #    BYTE        AttackType;        //爆击, miss
 #    DWORD        HurtHP;
+#    DWORD        HurtHPEx;
 # };
 # 
 # struct    tagCMSuperAtk
@@ -1355,8 +1382,12 @@
 # @return 返回值真, 检查通过
 # @remarks 检查客户端发送技能封包, 这里只简单检查一下
 def __CheckPlayerUseSkill_ClientPack(curPlayer, posX, posY, curSkill):
-    if curPlayer.GetHP() <= 0:
+    if GameObj.GetHP(curPlayer) <= 0:
         return
+    
+    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
+        #GameWorld.DebugLog("自定义场景中,不检查!")
+        return True
     
     #===========================================================================
     # if curPlayer.IsMoving():
@@ -1854,11 +1885,8 @@
     
     #升级技能CD直接冷却
     curSkill.SetRemainTime(0)
-    learnSkillNotifyDict = IpyGameDataPY.GetFuncEvalCfg("SPSkillType", 3, {})
     if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill:
         PlayerControl.WorldNotify(0, 'GetMountSkill', [curPlayer.GetName(), curSkillID])
-    elif skillTypeID in learnSkillNotifyDict:
-        PlayerControl.WorldNotify(0, learnSkillNotifyDict[skillTypeID], [curPlayer.GetName(), curSkillID])        
     else:
         #通知技能已升级成功 GeRen_admin_31379
         PlayerControl.NotifyCode(curPlayer, "GeRen_admin_31379", [curSkillID, curSkill.GetSkillLV()])
@@ -1891,18 +1919,14 @@
     if not CheckLearnSkillCondition(curPlayer, upSkill):
         return False
     
-    #坐骑技能学习判断
-    if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill:
-        if not PlayerHorse.CheckLearnHorseSkill(curPlayer, curSkillTypeID):
-            return False
+#    #坐骑技能学习判断
+#    if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill:
+#        if not PlayerHorse.CheckLearnHorseSkill(curPlayer, curSkillTypeID):
+#            return False
     #天赋技学习点数判断
     if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_GiftSkill:
         if not PlayerGreatMaster.GetGreatMasterFreeSkillPoint(curPlayer):
             return False
-    #诛仙技能学习判断
-    #if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_ZhuXian:
-    #    if not EquipZhuXian.CheckLearnZhuXianSkill(curPlayer, curSkillTypeID):
-    #        return False
         
     #经验检测
     skillLvUpNeedExp = upSkill.GetLVUpCostExp()
@@ -2069,6 +2093,7 @@
 #{
 #    tagHead        Head;
 #    DWORD    SkillTypeID;    // 专精技能ID
+#    BYTE    DoType;    // 0-激活升级 1-使用
 #};
 def OnSelectSkillElement(index, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
@@ -2086,37 +2111,47 @@
     if not mainSkill:
         GameWorld.DebugLog('主技能未学习,无法选专精mainSkillID=%s'%mainSkillID)
         return
+    doType = clientData.DoType
     curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % mainSkillID)
     activeSkillLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % selectSkillID)
-    #先判断是否可升级
-    updSelectSkillLV = activeSkillLV
-    nextSkill = GameWorld.GetGameData().FindSkillByType(selectSkillID, activeSkillLV + 1)
-    if nextSkill:
-        if CheckLearnSkillNeedAttr(curPlayer, nextSkill):
-            updSelectSkillLV = activeSkillLV + 1
-            skillElementType = GetSkillElementType(nextSkill)
     isChangeSkill = False #是否变更生效的技能
-    if updSelectSkillLV != activeSkillLV:
+    updSelectSkillLV = activeSkillLV
+    #先判断是否可升级
+    if doType is 0:
+        nextSkill = GameWorld.GetGameData().FindSkillByType(selectSkillID, activeSkillLV + 1)
+        if not nextSkill:
+            return
+
+        if not CheckLearnSkillNeedAttr(curPlayer, nextSkill):
+            return
+        updSelectSkillLV = activeSkillLV + 1
+        skillElementType = GetSkillElementType(nextSkill)
+
         #可升级则激活升一级
         EventShell.EventRespons_ElementSkill(curPlayer, mainSkillID, skillElementType, updSelectSkillLV)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementLV % selectSkillID, updSelectSkillLV)
         if curElementSkillID == selectSkillID:
             #正在使用的专精技能,则立即生效
             isChangeSkill = True
-    elif selectSkillID != curElementSkillID:
+    else: # 使用
+        if not activeSkillLV:
+            #未激活不能使用
+            return
+        if selectSkillID == curElementSkillID:
+            return
         isChangeSkill = True
-        
+    
     if isChangeSkill:
         #更换专精
-        if not RefreshElementSkill(curPlayer, selectSkillID):
+        if not RefreshElementSkill(curPlayer, selectSkillID)[1]:
             GameWorld.DebugLog('更换专精 不成功 selectSkillID=%s'%selectSkillID)
             return
         
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, selectSkillID)
-        if curElementSkillID:
-            if curElementSkillID != selectSkillID:
-                #原技能删除
-                skillManager.DeleteSkillBySkillTypeID(curElementSkillID)
+        UpdateElementSkillSelect(curPlayer, mainSkillID, selectSkillID)
+        #ChEquip.ChangeEquipfacadeByLingGen(curPlayer)
+        if curElementSkillID and curElementSkillID != selectSkillID:
+            #原技能删除
+            skillManager.DeleteSkillBySkillTypeID(curElementSkillID)
         
     
         # 重刷被动技能
@@ -2129,11 +2164,46 @@
     NotifyElementSkillInfo(curPlayer, mainSkillID, selectSkillID if updSelectSkillLV != activeSkillLV else 0)
     return
 
+def UpdateElementSkillSelect(curPlayer, mainSkillID, selectSkillID):
+    ## 更新专精技能选择, selectSkillID 可能被重置为0
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, selectSkillID)
+    #GameWorld.DebugLog("更新专精技能选择  mainSkillID=%s, selectSkillID=%s" % (mainSkillID, selectSkillID))
+    
+    # 以下额外更新选择的专精技能对应编号,用于表现其他玩家不同专精技能特效用
+    mainSkillList = IpyGameDataPY.GetFuncEvalCfg("SkillActTypeIdSort", curPlayer.GetJob())
+    if mainSkillID not in mainSkillList:
+        return
+    mainSkillIndex = mainSkillList.index(mainSkillID)
+    if mainSkillIndex < ShareDefine.Def_PDictDigitCnt:
+        exAttrValue = curPlayer.GetExAttr7()
+        exAttrIndex = mainSkillIndex
+    else:
+        exAttrValue = curPlayer.GetExAttr8()
+        exAttrIndex = mainSkillIndex - ShareDefine.Def_PDictDigitCnt
+    
+    elementSkillNum = 0
+    if selectSkillID:
+        ipyData = IpyGameDataPY.GetIpyGameData('SkillElement', selectSkillID)
+        if ipyData:
+            elementSkillNum = ipyData.GetElementSkillNum()
+            
+    updExAttrValue = GameWorld.ChangeDataByDigitPlace(exAttrValue, exAttrIndex, elementSkillNum)
+    #GameWorld.DebugLog("    exAttrValue=%s,exAttrIndex=%s,elementSkillNum=%s,updExAttrValue=%s" 
+    #                   % (exAttrValue, exAttrIndex, elementSkillNum, updExAttrValue))
+    
+    # 需要广播周围玩家
+    if mainSkillIndex < ShareDefine.Def_PDictDigitCnt:
+        curPlayer.SetExAttr7(updExAttrValue, True)
+    else:
+        curPlayer.SetExAttr8(updExAttrValue, True)
+    return
+
 def RefreshElementSkill(curPlayer, skillTypeID, isChangeLV=True):
     ##更新专精技能生效的等级
+    isNotify, hasChangeLV = False, False
     __InitElementSkillInfo()
     if skillTypeID not in PyGameData.g_elemntSkillDict:
-        return
+        return isNotify, hasChangeLV
     baseAttrDict = {
                             ShareDefine.Def_Effect_Metal:PlayerControl.GetMetal(curPlayer),
                             ShareDefine.Def_Effect_Wood:PlayerControl.GetWood(curPlayer),
@@ -2153,15 +2223,16 @@
             break
     if activeSkillLV > updSkillLV:
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementLV % skillTypeID, updSkillLV)
+        isNotify = True
     updSkillLV = min(updSkillLV, activeSkillLV) #不可超过激活的等级
     skillManager = curPlayer.GetSkillManager()
     curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
     curSkillLV = curSkill.GetSkillLV() if curSkill else 0
     #GameWorld.DebugLog('更新专精技能生效的等级 skillTypeID=%s,curSkillLV=%s,activeSkillLV=%s,updSkillLV=%s'%(skillTypeID, curSkillLV, activeSkillLV, updSkillLV))
     if not isChangeLV:
-        return
+        return isNotify, hasChangeLV
     if updSkillLV == curSkillLV:
-        return
+        return isNotify, hasChangeLV
     elif updSkillLV < curSkillLV:
         skillManager.DeleteSkillBySkillTypeID(skillTypeID)
         for _ in xrange(updSkillLV):
@@ -2169,11 +2240,13 @@
         if updSkillLV == 0:#重置为未选状态
             ipyData = IpyGameDataPY.GetIpyGameData('SkillElement', skillTypeID)
             mainSkillID = ipyData.GetMainSkillID()
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, 0)
+            UpdateElementSkillSelect(curPlayer, mainSkillID, 0)
+            #ChEquip.ChangeEquipfacadeByLingGen(curPlayer)
+            isNotify = True
     else:
         for _ in xrange(updSkillLV-curSkillLV):
             skillManager.LVUpSkillBySkillTypeID(skillTypeID)
-    return True
+    return isNotify, True
 
 def RefreshElementSkillByAttr(curPlayer, attrIDList):
     #加点、丹药、境界、洗点 会影响灵根点
@@ -2198,9 +2271,12 @@
             needRefreshSkillIDDict[curElementSkillID] = curSelectSkillID == curElementSkillID
     
     #GameWorld.DebugLog('属性点变更 刷新专精attrIDList=%s,needRefreshSkillIDList=%s'%(attrIDList,needRefreshSkillIDList))
-    isRefresh = False
+    needNotify, isRefresh = False, False
     for skillID, isChangeLV in needRefreshSkillIDDict.items():
-        if RefreshElementSkill(curPlayer, skillID, isChangeLV):
+        isNotify, hasChangeLV = RefreshElementSkill(curPlayer, skillID, isChangeLV)
+        if isNotify:
+            needNotify = True
+        if hasChangeLV:
             isRefresh = True
     if isRefresh:
         # 重刷被动技能
@@ -2209,7 +2285,8 @@
         curControl = PlayerControl.PlayerControl(curPlayer)
         curControl.RefreshAllSkill()
         curControl.RefreshPlayerAttrState()
-    NotifyElementSkillInfo(curPlayer)
+    if needNotify:
+        NotifyElementSkillInfo(curPlayer)
     return
 
 def GetElementSkillCnt(curPlayer, mainSkillIDList, activeLV, elementType=0):
@@ -3241,7 +3318,8 @@
     #--- 1. 先取得触发技能---
     
     #先检查数据库有没该类技能,如果最高等级不一样会找不到
-    exSkill = GameWorld.GetGameData().FindSkillByType(skillEnhanceID, skillLV)
+    #exSkill = GameWorld.GetGameData().FindSkillByType(skillEnhanceID, skillLV)
+    exSkill = GameWorld.GetGameData().GetSkillBySkillID(skillEnhanceID)
     #异常
     if not exSkill:
         GameWorld.ErrLog("对象 = %s, 找不到附加技能ID = %s, skillLv = %s"%(attacker.GetID() , skillEnhanceID , useSkill.GetSkillLV()))
@@ -3437,7 +3515,7 @@
     
     #这个技能是Buff
     if SkillCommon.IsBuff(curSkill):
-        if ChConfig.Def_SkillType_LstPlsBuffAtk == curSkill.GetSkillType():
+        if curSkill.GetSkillType() in [ChConfig.Def_SkillType_LstPlsBuffAtk, ChConfig.Def_SkillType_PassiveLstPlsBuffAtk]:
             defender = attacker
         return __DoLogic_AddBuff(attacker, defender, curSkill, isEnhanceSkill, tick, tagRoundPosX, tagRoundPosY)
     
@@ -3721,11 +3799,11 @@
         
         # 当技能类型为被动技能并且tag字段为0,则此技能为媒介用于触发技能 SkillEnhance1 SkillEnhance2
         skill1 = GameWorld.GetGameData().GetSkillBySkillID(curSkill.GetSkillEnhance1())
-        if skill1:
+        if skill1 and GameWorld.CanHappen(skill1.GetHappenRate(), ChConfig.Def_MaxRateValue):
             result = True if UsePassiveTriggerSkill(attacker, skill1, target, tick, True) else result
             
         skill2 = GameWorld.GetGameData().GetSkillBySkillID(curSkill.GetSkillEnhance2())
-        if skill2:
+        if skill2 and GameWorld.CanHappen(skill2.GetHappenRate(), ChConfig.Def_MaxRateValue):
             result = True if UsePassiveTriggerSkill(attacker, skill2, target, tick, True) else result
         
         SkillCommon.SetSkillRemainTime(curSkill, PlayerControl.GetReduceSkillCDPer(attacker), tick, attacker)
@@ -3736,7 +3814,7 @@
     GameWorld.DebugLog("释放被动触发技能 : %s- %s"%(skillAim, curSkill.GetSkillID()))
 
     if skillAim == ChConfig.Def_UseSkillAim_None:
-        if curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List:
+        if curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List and affectTag != ChConfig.Def_UseSkillTag_Self:
             if target and target.GetGameObjType() == IPY_GameWorld.gotNPC and target.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:
                 owner = NPCCommon.GetNpcObjOwnerDetail(target)
                 if owner and owner.GetID() == attacker.GetID():
@@ -3765,7 +3843,7 @@
                 return False
             
             target = petOwner
-            if target.GetHP() <= 0:
+            if GameObj.GetHP(target) <= 0:
                 return False
         
         if affectTag not in [ChConfig.Def_UseSkillTag_None, ChConfig.Def_UseSkillTag_Self]:

--
Gitblit v1.8.0