From ffb198b68f7e75f4fb2046189f1e7b2992d2ebac Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 15 九月 2025 14:41:24 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(于禁技能,支持格挡印记;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py | 47 ++++++++++++++++++++---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 22 +++++++---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 2 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 13 +++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 4 +
5 files changed, 72 insertions(+), 16 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 483b08e..8b7a961 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -226,6 +226,7 @@
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 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
@@ -401,13 +402,13 @@
return
def GetBuff(self, buffID): return self._buffIDDict.get(buffID, None)
- def FindBuffBySkillID(self, skillID):
+ def FindBuffListBySkillID(self, skillID):
## 返回该技能ID的所有buff列表
skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
if not skillData:
return []
- return self.FindBuffBySkillTypeID(skillData.GetSkillTypeID())
- def FindBuffBySkillTypeID(self, skillTypeID):
+ return self.FindBuffListBySkillTypeID(skillData.GetSkillTypeID())
+ def FindBuffListBySkillTypeID(self, skillTypeID):
## 返回该技能TypeID的所有buff列表
if skillTypeID not in self._skillTypeIDBuffIDs:
return []
@@ -417,6 +418,13 @@
continue
buffs.append(self._buffIDDict[buffID])
return buffs
+ def FindBuffByState(self, state):
+ ## 查找某种buff状态的buff
+ buffIDList = self._buffStateDict.get(state, [])
+ if not buffIDList:
+ return
+ buffID = buffIDList[0]
+ return self._buffIDDict.get(buffID, None)
def AddBuffState(self, state, buffID):
## 添加buff影响的状态,ChConfig.BatObjStateList
@@ -640,6 +648,10 @@
TurnPassive.RefreshPassive(self)
return
+ def TurnReset(self):
+ ## 回合重置
+ self._skillTurnUseCntDict = {}
+
def UpdInitBatAttr(self, initAttrDict, skillIDList):
## 更新战斗属性,一般只有主阵容需要更新,战斗中养成、装备变化等引起的主阵容属性变更时需要实时更新
self._initAttrDict = initAttrDict
@@ -803,10 +815,6 @@
## 统计治疗
self.cureStat += cureValue
return self.cureStat
-
- def TurnReset(self):
- ## 回合重置
- self._skillTurnUseCntDict = {}
class BattleObjMgr():
## 战斗对象管理器
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index ee92f50..2a01244 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -814,6 +814,8 @@
continue
GameWorld.DebugLog(" 重置武将: %s, HP:%s/%s, XP:%s" % (objName, batObj.GetHP(), batObj.GetMaxHP(), batObj.GetXP()))
+ batObj.TurnReset()
+
# 清除buff
buffMgr = batObj.GetBuffManager()
buffMgr.ClearBuff()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index ad78879..fc0c34a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3140,7 +3140,9 @@
BatObjState_LimitSkill, # 沉默 10
BatObjState_LimitAddHP, # 禁疗 11
BatObjState_Stone, # 石化 12
-) = range(13)
+ BatObjState_Disarm, # 缴械 13
+ BatObjState_ParryYJ, # 格挡印记 14
+) = range(15)
# 被控制的状态列表,无法行动,处于某些控制类buff影响状态下,如晕眩,冰冻,石化
InControlledStateList = [BatObjState_Frozen, BatObjState_Stun, BatObjState_Stone]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
index 9b80ade..4d70727 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -62,6 +62,11 @@
skillTypeID = buffSkill.GetSkillTypeID()
buffRepeat = buffSkill.GetBuffRepeat()
+ addLayerCnt = buffSkill.GetLayerCnt()
+ addLayerEff = buffSkill.GetEffectByID(6001)
+ if addLayerEff:
+ addLayerCnt = GameWorld.GetResultByWeightList(addLayerEff.GetEffectValues(), addLayerCnt)
+
#buff重复获得时的叠加规则
#以下规则默认针对的是相同施法者,即相同来源的处理
#如果有针对不同施法者的规则会说明
@@ -86,30 +91,45 @@
# 删除相同状态的buff
DoBuffDel(turnFight, batObj, buff, bySkill, afterLogic, buffOwner)
else:
- buffList = buffMgr.FindBuffBySkillTypeID(skillTypeID)
+ buffList = buffMgr.FindBuffListBySkillTypeID(skillTypeID)
if buffList:
for buff in buffList:
if not buff:
continue
if buff.GetOwnerID() != ownerID:
continue
- GameWorld.DebugLog(" 已经存在该buff,默认覆盖: buffID=%s,skillTypeID=%s,ownerID=%s" % (buff.GetBuffID(), skillTypeID, ownerID))
+ buffID = buff.GetBuffID()
+ GameWorld.DebugLog(" 已经存在该buff: buffID=%s,skillTypeID=%s,ownerID=%s,buffRepeat=%s" % (buffID, skillTypeID, ownerID, buffRepeat))
+
+ updLayerCnt = addLayerCnt
+ if buffRepeat == 3: # 叠加层级
+ nowLayerCnt = buff.GetLayer()
+ maxLayerCnt = buffSkill.GetLayerMax()
+ updLayerCnt = nowLayerCnt + addLayerCnt
+ if maxLayerCnt and updLayerCnt > maxLayerCnt:
+ updLayerCnt = maxLayerCnt
+ GameWorld.DebugLog(" 叠加层级: nowLayerCnt=%s,addLayerCnt=%s,updLayerCnt=%s" % (nowLayerCnt, addLayerCnt, updLayerCnt))
+ else:
+ GameWorld.DebugLog(" 默认覆盖")
+
# 重置回合、CD、值等
buff.SetCalcTime(turnFight.getTimeline())
buff.SetRemainTime(buffSkill.GetLastTime())
- buff.SetLayer(buffSkill.GetLayerCnt())
+ buff.SetLayer(updLayerCnt)
buff.SetBuffValueList(buffValueList)
if afterLogic and bySkill:
bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner])
else:
SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True)
+ break
+
return True
- __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic)
+ __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic, setLayerCnt=addLayerCnt)
return True
-def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False):
+def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False, setLayerCnt=0):
curID = batObj.GetID()
skillID = buffSkill.GetSkillID()
buff = buffMgr.AddBuff(skillID)
@@ -125,7 +145,7 @@
buff.SetOwnerID(ownerID)
buff.SetCalcTime(turnFight.getTimeline())
buff.SetRemainTime(buffSkill.GetLastTime())
- buff.SetLayer(buffSkill.GetLayerCnt())
+ buff.SetLayer(setLayerCnt)
buff.SetBuffValueList(buffValueList)
curBuffState = buffSkill.GetCurBuffState()
if curBuffState:
@@ -175,6 +195,21 @@
return
+def DecBuffLayer(turnFight, batObj, curBuff, decLayer=1, relatedSkillID=0):
+ ## 减少buff层级
+ curLayer = curBuff.GetLayer()
+ if not curLayer:
+ return
+ updLayer = max(0, curLayer - decLayer)
+ curBuff.SetLayer(updLayer)
+ if updLayer > 0:
+ SyncBuffRefresh(turnFight, batObj, curBuff, relatedSkillID)
+ return
+ objID = batObj.GetID()
+ buffID = curBuff.GetBuffID()
+ SyncBuffDel(turnFight, objID, buffID, relatedSkillID)
+ return
+
def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None):
'''删除buff
@param relatedSkill: 关联的技能
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index c670c0e..3231fc0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -1065,7 +1065,7 @@
aSuperDamPer, dSuperDamPerDef = 0, 0
if not isDot:
isSuperHit = CanSuperHit(atkObj, defObj) # 是否暴击
- isParry = (isTurnNormalSkill and CanParry(atkObj, defObj)) # 是否格挡,仅针对普攻
+ isParry = (isTurnNormalSkill and CanParry(turnFight, atkObj, defObj, curSkill)) # 是否格挡,仅针对普攻
isStun = CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕
if isSuperHit:
@@ -1169,10 +1169,19 @@
TurnBuff.DoAddBuffBySkillID(turnFight, defObj, stunSkillID, atkObj, curSkill, afterLogic=True)
return True
-def CanParry(atkObj, defObj):
+def CanParry(turnFight, atkObj, defObj, curSkill):
if defObj.IsInControlled():
#被控制无法格挡
return False
+
+ # 格挡印记
+ buffMgr = defObj.GetBuffManager()
+ parryYJBuff = buffMgr.FindBuffByState(ChConfig.BatObjState_ParryYJ)
+ if parryYJBuff and parryYJBuff.GetLayer():
+ GameWorld.DebugLog("格挡印记格挡了: buffID=%s,buffLayer=%s" % (parryYJBuff.GetBuffID(), parryYJBuff.GetLayer()))
+ TurnBuff.DecBuffLayer(turnFight, defObj, parryYJBuff, 1, curSkill.GetSkillID())
+ return True
+
aParryRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ParryRateDef)
dParryRate = defObj.GetBatAttrValue(ChConfig.AttrID_ParryRate)
parryNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnParryNum)
--
Gitblit v1.8.0