From 14b330f7dd90ab09f2a7a00c2bcf3a8008e0abd3 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 19 八月 2025 16:13:06 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(删除4012效果)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 252 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 212 insertions(+), 40 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 cd9560f..f546b05 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -27,6 +27,139 @@
import TurnPassive
import TurnBuff
+class PassiveEffManager():
+ ## 被动效果管理器
+
+ def __init__(self, batObj):
+ self._batObj = batObj
+ # 被影响的技能ID: 0为所有技能
+ self._AffectSkillDict = {} # 被动技能 {(触发方式, 被影响的技能ID):{技能ID:[effID, ...], ...}, ...}
+ self._AffectBuffDict = {} # 被动buff {(触发方式, 被影响的技能ID):{buffID:[effID, ...], ...}, ...}
+ return
+
+ def GetPassiveEffByTrigger(self, triggerWay, connSkill=None):
+ '''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
+ 优先级之后有需要再扩展
+ @return: [["skill/buff", skillID/buffID, effIDList], ...]
+ '''
+ connSkillID = connSkill.GetSkillTypeID() if connSkill else 0
+ effList = []
+ # 技能
+ key = (triggerWay, connSkillID)
+ if key in self._AffectSkillDict:
+ effDict = self._AffectSkillDict[key]
+ for skillID, effIDList in effDict.items():
+ effList.append(["skill", skillID, effIDList])
+ if connSkillID != 0:
+ key = (triggerWay, 0)
+ effDict = self._AffectSkillDict.get(key, {})
+ for skillID, effIDList in effDict.items():
+ effList.append(["skill", skillID, effIDList])
+
+ # buff
+ key = (triggerWay, connSkillID)
+ if key in self._AffectBuffDict:
+ effDict = self._AffectBuffDict[key]
+ for buffID, effIDList in effDict.items():
+ effList.append(["buff", buffID, effIDList])
+ if connSkillID != 0:
+ key = (triggerWay, 0)
+ effDict = self._AffectBuffDict.get(key, {})
+ for buffID, effIDList in effDict.items():
+ effList.append(["buff", buffID, effIDList])
+
+ return effList
+
+ def RefreshSkillPassiveEffect(self):
+ self._AffectSkillDict = {}
+
+ skillManager = self._batObj.GetSkillManager()
+ for index in range(0, skillManager.GetSkillCount()):
+ curSkill = skillManager.GetSkillByIndex(index)
+ if not curSkill:
+ continue
+ for index in xrange(curSkill.GetEffectCount()):
+ curEffect = curSkill.GetEffect(index)
+ effectID = curEffect.GetEffectID()
+ if effectID == 0:
+ continue
+ self.AddSkillPassiveEffect(curSkill, curEffect)
+
+ return self._AffectSkillDict
+
+ def AddSkillPassiveEffect(self, curSkill, effect):
+ ## 添加技能被动效果
+ triggerWay = effect.GetTriggerWay()
+ triggerSrc = effect.GetTriggerSrc()
+ if not triggerWay or triggerSrc != 1:
+ return
+
+ skillID = curSkill.GetSkillID()
+ connSkillID = curSkill.GetConnSkill()
+ #priority = curSkill.GetPriority()
+
+ effectID = effect.GetEffectID()
+
+ key = (triggerWay, connSkillID)
+ if key not in self._AffectSkillDict:
+ self._AffectSkillDict[key] = {}
+ effDict = self._AffectSkillDict[key]
+ if skillID not in effDict:
+ effDict[skillID] = []
+ effDict[skillID].append(effectID)
+ return
+
+ def RefreshBuffPassiveEffect(self):
+ self._AffectBuffDict = {}
+ buffMgr = self._batObj.GetBuffManager()
+ for index in range(buffMgr.GetBuffCount()):
+ buff = buffMgr.GetBuffByIndex(index)
+ if not buff:
+ continue
+ skillData = buff.GetSkillData()
+ for index in xrange(skillData.GetEffectCount()):
+ curEffect = skillData.GetEffect(index)
+ effectID = curEffect.GetEffectID()
+ if effectID == 0:
+ continue
+ self.AddBuffPassiveEffect(buff, skillData, curEffect)
+
+ return self._AffectBuffDict
+
+ def AddBuffPassiveEffect(self, buff, skillData, effect):
+ '''添加Buff被动效果
+ 同个buff的技能ID如果叠加规则是独立的,那么可能同时存在多个相同技能效果的buff
+ 如果触发效果,就要触发多次,所以buff的效果以buffID为key
+ '''
+ triggerWay = effect.GetTriggerWay()
+ triggerSrc = effect.GetTriggerSrc()
+ if not triggerWay or triggerSrc != 2:
+ return
+
+ buffID = buff.GetBuffID()
+ connSkillID = skillData.GetConnSkill()
+ #priority = skillData.GetPriority()
+
+ effectID = effect.GetEffectID()
+ key = (triggerWay, connSkillID)
+ if key not in self._AffectBuffDict:
+ self._AffectBuffDict[key] = {}
+ effDict = self._AffectBuffDict[key]
+ if buffID not in effDict:
+ effDict[buffID] = []
+ effDict[buffID].append(effectID)
+ return
+
+ def DelBuffPassiveEffect(self, buffID):
+ ## 删除Buff被动效果
+ for key, effDict in self._AffectBuffDict.items():
+ if buffID not in effDict:
+ continue
+ effDict.pop(buffID)
+ if not effDict:
+ self._AffectBuffDict.pop(key)
+ return
+
class HurtObj():
## 伤血统计
@@ -54,7 +187,7 @@
return
def HaveHurtType(self, hurtType):
## 判断是否存在某种伤血类型
- return self._hurtTypes&pow(2, hurtType)
+ return self._hurtTypes & pow(2, hurtType)
def GetHurtHP(self): return self._hurtHP
def SetHurtHP(self, hurtHP): self._hurtHP = hurtHP
def GetLostHP(self): return self._lostHP
@@ -66,26 +199,40 @@
def GetBounceHP(self): return self._bounceHP
def SetBounceHP(self, bounceHP): self._bounceHP = bounceHP
-class Effect():
+class SkillEffect():
- def __init__(self, effID, values):
+ def __init__(self, effID, values, triggerWay=0, triggerSrc=0, triggerParams=None):
self._effID = effID
self._values = values
+ self._triggerWay = triggerWay
+ self._triggerSrc = triggerSrc
+ self._triggerParams = triggerParams if triggerParams else []
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)
+ 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():
def __init__(self, ipyData):
self._ipyData = ipyData
self._effList = [] # [Effect, ...]
+ self._effDict = {} # {effID:Effect, ...}
for num in range(1, 1 + 3):
effID = getattr(ipyData, "GetEffectID%s" % num)()
values = getattr(ipyData, "GetEffectValues%s" % num)()
- self._effList.append(ObjPool.GetPoolMgr().acquire(Effect, effID, values))
+ triggerWay = getattr(ipyData, "GetTriggerWay%s" % num)()
+ triggerSrc = getattr(ipyData, "GetTriggerSrc%s" % num)()
+ triggerParams = getattr(ipyData, "GetTriggerParams%s" % num)()
+ effect = ObjPool.GetPoolMgr().acquire(SkillEffect, effID, values, triggerWay, triggerSrc, triggerParams)
+ self._effList.append(effect)
+ self._effDict[effID] = effect
return
def GetSkillID(self): return self._ipyData.GetSkillID()
@@ -101,12 +248,22 @@
def GetTagSelf(self): return self._ipyData.GetTagSelf() # 是否含自己
def GetTagAffect(self): return self._ipyData.GetTagAffect() # 目标细分
def GetTagCount(self): return self._ipyData.GetTagCount() # 目标个数
- def GetHappenRate(self): return self._ipyData.GetHappenRate() # 释放或添加几率
- def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
- def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
+ def GetCalcType(self): return self._ipyData.GetCalcType()
+ def GetSkillPer(self): return self._ipyData.GetSkillPer()
+ def GetSkillValue(self): return self._ipyData.GetSkillValue()
+ 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 GetConnSkill(self): return self._ipyData.GetConnSkill() # 关联技能
+ def GetEffectByID(self, effID): return self._effDict.get(effID, EmptyEffect)
+ def GetConnSkill(self): return self._ipyData.GetConnSkill()
+ def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
+ def GetIgnoreStates(self): return self._ipyData.GetIgnoreStates() # 无视限制列表
+ def GetBuffStates(self): return self._ipyData.GetBuffStates()
+ 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 GetEnhanceSkillList(self): return self._ipyData.GetEnhanceSkillList() # 额外触发的技能ID列表
def GetFightPower(self): return self._ipyData.GetFightPower()
@@ -117,6 +274,7 @@
self._buffID = 0
self._ownerID = 0
self._layer = 0
+ self._calcTime = 0
self._remainTime = 0
self._valueList = []
return
@@ -129,16 +287,19 @@
def SetOwnerID(self, ownerID): self._ownerID = ownerID
def GetLayer(self): return self._layer
def SetLayer(self, layer): self._layer = layer
+ def GetCalcTime(self): return self._calcTime
+ def SetCalcTime(self, calcTime): self._calcTime = calcTime
def GetRemainTime(self): return self._remainTime
def SetRemainTime(self, remainTime): self._remainTime = remainTime
- def SetValueList(self, valueList): self._valueList = valueList
- def GetValue(self, index):
+ def SetBuffValueList(self, valueList): self._valueList = valueList
+ def GetBuffValue(self, index):
return self._valueList[index] if len(self._valueList) > index else 0
class BuffManager():
## 战斗对象buff管理器
- def __init__(self):
+ def __init__(self, batObj):
+ self._batObj = batObj
self._buffList = [] # [PyBuff, ...]
self._buffIDDict = {} # {buffID:PyBuff, ...}
self._skillTypeIDBuffIDs = {} # 技能TypeID对应的buff {skillTypeID:[buffID, ...], ...}
@@ -158,12 +319,8 @@
return
def GetBuffCount(self): return len(self._buffList)
- def GetBuffByIndex(self, index):
- buff = self._buffList[index]
- #if False:
- # buff = PyBuff()
- return buff
-
+ def GetBuffByIndex(self, index): return self._buffList[index]
+
def AddBuff(self, skillID):
buff = None
ipyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
@@ -172,19 +329,18 @@
skillTypeID = ipyData.GetSkillTypeID()
self._buffID += 1
+ buffID = self._buffID
buff = ObjPool.GetPoolMgr().acquire(PyBuff, ipyData)
- buff.SetBuffID(self._buffID)
+ buff.SetBuffID(buffID)
self._buffList.append(buff)
- self._buffIDDict[self._buffID] = buff
+ self._buffIDDict[buffID] = buff
if skillTypeID not in self._skillTypeIDBuffIDs:
self._skillTypeIDBuffIDs[skillTypeID] = []
buffIDs = self._skillTypeIDBuffIDs[skillTypeID]
- if self._buffID not in buffIDs:
- buffIDs.append(self._buffID)
+ if buffID not in buffIDs:
+ buffIDs.append(buffID)
- #if False:
- # buff = PyBuff()
return buff
def DelBuff(self, buffID):
@@ -202,14 +358,7 @@
break
return
- def GetBuff(self, buffID):
- buff = None
- if buffID in self._buffIDDict:
- buff = self._buffIDDict[buffID]
- #if False:
- # buff = PyBuff()
- return buff
-
+ def GetBuff(self, buffID): return self._buffIDDict.get(buffID, None)
def FindBuffIDBySkillID(self, skillID):
## 返回该技能ID的所有buffID列表
skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
@@ -244,25 +393,34 @@
if buffID not in buffIDList:
return
buffIDList.remove(buffID)
- if not len(buffIDList):
+ if not buffIDList:
self._buffStateDict.pop(state)
GameWorld.DebugLog(" DelBuffState state=%s,buffID=%s,%s" % (state, buffID, self._buffStateDict))
return
- def IsInBuffState(self, state):
- ## 是否处于某种状态下
- return state in self._buffStateDict and len(self._buffStateDict[state]) > 0
+ def IsInBuffState(self, state): return state in self._buffStateDict ## 是否处于某种状态下
+ def GetStateBuffIDList(self, state): return self._buffStateDict.get(state, []) # 获取某种状态的所有buffID列表
+
class PySkill():
def __init__(self, ipyData):
self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
+ self._calcTime = 0
self._remainTime = 0
self._batType = 0 # 战斗类型,普通、连击、反击、追击等
self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
self._hurtList = [] # 本次伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
self._bySkill = None # 由哪个技能触发的
self._isEnhanceSkill = False # 是否由主技能额外触发的(非被动触发,即主技能的EnhanceSkillList字段中的技能)
+ return
+
+ def ResetUseRec(self):
+ self._batType = 0
+ self._tagObjList = []
+ self._bySkill = None
+ self._isEnhanceSkill = False
+ self.ClearHurtObj()
return
def GetSkillID(self): return self._skillData.GetSkillID()
@@ -278,16 +436,28 @@
def GetTagSelf(self): return self._skillData.GetTagSelf() # 是否含自己
def GetTagAffect(self): return self._skillData.GetTagAffect() # 目标细分
def GetTagCount(self): return self._skillData.GetTagCount() # 目标个数
- def GetHappenRate(self): return self._skillData.GetHappenRate() # 释放或添加几率
- def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
- def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
+ def GetCalcType(self): return self._skillData.GetCalcType()
+ def GetSkillPer(self): return self._skillData.GetSkillPer()
+ def GetSkillValue(self): return self._skillData.GetSkillValue()
+ def GetHappenRate(self): return self._skillData.GetHappenRate() # 触发概率
def GetEffect(self, index): return self._skillData.GetEffect(index)
def GetEffectCount(self): return self._skillData.GetEffectCount()
- def GetConnSkill(self): return self._skillData.GetConnSkill() # 关联技能
+ def GetEffectByID(self, effID): return self._skillData.GetEffectByID()
+ def GetConnSkill(self): return self._skillData.GetConnSkill()
+ def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
+ def GetIgnoreStates(self): return self._skillData.GetIgnoreStates() # 无视限制列表
+ def GetBuffStates(self): return self._skillData.GetBuffStates()
+ 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 GetEnhanceSkillList(self): return self._skillData.GetEnhanceSkillList() # 额外触发的技能ID列表
def GetFightPower(self): return self._skillData.GetFightPower()
## ---------------------------------- 非技能表内容 ----------------------------------
+ def GetCalcTime(self): return self._calcTime
+ def SetCalcTime(self, calcTime): self._calcTime = calcTime
def GetRemainTime(self): return self._remainTime
def SetRemainTime(self, remainTime): self._remainTime = remainTime
def GetBatType(self): return self._batType
@@ -392,7 +562,8 @@
self._skillUseCntDict = {} # 技能累计使用次数 {skillID:useCnt, ...}
self._skillTurnUseCntDict = {} # 技能单回合累计使用次数 {skillID:useCnt, ...}
self._skillMgr = ObjPool.GetPoolMgr().acquire(SkillManager)
- self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager)
+ self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager, self)
+ self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self)
# 统计
self.hurtStat = 0 # 输出统计
@@ -460,6 +631,7 @@
def GetSkillManager(self): return self._skillMgr
def GetBuffManager(self):return self._buffMgr
+ def GetPassiveEffManager(self):return self._passiveEffMgr
def GetCanAttack(self):
## 可否被攻击
--
Gitblit v1.8.0