From 6f2c8b0e79e4963cc6aceda674847d04d23e02b2 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 24 十二月 2025 18:25:40 +0800
Subject: [PATCH] 16 卡牌服务端(MainLevelPass流向增加祝福树等级信息;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py |   97 ++++++++++++++++++++++++++++++++++++------------
 1 files changed, 73 insertions(+), 24 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 f2a0f36..d7b8c8e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -32,6 +32,8 @@
     def __init__(self, batObj):
         self._batObj = batObj
         self._objID = batObj.GetID() if batObj else 0
+        self._skillIDList = [] # 已有技能ID列表,获取被动中快速判断已学技能用
+        self.noDeadSkill = None # 不死技能效果,暂时只支持最多1个这种技能
         
         # 技能
         self._AffectSkillDict = {} # 被动技能 {(触发方式, 有效来源):{技能ID:[effID, ...], ...}, ...}
@@ -56,9 +58,9 @@
         '''
         effList = []
         
-        # 额外子技能的一般是未学习的技能,直接加载自身的被动效果
+        # 触发自己未学习的技能,直接加载自身的被动效果,如额外子技能等
         if connSkill and not isinstance(connSkill, IpyGameDataPY.IPY_Skill) and self._objID == connSkill.GetObjID() \
-            and connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
+            and connSkill.GetSkillID() not in self._skillIDList:
             skillID = connSkill.GetSkillID()
             if skillID not in self._affectSkillEnhanceDict:
                 effDict = {}
@@ -81,15 +83,17 @@
                         
                     key = (tWay, tSrc)
                     if key not in effDict:
-                        effDict[key] = {}
-                    effList = effDict[key]
-                    if effectID not in effList:
-                        effList.append(effList)
+                        effDict[key] = []
+                    effIDList = effDict[key]
+                    if effectID not in effIDList:
+                        effIDList.append(effectID)
                 self._affectSkillEnhanceDict[skillID] = effDict
+                GameWorld.DebugLogEx("加载未学技能被动: objID=%s,skillID=%s,%s", self._objID, skillID, effDict)
                 
+            key = (triggerWay, ChConfig.TriggerSrc_SkillSelf)
             effDict = self._affectSkillEnhanceDict[skillID]
-            if triggerWay in effDict:
-                effList.append(["skill", skillID, 0, effDict[triggerWay]])
+            if key in effDict:
+                effList.append(["skill", skillID, 0, effDict[key]])
                 
         if triggerWay not in self._skillTriggerWayList and triggerWay not in self._buffTriggerWayList:
             return effList
@@ -143,6 +147,10 @@
             curSkill = skillManager.GetSkillByIndex(index)
             if not curSkill:
                 continue
+            skillID = curSkill.GetSkillID()
+            # 附加添加已学技能,用于判断是否自身技能
+            if skillID not in self._skillIDList:
+                self._skillIDList.append(skillID)
             for index in xrange(curSkill.GetEffectCount()):
                 curEffect = curSkill.GetEffect(index)
                 effectID = curEffect.GetEffectID()
@@ -182,6 +190,11 @@
         effDict[skillID].append(effectID)
         if triggerWay not in self._skillTriggerWayList:
             self._skillTriggerWayList.append(triggerWay)
+            
+        # 加载不死技能效果
+        if triggerWay == ChConfig.TriggerWay_NoDead:
+            self.noDeadSkill = curSkill
+            
         return
         
     def RefreshBuffPassiveEffect(self):
@@ -348,6 +361,7 @@
         self._ipyData = ipyData
         self._skillID = self._ipyData.GetSkillID()
         self._skillTypeID = self._ipyData.GetSkillTypeID()
+        self._cdTime = self._ipyData.GetCoolDownTime()
         self._effList = [] # [Effect, ...]
         self._effDict = {} # {(effID, triggerWay):Effect, ...} ,确保唯一,同个技能可能配置相同的效果ID
         for num in range(1, 1 + 3):
@@ -393,7 +407,7 @@
             return self._effDict[(effID, triggerWay)]
     def GetConnSkill(self): return self._ipyData.GetConnSkill()
     def GetCoolDownInit(self): return self._ipyData.GetCoolDownInit()
-    def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
+    def GetCoolDownTime(self): return self._cdTime
     def GetBuffStateLimit(self): return self._ipyData.GetBuffStateLimit()
     def GetCurBuffState(self): return self._ipyData.GetCurBuffState()
     def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
@@ -501,7 +515,7 @@
         return
     
     def GetBuffCount(self): return len(self._buffList)
-    def GetBuffByIndex(self, index): return self._buffList[index]
+    def GetBuffByIndex(self, index): return self._buffList[index] if len(self._buffList) > index else None
     
     def AddBuff(self, skillID):
         buff = None
@@ -579,16 +593,25 @@
             if buff.GetOwnerID() == ownerID:
                 return buff
         return
-    def FindBuffByState(self, state):
+    def FindBuffByState(self, state, ownerID=0):
         ## 查找某种buff状态的buff
+        # @param ownerID: 可指定获取归属于某个对象ID的buff
         if state not in self._buffStateDict:
             return
         buffIDList = self._buffStateDict[state]
         if not buffIDList:
             return
-        buffID = buffIDList[0]
-        if buffID in self._buffIDDict:
-            return self._buffIDDict[buffID]
+        if ownerID:
+            for buffID in buffIDList:
+                if buffID not in self._buffIDDict:
+                    continue
+                buff = self._buffIDDict[buffID]
+                if buff.GetOwnerID() == ownerID:
+                    return buff
+        else:
+            buffID = buffIDList[0]
+            if buffID in self._buffIDDict:
+                return self._buffIDDict[buffID]
     def FindBuffListByState(self, state):
         ## 查找某种buff状态的buff列表
         if state not in self._buffStateDict:
@@ -636,6 +659,7 @@
         self._skillData = SklllData(ipyData)
         self._skillID = self._skillData.GetSkillID()
         self._skillTypeID = self._skillData.GetSkillTypeID()
+        self._cdTime = self._skillData.GetCoolDownTime()
         self._remainTime = 0
         self._batType = 0 # 战斗类型,普通、连击、反击、追击等
         self._tagObjList = [] # 本次技能主要目标列表 [BatObj, ...]
@@ -646,6 +670,7 @@
         self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
         self._bySkill = None # 由哪个技能触发的
         self._byBuff = None # 由哪个buff触发的
+        self._byTriggerWay = 0 # 由哪个被动方式触发的
         self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
         self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
         
@@ -671,6 +696,7 @@
         self._effIgnoreObjIDList = []
         self._bySkill = None
         self._byBuff = None
+        self._byTriggerWay = 0
         self._afterLogicList = []
         self.ClearHurtObj()
         return
@@ -701,7 +727,7 @@
     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 GetCoolDownTime(self): return self._cdTime
     def GetBuffStateLimit(self): return self._skillData.GetBuffStateLimit()
     def GetCurBuffState(self): return self._skillData.GetCurBuffState()
     def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
@@ -710,7 +736,7 @@
     def GetLayerMax(self): return self._skillData.GetLayerMax()
     def GetBuffRepeat(self): return self._skillData.GetBuffRepeat() # Buff叠加规则
     def GetDispersedLimit(self): return self._skillData.GetDispersedLimit() # 驱散限制
-    def GetBuffRetain(self): return self._ipyData.GetBuffRetain()
+    def GetBuffRetain(self): return self._skillData.GetBuffRetain()
     def GetFightPower(self): return self._skillData.GetFightPower()
     
     ## ---------------------------------- 非技能表内容 ----------------------------------
@@ -722,6 +748,8 @@
     def SetBySkill(self, bySkill): self._bySkill = bySkill
     def GetByBuff(self): return self._byBuff
     def SetByBuff(self, byBuff): self._byBuff = byBuff
+    def GetByTriggerWay(self): return self._byTriggerWay
+    def SetByTriggerWay(self, byTriggerWay): self._byTriggerWay = byTriggerWay
     def GetTagObjList(self): return self._tagObjList # 技能主要目标列表
     def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
     def GetTagObjListEx(self): return self._tagObjListEx # 技能额外目标列表
@@ -862,10 +890,10 @@
 class BatObj():
     ## 战斗实体对象数据,目前与某个NPCObj绑定
     
-    def __init__(self):
+    def __init__(self, objID):
         self.tfGUID = "" # 所属的某场回合战斗的guid
         self.ownerID = 0 # 所属玩家ID,可能为0,0代表非玩家的战斗实体
-        self.objID = 0
+        self.objID = objID
         self.objName = ""
         self.npcID = 0
         self.heroID = 0
@@ -884,6 +912,7 @@
         self._hp = 0 # 当前生命值
         self._xp = 0 # 当前怒气值
         self._isAlive = True # 是否活着
+        self._killer = None # 被谁击杀的
         self._initAttrDict = {} # 初始化时的属性,固定不变,初始化时已经算好的属性  {attrID:value, ...}
         self._batAttrDict = {} # 实际战斗属性,包含buff层级的实际属性 {attrID:+-value, ...} value可能是负值
         self._skillTempAttrDict = {} # 某次技能释放中临时的属性增减 {attrID:+-value, ...} value可能是负值
@@ -1007,9 +1036,16 @@
     def SetLV(self, lv): self.lv = lv
     def GetStar(self): return self._star
     def SetStar(self, star): self._star = star
-    def GetDictByKey(self, key): return self._kvDict.get(key, 0)
-    def SetDict(self, key, value): self._kvDict[key] = value
-    
+    def GetDictByKey(self, key): 
+        if key in self._kvDict:
+            return self._kvDict[key]
+        return 0
+    def SetDict(self, key, value):
+        if not value:
+            self._kvDict.pop(key, None)
+        else:
+            self._kvDict[key] = value
+            
     def GetSkillManager(self): return self._skillMgr
     def GetBuffManager(self):return self._buffMgr
     def GetPassiveEffManager(self):return self._passiveEffMgr
@@ -1057,6 +1093,17 @@
             return False
         return True
     
+    def CanNoDead(self):
+        '''是否还可触发不死效果
+        暂定单个武将最多只支持配置1个不死效果,且单场战斗最多触发x次,即按技能cd判断即可
+        '''
+        noDeadSkill = self._passiveEffMgr.noDeadSkill # 固定有被动触发
+        if not noDeadSkill:
+            return
+        if noDeadSkill.GetRemainTime():
+            return
+        return True
+    
     def GetSneerTagObj(self):
         ## 获取被嘲讽的目标,如果存在则一定是活着的目标
         buffIDList = self._buffMgr.GetStateBuffIDList(ChConfig.BatObjState_Sneer)
@@ -1074,12 +1121,15 @@
     
     # 战斗属性
     def IsAlive(self): return self._isAlive # 是否活着
-    def SetDead(self):
+    def SetDead(self, killer=None):
+        self._killer = killer
         self._isAlive = False
         self._hp = 0
     def SetRevive(self, hp):
+        self._killer = None
         self._isAlive = True
         self._hp = hp
+    def GetKiller(self): return self._killer
     def GetMaxHP(self): return int(self._batAttrDict.get(ChConfig.AttrID_MaxHP, 0))
     def SetMaxHP(self, maxHP, isNotify=False):
         maxHP = int(maxHP)
@@ -1221,8 +1271,7 @@
         newObjID = self.__getNewObjID()
         if not newObjID:
             return newBatObj
-        newBatObj = BatObj()
-        newBatObj.objID = newObjID
+        newBatObj = BatObj(newObjID)
         self.batObjDict[newObjID] = newBatObj
         GameWorld.DebugLogEx("添加战斗单位: objID=%s", newObjID)
         if False:

--
Gitblit v1.8.0