From 5a91f4aa6a702388948d551158a2e92a65329834 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 14 十一月 2025 18:52:41 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(buff持续时间增加大回合支持;增加光环buff;优化攻击、治疗计算逻辑,甄宓、曹仁、董白平摊伤害技能支持;优化B427封包支持额外目标;优化dot、持续治疗结算逻辑及通知;)其他: 1. TurnFight 命令支持指定敌方武将阵容测试,直接在主线战斗 2. B424初始化前的血量变更0418通知屏蔽

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py |   77 ++++++++++++++++++++++++++++++++------
 1 files changed, 65 insertions(+), 12 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index efea606..32ab297 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -239,11 +239,11 @@
         self._objID = 0
         self._hurtTypes = 0 # 本次伤血类型,如闪避、暴击、格挡等,通过二进制或运算得到最终值,支持多种同时出现,如暴击的同时被格挡
         self._hurtHP = 0 # 公式最终计算的伤害值,一般用于飘血
-        self._realHurtHP = 0 # 真实伤血值,被承伤盾抵扣后的可伤血的值
         self._lostHP = 0 # 实际掉血值
         self._curHP = 0 # 更新血量
         self._suckHP = 0 # 吸血量
         self._bounceHP = 0 # 反弹血量
+        self._hurtListEx = [] # 额外伤血列表,一般后端单技能执行多次伤害逻辑时有用,如弹射的平摊伤害 [HurtObj, ...]
         return
     
     def GetObjID(self): return self._objID
@@ -253,14 +253,12 @@
     def AddHurtType(self, hurtType):
         ## 添加伤血类型,单次伤害支持多种类型同时出现
         self._hurtTypes |= pow(2, hurtType)
-        return
+        return self._hurtTypes
     def HaveHurtType(self, hurtType):
         ## 判断是否存在某种伤血类型
         return self._hurtTypes & pow(2, hurtType) 
     def GetHurtHP(self): return self._hurtHP
     def SetHurtHP(self, hurtHP): self._hurtHP = hurtHP
-    def GetRealHurtHP(self): return self._realHurtHP
-    def SetRealHurtHP(self, realHurtHP): self._realHurtHP = realHurtHP
     def GetLostHP(self): return self._lostHP
     def SetLostHP(self, lostHP): self._lostHP = lostHP
     def GetCurHP(self): return self._curHP
@@ -269,6 +267,18 @@
     def SetSuckHP(self, suckHP): self._suckHP = suckHP
     def GetBounceHP(self): return self._bounceHP
     def SetBounceHP(self, bounceHP): self._bounceHP = bounceHP
+    def ClearHurtObjEx(self):
+        poolMgr = ObjPool.GetPoolMgr()
+        for hurtObjEx in self._hurtListEx:
+            poolMgr.release(hurtObjEx)
+        self._hurtListEx = []
+        return
+    def AddHurtObjEx(self, tagID):
+        hurtObj = ObjPool.GetPoolMgr().acquire(HurtObj)
+        hurtObj.SetObjID(tagID)
+        self._hurtListEx.append(hurtObj)
+        return hurtObj
+    def GetHurtObjListEx(self): return self._hurtListEx # 某个伤害的额外伤害列表
     
 class SkillEffect():
     
@@ -337,14 +347,16 @@
     def GetEffectCount(self): return len(self._effList)
     def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), None)
     def GetConnSkill(self): return self._ipyData.GetConnSkill()
+    def GetCoolDownInit(self): return self._ipyData.GetCoolDownInit()
     def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
     def GetBuffStateLimit(self): return self._ipyData.GetBuffStateLimit()
     def GetCurBuffState(self): return self._ipyData.GetCurBuffState()
     def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
+    def GetLastTimeType(self): return self._ipyData.GetLastTimeType() # 持续时间规则
     def GetLayerCnt(self): return self._ipyData.GetLayerCnt()
     def GetLayerMax(self): return self._ipyData.GetLayerMax()
     def GetBuffRepeat(self): return self._ipyData.GetBuffRepeat() # Buff叠加规则
