From 69603a748cf54f1a81930d1f88861d32bf006205 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 26 十一月 2018 18:02:54 +0800
Subject: [PATCH] 4923 【后端】【1.3】神兵技能--神兵护盾

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                 |    4 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py          |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py            |   30 +++++++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py |   44 ++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py              |   17 ++++++++
 6 files changed, 93 insertions(+), 5 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 7b5a0be..3c4b876 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,48 @@
         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):
+    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)
+    
+    return hurtValue - absortValue
+
 ## 计算伤血值
 #  @param atkObj 攻击者
 #  @param defObj 防御者
@@ -1525,6 +1566,9 @@
     else:
         hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, orgAtkObj=attacker)
     
+    # 优先处理神兵护盾
+    hurtValue = CalcAtkProDef(atkObj, defObj, hurtValue)
+
     if defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldValue):
         # 麒麟护盾吸收伤害,将抵消的伤害存储
         absortValue = int(defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldValue)/float(ShareDefine.Def_MaxRateValue)*hurtValue)   
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index c20b8e1..853f5b2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -3931,7 +3931,9 @@
     
     #设置血量
     curPlayer.SetHP(curPlayer.GetMaxHP() * resetHpPercent / ChConfig.Def_MaxRateValue)
-    curPlayer.SetMP(curPlayer.GetMaxMP() * resetMpPercent / ChConfig.Def_MaxRateValue)
+    #curPlayer.SetMP(curPlayer.GetMaxMP() * resetMpPercent / ChConfig.Def_MaxRateValue)
+    #护盾
+    PlayerControl.SetProDef(curPlayer, PlayerControl.GetMaxProDef(curPlayer))
     
     #玩家复活后副本处理
     FBLogic.OnPlayerRebornOver(curPlayer, playerRebornType)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index e5d8b03..3120321 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -4205,6 +4205,7 @@
         #beforeAtkInterval = curPlayer.GetAtkInterval()
         beforeMaxHP = curPlayer.GetMaxHP()
         beforeMoveSpeedValue = GetSpeedValue(curPlayer)
+        beforeMaxProDef = GetMaxProDef(curPlayer)
         #构建玩家刷新通知客户端字典, 缓存[索引, 数值]
         playerStateDict = {}
         for index in xrange(1, ChConfig.Def_Calc_AllAttrType_MAX):
@@ -4399,6 +4400,9 @@
         CalcLineEffect.ChangePlayerAttrInLineEffectList(curPlayer, skillNoFightPowerAttrList[ChConfig.CalcAttr_Battle])
         #self.PrintAttr(curPlayer, "固定层级")
         
+        #护盾值刷新
+        self.__RefreshMaxProDef(beforeMaxProDef)
+        
         # 【到此所有功能属性都已刷新处理完毕,复制一份 功能属性的刷新结果,用于BUFF属性单独刷新】
         EffGetSet.CopyPlayerFuncAttr(curPlayer)
         
@@ -4426,6 +4430,26 @@
         GameWorld.DebugLog("End RefreshPlayerAttrStateEx!!!")
         return True
     
+    
+    # 生命转化为防护值
+    def __RefreshMaxProDef(self, beforeMaxProDef):
+        curPlayer = self.__Player
+        if GetProDefHPPer(curPlayer) == 0:
+            return
+        SetMaxProDef(curPlayer, curPlayer.GetMaxHP()*GetProDefHPPer(curPlayer)/ChConfig.Def_MaxRateValue)
+        
+        afterMaxProDef = GetMaxProDef(curPlayer)
+        addValue = max(0, afterMaxProDef - beforeMaxProDef)
+        curProDef = GetProDef(curPlayer)
+        
+        if beforeMaxProDef > 0 and addValue > 0 and curPlayer.GetPlayerAction() != IPY_GameWorld.paDie:
+            # 同步增加 (死亡状态下不刷)
+            SetProDef(curPlayer, min(curProDef + addValue, afterMaxProDef))
+        elif curProDef > afterMaxProDef:
+            # 做一次防范纠正
+            SetProDef(curPlayer, min(curProDef, afterMaxProDef))
+            
+        return
     
     def __RefreshBuffAttr(self):
         ## 刷新buff层属性,该层属性只会改变玩家最终属性,不会影响战力等
