From 1ea73e1885835466265ce788d93556b7030ee0e8 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期日, 30 十二月 2018 18:42:00 +0800
Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(GM工具增加子服服务器维护,文字翻译版)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py |  135 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 127 insertions(+), 8 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 129f1b8..dae7c55 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -1478,7 +1478,51 @@
         return attacker if not owner else owner
     
     return attacker
+   
+# 检查对象是否属于玩家,比如用于纯PVP验证
+def CheckIsPlayerOnwer(gameObj):
+    if not gameObj:
+        return False
     
+    objType = gameObj.GetGameObjType()
+    
+    if objType == IPY_GameWorld.gotPlayer:
+        return True
+    
+    objNPCType = gameObj.GetGameNPCObjType()
+    if objNPCType == IPY_GameWorld.gnotNormal:
+        return False
+    
+    if objNPCType == IPY_GameWorld.gnotSummon:
+        owner = NPCCommon.GetSummonOwnerDetel(gameObj)
+        if not owner:
+            return False
+        if owner.GetGameObjType() != IPY_GameWorld.gotPlayer:
+            return False
+            
+    return True
+    
+# 攻击时防守方神兵护盾的处理
+def CalcAtkProDef(atkObj, defObj, hurtValue, curSkill, tick):
+    if defObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
+        return hurtValue
+    
+    if not CheckIsPlayerOnwer(atkObj):
+        return hurtValue
+
+    curProDef = PlayerControl.GetProDef(defObj)
+    if not curProDef:
+        return hurtValue
+    
+    absortValue = min(PlayerControl.GetProDefAbsorb(defObj)*hurtValue/ChConfig.Def_MaxRateValue, curProDef)
+    
+    PlayerControl.SetProDef(defObj, curProDef - absortValue)
+    
+    # 被动技能触发
+    defObj.SetDict(ChConfig.Def_PlayerKey_GodWeaponBeforeProDef, curProDef)
+    PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_ProDefValue, tick)
+    return hurtValue - absortValue
+
 ## 计算伤血值
 #  @param atkObj 攻击者
 #  @param defObj 防御者
@@ -1525,6 +1569,21 @@
     else:
         hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, orgAtkObj=attacker)
     
+    # 优先处理神兵护盾
+    hurtValue = CalcAtkProDef(atkObj, defObj, hurtValue, curSkill, tick)
+
+    # 伤害吸收盾回血型
+    buffManager = defObj.GetBuffState()
+    curEffect, plusValue, skillID = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_AbsorbShieldXMZJ)
+    if skillID:
+        absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue
+        if absortValue:
+            hurtValue -= absortValue
+            findBuff = SkillCommon.FindBuffByID(defObj, skillID)[0]
+            if findBuff:
+                # 用于回血
+                findBuff.SetValue(int(findBuff.GetValue() + absortValue))
+
     if defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldValue):
         # 麒麟护盾吸收伤害,将抵消的伤害存储
         absortValue = int(defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldValue)/float(ShareDefine.Def_MaxRateValue)*hurtValue)   
@@ -1568,7 +1627,20 @@
     
     remainHP = int(remainHP)    #防范
     if defObjType == IPY_GameWorld.gotPlayer:
+        curHP = GameObj.GetHP(defObj)
         GameObj.SetHP(defObj, remainHP, False)
+        
+        lockHPPer = PassiveBuffEffMng.OnObjsPassiveSkillLockHP(defObj, atkObj, curSkill, ChConfig.TriggerType_LockHP, tick)
+        if lockHPPer:
+            # 锁血情况
+            lockHP = GameObj.GetMaxHP(defObj)*lockHPPer/ChConfig.Def_MaxRateValue
+            if lockHP < curHP and remainHP < lockHP:
+                remainHP = lockHP
+            elif lockHP >= curHP:
+                remainHP = curHP
+            
+            #锁血纠正血量
+            GameObj.SetHP(defObj, remainHP, False)
             
     elif defObjType == IPY_GameWorld.gotNPC:
         if defObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
@@ -1578,6 +1650,11 @@
         elif defObj.GetGameNPCObjType() == IPY_GameWorld.gnotTruck:
             remainHP = max(PlayerTruck.GetTruckDestroyMinHP(defObj), remainHP)
             GameObj.SetHP(defObj, remainHP)
+        
+        elif defObj.GetType() == ChConfig.ntHelpBattleRobot:
+            remainHP = min(dHP, max(GameObj.GetMaxHP(defObj)/2, remainHP)) # 助战机器人剩余血量不能少于一半
+            GameObj.SetHP(defObj, remainHP)
+            
         else:
             #防守方是怪物NPC,只扣其血
             GameObj.SetHP(defObj, remainHP)
@@ -1663,6 +1740,7 @@
     suppressLV, suppressFightPower = 0, 0 # 压制等级差、战力差
     suppressReMaxHP = 0 # NPC压制等级生命值, 等级表中NPC等级对应的数据, 压制等级差大于0时才有值
     suppressNPCFightPower = 0 # 压制NPC战力
+    fbFightPower, fbBaseHurt = 0, 0 # 副本战力, 副本保底伤害
     #当攻击方为NPC,防守方为玩家时,计算压制等级 及 压制战力
     if atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:
         
@@ -1682,10 +1760,25 @@
         if suppressNPCFightPower:
             suppressFightPower = max(0, suppressNPCFightPower - defObj.GetFightPower())
             
