From e926fc46837c5fb26c537ecb15945a78e2f3423f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 17 十一月 2025 19:53:58 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(完善战斗相关公式参数;竞技增减伤属性、战力系数改为PVP增减伤;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py |   86 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 72 insertions(+), 14 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 2e25105..1128578 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():
     
@@ -342,10 +352,11 @@
     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():
@@ -363,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):
@@ -404,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管理器
@@ -503,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, [])
@@ -552,10 +579,12 @@
         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], ...]
@@ -578,6 +607,7 @@
         ## 注:有用到对象池相关对象的一定要重置,不然再回收技能对象时会连同该技能下的所有用到的对象池对象一并回收,导致后续使用对象错误
         self._batType = 0
         self._tagObjList = []
+        self._tagObjListEx = []
         self._killObjList = []
         self._effIgnoreObjIDList = []
         self._bySkill = None
@@ -616,6 +646,7 @@
     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叠加规则
@@ -631,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列表
@@ -649,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):
         ## 连击相关清空
@@ -785,6 +832,7 @@
         self._batAttrDict = {} # 实际战斗属性,包含buff层级的实际属性 {attrID:+-value, ...} value可能是负值
         self._skillTempAttrDict = {} # 某次技能释放中临时的属性增减 {attrID:+-value, ...} value可能是负值
         self._kvDict = {} # 自定义kv字典
+        self._bigTurnAtkbackCnt = 0 # 大回合累计反击次数
         self._skillUseCntDict = {} # 技能累计使用次数 {skillID:useCnt, ...}
         self._skillTurnUseCntDict = {} # 技能单回合累计使用次数 {skillID:useCnt, ...}
         self._skillMgr = ObjPool.GetPoolMgr().acquire(SkillManager, self)
@@ -794,6 +842,7 @@
         self._harmSelfHP = 0 # 自残值
         self._mainTagIDList = [] # 主技能目标ID列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
         self._timing = 0 # 当前武将时间节点: 0-回合前;1-回合后
+        self._angerOverflow = 0 # 怒气技能怒气溢出值,子技能也生效,因为主技能释放后怒气会被扣除,所以这里做个记录
         
         # 统计
         self.hurtStat = 0 # 输出统计
@@ -817,7 +866,7 @@
         self._skillTempAttrDict = {}
         self.SetXP(initXP, False)
         self.SetHPFull(False)
-        TurnBuff.RefreshBuffAttr(self)
+        TurnBuff.RefreshBuffAttr(self, isInit=True)
         TurnPassive.RefreshPassive(self)
         return
     
@@ -1016,8 +1065,6 @@
     
     def GetSkillUseCnt(self, skillID): return self._skillUseCntDict.get(skillID, 0) # 单场战斗累计使用次数
     def GetSkillTurnUseCnt(self, skillID): return self._skillTurnUseCntDict.get(skillID, 0) # 单回合累计使用次数
-    def ResetSkillTurnUseCnt(self):
-        self._skillTurnUseCntDict = {}
     def ResetSkillUseCnt(self):
         self._skillUseCntDict = {}
         self._skillTurnUseCntDict = {}
@@ -1025,12 +1072,23 @@
         self._skillUseCntDict[skillID] = self._skillUseCntDict.get(skillID, 0) + 1
         self._skillTurnUseCntDict[skillID] = self._skillTurnUseCntDict.get(skillID, 0) + 1
         
+    def GetBigTurnAtkbackCnt(self): return self._bigTurnAtkbackCnt
+    def AddBigTurnAtkbackCnt(self):  self._bigTurnAtkbackCnt += 1
+    
+    def ResetBigTurn(self):
+        ## 每大回合重置
+        self._bigTurnAtkbackCnt = 0
+        self._skillTurnUseCntDict = {}
+    
     def GetLastHurtValue(self): return self._lastHurtValue
     def SetLastHurtValue(self, lastHurtValue): self._lastHurtValue = lastHurtValue
     
     def GetHarmSelfHP(self): return self._harmSelfHP
     def SetHarmSelfHP(self, harmSelfHP): self._harmSelfHP = harmSelfHP
     
+    def GetAngerOverflow(self): return self._angerOverflow
+    def SetAngerOverflow(self, angerOverflow): self._angerOverflow = angerOverflow
+    
     def GetMainTagIDList(self): return self._mainTagIDList
     def SetMainTagIDList(self, mainTagIDList): self._mainTagIDList = mainTagIDList
     

--
Gitblit v1.8.0