From 02f8c83ffab335d63d18bdde30e61bd2233f1f87 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期四, 09 五月 2019 16:58:57 +0800
Subject: [PATCH] 6501 【后端】【2.0】仙盟任务(增加多个任务接口)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py |  190 +++++++++++++++++++++++++++++++++--------------
 1 files changed, 134 insertions(+), 56 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
index 16ce277..2fb69b6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -99,6 +99,13 @@
     coolDownTime = curSkill.GetCoolDownTime()
     remainTime = coolDownTime
     if isPassiveSkill(curSkill):
+        if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_GiftSkill:
+            # 天赋有减CD效果
+            reduceSkillCDPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, None, curSkill, ChConfig.TriggerType_GiftReduceCD)
+            # 减CD比率
+            if reduceSkillCDPer > 0:
+                remainTime = int(remainTime * max(0, ShareDefine.Def_MaxRateValue - reduceSkillCDPer) / ShareDefine.Def_MaxRateValue)
+                
         # 被动技能的处理和主动技能区分
         curSkill.SetRemainTime(remainTime)
         return
@@ -108,7 +115,6 @@
     #    remainTime = skillData.GetCoolDownTime()
     
     reduceSkillCDPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, None, curSkill, ChConfig.TriggerType_ReduceCD)
-
     # 减CD比率
     if reduceSkillCDPer > 0:
         remainTime = int(remainTime * max(0, ShareDefine.Def_MaxRateValue - reduceSkillCDPer) / ShareDefine.Def_MaxRateValue)
@@ -214,11 +220,12 @@
 def PlayerLoginMergeServerSkillLogic(curPlayer, tick):
     playerID = curPlayer.GetPlayerID()
 
-    if not GameWorld.IsMergeServer():
+    if not GameWorld.IsCrossServer():
         GameWorld.DebugLog("非跨服服务器上线不清除buff...", playerID)
         return
     
-    ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID")
+    #ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID")
+    ClearBuffSkillTypeIDList = []
     # 跨服服务器上线清除增益/减益buff
     GameWorld.Log("跨服服务器上线清除buff...", playerID)
     clearBuffList = [] # 先汇总再清除,不然索引会变更
@@ -273,6 +280,15 @@
             curSkill.SetRemainTime(0)
             GameWorld.DebugLog("        SetRemainTime 0 skillName=%s,skillTypeID=%s" 
                                % (curSkill.GetSkillName(), curSkill.GetSkillTypeID()), playerID)
+    return
+
+def ResetAllSkillCD(curPlayer):
+    skillManager = curPlayer.GetSkillManager()
+    for i in xrange(skillManager.GetSkillCount()):
+        skill = skillManager.GetSkillByIndex(i)
+        if skill.GetRemainTime() != 0:
+            skill.SetRemainTime(0)
+            skill.Sync_Skill()
     return
 
 ## 刷新玩家所有技能的剩余时间(上线)
@@ -466,6 +482,8 @@
     
     return int(value)
    
+   
+
 ## 玩家召唤NPC(当前玩家,召唤技能,召唤兽ID,召唤兽属性列表, 召唤兽离自己的距离, 当前时间)
 #  @param curPlayer 当前玩家
 #  @param curSkill 召唤技能
@@ -508,6 +526,8 @@
         summonPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), summonDist)
         summonNPC.Reborn(summonPos.GetPosX(), summonPos.GetPosY())
     summonNPC.SetBornTime(tick)
+    # 继承技能等级
+    SetSummonNPCSkillLV(summonNPC, curSkill)
     if curSkill:
         summonNPC.SetLastTime(curSkill.GetLastTime())
     #----设置为无敌,在AI中解除无敌
@@ -515,6 +535,38 @@
     summonNPC.SetCanAttack(False)
     
     return 
