From 828ac10fd533a60f7f2da90a526e42490cd8537f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 22 十月 2025 11:37:52 +0800
Subject: [PATCH] 16 卡牌服务端(删除反外挂验证)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 151 ++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 122 insertions(+), 29 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 2297e4b..5437571 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -37,17 +37,27 @@
self._AffectBuffDict = {} # 被动buff {(触发方式, 有效来源):{buffID:[effID, ...], ...}, ...}
return
- def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0):
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
+ self._batObj = None
+ return
+
+ def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0, connBuff=None):
'''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
优先级之后有需要再扩展
@return: [["skill/buff", skillID/buffID, effIDList], ...]
'''
effList = []
- if not connSkillTypeID and connSkill:
- connSkillTypeID = connSkill.GetSkillTypeID()
-
- if connSkill and self._batObj.GetID() == connSkill.GetObjID():
+ if not connSkillTypeID:
+ if connSkill:
+ connSkillTypeID = connSkill.GetSkillTypeID()
+ elif connBuff:
+ skillData = connBuff.GetSkillData()
+ connSkillTypeID = skillData.GetSkillTypeID()
+
+ # SkillData 对象暂时没有 GetObjID
+ if connSkill and hasattr(connSkill, "GetObjID") and self._batObj.GetID() == connSkill.GetObjID():
skillID = connSkill.GetSkillID()
skillManager = self._batObj.GetSkillManager()
# 非对象身上的技能,读取本技能被动触发的效果,一般是主技能拆分的子技能
@@ -58,14 +68,18 @@
effectID = effect.GetEffectID()
if effectID == 0:
continue
- triggerWay = effect.GetTriggerWay()
- triggerSrc = effect.GetTriggerSrc()
- if not triggerWay:
+ tWay = effect.GetTriggerWay()
+ tSrc = effect.GetTriggerSrc()
+ if not tWay:
continue
- if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+ if tWay in ChConfig.TriggerWayNoLoadList:
continue
- if triggerSrc != ChConfig.TriggerSrc_SkillSelf:
+ if tSrc != ChConfig.TriggerSrc_SkillSelf:
# 仅添加本技能的
+ continue
+ if tWay == ChConfig.TriggerWay_CalcEffValue:
+ tWay = "%s_%s" % (tWay, effectID)
+ if tWay != triggerWay:
continue
effIDList.append(effectID)
if effIDList:
@@ -124,7 +138,7 @@
triggerSrc = effect.GetTriggerSrc()
if not triggerWay:
return
- if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+ if triggerWay in ChConfig.TriggerWayNoLoadList:
return
if triggerSrc in [ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_BuffSelf]:
# buff有效的不加进来
@@ -174,7 +188,7 @@
triggerSrc = effect.GetTriggerSrc()
if not triggerWay:
return
- if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+ if triggerWay in ChConfig.TriggerWayNoLoadList:
return
if triggerSrc in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
# 技能有效的不加进来
@@ -215,6 +229,10 @@
def __init__(self):
self.Clear()
+ return
+
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
return
def Clear(self):
@@ -262,6 +280,10 @@
#self._triggerParams = triggerParams if triggerParams else []
return
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
+ return
+
def GetEffectID(self): return self._effID
def GetEffectValue(self, index): return self._values[index] if len(self._values) > index else 0
def GetEffectValueCount(self): return len(self._values)
@@ -269,8 +291,6 @@
def GetTriggerWay(self): return self._triggerWay
def GetTriggerSrc(self): return self._triggerSrc
#def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
-
-EmptyEffect = SkillEffect(0, [])
class SklllData():
@@ -287,6 +307,10 @@
effect = ObjPool.GetPoolMgr().acquire(SkillEffect, effID, values, triggerWay, triggerSrc)
self._effList.append(effect)
self._effDict[(effID, triggerWay)] = effect
+ return
+
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
return
def GetIpyData(self): return self._ipyData
@@ -311,16 +335,16 @@
def GetHappenRate(self): return self._ipyData.GetHappenRate() # 触发概率
def GetEffect(self, index): return self._effList[index] if len(self._effList) > index else 0
def GetEffectCount(self): return len(self._effList)
- def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), EmptyEffect)
+ def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), None)
def GetConnSkill(self): return self._ipyData.GetConnSkill()
def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
- def GetIgnoreStates(self): return self._ipyData.GetIgnoreStates() # 无视限制列表
+ def GetBuffStateLimit(self): return self._ipyData.GetBuffStateLimit()
def GetCurBuffState(self): return self._ipyData.GetCurBuffState()
def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
def GetLayerCnt(self): return self._ipyData.GetLayerCnt()
def GetLayerMax(self): return self._ipyData.GetLayerMax()
def GetBuffRepeat(self): return self._ipyData.GetBuffRepeat() # Buff叠加规则
- def GetDieContinue(self): return self._ipyData.GetDieContinue() # Buff死亡存在
+ def GetDispersedLimit(self): return self._ipyData.GetDispersedLimit() # 驱散限制
def GetFightPower(self): return self._ipyData.GetFightPower()
def GetSkillMotionName(self): return self._ipyData.GetSkillMotionName()
@@ -336,6 +360,10 @@
self._value1 = 0 # 值需要通知前端,开发时注意20亿问题
self._value2 = 0
self._value3 = 0
+ return
+
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
return
def GetSkillData(self): return self._skillData
@@ -376,6 +404,11 @@
self._buffStateDict = {} # buff影响的状态 {state:[buffID, ...], ...}
self._buffID = 0 # 该对象的唯一buffID,递增,不同对象buffID可重复,buffID非skillID,不同buffID的skillID可能一样
# 该项目设定同一个对象可能同时存在多个相同skillID的buff,独立算CD
+ return
+
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
+ self._batObj = None
return
def ClearBuff(self):
@@ -465,6 +498,15 @@
return
buffID = buffIDList[0]
return self._buffIDDict.get(buffID, None)
+ def FindBuffListByState(self, state):
+ ## 查找某种buff状态的buff列表
+ buffIDList = self._buffStateDict.get(state, [])
+ buffs = []
+ for buffID in buffIDList:
+ if buffID not in self._buffIDDict:
+ continue
+ buffs.append(self._buffIDDict[buffID])
+ return buffs
def AddBuffState(self, state, buffID):
## 添加buff影响的状态,ChConfig.BatObjStateList
@@ -500,8 +542,10 @@
self._remainTime = 0
self._batType = 0 # 战斗类型,普通、连击、反击、追击等
self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
+ self._killObjList = [] # 本次技能击杀目标列表 [BatObj, ...]
self._hurtList = [] # 本次伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
self._bySkill = None # 由哪个技能触发的
+ self._byBuff = None # 由哪个buff触发的
self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
# 连击相关
@@ -511,15 +555,25 @@
self._parryTagIDDict = {} # 单次连续连击中对方已格挡次数 {tagID:parryNum, ...}
return
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
+ self.ResetUseRec()
+ return
+
def ResetUseRec(self):
+ ## 重置技能使用记录
+ ## 注:有用到对象池相关对象的一定要重置,不然再回收技能对象时会连同该技能下的所有用到的对象池对象一并回收,导致后续使用对象错误
self._batType = 0
self._tagObjList = []
+ self._killObjList = []
self._bySkill = None
+ self._byBuff = None
self._afterLogicList = []
self.ClearHurtObj()
return
def GetObjID(self): return self._objID
+ def GetSkillData(self): return self._skillData
def GetSkillID(self): return self._skillData.GetSkillID()
def GetSkillTypeID(self): return self._skillData.GetSkillTypeID()
def GetSkillLV(self): return self._skillData.GetSkillLV()
@@ -544,13 +598,13 @@
def GetEffectByID(self, effID, triggerWay=0): return self._skillData.GetEffectByID(effID, triggerWay)
def GetConnSkill(self): return self._skillData.GetConnSkill()
def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
- def GetIgnoreStates(self): return self._skillData.GetIgnoreStates() # 无视限制列表
+ def GetBuffStateLimit(self): return self._skillData.GetBuffStateLimit()
def GetCurBuffState(self): return self._skillData.GetCurBuffState()
def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
def GetLayerCnt(self): return self._skillData.GetLayerCnt()
def GetLayerMax(self): return self._skillData.GetLayerMax()
def GetBuffRepeat(self): return self._skillData.GetBuffRepeat() # Buff叠加规则
- def GetDieContinue(self): return self._skillData.GetDieContinue() # Buff死亡存在
+ def GetDispersedLimit(self): return self._skillData.GetDispersedLimit() # 驱散限制
def GetFightPower(self): return self._skillData.GetFightPower()
def GetSkillMotionName(self): return self._skillData.GetSkillMotionName()
@@ -563,8 +617,12 @@
def SetBatType(self, batType): self._batType = batType
def GetBySkill(self): return self._bySkill
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 SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
+ def GetKillObjList(self): return self._killObjList # 击杀目标列表
+ def SetKillObjList(self, killObjList): self._killObjList = killObjList
def GetAfterLogicList(self): return self._afterLogicList
def AddAfterLogic(self, logicType, logicData):
'''添加技能释放后需要处理额外逻辑
@@ -630,6 +688,11 @@
self._skillDict = {} # {skillID:PySkill, ...}
return
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
+ self._batObj = None
+ return
+
def SkillReset(self):
poolMgr = ObjPool.GetPoolMgr()
for skill in self._skillList:
@@ -692,6 +755,7 @@
self.atkDistType = 0
self.specialty = 0 # 特长
self.sex = 0
+ self.job = 0
self.lv = 1
self.fightPower = 0
self.faction = 0 # 所属阵营,一般只有双方阵营, 1 或 2,发起方默认1
@@ -718,6 +782,10 @@
self.cureStat = 0 # 治疗统计
return
+ def onRelease(self):
+ ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
+ return
+
def InitBatAttr(self, initAttrDict, initXP=0):
'''初始化战斗属性
@param initAttrDict: 已经算好的在阵容中的属性,包含羁绊、阵容属性等,战斗中只要计算buff属性即可
@@ -738,16 +806,31 @@
## 回合重置
self._skillTurnUseCntDict = {}
- def UpdInitBatAttr(self, initAttrDict, skillIDList):
+ def UpdInitBatAttr(self, initAttrDict, skillIDList=None):
## 更新战斗属性,一般只有主阵容需要更新,战斗中养成、装备变化等引起的主阵容属性变更时需要实时更新
self._initAttrDict = initAttrDict
learnNewSkill = False
- for skillID in skillIDList:
- if self._skillMgr.LearnSkillByID(skillID):
- learnNewSkill = True
+ if skillIDList:
+ for skillID in skillIDList:
+ if self._skillMgr.LearnSkillByID(skillID):
+ learnNewSkill = True
TurnBuff.RefreshBuffAttr(self)
if learnNewSkill: # 有学新技能时重刷技能被动
self._passiveEffMgr.RefreshSkillPassiveEffect()
+ return
+
+ def GMSetBatAttr(self, attrID, attrValue):
+ ## GM设置战斗属性
+ self._initAttrDict[attrID] = attrValue # 需要同步设置初始化属性,防止刷属性后被重置
+ if attrID == ChConfig.AttrID_HP:
+ self.SetHP(attrValue, True)
+ if attrValue > self.GetMaxHP():
+ self._initAttrDict[ChConfig.AttrID_MaxHP] = attrValue
+ self.SetMaxHP(attrValue, True)
+ elif attrID == ChConfig.AttrID_XP:
+ self.SetXP(attrValue, True)
+ else:
+ self.SetBatAttrValue(attrID, attrValue)
return
def ResetBattleEffect(self):
@@ -772,6 +855,8 @@
def SetSpecialty(self, specialty): self.specialty = specialty
def GetSex(self): return self.sex
def SetSex(self, sex): self.sex = sex
+ def GetJob(self): return self.job
+ def SetJob(self, job): self.job = job
def GetNPCID(self): return self.npcID # 如果是NPC战斗单位,则该值非0
def SetNPCID(self, npcID): self.npcID = npcID # 设置所属的NPCID
def GetHeroID(self): return self.heroID
@@ -820,18 +905,25 @@
return True
return False
- def IsInControlled(self):
- ## 是否被控制中
- for state in ChConfig.InControlledStateList:
+ def IsInControlled(self): return self.IsInBuffStateGroup(1) or self.IsInBuffStateGroup(2) # 是否被控制中
+ def IsInControlledHard(self): return self.IsInBuffStateGroup(1) # 是否被硬控中
+ def IsInBuffStateGroup(self, buffStateGroup):
+ '''是否在某个状态组中
+ 已定义的组: 1 - 硬控组;2 - 软控组;3 - 限制普攻组;4 - 限制怒技组;5 - 限制被动动态组
+ '''
+ buffStateGroupDict = IpyGameDataPY.GetFuncEvalCfg("BuffStateGroup", 1, {})
+ if buffStateGroup not in buffStateGroupDict:
+ return
+ for state in buffStateGroupDict[buffStateGroup]:
if self._buffMgr.IsInBuffState(state):
- return True
- return False
+ return state
+ return
def CanAction(self):
## 是否可以行动
if not self.IsAlive():
return False
- if self.IsInControlled():
+ if self.IsInControlledHard():
return False
return True
@@ -923,6 +1015,7 @@
## 统计承伤
self.defStat += lostHP
return self.defStat
+ def GetStatDefValue(self): return self.defStat # 获取累计总承伤
def StatCureValue(self, cureValue):
## 统计治疗
--
Gitblit v1.8.0