ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -1479,6 +1479,47 @@ 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) 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) 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) 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 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -1438,6 +1438,7 @@ 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: @@ -1445,6 +1446,22 @@ 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 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) #剩余血量