From 7cf1be63a7bbf9119bf6c404899e8f71f12400c9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 20 一月 2026 21:10:30 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(命格技能朱雀;增加触发方式61-附加持续伤害buff时;群攻触发的命格buff默认只触发一次;增加效果5029-额外结算dot伤害;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 121 ++++++++++++++++++++++++++++++++--------
1 files changed, 96 insertions(+), 25 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 221cfc5..135eb26 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -398,13 +398,14 @@
colNumList.insert(0, specInColNum)
GameWorld.DebugLogEx("纵排: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
+ posObjIDDict = batLineup.getPosObjIDDict()
for col in colNumList:
for row in range(1, 1 + ChConfig.TurnFightRows):
pNum = (row - 1) * ChConfig.TurnFightCols + col
#GameWorld.DebugLogEx(" col=%s,row=%s,pNum=%s", col, row, pNum)
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
continue
@@ -423,13 +424,14 @@
GameWorld.DebugLogEx("全部: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
# 按前排优先原则
+ posObjIDDict = batLineup.getPosObjIDDict()
for row in range(1, 1 + ChConfig.TurnFightRows):
for col in colNumList:
pNum = (row - 1) * ChConfig.TurnFightCols + col
#GameWorld.DebugLogEx(" col=%s,row=%s,pNum=%s", col, row, pNum)
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
continue
@@ -561,7 +563,7 @@
batObjMgr = BattleObj.GetBatObjMgr()
for num in lineupNumList:
batLineup = batFaction.getBatlineup(num)
- for tagID in batLineup.posObjIDDict.values():
+ for tagID in batLineup.getBatHeroObjIDList():
tagObj = batObjMgr.getBatObj(tagID)
if tagObj.IsAlive() and tagObj.CheckInState(checkInStates):
return lineupNum, changeTagSet
@@ -597,13 +599,14 @@
GameWorld.DebugLogEx("前后排: rowNumList=%s,colNumList=%s,specObjID-PosNum=%s-%s", rowNumList, colNumList, specObjID, specObjPosNum)
aimObjList = []
+ posObjIDDict = batLineup.getPosObjIDDict()
for row in rowNumList:
for col in colNumList:
pNum = (row - 1) * ChConfig.TurnFightCols + col
#GameWorld.DebugLogEx(" row=%s,col=%s,pNum=%s", row, col, pNum)
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
continue
@@ -630,11 +633,12 @@
batObjMgr = BattleObj.GetBatObjMgr()
batLineup = tagObj.GetTFBatLineup()
aimObjList = []
+ posObjIDDict = batLineup.getPosObjIDDict()
for col in colNumList:
pNum = (row - 1) * ChConfig.TurnFightCols + col
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not tagBatObj.IsAlive():
continue
@@ -659,11 +663,12 @@
batObjMgr = BattleObj.GetBatObjMgr()
batLineup = tagObj.GetTFBatLineup()
aimObjList = []
+ posObjIDDict = batLineup.getPosObjIDDict()
for row in range(1, 1 + ChConfig.TurnFightRows):
pNum = (row - 1) * ChConfig.TurnFightCols + col
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not tagBatObj.IsAlive():
continue
@@ -715,12 +720,13 @@
colNumList.insert(0, inColNum)
# 按前排优先原则
+ posObjIDDict = batLineup.getPosObjIDDict()
for row in range(ChConfig.TurnFightRows):
for col in colNumList:
pNum = row * ChConfig.TurnFightCols + col
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf=True):
continue
@@ -1415,6 +1421,8 @@
# 优先处理afterLogic,可再预先汇总一些会触发被动的信息
relatedSkillID = useSkill.GetSkillID()
delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
+ beControlledHardDict = {} # 受控目标 {objID:buff, ...}
+ beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
afterLogicList = useSkill.GetAfterLogicList()
for logicType, logicData in afterLogicList:
if logicType == ChConfig.AfterLogic_DelBuff:
@@ -1433,6 +1441,15 @@
buff = logicData[1]
TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID)
+ # 统计添加buff需要触发的被动
+ elif logicType == ChConfig.AfterLogic_TriggerAddBuff:
+ triggerType, batObj, buff, buffOwner = logicData
+ if buffOwner.GetID() == curID:
+ if triggerType == ChConfig.TriggerWay_BeControlledHard:
+ beControlledHardDict[batObj.GetID()] = buff
+ elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
+ beDotBuffDict[batObj.GetID()] = buff
+
# 统计击杀
killObjList = [] # 击杀其他阵营目标列表
dieObjList = [] # 死亡的单位列表,包含友方单位或自己
@@ -1575,7 +1592,7 @@
batFaction = turnFight.getBatFaction(faction)
for lineupNum in batFaction.lineupDict.keys():
batLineup = batFaction.getBatlineup(lineupNum)
- for lineupObjID in batLineup.posObjIDDict.values():
+ for lineupObjID in batLineup.getBatHeroObjIDList():
lineupObj = batObjMgr.getBatObj(lineupObjID)
if not lineupObj.IsAlive():
continue
@@ -1618,6 +1635,7 @@
isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
curBatLineup = curObj.GetTFBatLineup()
curMGObj = curBatLineup.getMinggeObj()
+ mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
for tagObj in tagObjListAll:
tagID = tagObj.GetID()
@@ -1674,6 +1692,21 @@
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeStun, curObj, connSkill=useSkill)
+ # 控制
+ if tagID in beControlledHardDict:
+ buff = beControlledHardDict[tagID]
+ if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
+ if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
+
+ # 附加dot
+ if tagID in beDotBuffDict:
+ if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 暴击
if tagID in superHitObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
@@ -1698,7 +1731,8 @@
elif batType == ChConfig.TurnBattleType_Pursue:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
if isAttackDirect:
- if curMGObj:
+ if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
# 反击
@@ -1708,8 +1742,8 @@
# 敌友方
- if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt:
- for lineupObjID in curBatLineup.posObjIDDict.values():
+ if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt or tagID in beControlledHardDict:
+ for lineupObjID in curBatLineup.getBatHeroObjIDList():
lineupObj = batObjMgr.getBatObj(lineupObjID)
if not lineupObj.IsAlive():
continue
@@ -1725,6 +1759,10 @@
if not triggerOne:
TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
+ # 敌方被控时
+ if tagID in beControlledHardDict and lineupObj.GetFaction() != tagObj.GetFaction():
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyBeControlledHard, tagObj, connSkill=useSkill)
+
# 连击
if batType == ChConfig.TurnBattleType_Combo:
TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
@@ -1749,9 +1787,7 @@
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])
+ dongbaiObj = batLineup.getHeroObj(ChConfig.HeroID_Dongbai)
if not dongbaiObj or dongbaiObj.IsAlive():
return
skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
@@ -2007,7 +2043,7 @@
@param effectID: 被动效果ID
注:可能由A引起触发B技能的效果释放技能C
'''
- if not passiveSkill:
+ if not passiveSkill or not batObj:
return
if isinstance(passiveSkill, int):
passiveSkillID = passiveSkill
@@ -2618,12 +2654,10 @@
faction, lineupNum, hurtValueDict, immuneHurtDict)
# 按优先级顺序处理拥有分摊效果的武将
for effHeroID in effHeroIDList:
- if effHeroID not in batLineup.heroObjIDDict:
- continue
- objID = batLineup.heroObjIDDict[effHeroID]
- batObj = batObjMgr.getBatObj(objID)
+ batObj = batLineup.getHeroObj(effHeroID)
if not batObj or not batObj.IsAlive():
continue
+ objID = batObj.GetID()
buffMgr = batObj.GetBuffManager()
inHurt = objID in hurtValueDict # 光环里的人员是否有受伤
@@ -3081,6 +3115,43 @@
useSkill.ResetUseRec()
return
+def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
+ ## 额外结算指定伤害
+ skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+ if not skillIpyData:
+ return
+
+ atkID = atkObj.GetID()
+ defID = defObj.GetID()
+
+ # 结算需要同步标签
+ useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
+ Sync_TurnFightTag(turnFight, useTag, 0)
+
+ dHP = defObj.GetHP()
+ dMaxHP = defObj.GetMaxHP()
+ GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s",
+ atkID, defID, skillID, hurtValue, dHP, dMaxHP)
+
+ useSkill = BattleObj.PySkill(skillIpyData, atkID)
+ useSkill.SetTagObjList([defObj])
+ useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
+
+ hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
+ hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
+ calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
+ DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
+
+ Sync_UseSkill(turnFight, atkObj, useSkill)
+
+ DoBeAttackResult(turnFight, atkObj, useSkill)
+
+ # 通知结束标签
+ Sync_TurnFightTag(turnFight, useTag, 1)
+
+ useSkill.ResetUseRec()
+ return True
+
def Sync_TurnFightTag(turnFight, useTag, sign):
## 通知技能标签
clientPack = ChPyNetSendPack.tagSCTurnFightTag()
--
Gitblit v1.8.0