From c63ffd10aecb12b2e09dae603cf9a0f824f6482c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 10 十二月 2025 15:46:15 +0800
Subject: [PATCH] 16 卡牌服务端(合成目标物品与材料物品不在同一背包时支持合成;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 70 ++++++++++++++++++++++++++--------
1 files changed, 53 insertions(+), 17 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 5e7ae6c..1a3d1bb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -35,6 +35,7 @@
# 被影响的技能ID: 0为所有技能
self._AffectSkillDict = {} # 被动技能 {(触发方式, 有效来源):{技能ID:[effID, ...], ...}, ...}
self._AffectBuffDict = {} # 被动buff {(触发方式, 有效来源):{buffID:[effID, ...], ...}, ...}
+ self._buffSkillIDDict = {} # {buffID:skillID, ...}
return
def onRelease(self):
@@ -45,7 +46,7 @@
def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0, connBuff=None):
'''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
优先级之后有需要再扩展
- @return: [["skill/buff", skillID/buffID, effIDList], ...]
+ @return: [["skill/buff", skillID, buffID, effIDList], ...]
'''
effList = []
@@ -75,7 +76,7 @@
if tWay in ChConfig.TriggerWayNoLoadList:
continue
if tSrc != ChConfig.TriggerSrc_SkillSelf:
- # 仅添加本技能的
+ # 非对象身上已学的技能时,仅添加本技能有效的
continue
if tWay == ChConfig.TriggerWay_CalcEffValue:
tWay = "%s_%s" % (tWay, effectID)
@@ -83,7 +84,7 @@
continue
effIDList.append(effectID)
if effIDList:
- effList.append(["skill", skillID, effIDList])
+ effList.append(["skill", skillID, 0, effIDList])
# 优先取关联技能的
if connSkillTypeID and connSkillTypeID not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_SkillSelf, ChConfig.TriggerSrc_BuffSelf]:
@@ -92,26 +93,26 @@
if key in self._AffectSkillDict:
effDict = self._AffectSkillDict[key]
for skillID, effIDList in effDict.items():
- effList.append(["skill", skillID, effIDList])
+ effList.append(["skill", skillID, 0, effIDList])
# buff
key = (triggerWay, connSkillTypeID)
if key in self._AffectBuffDict:
effDict = self._AffectBuffDict[key]
for buffID, effIDList in effDict.items():
- effList.append(["buff", buffID, effIDList])
+ effList.append(["buff", self._buffSkillIDDict.get(buffID, 0), buffID, effIDList])
# 所有技能有效的
key = (triggerWay, ChConfig.TriggerSrc_Skill)
effDict = self._AffectSkillDict.get(key, {})
for skillID, effIDList in effDict.items():
- effList.append(["skill", skillID, effIDList])
+ effList.append(["skill", skillID, 0, effIDList])
# 所有buff有效的
key = (triggerWay, ChConfig.TriggerSrc_Buff)
effDict = self._AffectBuffDict.get(key, {})
for buffID, effIDList in effDict.items():
- effList.append(["buff", buffID, effIDList])
+ effList.append(["buff", self._buffSkillIDDict.get(buffID, 0), buffID, effIDList])
return effList
@@ -140,7 +141,7 @@
return
if triggerWay in ChConfig.TriggerWayNoLoadList:
return
- if triggerSrc in [ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_BuffSelf]:
+ if effect.GetTriggerBuffEnable():
# buff有效的不加进来
return
@@ -190,8 +191,8 @@
return
if triggerWay in ChConfig.TriggerWayNoLoadList:
return
- if triggerSrc in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
- # 技能有效的不加进来
+ if not effect.GetTriggerBuffEnable():
+ # 非buff有效的不加进来
return
buffID = buff.GetBuffID()
@@ -212,6 +213,7 @@
effIDList = effDict[buffID]
if effectID not in effIDList:
effIDList.append(effectID)
+ self._buffSkillIDDict[buffID] = skillData.GetSkillID()
return
def DelBuffPassiveEffect(self, buffID):
@@ -222,6 +224,7 @@
effDict.pop(buffID)
if not effDict:
self._AffectBuffDict.pop(key)
+ self._buffSkillIDDict.pop(buffID, 0)
return
class HurtObj():
@@ -282,12 +285,13 @@
class SkillEffect():
- def __init__(self, effID, values, triggerWay=0, triggerSrc=0):
+ def __init__(self, effID, values, triggerWay=0, triggerSrcs=[]):
+ # @param triggerSrcs: 触发参数 [触发来源, buff时是否有效默认无效]
self._effID = effID
self._values = values
self._triggerWay = triggerWay
- self._triggerSrc = triggerSrc
- #self._triggerParams = triggerParams if triggerParams else []
+ self._triggerSrc = triggerSrcs[0] if len(triggerSrcs) > 0 else 0
+ self._triggerBuffEnable = triggerSrcs[1] if len(triggerSrcs) > 1 else 0
return
def onRelease(self):
@@ -300,8 +304,13 @@
def GetEffectValues(self): return self._values # 直接返回整个效果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
-
+ def GetTriggerBuffEnable(self):
+ if self.GetTriggerSrc() in [ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_BuffSelf]:
+ return True
+ if self._triggerBuffEnable:
+ return True
+ return False
+
class SklllData():
def __init__(self, ipyData):
@@ -313,7 +322,6 @@
values = getattr(ipyData, "GetEffectValues%s" % num)()
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)
self._effList.append(effect)
self._effDict[(effID, triggerWay)] = effect
@@ -357,6 +365,7 @@
def GetLayerMax(self): return self._ipyData.GetLayerMax()
def GetBuffRepeat(self): return self._ipyData.GetBuffRepeat() # Buff叠加规则
def GetDispersedLimit(self): return self._ipyData.GetDispersedLimit() or self._ipyData.GetSkillType() == ChConfig.Def_SkillType_Halo # 驱散限制
+ def GetBuffRetain(self): return self._ipyData.GetBuffRetain()
def GetFightPower(self): return self._ipyData.GetFightPower()
class PyBuff():
@@ -384,6 +393,8 @@
def GetSkillData(self): return self._skillData
def GetSkillID(self): return self._skillData.GetSkillID()
def GetCurBuffState(self): return self._skillData.GetCurBuffState()
+ def GetDispersedLimit(self): return self._skillData.GetDispersedLimit()
+ def GetBuffRetain(self): return self._skillData.GetBuffRetain()
def GetAddTiming(self): return self._addTiming
def SetAddTiming(self, addTiming):
self._addTiming = addTiming
@@ -653,6 +664,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 GetFightPower(self): return self._skillData.GetFightPower()
## ---------------------------------- 非技能表内容 ----------------------------------
@@ -823,6 +835,7 @@
self.sex = 0
self.job = 0
self.lv = 1
+ self._star = 0
self.fightPower = 0
self.faction = 0 # 所属阵营,一般只有双方阵营, 1 或 2,发起方默认1
self.lineupNum = 1 # 阵容位置编号,一般多V多时有用,通常默认1
@@ -835,6 +848,8 @@
self._skillTempAttrDict = {} # 某次技能释放中临时的属性增减 {attrID:+-value, ...} value可能是负值
self._kvDict = {} # 自定义kv字典
self._bigTurnAtkbackCnt = 0 # 大回合累计反击次数
+ self._incrementValue = 0 # 自增值,每场战斗重置,用于确保唯一的场景,如 Skill tag 标签
+ self._skillHappenFailCntDict = {} # 技能累计概率触发次数,使用成功后重置 {skillID:failCnt, ...}
self._skillUseCntDict = {} # 技能累计使用次数 {skillID:useCnt, ...}
self._skillTurnUseCntDict = {} # 技能单回合累计使用次数 {skillID:useCnt, ...}
self._skillMgr = ObjPool.GetPoolMgr().acquire(SkillManager, self)
@@ -900,6 +915,7 @@
return
def ResetBattleEffect(self):
+ ## 重置战斗属性,一般刷属性前调用
self._batAttrDict = {}
self._batAttrDict.update(self._initAttrDict)
self.__onUpdBatAttr()
@@ -948,6 +964,8 @@
def SetFightPower(self, fightPower): self.fightPower = fightPower
def GetLV(self): return self.lv
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
@@ -1018,6 +1036,9 @@
def SetDead(self):
self._isAlive = False
self._hp = 0
+ def SetRevive(self, hp):
+ self._isAlive = True
+ self._hp = hp
def GetMaxHP(self): return int(self._batAttrDict.get(ChConfig.AttrID_MaxHP, 0))
def SetMaxHP(self, maxHP, isNotify=False):
maxHP = int(maxHP)
@@ -1065,11 +1086,22 @@
self._skillTempAttrDict[attrID] = self._skillTempAttrDict.get(attrID, 0) + value
def ClearSkillTempAttr(self): self._skillTempAttrDict = {}
+ def GetSkillHappenFailCnt(self, skillID): return self._skillHappenFailCntDict.get(skillID, 0) # 技能概率触发失败累计次数
+ def IsSkillCanHappen(self, skillID, happenRate):
+ if happenRate and not GameWorld.CanHappen(happenRate, ChConfig.Def_MaxRateValue):
+ self._skillHappenFailCntDict[skillID] = self._skillHappenFailCntDict.get(skillID, 0) + 1
+ return False
+ self._skillHappenFailCntDict.pop(skillID, 0)
+ return True
+
def GetSkillUseCnt(self, skillID): return self._skillUseCntDict.get(skillID, 0) # 单场战斗累计使用次数
def GetSkillTurnUseCnt(self, skillID): return self._skillTurnUseCntDict.get(skillID, 0) # 单回合累计使用次数
def ResetSkillUseCnt(self):
+ ## 每场战斗开始时重置
+ self._skillHappenFailCntDict = {}
self._skillUseCntDict = {}
self._skillTurnUseCntDict = {}
+ self._incrementValue = 0
def AddSkillUseCnt(self, skillID):
self._skillUseCntDict[skillID] = self._skillUseCntDict.get(skillID, 0) + 1
self._skillTurnUseCntDict[skillID] = self._skillTurnUseCntDict.get(skillID, 0) + 1
@@ -1081,6 +1113,10 @@
## 每大回合重置
self._bigTurnAtkbackCnt = 0
self._skillTurnUseCntDict = {}
+
+ def GetIncrementValue(self):
+ self._incrementValue += 1
+ return self._incrementValue
def GetLastHurtValue(self): return self._lastHurtValue
def SetLastHurtValue(self, lastHurtValue): self._lastHurtValue = lastHurtValue
@@ -1191,7 +1227,7 @@
return batObjMgr
def OnMinute():
- GameWorld.Log("战斗单位数量: %s" % len(GetBatObjMgr().batObjDict))
+ #GameWorld.Log("战斗单位数量: %s" % len(GetBatObjMgr().batObjDict))
return
def NotifyObjInfoRefresh(batObj, attrID, value):
--
Gitblit v1.8.0