+    mustHit = False
+    helpBattleFormatKey = ""
+    if atkObjType == IPY_GameWorld.gotNPC and atkObj.GetType() == ChConfig.ntHelpBattleRobot:
+        mustHit = True
+        suppressNPCFightPower = NPCCommon.GetSuppressFightPower(atkObj)
+        fbFightPower = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBFightPower)
+        fbBaseHurt = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBBaseHurt)
+        helpBattleFormatKey = "HelpRobot_Atk"
+    if defObjType == IPY_GameWorld.gotNPC and defObj.GetType() == ChConfig.ntHelpBattleRobot:
+        mustHit = True
+        suppressNPCFightPower = NPCCommon.GetSuppressFightPower(defObj)
+        fbFightPower = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBFightPower)
+        fbBaseHurt = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBBaseHurt)
+        helpBattleFormatKey = "HelpRobot_Def"
+        
     #命中公式 攻击方类型不同,公式不同
     hitFormula = ReadChConfig.GetChConfig('CalcCanHit')
     
-    if not PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, 
+    if not mustHit and not PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, 
                            ChConfig.TriggerType_Buff_MustBeHit):
         # 技能对指定BOSS无效果的返回MISS
         if defObjType == IPY_GameWorld.gotNPC and defObj.GetIsBoss() not in ChConfig.Def_SkillAttack_NPCIsBoss \
@@ -1740,7 +1833,9 @@
     if isLuckyHit:
         # 会心一击时增加会心伤害百分比 
         aLuckyHit += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_LuckyHit)
-
+        aLuckyHit -= PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_BeLuckyHitSubPer)
+        aLuckyHit = max(aLuckyHit, 0)
+        
     #参与运算的数值
     rand = random.random()                #种子数 0~1
     
@@ -1782,13 +1877,14 @@
         
     else:
         aIgnoreDefRate = 0  # 无视防御比率
+        aFinalHurtPer = GameObj.GetPetDamPer(atkObj) # 最外层伤害加成, 可能为负值
         aSkillAtkRate = NPCCommon.GetSkillAtkRate(atkObj)   # 技能攻击力加成
         if atkObjType == IPY_GameWorld.gotNPC and atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
             aSkillAtkRate += atkObj.GetSkillAtkRate()
+            
         aNPCHurtAddPer = 0  # PVE伤害加成
         aDamagePer = 0      # 外层伤害加成
         aDamagePerPVP = 0   # 外层PVP伤害加成
-        aFinalHurtPer = 0 # 最外层伤害加成, 可能为负值
         aFinalHurt = NPCCommon.GetFinalHurt(atkObj) # 最终固定伤害
         aFightPower = NPCCommon.GetSuppressFightPower(atkObj)
         
@@ -1867,10 +1963,22 @@
             suppressFormulaKeyRealm = "PVESuppressValueRealm"
             if suppressFormulaKeyRealm in hurtDist:
                 SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm])))
+        
+        
+    # 骑宠争夺最终伤害衰减           
+    if defObjType == IPY_GameWorld.gotNPC and FamilyRobBoss.IsHorsePetRobBoss(defObj.GetNPCID()):
+        ownerPlayer = None
+        # 召唤兽和宠物需要从人物获取状态
+        if atkObj.GetGameObjType() == IPY_GameWorld.gotNPC:
+            if atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
+                ownerPlayer = PetControl.GetPetOwner(atkObj)
+            elif atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:
+                ownerPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, atkObj)
+        else:
+            ownerPlayer = atkObj
             
-        # 骑宠争夺最终伤害衰减           
-        if FamilyRobBoss.IsHorsePetRobBoss(defObj.GetNPCID()):
-            findBuff = SkillCommon.FindBuffByID(atkObj, ChConfig.Def_SkillID_HorsePetRobBossKillCntBuff)[0]
+        if ownerPlayer:
+            findBuff = SkillCommon.FindBuffByID(ownerPlayer, ChConfig.Def_SkillID_HorsePetRobBossKillCntBuff)[0]
             if findBuff:
                 reduceFinalHurtPer = findBuff.GetSkill().GetEffect(0).GetEffectValue(0)
                 aFinalHurtPer -= reduceFinalHurtPer
@@ -1893,7 +2001,11 @@
         suppressLVHurtKey = "%s_%s" % (hurtFormulaKey, suppressLVGroup)
         if suppressLVHurtKey in hurtDist:
             hurtFormulaKey = suppressLVHurtKey
-            
+    
+    # 助战机器人特殊伤血key
+    if helpBattleFormatKey:
+        hurtFormulaKey = helpBattleFormatKey
+        
     if hurtFormulaKey not in hurtDist:
         GameWorld.ErrLog("CalcAttackValue.txt 伤害公式未配置, key=%s" % (hurtFormulaKey))
         return 0, ChConfig.Def_HurtType_Miss
@@ -1959,6 +2071,8 @@
     if atkObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
         # 记录最后一次伤害值
         atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtValue, resultHurtType.RealHurtHP)
+        if defObj.GetGameObjType() == IPY_GameWorld.gotNPC:
+            atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtNPCObjID, defObj.GetID())
         
     return
 
@@ -1969,6 +2083,12 @@
     if objType == IPY_GameWorld.gotPlayer:
         return "P"
     
+    if objType == IPY_GameWorld.gotNPC:
+        if obj.GetType() == ChConfig.ntRobot:
+            return "Robot"
+        if obj.GetType() == ChConfig.ntHelpBattleRobot:
+            return "HelpRobot"
+        
     objType = obj.GetGameNPCObjType()
     if objType == IPY_GameWorld.gnotPet:
         return "Pet"
@@ -2470,7 +2590,6 @@
     
     #---NPC处理---
     if not ChNPC.OnCheckCanDie(atkObj, curObjDetel, curSkill, tick):
-        GameObj.SetHP(curObjDetel, 1)
         return
     
     npcControl = NPCCommon.NPCControl(curObjDetel)

--
Gitblit v1.8.0