From ecec2bde4584f578e822e614548e3ceec830cfef Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 23 十二月 2025 16:04:59 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(修复吕玲绮队友死亡触发怒技回合受限无效bug;7009效果支持纯被动效果技能;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 57 ++++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 38 insertions(+), 19 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 d593e48..dadceb8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -62,8 +62,8 @@
skillType = useSkill.GetSkillType()
byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
if not curBatObj.IsAlive():
- if skillType == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
- GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
+ if skillType == ChConfig.Def_SkillType_Revive:
+ GameWorld.DebugLogEx("死亡时使用复活技能! skillID=%s", skillID)
else:
if byTriggerWay in ChConfig.DeadCanTriggerWayList:
GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,byTriggerWay=%s", skillID, byTriggerWay)
@@ -138,7 +138,7 @@
angerOverflow = max(curXP - maxXP, 0)
curBatObj.SetAngerOverflow(angerOverflow)
GameWorld.DebugLogEx("怒气溢出值: curXP=%s/%s,angerOverflow=%s", curXP, maxXP, angerOverflow)
- if batType == ChConfig.TurnBattleType_Enhance:
+ elif batType == ChConfig.TurnBattleType_Enhance:
pass
else:
curBatObj.SetAngerOverflow(0)
@@ -203,7 +203,7 @@
def CheckSkillUseCntLimit(batObj, useSkill):
## 检查技能使用次数是否受限
- # @return: 是否受限
+ # @return: 是否受限,None-没有受限效果,False-不受限,True-受限了
if not hasattr(useSkill, "GetEffectByID"):
return
effect = useSkill.GetEffectByID(ChConfig.SkillEff_SkillUseCntLimit)
@@ -225,7 +225,7 @@
GameWorld.DebugLogEx("技能每大回合使用次数受限! skillID=%s,turnUseCnt=%s >= %s", skillID, turnUseCnt, turnUseCntLimit)
return True
- return
+ return False
def IsNeedSyncSkill(useSkill):
## 使用需要同步B427使用技能
@@ -756,9 +756,13 @@
return
harmPer = harmEff.GetEffectValue(0) # 自残百分比
noEnoughDo = harmEff.GetEffectValue(1) # 不足时扣除方式 0-不扣;1-自杀;2-扣剩1点
+ calcType = harmEff.GetEffectValue(2) # 计算方式:0-按最大血量;1-按当前血量
curHP = curBatObj.GetHP()
maxHP = curBatObj.GetMaxHP()
- harmHP = int(maxHP * harmPer / 100.0)
+ if calcType == 1:
+ harmHP = int(curHP * harmPer / 100.0)
+ else:
+ harmHP = int(maxHP * harmPer / 100.0)
lostHP = harmHP
if curHP <= harmHP:
if noEnoughDo == 0:
@@ -768,8 +772,8 @@
updHP = max(curHP - lostHP, 0)
curBatObj.SetHP(updHP, False)
- GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s",
- curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo)
+ GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s,calcType=%s",
+ curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo, calcType)
curBatObj.SetHarmSelfHP(harmHP) # 无视实际扣血量,直接更新
@@ -1355,11 +1359,7 @@
killObjList.append(tagObj)
TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
useSkill.SetKillObjList(killObjList)
- # 判断自己,因为反弹、平摊伤害的原因,有可能自己干死自己
- if curObj.IsAlive() and curObj.GetHP() <= 0:
- dieObjList.append(curObj)
- TurnAttack.SetObjKilled(turnFight, curObj)
-
+
# 统计伤血,可能单个技能对同一目标造成多次伤害
totalHurtValue = 0
isSuckHP = False
@@ -1367,11 +1367,18 @@
stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
beHurtObjIDList = [] # 受伤的对象ID列表
reviveObjList = [] # 复活的对象列表
+ bounceObjList = [] # 有反弹的对象列表
for hurtObj in useSkill.GetHurtObjListAll():
hurtObjID = hurtObj.GetObjID()
tagObj = batObjMgr.getBatObj(hurtObjID)
if not tagObj:
continue
+
+ bounceHP = hurtObj.GetBounceHP()
+ if bounceHP:
+ if tagObj not in bounceObjList:
+ bounceObjList.append(tagObj)
+
if hurtObj.HaveHurtType(ChConfig.HurtAtkType_Hurt) and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_Immune) \
and (isTurnNormalSkill or isAngerSkill) and tagObj.IsAlive():
__doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
@@ -1411,6 +1418,12 @@
if hurtObj.GetSuckHP() > 0:
isSuckHP = True
+ # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
+ if curObj.IsAlive() and curObj.GetHP() <= 0:
+ dieObjList.append(curObj)
+ killer = bounceObjList[0] if bounceObjList else None
+ TurnAttack.SetObjKilled(turnFight, curObj, killer)
+
# 记录最后一次总伤害,有伤害目标才记录
if totalHurtValue:
curObj.SetLastHurtValue(totalHurtValue)
@@ -1466,10 +1479,10 @@
for dieObj in dieObjList:
# 敌方单位死亡时
if lineupObj.GetFaction() != dieObj.GetFaction():
- TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill, byKiller=curObj)
# 己方单位死亡时
else:
- TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
# 复活时
for tagObj in reviveObjList:
@@ -1509,6 +1522,7 @@
if isExObj:
continue
+ isDotHurt = False
# 直接攻击
if isAttackDirect:
if not triggerOne:
@@ -1519,6 +1533,7 @@
elif not isAttackDirect:
# 受到持续伤害
if tagID in beHurtObjIDList:
+ isDotHurt = True
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_DOTHurt, tagObj, connSkill=useSkill, connBuff=timeBuff)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill, connBuff=timeBuff)
@@ -1558,7 +1573,7 @@
# 敌友方
- if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue]:
+ if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt:
if not curBatLineup:
curBatLineup = curObj.GetBatLineup()
for lineupObjID in curBatLineup.posObjIDDict.values():
@@ -1572,7 +1587,11 @@
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)
-
+ # 持续伤害
+ elif isDotHurt:
+ if not triggerOne:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
+
# 连击
if batType == ChConfig.TurnBattleType_Combo:
TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
@@ -2655,12 +2674,12 @@
return
GameWorld.DebugLogEx(" 反弹伤害=%s,%s/%s, damBackPer=%s", bounceHP, atkObj.GetHP(), atkObj.GetMaxHP(), damBackPer)
- bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, bounceHP)
+ bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, defObj, atkObj, bounceHP)
if bounceHP <= 0:
GameWorld.DebugLogEx(" bounceHP=%s", bounceHP)
return
hurtObj.SetBounceHP(bounceHP)
- DoLostHP(turnFight, atkObj, defObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
+ DoLostHP(turnFight, defObj, atkObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
return
def CalcSuckBlood(turnFight, atkObj, defObj, hurtObj, curSkill):
--
Gitblit v1.8.0