From 6431718d4fabf83de74f7abe40f671590dbf91c0 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 26 十二月 2025 09:08:44 +0800
Subject: [PATCH] 358 【内政】红颜系统-服务端(马车炸弹不出裂纹;马车炸开后通知马车空白;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 143 ++++++++++++++++++++++++++++++++++-------------
1 files changed, 104 insertions(+), 39 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..3399483 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) # 无视实际扣血量,直接更新
@@ -828,7 +832,7 @@
tagID = tagObj.GetID()
if tagID == ChConfig.HeroID_Caoren:
continue
- if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
+ if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
continue
if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
caorenProtectObj = tagObj
@@ -906,7 +910,7 @@
continue
if tagID == ChConfig.HeroID_Caoren:
continue
- if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
+ if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
continue
if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
caorenProtectObj = tagObj
@@ -1344,34 +1348,43 @@
# 统计击杀
killObjList = [] # 击杀其他阵营目标列表
dieObjList = [] # 死亡的单位列表,包含友方单位或自己
+ nodeadObjList = [] # 不死的单位列表
tagObjList = useSkill.GetTagObjList() # 主要目标列表
tagObjListEx = useSkill.GetTagObjListEx() # 额外目标列表
tagObjListAll = tagObjList + tagObjListEx
for tagObj in tagObjListAll:
tagID = tagObj.GetID()
if tagObj.IsAlive() and tagObj.GetHP() <= 0:
- dieObjList.append(tagObj)
- if tagObj.GetFaction() != curObj.GetFaction():
- killObjList.append(tagObj)
- TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
+ if tagObj.CanNoDead():
+ tagObj.SetHP(1, True) # 触发不死,保留1点血量
+ nodeadObjList.append(tagObj)
+ else:
+ dieObjList.append(tagObj)
+ if tagObj.GetFaction() != curObj.GetFaction():
+ 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
+ suckObjIDList = [] # 吸血的对象ID列表
missObjIDList, immuneObjIDList = [], [] # 闪避、免疫对象ID列表
stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
beHurtObjIDList = [] # 受伤的对象ID列表
reviveObjList = [] # 复活的对象列表
+ bounceObjList = [] # 有反弹的对象列表
+ caorenProtectList = [] # 有被曹仁防护的对象列表
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)
@@ -1408,9 +1421,24 @@
if hurtObjID not in stunObjIDList:
stunObjIDList.append(hurtObjID)
- if hurtObj.GetSuckHP() > 0:
- isSuckHP = True
-
+ if hurtObj.HaveHurtType(ChConfig.HurtAtkType_CaorenProtect):
+ if tagObj not in caorenProtectList:
+ caorenProtectList.append(tagObj)
+
+ if hurtObj.GetSuckHP() > 0 and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_PoisonCureSuck):
+ if hurtObjID not in suckObjIDList:
+ suckObjIDList.append(hurtObjID)
+
+ # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
+ if curObj.IsAlive() and curObj.GetHP() <= 0:
+ if curObj.CanNoDead():
+ curObj.SetHP(1, True) # 触发不死,保留1点血量
+ nodeadObjList.append(curObj)
+ else:
+ dieObjList.append(curObj)
+ killer = bounceObjList[0] if bounceObjList else None
+ TurnAttack.SetObjKilled(turnFight, curObj, killer)
+
# 记录最后一次总伤害,有伤害目标才记录
if totalHurtValue:
curObj.SetLastHurtValue(totalHurtValue)
@@ -1420,7 +1448,7 @@
DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
if stunObjIDList:
DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_Stun, relatedSkillID)
- if isSuckHP:
+ if suckObjIDList:
DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuckHP, relatedSkillID)
# 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
@@ -1466,11 +1494,15 @@
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 nodeadObjList:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_NoDead, curObj, connSkill=useSkill)
+
# 复活时
for tagObj in reviveObjList:
# 同步最新的怒气及buff,血量已经在技能中通知了
@@ -1479,6 +1511,20 @@
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
+ # 曹仁防护触发,暂写死
+ for tagObj in caorenProtectList:
+ tagBatLineup = tagObj.GetBatLineup()
+ caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
+ if not caorenObj or not caorenObj.IsAlive():
+ continue
+ caoRenSkill = caorenObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_CaorenProtect)
+ if not caoRenSkill:
+ continue
+ passiveSkillID = caoRenSkill.GetEffect(0).GetEffectValue(0) # 防护成功后的触发技能ID,默认写在效果1的值
+ GameWorld.DebugLogEx("曹仁防护后触发技能: caorenID=%s,protectID=%s,passiveSkillID=%s", caorenObj.GetID(), tagObj.GetID(), passiveSkillID)
+ if passiveSkillID:
+ OnUsePassiveSkill(turnFight, caorenObj, curObj, passiveSkillID, connSkill=useSkill)
+
triggerOne = False
batType = useSkill.GetBatType()
isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
@@ -1490,6 +1536,10 @@
if tagID in missObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
+
+ # 免疫
+ if tagID in immuneObjIDList:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
if tagID in effIgnoreObjIDList:
continue
@@ -1509,6 +1559,7 @@
if isExObj:
continue
+ isDotHurt = False
# 直接攻击
if isAttackDirect:
if not triggerOne:
@@ -1519,6 +1570,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)
@@ -1543,6 +1595,12 @@
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
+ # 吸血
+ if tagID in suckObjIDList:
+ if not triggerOne:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
+
# 连击
if batType == ChConfig.TurnBattleType_Combo:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
@@ -1558,7 +1616,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 +1630,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)
@@ -1843,7 +1905,7 @@
OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
return
-def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, **kwargs):
+def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, batType=ChConfig.TurnBattleType_Passive, **kwargs):
'''被动触发使用技能
@param passiveSkill: 释放的被动技能 或 技能ID
@param connSkill: 由什么技能引起的
@@ -1893,12 +1955,12 @@
GameWorld.DebugLogEx(" 概率不触发: tagID=%s,happenRate=%s", tagID, happenRate)
return
passiveTagObjList = [tagObj]
- isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
elif tagAim == ChConfig.SkillTagAim_MainSkillEx:
if not connSkill:
return
passiveTagObjList = connSkill.GetTagObjList()
- isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
if "byFriendObj" not in kwargs:
return
@@ -1906,10 +1968,10 @@
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)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, 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)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
return isOK
@@ -2222,7 +2284,7 @@
return hurtValue, hurtTypes, immuneHurt
hurtValue = int(hurtValue)
- if defObj.CheckInState(ChConfig.BatObjState_Wudi):
+ if defObj.CheckInState(ChConfig.ImmuneHurtStateList):
hurtTypes |= pow(2, ChConfig.HurtAtkType_Immune) # 添加免疫
immuneHurt = hurtValue
hurtValue = 0
@@ -2393,7 +2455,7 @@
# 曹仁的分担触发条件暂时程序内固定,有修改时程序同步修改
# 曹仁: 我方英雄受到直接攻击时(受到群攻时选择血量最低的友方进行防护),曹仁有30%概率为其分担一半所受伤害,每成功分担一次,曹仁获得1层坚韧,使我方全体减伤提升5%,最多6层,曹仁死亡效果消失
# 董白怒气 同命锁 对敌方攻击最高的1个目标造成攻击力450%物理伤害,并与其连接,使两人受到的任意伤害平摊(平摊伤害不会被再次平摊),持续2回合
- caorenSkillID = 1015070
+ caorenSkillID = ChConfig.SkillID_CaorenProtect
effHeroIDList = [ChConfig.HeroID_Zhenfu, ChConfig.HeroID_Caoren, ChConfig.HeroID_Dongbai] # 暂固定,有增加武将再同步修改
isAve = False
@@ -2506,7 +2568,7 @@
immuneHurt = immuneHurtDict.get(aveObjID)
if immuneHurt == None:
- if aveObj.CheckInState(ChConfig.BatObjState_Wudi):
+ if aveObj.CheckInState(ChConfig.ImmuneHurtStateList):
immuneHurt = 0
else:
immuneHurt = -1 # 标记没有无敌
@@ -2655,12 +2717,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):
@@ -2758,6 +2820,9 @@
cureHP += cureHPEx
GameWorld.DebugLogEx(" 额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
+ addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddCureMultiBySkillType, curSkill)
+ if addCureMulti:
+ multiValue += addCureMulti / 100.0
if multiValue and multiValue != 1:
cureHP = int(cureHP * multiValue)
GameWorld.DebugLogEx(" 治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)
--
Gitblit v1.8.0