From 3da8e5eb44d92945d64ddd9bc075b9322a088d94 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期二, 19 三月 2019 17:08:55 +0800
Subject: [PATCH] 6341 【后端】【2.0】境界改版开发单(经验buff)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 251 +++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 196 insertions(+), 55 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 018883c..2be3515 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,56 @@
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 = 0
+ reducePer = 0
+ #addPer += EquipZhuXian.GetZhuXianEquipSkillAddPer(atkObj.GetPlayerID(), skillTypeID)
+
+ 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):
@@ -1538,6 +1605,7 @@
atkObj = ElfChangeAttacker(attacker) # Elf灵为替身攻击,要取玩家的属性
resultHurtType = HurtType()
+ atkObjType = attacker.GetGameObjType()
defObjType = defObj.GetGameObjType()
dHP = GameObj.GetHP(defObj) # 防守方当前血量
dMaxHP = GameObj.GetMaxHP(defObj) # 防守方最大血量
@@ -1555,45 +1623,23 @@
# 理论伤害一致, 多加点预算伤害避免计算误差
#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:
hurtValue = clientValue
else:
# 外挂最高伤害基本防范
- GameWorld.DebugAnswer(atkObj, "%s----客户端伤害 %s 服务端最高伤害 %s"%(atkObj.GetID(), [clientValue, hurtType], hurtValue))
+ GameWorld.DebugLog(atkObj, "%s----客户端伤害 %s 服务端最高伤害 %s"%(atkObj.GetID(), [clientValue, hurtType], hurtValue))
hurtValue = int(hurtValue*0.8)
#GameWorld.DebugAnswer(atkObj, "客户端伤害 %s 服务端伤害 %s"%([defObj.GetID(), clientValue, hurtType], hurtValue))
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)
- hurtValue -= absortValue
-
- # 吸收至指定血量比例值
- absorbHurt = defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShield)
- if absorbHurt <= defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldMax):
- maxValue = min(absorbHurt + absortValue, defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldMax))
- defObj.SetDict(ChConfig.Def_PlayerKey_AbsorbShield, maxValue) # 记录护盾吸收的伤害用于爆炸
+ WriteHurtLog(attacker, defObj, curSkill, hurtValue, hurtType, "公式层")
+
+ hurtValue = CalcHurtHPWithBuff(atkObj, defObj, hurtValue, curSkill, tick)
# buff减少伤害百分比
reducePer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
@@ -1603,9 +1649,21 @@
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)
@@ -1673,7 +1731,9 @@
resultHurtType.LostHP = lostValue
if defObjType == IPY_GameWorld.gotPlayer:
FBLogic.OnFBLostHP(defObj, lostValue)
-
+
+ WriteHurtLog(attacker, defObj, curSkill, resultHurtType.LostHP, resultHurtType.HurtType, "最终扣血")
+
#攻击触发事件, 该代码应该放在DoAttack函数中处理逻辑比较清晰,也不会破坏GetHurtHP函数
#因为DoAttack修改点比较多,暂不迁移,相关攻击事件逻辑,就往此函数中添加
AttackEventTrigger(atkObj, defObj, curSkill, resultHurtType, tick)
@@ -1684,6 +1744,78 @@
return resultHurtType
+# 计算伤害后,因各种buff和状态的影响处理
+def CalcHurtHPWithBuff(atkObj, defObj, hurtValue, curSkill, tick):
+ # 优先处理神兵护盾
+ 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)
+ hurtValue -= absortValue
+
+ # 吸收至指定血量比例值
+ absorbHurt = defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShield)
+ if absorbHurt <= defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldMax):
+ maxValue = min(absorbHurt + absortValue, defObj.GetDictByKey(ChConfig.Def_PlayerKey_AbsorbShieldMax))
+ defObj.SetDict(ChConfig.Def_PlayerKey_AbsorbShield, maxValue) # 记录护盾吸收的伤害用于爆炸
+
+ # 天罡护法,将期间受到的伤害总值用于回血,不改变伤害
+ curEffect, plusValue, skillID2 = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_StoreBlood)
+ if skillID2:
+ absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue
+ if absortValue:
+ findBuff = SkillCommon.FindBuffByID(defObj, skillID2)[0]
+ if findBuff:
+ # 用于回血
+ findBuff.SetValue(int(findBuff.GetValue() + absortValue))
+ return hurtValue
+
+
+
+# GM 命令 HurtLog 查看战斗伤害日志
+def WriteHurtLog(attacker, defObj, curSkill, hurtValue, hurtType, msg):
+ logLevel = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_HurtLog)
+ if not logLevel:
+ return
+
+ if logLevel == 1:
+ # 只看玩家伤害
+ if not attacker:
+ return
+
+ if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
+ return
+ msg = "玩家" + msg
+
+ attackerID = attacker.GetID() if attacker else 0
+ defenderID = defObj.GetID() if defObj else 0
+ skillID = curSkill.GetSkillID() if curSkill else 0
+ skillName = curSkill.GetSkillName() if curSkill else ""
+ attackerName = attacker.GetName() if attacker else ""
+ defenderName = defObj.GetName() if defObj else ""
+
+ if attacker and attacker.GetGameObjType() == IPY_GameWorld.gotPlayer:
+ attackerName = attackerName.decode("utf8").encode('gbk')
+
+ if defObj and defObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+ defenderName = defenderName.decode("utf8").encode('gbk')
+
+ GameWorld.DebugLog("攻击伤害-%s:(%s %s)攻击(%s %s), 技能ID:(%s %s), 伤害值:%s, 伤害类型:%s "%(
+ msg, attackerID, attackerName, defenderID, defenderName,
+ skillID, skillName, hurtValue, hurtType))
# 血盾支持多个同时存在
def CalcBloodShield(atkObj, defObj, hurtValue):
@@ -1802,7 +1934,8 @@
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
@@ -1814,6 +1947,8 @@
# 改变技能伤害
atkSkillPer, atkSkillValue = ChangeSkillHurt(atkObj, defObj, curSkill, atkSkillPer, atkSkillValue)
+
+ atkSkillPer = ChangeSkillHurtPer(atkObj, defObj, curSkill, atkSkillPer)
# atkSkillPer 包含普攻,所以不是用技能增强处理
atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)
@@ -1832,6 +1967,11 @@
# 暴击增加技能伤害
atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitSkillPer)
+ atkSkillPer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitSkillPer)
+
+ # buff中暴击减层,无触发技能
+ PassiveBuffEffMng.OnPassiveBuffTrigger(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitSubLayer, tick)
+
if isLuckyHit:
# 会心一击时增加会心伤害百分比
@@ -2076,7 +2216,8 @@
atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtValue, resultHurtType.RealHurtHP)
if defObj.GetGameObjType() == IPY_GameWorld.gotNPC:
atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtNPCObjID, defObj.GetID())
-
+ else:
+ defObj.SetDict(ChConfig.Def_PlayerKey_LastAttackerObjID, atkObj.GetID())
return
@@ -2229,7 +2370,7 @@
atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
atkBackHP += int(hurtValue * atkBackHPPer*1.0 / ChConfig.Def_MaxRateValue)
-
+
suckHP += atkBackHP
if suckHP <= 0:
--
Gitblit v1.8.0