@@ -6483,17 +6507,17 @@
 def GetMaxProDef(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrMaxProDef)
 def SetMaxProDef(curPlayer, value):
     curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrMaxProDef, value)
-    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_MaxProDef, value, True) # 周围玩家需要通知
+    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_MaxProDef, value, False) # 周围玩家需要通知
 #---生命上限换算为防护值的百分比----
 def GetProDefHPPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrProDefHPPer)
 def SetProDefHPPer(curPlayer, value):
     curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrProDefHPPer, value)
-    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ProDefHPPer, value, False)
+    #curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ProDefHPPer, value, False)
 #---防护值吸收伤害比率----
 def GetProDefAbsorb(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrProDefAbsorb)
 def SetProDefAbsorb(curPlayer, value):
     curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrProDefAbsorb, value)
-    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ProDefAbsorb, value, False)
+    #curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ProDefAbsorb, value, False)
     
 #---宠物攻击提升值----
 def GetPetMinAtk(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetMinAtk)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py
index 5b12418..6a8d7bb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGodWeapon.py
@@ -170,6 +170,7 @@
             return
         
     SetGodWeaponLV(curPlayer, weaponType, 1)
+    RefreshGodWeaponAttr(curPlayer)
     GameWorld.DebugLog("解锁神兵: weaponType=%s" % weaponType)
     Sync_GodWeaponLVInfo(curPlayer, weaponType)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 17a53df..99e49a4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -1438,13 +1438,30 @@
         curPlayer.SetDict(ChConfig.Def_PDict_PKStateTick, 0)
         curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_PKState, 0, False)
         #GameWorld.DebugLog("退出PK状态!", curPlayer.GetPlayerID())
+        curPlayer.SetDict("StartProDTick", tick) # 开始恢复时间点
         
     bossStateTick = curPlayer.GetDictByKey(ChConfig.Def_PDict_BossStateTick)
     if bossStateTick and (tick - bossStateTick) >= validTime:
         curPlayer.SetDict(ChConfig.Def_PDict_BossStateTick, 0)
         curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_BossState, 0, False)
         #GameWorld.DebugLog("退出Boss状态!", curPlayer.GetPlayerID())
+    
+    # 脱离PK战斗 X秒后按比例恢复
+    if not IsInPKState(curPlayer):
+        if tick - curPlayer.GetDictByKey("StartProDTick") < IpyGameDataPY.GetFuncCfg("MagicExterior", 2) * 1000:
+            return
         
+        if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
+            return
+        
+        # 每秒恢复
+        if tick - curPlayer.GetDictByKey("restoreProDTick") < 1000:
+            return
+        #非PK状态恢复护盾
+        PlayerControl.SetProDef(curPlayer, min(PlayerControl.GetProDef(curPlayer) + \
+                    IpyGameDataPY.GetFuncCfg("MagicExterior", 3)*PlayerControl.GetMaxProDef(curPlayer)/ChConfig.Def_MaxRateValue, \
+                    PlayerControl.GetMaxProDef(curPlayer)))
+        curPlayer.SetDict("restoreProDTick", tick)
     return
 
 def IsInPKState(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PDict_PKStateTick) > 0
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 46478a0..71b31cb 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
@@ -1219,8 +1219,8 @@
     curObjHP_BeforeAttack = GameObj.GetHP(curObj)
     
     if reduceHP :
+        lostValue = AttackCommon.CalcAtkProDef(buffOwner, curObj, lostValue)
         # 血盾 
-
         lostValue = AttackCommon.CalcBloodShield(buffOwner, curObj, lostValue)
         
         #剩余血量

--
Gitblit v1.8.0