From 8262e09b6dbb9e955cf19ef880eaae459a1ff111 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 27 六月 2019 10:04:55 +0800
Subject: [PATCH] 7584 【后端】【主干】神兽装备评分(暴击抗性参数 SuperHitRateReduce)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py |  104 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 72 insertions(+), 32 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 ca70991..35e701d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -47,7 +47,6 @@
 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)
     
     #技能攻击最大数量
@@ -157,7 +164,8 @@
             return False
         
         g_ClientHurtDict[(hurobj.ObjID, hurobj.ObjType)] = [hurobj.HurtHP, hurobj.AttackType]
-        
+    
+    g_UseSkillPlayerID = curPlayer.GetID()
     return True
 #---------------------------------------------------------------------    
 # 非客户端玩家释放的技能
@@ -169,11 +177,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
@@ -1358,6 +1371,10 @@
     if curPlayer.GetHP() <= 0:
         return
     
+    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
+        #GameWorld.DebugLog("自定义场景中,不检查!")
+        return True
+    
     #===========================================================================
     # if curPlayer.IsMoving():
     #    GameWorld.DebugLog("移动中不可使用技能")
@@ -1899,10 +1916,6 @@
     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()
@@ -2060,6 +2073,8 @@
 
 ## 获取技能升级属性需求 rutrun attrID, attrvalue
 def GetSkillUpNeedAttr(stateSkillLV):return stateSkillLV /100000, stateSkillLV%100000
+## 获取技能专精类型
+def GetSkillElementType(curSkill): return curSkill.GetStateSkillLV() /100000
 
 #// A5 16 选择技能五行专精 #tagCMSelectSkillElement
 #
@@ -2067,6 +2082,7 @@
 #{
 #    tagHead        Head;
 #    DWORD    SkillTypeID;    // 专精技能ID
+#    BYTE    DoType;    // 0-激活升级 1-使用
 #};
 def OnSelectSkillElement(index, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
@@ -2084,36 +2100,46 @@
     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
     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, updSelectSkillLV)
+        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)
+        if curElementSkillID and curElementSkillID != selectSkillID:
+            #原技能删除
+            skillManager.DeleteSkillBySkillTypeID(curElementSkillID)
         
     
         # 重刷被动技能
@@ -2128,9 +2154,10 @@
 
 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),
@@ -2150,15 +2177,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):
@@ -2167,10 +2195,11 @@
             ipyData = IpyGameDataPY.GetIpyGameData('SkillElement', skillTypeID)
             mainSkillID = ipyData.GetMainSkillID()
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, 0)
+            isNotify = True
     else:
         for _ in xrange(updSkillLV-curSkillLV):
             skillManager.LVUpSkillBySkillTypeID(skillTypeID)
-    return True
+    return isNotify, True
 
 def RefreshElementSkillByAttr(curPlayer, attrIDList):
     #加点、丹药、境界、洗点 会影响灵根点
@@ -2195,9 +2224,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:
         # 重刷被动技能
@@ -2206,11 +2238,14 @@
         curControl = PlayerControl.PlayerControl(curPlayer)
         curControl.RefreshAllSkill()
         curControl.RefreshPlayerAttrState()
-    NotifyElementSkillInfo(curPlayer)
+    if needNotify:
+        NotifyElementSkillInfo(curPlayer)
     return
 
-def GetElementSkillCnt(curPlayer, mainSkillIDList, activeLV):
+def GetElementSkillCnt(curPlayer, mainSkillIDList, activeLV, elementType=0):
     ##获取已选择的专精技能数量
+    # @param elementType: 专精类型,对应灵根ID
+    gameData = GameWorld.GetGameData()
     cnt = 0
     skillManager = curPlayer.GetSkillManager()
     for i in xrange(skillManager.GetSkillCount()):
@@ -2223,6 +2258,10 @@
             continue
         for ipyData in ipyDataList:
             elementSkillID = ipyData.GetElementSkillID()
+            if elementType:
+                elementSkillData = gameData.GetSkillBySkillID(elementSkillID)
+                if GetSkillElementType(elementSkillData) != elementType:
+                    continue
             curActiveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % elementSkillID)
             if curActiveLV >= activeLV:
                 cnt += 1
@@ -3232,7 +3271,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()))
@@ -3428,7 +3468,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)
     
@@ -3727,7 +3767,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():

--
Gitblit v1.8.0