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 | 143 ++++++++++++++++++++++++++++-------------------
1 files changed, 86 insertions(+), 57 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 cd2e444..d7b8c8e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -23,7 +23,6 @@
import ChNetSendPack
import ShareDefine
import ChConfig
-import ObjPool
import TurnPassive
import TurnBuff
@@ -33,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, ...], ...}, ...}
@@ -57,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 = {}
@@ -82,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
@@ -144,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()
@@ -183,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):
@@ -306,13 +318,10 @@
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 = HurtObj()
hurtObj.SetObjID(tagID)
self._hurtListEx.append(hurtObj)
return hurtObj
@@ -352,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):
@@ -359,7 +369,7 @@
values = getattr(ipyData, "GetEffectValues%s" % num)()
triggerWay = getattr(ipyData, "GetTriggerWay%s" % num)()
triggerSrc = getattr(ipyData, "GetTriggerSrc%s" % num)()
- effect = ObjPool.GetPoolMgr().acquire(SkillEffect, effID, values, triggerWay, triggerSrc)
+ effect = SkillEffect(effID, values, triggerWay, triggerSrc)
self._effList.append(effect)
self._effDict[(effID, triggerWay)] = effect
return
@@ -397,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() # 持续时间
@@ -412,7 +422,7 @@
class PyBuff():
def __init__(self, ipyData):
- self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
+ self._skillData = SklllData(ipyData)
self._skillID = self._skillData.GetSkillID()
self._skillTypeID = self._skillData.GetSkillTypeID()
self._addTiming = 0 # 添加该buff时间点,0-自身回合前;1-自身回合后
@@ -425,7 +435,7 @@
self._value2 = 0
self._value3 = 0
self._isCopy = 0 # 是否复制的buff
- self._effExDict = {} # 效果ID额外数值 {effID:value, ...} # 计算方式取决于本buff技能中属性效果ID的配置
+ self._effExDict = {} # 效果ID额外数值 {(effID, calcType):value, ...} # 计算方式取决于本buff技能中属性效果ID的配置
self._haloObjIDList = [] # 光环有效目标ID列表 [objID, ...],ownerID为自己时即为光源,包含光源
return
@@ -469,11 +479,8 @@
def SetValue3(self, value): self._value3 = value
def GetIsCopy(self): return self._isCopy
def SetIsCopy(self, isCopy): self._isCopy = isCopy
- def GetEffectValueEx(self, effID):
- if effID in self._effExDict:
- return self._effExDict[effID]
def ResetEffectValueEx(self): self._effExDict = {}
- def AddEffectValueEx(self, effID, valueEx): self._effExDict[effID] = self._effExDict.get(effID, 0) + valueEx
+ def AddEffectValueEx(self, effID, valueEx, calcType=1): self._effExDict[(effID, calcType)] = self._effExDict.get((effID, calcType), 0) + valueEx
def GetEffectExDict(self): return self._effExDict
def GetHaloObjIDList(self): return self._haloObjIDList
def SetHaloObjIDList(self, haloObjIDList): self._haloObjIDList = haloObjIDList
@@ -500,9 +507,6 @@
return
def ClearBuff(self):
- poolMgr = ObjPool.GetPoolMgr()
- for buff in self._buffList:
- poolMgr.release(buff)
self._buffList = []
self._buffIDDict = {}
self._skillTypeIDBuffIDs = {}
@@ -511,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
@@ -522,7 +526,7 @@
self._buffID += 1
buffID = self._buffID
- buff = ObjPool.GetPoolMgr().acquire(PyBuff, ipyData)
+ buff = PyBuff(ipyData)
buff.SetBuffID(buffID)
self._buffList.append(buff)
@@ -558,8 +562,6 @@
if not buffIDList:
self._skillTypeIDBuffIDs.pop(skillTypeID)
break
- if release:
- ObjPool.GetPoolMgr().release(buff)
return
def GetBuff(self, buffID):
@@ -591,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:
@@ -645,9 +656,10 @@
def __init__(self, ipyData, objID):
self._objID = objID # 该技能谁的
- self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
+ 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, ...]
@@ -658,6 +670,7 @@
self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
self._bySkill = None # 由哪个技能触发的
self._byBuff = None # 由哪个buff触发的
+ self._byTriggerWay = 0 # 由哪个被动方式触发的
self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
@@ -683,6 +696,7 @@
self._effIgnoreObjIDList = []
self._bySkill = None
self._byBuff = None
+ self._byTriggerWay = 0
self._afterLogicList = []
self.ClearHurtObj()
return
@@ -713,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() # 持续时间
@@ -722,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()
## ---------------------------------- 非技能表内容 ----------------------------------
@@ -734,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 # 技能额外目标列表
@@ -754,21 +770,18 @@
return
def ClearHurtObj(self):
## 清空伤血统计
- 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, isEx=False):
## 添加某个伤血
# @param isEx: 是否额外伤血
- hurtObj = ObjPool.GetPoolMgr().acquire(HurtObj)
+ hurtObj = HurtObj()
hurtObj.SetObjID(tagID)
if isEx:
self._hurtListEx.append(hurtObj)
@@ -830,9 +843,6 @@
return
def SkillReset(self):
- poolMgr = ObjPool.GetPoolMgr()
- for skill in self._skillList:
- poolMgr.release(skill)
self._skillList = []
self._skillDict = {}
return
@@ -865,7 +875,7 @@
self.__deleteSkill(curSkill)
# 学新技能
- curSkill = ObjPool.GetPoolMgr().acquire(PySkill, ipyData, self._batObj.GetID())
+ curSkill = PySkill(ipyData, self._batObj.GetID())
self._skillDict[skillID] = curSkill
self._skillList.append(curSkill)
return curSkill
@@ -875,16 +885,15 @@
self._skillDict.pop(skillID, None)
if curSkill in self._skillList:
self._skillList.remove(curSkill)
- ObjPool.GetPoolMgr().release(curSkill)
return
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
@@ -903,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可能是负值
@@ -912,9 +922,9 @@
self._skillHappenFailCntDict = {} # 技能累计概率触发次数,使用成功后重置 {skillID:failCnt, ...}
self._skillUseCntDict = {} # 技能累计使用次数 {skillID:useCnt, ...}
self._skillTurnUseCntDict = {} # 技能单回合累计使用次数 {skillID:useCnt, ...}
- self._skillMgr = ObjPool.GetPoolMgr().acquire(SkillManager, self)
- self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager, self)
- self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self)
+ self._skillMgr = SkillManager(self)
+ self._buffMgr = BuffManager(self)
+ self._passiveEffMgr = PassiveEffManager(self)
self._lastHurtValue = 0
self._harmSelfHP = 0 # 自残值
self._mainTagIDList = [] # 主技能目标ID列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
@@ -1026,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
@@ -1076,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)
@@ -1093,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)
@@ -1240,8 +1271,7 @@
newObjID = self.__getNewObjID()
if not newObjID:
return newBatObj
- newBatObj = ObjPool.GetPoolMgr().acquire(BatObj)
- newBatObj.objID = newObjID
+ newBatObj = BatObj(newObjID)
self.batObjDict[newObjID] = newBatObj
GameWorld.DebugLogEx("添加战斗单位: objID=%s", newObjID)
if False:
@@ -1274,7 +1304,6 @@
# turnFight.addBatPack(clientPack)
# 最后回收对象
- ObjPool.GetPoolMgr().release(batObj)
if objID not in self._freeIDList: # 回收ID,重复利用
self._freeIDList.append(objID)
return
@@ -1298,7 +1327,7 @@
turnFight = TurnAttack.GetTurnFightMgr().getTurnFight(batObj.GetTFGUID())
if not turnFight:
return
- clientPack = ObjPool.GetPoolMgr().acquire(ChNetSendPack.tagObjInfoRefresh)
+ clientPack = ChNetSendPack.tagObjInfoRefresh()
clientPack.ObjID = batObj.GetID()
clientPack.RefreshType = refreshType
if isBig:
--
Gitblit v1.8.0