+
+# 召唤兽技能继承,玩家释放技能的等级
+def SetSummonNPCSkillLV(summonNPC, curSkill):
+    if curSkill.GetEffect(0).GetEffectValue(1) == 0:
+        return
+    skillLV = curSkill.GetSkillLV() - 1
+    if skillLV == 0:
+        return
+    
+    skillManager = summonNPC.GetSkillManager()
+    learnSkillIDList =[]
+    for index in range(0, skillManager.GetSkillCount()):
+        useSkill = skillManager.GetSkillByIndex(index)
+        #已经到尾部了
+        if not useSkill or useSkill.GetSkillTypeID() == 0:
+            break
+        
+        useSkillTypeID = useSkill.GetSkillTypeID()
+        # 找到可学习的技能
+        learnSkillID = useSkillTypeID + skillLV
+        findSkill = GameWorld.GetGameData().GetSkillBySkillID(learnSkillID)
+        if not findSkill:
+            continue
+        if findSkill.GetSkillTypeID() != useSkillTypeID:
+            # 不是同一个技能
+            continue
+        learnSkillIDList.append(learnSkillID)
+        
+    for skillID in learnSkillIDList:
+        skillManager.LearnSkillByID(skillID, False)
+    return
+
 
 ## 设置召唤兽属性
 #  @param curPlayer 当前玩家
@@ -1170,37 +1222,24 @@
             
     return
 
-## 获取哥布林功能NPC类型掉血值
-def GetGoblinLostHP(defender, hurtValue):
-    if not defender:
-        return hurtValue
-    
-    defObjType = defender.GetGameObjType()
-    if defObjType == IPY_GameWorld.gotNPC:
-        npcFuncType = defender.GetFunctionType()
-        if npcFuncType == ChConfig.Def_NPCFuncType_Goblin:
-            goblinHurtValue = int(ReadChConfig.GetEvalChConfig('GoblinHurtValue'))
-            hurtValue = min(hurtValue, goblinHurtValue)
-            
-    return hurtValue
-
-## 技能伤血
-#  @param curObj 当前对象
-#  @param skillTypeID 技能类型ID
-#  @param buffOwner buff拥有者
-#  @param lostValue 丢失值
-#  @param tick 当前时间
-#  @param view 是否广播
-#  @param reduce 是否扣血
-#  @return None
-#  @remarks 函数详细说明.
-def SkillLostHP(curObj, skillTypeID, buffOwner, lostValue, tick, view=True, reduceHP=True, 
-                isDoAttackResult=True, hurtType=ChConfig.Def_HurtType_Normal):
+## 直接扣血不走公式
+# view 是否广播客户端飘血
+# isDoAttackResult 是否立即处理结果,为False必须外层有处理
+# hurtType 飘血类型
+# skillAffect 默认True 会被各种技能BUFF盾等影响伤血数值
+#             False代表一些特殊处理纯固定伤害飘字(如采集固定掉1点血)
+def SkillLostHP(curObj, skillTypeID, buffOwner, lostValue, tick, view=True, 
+                isDoAttackResult=True, hurtType=ChConfig.Def_HurtType_Normal,
+                skillAffect=True):
     if lostValue <= 0:
         GameWorld.Log('###技能伤害血量异常,数值错误 = %s,技能类型ID = %s' % (lostValue, skillTypeID))
         return
     
-    #lostValue = GetGoblinLostHP(curObj, lostValue)
+    if not curObj.GetCanAttack():
+        # 无敌不掉血
+        ## 后续有其他情况也应考虑进来,如镖车是否某状态不掉血
+        return
+    
     curObjType = curObj.GetGameObjType()
     curSkill = GameWorld.GetGameData().FindSkillByType(skillTypeID, 1)
     
@@ -1211,29 +1250,32 @@
     
     notifyLostValue = lostValue
     curObjHP_BeforeAttack = GameObj.GetHP(curObj)
+    if curObjHP_BeforeAttack == 0:
+        # 没有血量不能再触发
+        return
     
