From 7fbb43a339c8b3536aface156013b49edcb6ad98 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 19 九月 2018 14:38:30 +0800 Subject: [PATCH] 3681 【后端】神兽基础战斗力 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 132 +++++++++++++++++++++++++++++++++++++------ 1 files changed, 113 insertions(+), 19 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 ca2582a..60ee246 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 @@ -41,7 +41,7 @@ import PlayerTruck #import PlayerPrestigeSys import PlayerFamily -import BossHurtMng +#import BossHurtMng import PassiveBuffEffMng import PlayerSuccess import GameFuncComm @@ -56,6 +56,7 @@ import PlayerState import ChPyNetSendPack import NetPackCommon +import FamilyRobBoss import FBCommon import datetime @@ -610,7 +611,7 @@ # @remarks 获得curPlayer是否是新手 def GetIsNewGuy(curPlayer): - if curPlayer.GetLV() < ReadChConfig.GetEvalChConfig("MinPKLV"): + if curPlayer.GetLV() < IpyGameDataPY.GetFuncCfg("PKConfig", 5): return True return False @@ -679,7 +680,8 @@ defNPCHurtList = curTagObj.GetPlayerHurtList() curObjType = curObj.GetGameObjType() if curObjType == IPY_GameWorld.gotPlayer: - BossHurtMng.BossAddPlayerInHurtList(curObj, curTagObj, hurtHP) + #BossHurtMng.BossAddPlayerInHurtList(curObj, curTagObj, hurtHP) + FamilyRobBoss.OnPlayerHurtFamilyOwnerBoss(curObj, curTagObj, hurtHP) if curTagObj.GetGameObjType() == IPY_GameWorld.gotNPC: FBLogic.DoFB_Player_HurtNPC(curObj, curTagObj, hurtHP) if GameObj.GetHP(curTagObj) == 0: @@ -748,6 +750,10 @@ if not CheckKillNPCByCnt(attacker, defender): return False + #仙盟归属NPC判断 + if not CheckCanAttackFamilyOwnerNPC(attacker, defender): + return False + # NPC打玩家,反过来判断 elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer: ##攻击次数判断 @@ -758,12 +764,19 @@ if not CheckKillNPCByCnt(defender, attacker, False): return False + #仙盟归属NPC判断 + if not CheckCanAttackFamilyOwnerNPC(defender, attacker, False): + return False # NPC打NPC elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotNPC: if PetControl.IsPet(attacker) or attacker.GetGameNPCObjType()== IPY_GameWorld.gnotSummon: #击杀次数判断 if not CheckKillNPCByCnt(attacker, defender, False): + return False + + #仙盟归属NPC判断 + if not CheckCanAttackFamilyOwnerNPC(attacker, defender, False): return False #攻击NPC等级限制 @@ -817,6 +830,34 @@ return False +def CheckCanAttackFamilyOwnerNPC(attacker, defender, isNotify=True): + ''' 判断可否攻击仙盟归属的NPC ''' + if defender.GetGameObjType() != IPY_GameWorld.gotNPC: + #GameWorld.DebugLog("只判断被攻击的是NPC的情况") + return True + + if NPCCommon.GetDropOwnerType(defender) != ChConfig.DropOwnerType_Family: + return True + + atkPlayer, npcObjType = GetAttackPlayer(attacker) + # 攻击者非玩家不限制 + if not atkPlayer: + #GameWorld.DebugLog("攻击者非玩家不限制") + return True + + atkLimitNotifyMark = "" + if GetIsNewGuy(atkPlayer): + atkLimitNotifyMark = "FairyGrabBossNotAtk" + elif not atkPlayer.GetFamilyID(): + atkLimitNotifyMark = "FairyGrabBossNoFairy" + + if atkLimitNotifyMark: + if npcObjType is None and isNotify: + PlayerControl.NotifyCode(atkPlayer, atkLimitNotifyMark) + return False + + return True + def CheckKillNPCByCnt(attacker, defender, isNotify=True): ''' 判断当日击杀该NPC次数是否已满 ''' if defender.GetGameObjType() != IPY_GameWorld.gotNPC: @@ -853,9 +894,9 @@ if hasKillCnt >= limitCnt + itemAddKillCnt: - if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender): - GameWorld.DebugLog("攻击过该boss可继续攻击") - return True + #if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender): + # GameWorld.DebugLog("攻击过该boss可继续攻击") + # return True #次数不足 # 实际攻击者类型None则需要提示玩家 if npcObjType is None: @@ -888,9 +929,9 @@ hasAttackCnt = atkPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WorldBoss_HurtCnt, 0) if hasAttackCnt >= limitCnt: - if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender): - GameWorld.DebugLog("攻击过该boss可继续攻击") - return True + #if BossHurtMng.GetPlayerBossHurt(atkPlayer, defender): + # GameWorld.DebugLog("攻击过该boss可继续攻击") + # return True #次数不足 # 实际攻击者类型None则需要提示玩家 if npcObjType is None: @@ -1564,14 +1605,14 @@ summonAtkPer = 1 # 召唤继承提高基础攻击力,取表 if atkObj.GetGameObjType() == IPY_GameWorld.gotNPC and atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotSummon: - summonAtkPer = atkObj.GetDictByKey(ChConfig.Def_GameObjKey_InheritOwner) - if summonAtkPer > 0: + summonAtkPerValue = atkObj.GetDictByKey(ChConfig.Def_GameObjKey_InheritOwner) + if summonAtkPerValue > 0: # 暴风雪类召唤兽转化为主人计算伤害 atkObj = NPCCommon.GetSummonOwnerDetel(atkObj) if not atkObj: return 0, ChConfig.Def_HurtType_Miss - summonAtkPer = summonAtkPer*1.0/ChConfig.Def_MaxRateValue + summonAtkPer = summonAtkPerValue*1.0/ChConfig.Def_MaxRateValue #GameWorld.DebugLog("召唤兽取主人---------%s-%s-%s-%s"%(atkObj.GetID(), atkSkillPer, atkSkillValue, summonAtkPer)) atkObjType = atkObj.GetGameObjType() @@ -1655,6 +1696,10 @@ if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_OneDamage): return 1, hurtType + worldLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) + wLVIpyData = PlayerControl.GetPlayerLVIpyData(worldLV) + wReFightPower = 0 if not wLVIpyData else wLVIpyData.GetReFightPower() # 当前世界等级参考战力 + # 改变技能伤害 atkSkillPer, atkSkillValue = ChangeSkillHurt(atkObj, defObj, curSkill, atkSkillPer, atkSkillValue) @@ -1674,6 +1719,10 @@ # 暴击增加技能伤害 atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitSkillPer) + + if isLuckyHit: + # 会心一击时增加会心伤害百分比 + aLuckyHit += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_LuckyHit) #参与运算的数值 rand = random.random() #种子数 0~1 @@ -1701,8 +1750,9 @@ aDamagePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddDamagePer) aDamagePer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddDamagePer) + aNPCHurtAddPer = PlayerControl.GetNPCHurtAddPer(atkObj) # PVE伤害加成 aDamagePerPVP = PlayerControl.GetDamagePerPVP(atkObj) # 外层PVP伤害加成 - aFinalHurtPer = PlayerControl.GetFinalHurtPer(atkObj) # 最外层伤害加成 + aFinalHurtPer = PlayerControl.GetFinalHurtPer(atkObj) # 最外层伤害加成, 可能为负值 aFinalHurt = PlayerControl.GetFinalHurt(atkObj) # 最终固定伤害 # 被动增加最终伤害 aFinalHurt += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalValue) @@ -1716,9 +1766,10 @@ 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 # 最外层伤害加成 + aFinalHurtPer = 0 # 最外层伤害加成, 可能为负值 aFinalHurt = NPCCommon.GetFinalHurt(atkObj) # 最终固定伤害 aFightPower = NPCCommon.GetSuppressFightPower(atkObj) @@ -1776,17 +1827,35 @@ #GameWorld.DebugLog("境界压制:aRealmLV=%s,dRealmLV=%s,aRealmGroup=%s,dRealmGroup=%s,SuppressValueRealmRate=%s" # % (aRealmLV, dRealmLV, aRealmGroup, dRealmGroup, SuppressValueRealmRate)) - else: - #PVE 境界压制 + elif atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer: + # EVP 境界压制 aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType) if aRealmLV + dRealmLV != 0: #有压制 - suppressRealm = aRealmLV - dRealmLV + suppressRealm = aRealmLV - dRealmLV # 存在负数 + suppressRealmHurtPer = GetRealmHurtPer(aRealmLV, dRealmLV, 2) # 境界压制加成百分比,存在负数 + suppressFormulaKeyRealm = "EVPSuppressValueRealm" + if suppressFormulaKeyRealm in hurtDist: + SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm]))) + + elif atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC: + # PVE 境界压制 + aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType) + if aRealmLV + dRealmLV != 0: + #有压制 + suppressRealm = aRealmLV - dRealmLV # 存在负数 + suppressRealmHurtPer = GetRealmHurtPer(aRealmLV, dRealmLV, 3) # 境界压制加成百分比,存在负数 suppressFormulaKeyRealm = "PVESuppressValueRealm" if suppressFormulaKeyRealm in hurtDist: SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressFormulaKeyRealm, hurtDist[suppressFormulaKeyRealm]))) - - + + # 骑宠争夺最终伤害衰减 + if FamilyRobBoss.IsHorsePetRobBoss(defObj.GetNPCID()): + findBuff = SkillCommon.FindBuffByID(atkObj, ChConfig.Def_SkillID_HorsePetRobBossKillCntBuff)[0] + if findBuff: + reduceFinalHurtPer = findBuff.GetSkill().GetEffect(0).GetEffectValue(0) + aFinalHurtPer -= reduceFinalHurtPer + atkStateMark = GetObjAtkStateMark(atkObj) defStateMark = GetObjAtkStateMark(defObj) hurtFormulaKey = "%sV%s_%s" % (atkStateMark, defStateMark, atkType) @@ -1818,7 +1887,26 @@ return hurtValue, hurtType +# 获取EVP和PVE伤害百分比差,PVE无境界压制, 境界等级对应列表的index,越界取最高 +def GetRealmHurtPer(aRealmLV, dRealmLV, gridIndex): + suppressRealmHurtPer = 0 + suppressRealmDict = IpyGameDataPY.GetFuncEvalCfg("RealmGroup", gridIndex) + + plus_minus = 1 # 负数为反压制 + if aRealmLV >= dRealmLV: + suppressList = range(dRealmLV+1, aRealmLV+1) + else: + suppressList = range(aRealmLV+1, dRealmLV+1) + plus_minus = -1 + + + for realmLV in suppressList: + suppressRealmHurtPer += suppressRealmDict.get(realmLV, 0) + + return suppressRealmHurtPer*plus_minus + +# 获取双方境界值 def GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType): if atkObjType == IPY_GameWorld.gotNPC: aRealmLV = NPCCommon.GetRealmLV(atkObj) @@ -2179,6 +2267,12 @@ if tagPlayer.GetPlayerAction() == IPY_GameWorld.paSit: return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_SitNotPK + if GetIsNewGuy(curPlayer): + return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_NewGuy + + if GetIsNewGuy(tagPlayer): + return ChConfig.Type_Relation_None, ChConfig.Def_PASysMessage_NotAttackNewGuy + #攻守双方同一队伍,不可PK,可加增益buff #if curPlayerAreaType not in [ShareDefine.gatManor] and CanAlikeTeam(curPlayer, tagPlayer): # #副本队友特殊判断 -- Gitblit v1.8.0