-    def GetDispersedLimit(self): return self._ipyData.GetDispersedLimit() # 驱散限制
+    def GetDispersedLimit(self): return self._ipyData.GetDispersedLimit() or self._ipyData.GetSkillType() == ChConfig.Def_SkillType_Halo # 驱散限制
     def GetFightPower(self): return self._ipyData.GetFightPower()
     
 class PyBuff():
@@ -362,6 +374,7 @@
         self._value3 = 0
         self._isCopy = 0 # 是否复制的buff
         self._effExDict = {} # 效果ID额外数值 {effID:value, ...} # 计算方式取决于本buff技能中属性效果ID的配置
+        self._haloObjIDList = [] # 光环有效目标ID列表 [objID, ...],ownerID为自己时即为光源,包含光源
         return
     
     def onRelease(self):
@@ -403,6 +416,11 @@
     def GetEffectValueEx(self, effID): return self._effExDict.get(effID, 0)
     def ResetEffectValueEx(self): self._effExDict = {}
     def AddEffectValueEx(self, effID, valueEx): self._effExDict[effID] = self._effExDict.get(effID, 0) + valueEx
+    def GetHaloObjIDList(self): return self._haloObjIDList
+    def SetHaloObjIDList(self, haloObjIDList): self._haloObjIDList = haloObjIDList
+    def AddHaloObjID(self, objID):
+        if objID not in self._haloObjIDList:
+            self._haloObjIDList.append(objID)
     
 class BuffManager():
     ## 战斗对象buff管理器
@@ -502,6 +520,16 @@
                 continue
             buffs.append(self._buffIDDict[buffID])
         return buffs
+    def FindBuffBySkillID(self, skillID, ownerID=0):
+        ## 查找某个技能ID的buff
+        # @param ownerID: 可指定查找指定来源的buff
+        buffList = self.FindBuffListBySkillID(skillID)
+        if not ownerID:
+            return buffList[0] if buffList else None
+        for buff in buffList:
+            if buff.GetOwnerID() == ownerID:
+                return buff
+        return
     def FindBuffByState(self, state):
         ## 查找某种buff状态的buff
         buffIDList = self._buffStateDict.get(state, [])
@@ -551,13 +579,16 @@
         self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
         self._remainTime = 0
         self._batType = 0 # 战斗类型,普通、连击、反击、追击等
-        self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
+        self._tagObjList = [] # 本次技能主要目标列表 [BatObj, ...]
+        self._tagObjListEx = [] # 本次技能额外目标列表,平摊伤害、溅射等 [BatObj, ...]
         self._killObjList = [] # 本次技能击杀目标列表 [BatObj, ...]
         self._effIgnoreObjIDList = [] # 额外技能效果无效的目标ID列表,一般是被闪避、免疫等
-        self._hurtList = [] # 本次伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
+        self._hurtList = [] # 主要伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
+        self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
         self._bySkill = None # 由哪个技能触发的
         self._byBuff = None # 由哪个buff触发的
         self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
+        self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
         
         # 连击相关
         self._comboState = 0 # 连击状态 0-未重置,1-初始化连击相关可连击,2-连击已中断
@@ -576,6 +607,7 @@
         ## 注:有用到对象池相关对象的一定要重置,不然再回收技能对象时会连同该技能下的所有用到的对象池对象一并回收,导致后续使用对象错误
         self._batType = 0
         self._tagObjList = []
+        self._tagObjListEx = []
         self._killObjList = []
         self._effIgnoreObjIDList = []
         self._bySkill = None
@@ -609,10 +641,12 @@
     def GetEffectCount(self): return self._skillData.GetEffectCount()
     def GetEffectByID(self, effID, triggerWay=0): return self._skillData.GetEffectByID(effID, triggerWay)
     def GetConnSkill(self): return self._skillData.GetConnSkill()