-    if reduceHP :
-        # 血盾 
-
-        lostValue = AttackCommon.CalcBloodShield(buffOwner, curObj, lostValue)
-        
-        #剩余血量
-        remainHP = max(curObjHP_BeforeAttack - lostValue , 0)
-        
-        #NPC处理
-        if curObjType == IPY_GameWorld.gotNPC:
-            #宠物特殊处理
-            if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
-                PetControl.SetPetHP(curObj, remainHP)
-            else:
-                GameObj.SetHP(curObj, remainHP)
-                if not view :   # 已广播的不重复
-                    curObj.Notify_HPEx()
-
-        #其他对象逻辑处理
+    if skillAffect:
+        lostValue = AttackCommon.CalcHurtHPWithBuff(buffOwner, curObj, lostValue, curSkill, tick)
+    
+    #剩余血量
+    remainHP = max(curObjHP_BeforeAttack - lostValue , 0)
+    
+    #NPC处理
+    if curObjType == IPY_GameWorld.gotNPC:
+        #宠物特殊处理
+        if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
+            PetControl.SetPetHP(curObj, remainHP)
         else:
-            # 已广播的不重复
-            GameObj.SetHP(curObj, remainHP, not view)
+            GameObj.SetHP(curObj, remainHP)
+            if not view :   # 已广播的不重复
+                curObj.Notify_HPEx()
+
+    #其他对象逻辑处理
+    else:
+        # 已广播的不重复
+        GameObj.SetHP(curObj, remainHP, not view)
+    
+    AttackCommon.WriteHurtLog(buffOwner, curObj, curSkill, lostValue, hurtType, "持续掉血")
     
     if view:
         #广播伤血类型
@@ -1246,9 +1288,10 @@
     
     #无法找到Buff拥有者
     if not buffOwner:
-        AttackCommon.DoLogic_ObjDead(curObj)
+        AttackCommon.DoLogic_ObjDead(None, curObj, curSkill, tick)
         return
         
+
     #NPC需要手动添加伤血和仇恨, 因为无调用DoAttack
     if curObjType == IPY_GameWorld.gotNPC:
         
@@ -1625,11 +1668,13 @@
         return True
     
     buffSkill = curObjBuff.GetSkill()
-    buffSkillLV = buffSkill.GetSkillLV()
     
-    #已存在更强大的效果
-    if buffSkillLV > curSkillLV:
-        return
+    #buff根据情况可以叠加低级,或者低级覆盖高级
+#    buffSkillLV = buffSkill.GetSkillLV()
+#    
+#    #已存在更强大的效果
+#    if buffSkillLV > curSkillLV:
+#        return
         
     if not buffSkill.GetLastTime():
         #GameWorld.DebugLog("无时间限制buff,只要存在buff,则无需重复添加")
@@ -1702,6 +1747,35 @@
     
     return returnInfo
 
+
+def FindBuffByOwner(gameObj, skillTypeID, ownerID, ownerType):
+    findSkill = GameWorld.GetGameData().GetSkillBySkillID(skillTypeID)
+    buffType = GetBuffType(findSkill)
+    buffTuple = GetBuffManagerByBuffType(gameObj, buffType)
+    if buffTuple == ():
+        return None
+    
+    buffManager = buffTuple[0]
+    for i in range(0, buffManager.GetBuffCount()):
+        curBuff = buffManager.GetBuff(i)
+        if not curBuff:
+            continue
+        
+        #判断是否拥有同一类型的技能
+        if curBuff.GetSkill().GetSkillTypeID() != skillTypeID:
+            continue
+        
+        #判断是否拥有同一类型的技能
+        if curBuff.GetOwnerID() != ownerID:
+            continue
+        
+        if curBuff.GetOwnerType() != ownerType:
+            continue
+    
+        return curBuff
+    
+    return None
+    
 #---------------------------------------------------------------------
 ## 执行清空命令 参数:玩家, 保留技能类型列表
 #  @param curPlayer 玩家
@@ -1910,6 +1984,10 @@
 # @return 返回值, 伤害数量
 # @remarks 获得区域技能伤害对象数量
 def GetSkillArea_Atk_Count(attacker, curSkill):
+    if attacker.GetGameObjType() ==  IPY_GameWorld.gotPlayer and attacker.GetAttackMode() == IPY_GameWorld.amContest:
+        # 单一目标锁定模式
+        return 1 
+    
     #默认攻击最大数
     hurtCount = 50
     

--
Gitblit v1.8.0