From c613115bfffc33e6daa7ba37ec0628c580d232d3 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期日, 30 十二月 2018 10:38:44 +0800 Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(查看玩家信息增加标记是否跨服玩家) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 140 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 132 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 07d6881..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 @@ -58,6 +58,7 @@ import NetPackCommon import FamilyRobBoss import FBCommon +import ChNPC import datetime import math @@ -1477,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 防御者 @@ -1524,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) @@ -1567,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: @@ -1577,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) @@ -1662,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: @@ -1681,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 \ @@ -1739,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 @@ -1781,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) @@ -1866,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 @@ -1892,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 @@ -1958,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 @@ -1968,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" @@ -2457,7 +2578,7 @@ # @param curObjDetel 对象实例 # @return 返回值无意义 # @remarks 理对象死亡逻辑 -def DoLogic_ObjDead(curObjDetel): +def DoLogic_ObjDead(atkObj, curObjDetel, curSkill, tick): if GameObj.GetHP(curObjDetel) > 0: return @@ -2468,6 +2589,9 @@ return #---NPC处理--- + if not ChNPC.OnCheckCanDie(atkObj, curObjDetel, curSkill, tick): + return + npcControl = NPCCommon.NPCControl(curObjDetel) npcControl.SetKilled() return -- Gitblit v1.8.0