From 8d701c0d36c2f4ed0948ea485d10506f9ae86ef8 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 20 十二月 2025 14:01:21 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(修复关羽潜能触发怒气追击会消耗怒气bug;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 134 ++++++++++++++++++++++++++++++++++++++------
1 files changed, 116 insertions(+), 18 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index 38f8ede..b6da081 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,13 +59,14 @@
if not skillID:
return
+ skillType = useSkill.GetSkillType()
+ byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
if not curBatObj.IsAlive():
- if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
+ if skillType == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
else:
- triggerWay = kwargs.get("triggerWay", 0)
- if triggerWay in ChConfig.DeadCanTriggerWayList:
- GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
+ if byTriggerWay in ChConfig.DeadCanTriggerWayList:
+ GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,byTriggerWay=%s", skillID, byTriggerWay)
elif batType == ChConfig.TurnBattleType_Enhance:
GameWorld.DebugLogEx("死亡状态额外技能不限制,主技能能放的话也就能放! skillID=%s", skillID)
else:
@@ -103,10 +104,16 @@
if not tagObjList and isRemove:
return
+ if tagObjList and skillType == ChConfig.Def_SkillType_Revive:
+ for tagObj in tagObjList[::-1]:
+ if tagObj.CheckInState(ChConfig.BatObjState_RebornLimit):
+ GameWorld.DebugLogEx(" 目标被禁止复活不处理! tagID=%s", tagObj.GetID())
+ tagObjList.remove(tagObj)
+
if not tagObjList:
# 可扩展其他目标选择,如复活技能没有死亡单位时则使用另外的效果
GameWorld.DebugLogEx("找不到技能目标! skillID=%s,mapID=%s,funcLineID=%s", skillID, turnFight.mapID, turnFight.funcLineID, turnFight.getReqPlayerID())
- if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive:
+ if skillType == ChConfig.Def_SkillType_Revive and not isinstance(useSkill, IpyGameDataPY.IPY_Skill):
otherEff = useSkill.GetEffectByID(ChConfig.SkillEff_ReviveNoUse)
if otherEff:
otherSkillID = otherEff.GetEffectValue(0)
@@ -150,6 +157,7 @@
useSkill.SetBatType(batType)
useSkill.SetBySkill(bySkill)
useSkill.SetByBuff(byBuff)
+ useSkill.SetByTriggerWay(byTriggerWay)
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
if isTurnNormalSkill:
@@ -178,7 +186,7 @@
else:
__doUseSkill(turnFight, curBatObj, useSkill)
- DoAttackResult(turnFight, curBatObj, useSkill)
+ DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
if useTag:
Sync_TurnFightTag(turnFight, useTag, 1)
@@ -220,7 +228,8 @@
def IsNeedSyncSkill(useSkill):
## 使用需要同步B427使用技能
- if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff]:
+ if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff,
+ ChConfig.Def_SkillType_AtkEx]:
return True
if useSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_TurnNormaSkill, ChConfig.Def_SkillFuncType_AngerSkill]:
return True
@@ -441,6 +450,14 @@
for aimObj in aimObjList[::-1]:
if not aimObj.CheckInState(ChConfig.BatObjState_PoisonCure):
aimObjList.remove(aimObj)
+
+ # 仅流血目标
+ elif tagAffect == ChConfig.SkillTagAffect_Bleeding:
+ atkBackTagFrist = False
+ for aimObj in aimObjList[::-1]:
+ if not aimObj.CheckInState(ChConfig.BatObjState_Bleeding):
+ aimObjList.remove(aimObj)
+
else:
# 范围目标超过个数,则随机取
if tagCount and len(aimObjList) > tagCount:
@@ -771,22 +788,24 @@
addPer = addPerMax
GameWorld.DebugLogEx("司马懿特殊潜能技能额外增加比例: frozenCnt=%s,addPer=%s" % (frozenCnt, addPer))
+ addBatDamPer = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
+
# 计算伤害
calcHurtResults = []
for tagBatObj in useSkill.GetTagObjList():
- hurtValue, hurtTypes, immuneHurt = __calcSkillHurt(turnFight, curBatObj, tagBatObj, useSkill, addPer)
+ hurtValue, hurtTypes, immuneHurt = __calcSkillHurt(turnFight, curBatObj, tagBatObj, useSkill, addPer, addBatDamPer)
calcHurtResults.append([tagBatObj, hurtValue, hurtTypes, immuneHurt])
DoSkillHurtHP(turnFight, curBatObj, useSkill, calcHurtResults)
return
-def __calcSkillHurt(turnFight, atkObj, defObj, curSkill, addPer=0):
+def __calcSkillHurt(turnFight, atkObj, defObj, curSkill, addPer=0, addBatDamPer=0):
## 计算技能伤害,只计算值,不做实际处理
# @param addPer: 外部指定增加的比例
# @return: hurtValue, hurtTypes, immuneHurt
atkSkillPer = curSkill.GetSkillPer() + addPer
atkSkillValue = curSkill.GetSkillValue()
- hurtValue, hurtTypes = CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer)
+ hurtValue, hurtTypes = CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, addBatDamPer)
hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
return hurtValue, hurtTypes, immuneHurt
@@ -1122,7 +1141,7 @@
return
-def DoAttackResult(turnFight, curBatObj, useSkill):
+def DoAttackResult(turnFight, curBatObj, useSkill, **kwargs):
'''执行攻击结果
@param curBatObj: 施法方或buff归属方
'''
@@ -1139,13 +1158,21 @@
if useSkill.GetCoolDownTime():
useSkill.SetRemainTime(useSkill.GetCoolDownTime())
+ if "byEffSkill" in kwargs:
+ byEffSkill = kwargs["byEffSkill"]
+ cdTime = byEffSkill.GetCoolDownTime()
+ if cdTime:
+ if hasattr(byEffSkill, "GetRemainTime"):
+ byEffSkill.SetRemainTime(cdTime)
+ GameWorld.DebugLogEx("提前设置效果技能触发后CD,防止嵌套循环触发! effSkillID=%s,cdTime=%s", byEffSkill.GetSkillID(), cdTime)
+
__doCostZhanchui(turnFight, curBatObj, useSkill) # 先扣除再同步技能
# 需先技能使用 - 前端按顺序优先表现技能释放内容,前端需要动作或有伤血则通知
if IsNeedSyncSkill(useSkill):
Sync_UseSkill(turnFight, curBatObj, useSkill)
- __doSkillUserAnger(turnFight, curBatObj, useSkill)
+ __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs)
DoBeAttackResult(turnFight, curBatObj, useSkill)
return
@@ -1272,13 +1299,14 @@
return useSkill
return
-def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
+def DoBeAttackResult(turnFight, curObj, useSkill, timeBuff=None):
'''被攻击结果
@param curObj: 施法方或buff归属方
+ @param timeBuff: 持续结算的buff,如持续攻击、持续治疗等
'''
- #curID = curObj.GetID()
- isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
+ curID = curObj.GetID()
+ isUseSkill = False if timeBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
isAngerSkill = SkillCommon.isAngerSkill(useSkill)
@@ -1417,6 +1445,7 @@
if dieObjList:
for dieObj in dieObjList:
TurnPassive.OnTriggerPassiveEffect(turnFight, dieObj, ChConfig.TriggerWay_WhenDie, curObj, connSkill=useSkill)
+ __dongbaiRevive(turnFight, dieObj, useSkill) # 写死特殊处理董白复活
for faction in [ChConfig.Def_FactionA, ChConfig.Def_FactionB]:
batFaction = turnFight.getBatFaction(faction)
@@ -1445,6 +1474,7 @@
triggerOne = False
batType = useSkill.GetBatType()
isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
+ curBatLineup = None
for tagObj in tagObjListAll:
tagID = tagObj.GetID()
@@ -1461,6 +1491,7 @@
# 掉血时
if tagID in beHurtObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeHurt, curObj, connSkill=useSkill)
+ #TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill) 暂时用不到先屏蔽
# 受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)
if not isAttackDirect:
@@ -1516,12 +1547,64 @@
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AtkBack, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAtkBack, curObj, connSkill=useSkill)
+
+ # 敌友方
+ if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue]:
+ if not curBatLineup:
+ curBatLineup = curObj.GetBatLineup()
+ for lineupObjID in curBatLineup.posObjIDDict.values():
+ lineupObj = batObjMgr.getBatObj(lineupObjID)
+ if not lineupObj.IsAlive():
+ continue
+
+ # 直接攻击
+ if isAttackDirect:
+ if not triggerOne:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
+ if curID != lineupObj.GetID():
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOneNoSelf, tagObj, connSkill=useSkill, byFriendObj=curObj)
+
+ # 连击
+ if batType == ChConfig.TurnBattleType_Combo:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
+
+ # 追击
+ elif batType == ChConfig.TurnBattleType_Pursue:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
+
triggerOne = True # 设置已经触发过一次
# 验证是否结算,最后处理
if dieObjList:
turnFight.checkOverByKilled()
+ return
+
+def __dongbaiRevive(turnFight, batObj, useSkill):
+ '''特殊处理董白复活: 董白死亡之后的时间,若有敌方单位阵亡,董白以50%血量复活
+ '''
+ faction = batObj.GetFaction()
+ batFaction = turnFight.getBatFaction(ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB)
+ if not batFaction:
+ return
+ batLineup = batFaction.getBatlineup(1)
+ if ChConfig.HeroID_Dongbai not in batLineup.heroObjIDDict:
+ return
+ dongbaiObj = BattleObj.GetBatObjMgr().getBatObj(batLineup.heroObjIDDict[ChConfig.HeroID_Dongbai])
+ if not dongbaiObj or dongbaiObj.IsAlive():
+ return
+ skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
+ if not skill:
+ GameWorld.DebugLogEx("董白还还未学习特殊复活技能! %s", ChConfig.SkillID_DongbaiRevive)
+ return
+ enemyDeadCnt = dongbaiObj.GetDictByKey("EnemyDeadCnt") + 1
+ dongbaiObj.SetDict("EnemyDeadCnt", enemyDeadCnt)
+ GameWorld.DebugLogEx("董白记录自身死亡后的敌方阵亡单位数: %s" % enemyDeadCnt)
+ needDeadCnt = skill.GetEffect(0).GetEffectValue(0) # 固定配置在效果1值
+ if enemyDeadCnt < needDeadCnt:
+ return
+ dongbaiObj.SetDict("EnemyDeadCnt", 0)
+ OnUseSkill(turnFight, dongbaiObj, skill, batType=ChConfig.TurnBattleType_Passive, bySkill=useSkill)
return
def __doCostZhanchui(turnFight, curBatObj, useSkill):
@@ -1561,10 +1644,14 @@
return
-def __doSkillUserAnger(turnFight, curBatObj, useSkill):
+def __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs):
## 技能释放者怒气相关
if SkillCommon.isAngerSkill(useSkill):
- curBatObj.SetXP(0)
+ if "noUseXP" in kwargs:
+ kwargs.pop("noUseXP")
+ GameWorld.DebugLogEx("本次不消耗怒气")
+ else:
+ curBatObj.SetXP(0)
elif SkillCommon.isTurnNormalSkill(useSkill) and useSkill.GetBatType() == ChConfig.TurnBattleType_Normal:
addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3)
AddFightXP(curBatObj, addXP, "skillID:%s" % useSkill.GetSkillID())
@@ -1797,13 +1884,21 @@
return
passiveTagObjList = connSkill.GetTagObjList()
isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+ elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
+ if "byFriendObj" not in kwargs:
+ return
+ byFriendObj = kwargs.pop("byFriendObj") # 触发即移除,防止一直传递引发其他问题,如触发的技能再触发其他技能会被视为也是有byFriendObj
+ passiveTagObjList = [byFriendObj]
+ GameWorld.DebugLogEx("被动触发技能,针对来源友军! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s,byFriendID=%s",
+ effSkillID, effectID, passiveSkillID, bySkillID, byFriendObj.GetID())
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
else:
GameWorld.DebugLogEx("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
return isOK
-def CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, **kwargs):
+def CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, addBatDamPer=0, **kwargs):
'''按公式计算伤害,默认按攻击计算
'''
@@ -1894,6 +1989,7 @@
dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
+ aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
aNormalSkillPer, dNormalSkillPerDef = 0, 0
if isTurnNormalSkill:
@@ -1917,6 +2013,7 @@
aBatDamPer, dBatDamPerDef = 0, 0 # 战斗增减伤
aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
+ aBatDamPer += addBatDamPer
# 物法增减伤
if pmType == IPY_GameWorld.ghtMag: # 法伤
@@ -2015,6 +2112,7 @@
hurtAtkPerMax = curSkill.GetHurtAtkPerMax() # 最大万分比,限制最终伤害不超过攻击力万分率
if hurtAtkPerMax:
+ hurtAtkPerMax += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddHurtAtkPerMax, curSkill)
aAtk = atkObj.GetAtk()
hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
hurtValue = min(hurtValue, hurtValueMax)
--
Gitblit v1.8.0