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