+    def GetCoolDownInit(self): return self._skillData.GetCoolDownInit()
     def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
     def GetBuffStateLimit(self): return self._skillData.GetBuffStateLimit()
     def GetCurBuffState(self): return self._skillData.GetCurBuffState()
     def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
+    def GetLastTimeType(self): return self._skillData.GetLastTimeType() # 持续时间规则
     def GetLayerCnt(self): return self._skillData.GetLayerCnt()
     def GetLayerMax(self): return self._skillData.GetLayerMax()
     def GetBuffRepeat(self): return self._skillData.GetBuffRepeat() # Buff叠加规则
@@ -628,8 +662,12 @@
     def SetBySkill(self, bySkill): self._bySkill = bySkill
     def GetByBuff(self): return self._byBuff
     def SetByBuff(self, byBuff): self._byBuff = byBuff
-    def GetTagObjList(self): return self._tagObjList # 技能目标列表
+    def GetTagObjList(self): return self._tagObjList # 技能主要目标列表
     def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
+    def GetTagObjListEx(self): return self._tagObjListEx # 技能额外目标列表
+    def AddTagObjEx(self, tagObj):
+        if tagObj not in self._tagObjList and tagObj not in self._tagObjListEx:
+            self._tagObjListEx.append(tagObj)
     def GetKillObjList(self): return self._killObjList # 击杀目标列表
     def SetKillObjList(self, killObjList): self._killObjList = killObjList
     def GetEffIgnoreObjIDList(self): return self._effIgnoreObjIDList # 额外技能效果无效的目标ID列表
@@ -646,16 +684,28 @@
         ## 清空伤血统计
         poolMgr = ObjPool.GetPoolMgr()
         for hurtObj in self._hurtList:
+            hurtObj.ClearHurtObjEx()
             poolMgr.release(hurtObj)
         self._hurtList = []
+        
+        for hurtObjEx in self._hurtListEx:
+            hurtObjEx.ClearHurtObjEx()
+            poolMgr.release(hurtObjEx)
+        self._hurtListEx = []
         return
-    def AddHurtObj(self, tagID):
+    def AddHurtObj(self, tagID, isEx=False):
         ## 添加某个伤血
+        # @param isEx: 是否额外伤血
         hurtObj = ObjPool.GetPoolMgr().acquire(HurtObj)
         hurtObj.SetObjID(tagID)
-        self._hurtList.append(hurtObj)
+        if isEx:
+            self._hurtListEx.append(hurtObj)
+        else:
+            self._hurtList.append(hurtObj)
         return hurtObj
-    def GetHurtObjList(self): return self._hurtList
+    def GetHurtObjList(self): return self._hurtList # 技能主要伤血列表
+    def GetHurtObjListEx(self): return self._hurtListEx # 技能额外伤血列表
+    def GetHurtObjListAll(self): return self._hurtList + self._hurtListEx # 技能所有伤血列表
     
     def __commboClear(self):
         ## 连击相关清空
@@ -689,6 +739,9 @@
     def SetTagMissNum(self, tagID, missNum): self._missTagIDDict[tagID] = missNum
     def GetTagParryNum(self, tagID): return self._parryTagIDDict.get(tagID, 0)
     def SetTagParryNum(self, tagID, parryNum): self._parryTagIDDict[tagID] = parryNum
+    
+    def GetEnergy(self): return self._energy # 累计能量
+    def SetEnergy(self, energy): self._energy = energy
     
 class SkillManager():
     ## 战斗对象技能管理器
@@ -811,7 +864,7 @@
         self._skillTempAttrDict = {}
         self.SetXP(initXP, False)
         self.SetHPFull(False)
-        TurnBuff.RefreshBuffAttr(self)
+        TurnBuff.RefreshBuffAttr(self, isInit=True)
         TurnPassive.RefreshPassive(self)
         return
     

--
Gitblit v1.8.0