From 7d3e1b11373f664833362b3887dfe96e44dbf0da Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期五, 25 一月 2019 16:07:51 +0800 Subject: [PATCH] 2954 【1.5.100】【1.5.0】跨服竞技场地图报错 -- 男号技能极光琉璃的减攻速buff 被敌方反弹导致报错问题 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 140 +++++++++++++++++++++++++++++++++++++--------- 1 files changed, 112 insertions(+), 28 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 dae7c55..bb89a25 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 @@ -57,6 +57,7 @@ import ChPyNetSendPack import NetPackCommon import FamilyRobBoss +import EquipZhuXian import FBCommon import ChNPC @@ -324,6 +325,10 @@ if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: return + crossNotifyList = [] + isCrossServer = GameWorld.IsCrossServer() + atkServerGroupID = PlayerControl.GetPlayerServerGroupID(attacker) + defServerGroupID = PlayerControl.GetPlayerServerGroupID(defender) lineID = GameWorld.GetGameWorld().GetLineID() # 杀人玩家有帮会 if attacker.GetFamilyID() > 0: @@ -338,30 +343,40 @@ notifyCode = 'PK_pan_318691' paramList = [defFamilyMemberLv, defName, defMapID, atkName,defPosX, defPosY, lineID] - PlayerControl.FamilyNotify(defFamilyID, notifyCode, paramList) - + if isCrossServer: + crossNotifyList.append(PlayerControl.GetCrossFamilyNotifyInfo(defFamilyID, notifyCode, paramList)) + else: + PlayerControl.FamilyNotify(defFamilyID, notifyCode, paramList) + # 有职位被杀,全服广播 - if defFamilyMemberLv <= 0: - return + if defFamilyMemberLv > 0: + defFamilyName = defender.GetFamilyName() - defFamilyName = defender.GetFamilyName() - - killCnt = attacker.GetDictByKey(ChConfig.Def_PlayerKey_KillPlayerCnt % defender.GetPlayerID()) + 1 - attacker.SetDict(ChConfig.Def_PlayerKey_KillPlayerCnt % defender.GetPlayerID(), killCnt) - #被杀重置击杀数 - defender.SetDict(ChConfig.Def_PlayerKey_KillPlayerCnt % attacker.GetPlayerID(), 0) - - killPlayerNotifyDict = IpyGameDataPY.GetFuncEvalCfg('FamilyKilledNotify') - - killKeys = sorted(killPlayerNotifyDict.keys()) - notifyKey = 0 - for killCntKey in killKeys: - if killCnt < killCntKey: - break - notifyKey = killCntKey - if notifyKey in killPlayerNotifyDict: - notifyMark = killPlayerNotifyDict[notifyKey] - PlayerControl.WorldNotify(0, notifyMark, [atkName, defMapID, defFamilyName, defFamilyMemberLv, defName]) + killCnt = attacker.GetDictByKey(ChConfig.Def_PlayerKey_KillPlayerCnt % defender.GetPlayerID()) + 1 + attacker.SetDict(ChConfig.Def_PlayerKey_KillPlayerCnt % defender.GetPlayerID(), killCnt) + #被杀重置击杀数 + defender.SetDict(ChConfig.Def_PlayerKey_KillPlayerCnt % attacker.GetPlayerID(), 0) + + killPlayerNotifyDict = IpyGameDataPY.GetFuncEvalCfg('FamilyKilledNotify') + + killKeys = sorted(killPlayerNotifyDict.keys()) + notifyKey = 0 + for killCntKey in killKeys: + if killCnt < killCntKey: + break + notifyKey = killCntKey + if notifyKey in killPlayerNotifyDict: + notifyMark = killPlayerNotifyDict[notifyKey] + msgParamList = [atkName, defMapID, defFamilyName, defFamilyMemberLv, defName] + if isCrossServer: + crossNotifyList.append(PlayerControl.GetCrossWorldNotifyInfo(0, notifyMark, msgParamList)) + if atkServerGroupID != defServerGroupID: + PlayerControl.NotifyCode(attacker, notifyMark, msgParamList) + else: + PlayerControl.WorldNotify(0, notifyMark, msgParamList) + + if crossNotifyList: + PlayerControl.CrossNotify([defServerGroupID], crossNotifyList) return @@ -1287,11 +1302,12 @@ ChConfig.Def_HurtType_LuckyHit:[False, 0, 0], ChConfig.Def_HurtType_SuperHit:[False, 0, 0], ChConfig.Def_HurtType_Parry:[False, 0, 0], + ChConfig.Def_HurtType_Zhuxian:[False, 0, 0], } calcTypeList = [] if atkObjType == IPY_GameWorld.gotPlayer: - calcTypeList += [ChConfig.Def_HurtType_LuckyHit, ChConfig.Def_HurtType_SuperHit] + calcTypeList += [ChConfig.Def_HurtType_LuckyHit, ChConfig.Def_HurtType_SuperHit, ChConfig.Def_HurtType_Zhuxian] if defObjType == IPY_GameWorld.gotPlayer: calcTypeList += [ChConfig.Def_HurtType_Parry] # 暂时只计算玩家 @@ -1304,6 +1320,7 @@ ChConfig.Def_HurtType_LuckyHit:lambda aObj, dObj, hState:__HurtTypeHappen_LuckyHit(aObj, dObj, hState), ChConfig.Def_HurtType_SuperHit:lambda aObj, dObj, hState:__HurtTypeHappen_SuperHit(aObj, dObj, hState), ChConfig.Def_HurtType_Parry:lambda aObj, dObj, hState:__HurtTypeHappen_Parry(aObj, dObj, hState), + ChConfig.Def_HurtType_Zhuxian:lambda aObj, dObj, hState:__HurtTypeHappen_Zhuxian(aObj, dObj, hState), } hadCheckList = [] # 已经处理过的伤害类型列表 @@ -1390,6 +1407,55 @@ return True, 0, chanceDefPer return +def __HurtTypeHappen_Zhuxian(atkObj, defObj, happenState): + """诛仙一击""" + rate = PlayerControl.GetZhuXianRate(atkObj) + if not rate: + return + + if GameWorld.CanHappen(rate): + return True, PlayerControl.GetZhuXianHurtPer(atkObj), 0 + return + + +def ChangeSkillHurtPer(atkObj, defObj, curSkill, skillPer): + ## 改变技能伤害百分比 + + if not curSkill: + return skillPer + + if atkObj.GetGameObjType() != IPY_GameWorld.gotPlayer: + return skillPer + + skillTypeID = curSkill.GetSkillTypeID() + + addPer = EquipZhuXian.GetZhuXianEquipSkillAddPer(atkObj.GetPlayerID(), skillTypeID) + reducePer = 0 + + if defObj.GetGameObjType() == IPY_GameWorld.gotPlayer: + reducePer = EquipZhuXian.GetZhuXianEquipSkillReducePer(defObj.GetPlayerID(), skillTypeID) + + #根据防守方职业 计算攻击方伤害加成 + if defObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]: + addPer += PlayerControl.GetJobAHurtAddPer(atkObj) + elif defObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]: + addPer += PlayerControl.GetJobBHurtAddPer(atkObj) + elif defObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]: + addPer += PlayerControl.GetJobCHurtAddPer(atkObj) + + #根据攻击方职业 计算防守方伤害减免 + if atkObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]: + reducePer += PlayerControl.GetJobAAtkReducePer(defObj) + elif atkObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]: + reducePer += PlayerControl.GetJobBAtkReducePer(defObj) + elif atkObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]: + reducePer += PlayerControl.GetJobCAtkReducePer(defObj) + + if addPer or reducePer: + addSkillPer = (addPer - reducePer) / 10000.0 + skillPer = max(0, skillPer + addSkillPer) + + return skillPer # 改变技能伤害(效果ID1010), 野外小怪1009替换1010伤害(2018-03-07增加精英怪) def ChangeSkillHurt(curPlayer, defObj, curSkill, skillPer, skillValue): @@ -1555,7 +1621,7 @@ # 理论伤害一致, 多加点预算伤害避免计算误差 #hurtValue = min(ShareDefine.Def_UpperLimit_DWord, hurtValue+10) #atkObj.SetDict(ChConfig.Def_PlayerKey_ClientMaxHurtValue, int(hurtValue*1.2)) - hurtValue = atkObj.GetMaxAtk()*atkSkillPer*20 # 加入被动计算不准确改成估算 + hurtValue = atkObj.GetMaxAtk()*atkSkillPer*40 # 加入被动计算不准确改成估算 clientValue, hurtType = SkillShell.GetClientHurtByObj(defObj.GetID(), defObjType) if clientValue <= hurtValue: @@ -1603,10 +1669,23 @@ reducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer) hurtValue = int(hurtValue*(max(ChConfig.Def_MaxRateValue - reducePer, 0))*1.0/ChConfig.Def_MaxRateValue) + + # 终极斩杀新效果,必须和斩杀严格区分,会涉及到CD概率,已经触发其他技能等问题 + if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_ZhongjiZhansha): + # 斩杀 + hurtType = ChConfig.Def_HurtType_ZhognjiZhansha + hurtValue = GameObj.GetHP(defObj) + #伤害结构体 + resultHurtType.HurtHP = hurtValue + resultHurtType.HurtType = hurtType + resultHurtType.RealHurtHP = hurtValue + + remainHP = 0 # 剩余血量 # 斩杀,濒死等情况的处理 - if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackKill): + elif PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackKill): # 斩杀 + hurtType = ChConfig.Def_HurtType_Zhansha hurtValue = GameObj.GetHP(defObj) #伤害结构体 resultHurtType.HurtHP = hurtValue @@ -1801,17 +1880,22 @@ isLuckyHit, aLuckyHit, dLuckyHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_LuckyHit] # 幸运一击 isSuperHit, aSuperHit, dSuperHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_SuperHit] # 暴击 dDamChanceDef = hurtTypeResultDict[ChConfig.Def_HurtType_Parry][2] # 抵御, 大于0代表触发抵御效果 - + isZhuxianHit, aZhuxianHurtPer, dZhuxianReducePer = hurtTypeResultDict[ChConfig.Def_HurtType_Zhuxian] # 诛仙一击 + if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_OneDamage): return 1, hurtType + wReFightPower = 0 worldLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) - wLVIpyData = PlayerControl.GetPlayerLVIpyData(worldLV) - wReFightPower = 0 if not wLVIpyData else wLVIpyData.GetReFightPower() # 当前世界等级参考战力 + if worldLV: + wLVIpyData = PlayerControl.GetPlayerLVIpyData(worldLV) + wReFightPower = 0 if not wLVIpyData else wLVIpyData.GetReFightPower() # 当前世界等级参考战力 # 改变技能伤害 atkSkillPer, atkSkillValue = ChangeSkillHurt(atkObj, defObj, curSkill, atkSkillPer, atkSkillValue) + atkSkillPer = ChangeSkillHurtPer(atkObj, defObj, curSkill, atkSkillPer) + # atkSkillPer 包含普攻,所以不是用技能增强处理 atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer) -- Gitblit v1.8.0