From c1b3a0b95ee7e09e434389120e35cc73893b9ae4 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 21 一月 2019 19:40:46 +0800 Subject: [PATCH] 5931 【后端】【1.5.100】诛仙装备开发(增加诛仙装备穿脱包) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 143 ++++++++++++++++++++++++++++++++++++----------- 1 files changed, 110 insertions(+), 33 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 b7f7d9f..cef9985 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 @@ -324,6 +324,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 +342,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 +1301,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 +1319,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 = [] # 已经处理过的伤害类型列表 @@ -1389,6 +1405,17 @@ if GameWorld.CanHappen(ChConfig.Def_ChanceDefRate): 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 + # 改变技能伤害(效果ID1010), 野外小怪1009替换1010伤害(2018-03-07增加精英怪) @@ -1520,7 +1547,7 @@ # 被动技能触发 defObj.SetDict(ChConfig.Def_PlayerKey_GodWeaponBeforeProDef, curProDef) - PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, curSkill, ChConfig.TriggerType_ProDefValue, tick) + PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_ProDefValue, tick) return hurtValue - absortValue ## 计算伤血值 @@ -1603,10 +1630,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 @@ -1627,7 +1667,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: @@ -1788,13 +1841,16 @@ 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) @@ -1820,7 +1876,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 @@ -1862,13 +1920,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) @@ -1947,10 +2006,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 @@ -2055,6 +2126,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" -- Gitblit v1.8.0