From 2838ace78267ff0f7681f424fa939449061ae781 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 23 九月 2025 10:55:08 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(庞统技能;增加触发方式被连击18,被追击19;增加buff状态限制管理支持,写死硬控中无法格挡、闪避、行动;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5013.py | 39 +++++++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 23 +++++++----
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 4 +-
PySysDB/PySysDBPY.h | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 24 ++++++++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 12 +++--
6 files changed, 85 insertions(+), 19 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index f166624..d05378c 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -111,7 +111,7 @@
BYTE TriggerWay3; //触发方式
BYTE TriggerSrc3; //有效来源
WORD CoolDownTime; //技能冷却时间
- list IgnoreStates; //无视限制列表
+ WORD BuffStateLimit; //Buff状态限制组
BYTE CurBuffState; //Buff状态值
WORD LastTime; //持续时间
BYTE LayerCnt; //Buff层数
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 2fc113a..c96bb09 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -317,7 +317,7 @@
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()
@@ -549,7 +549,7 @@
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()
@@ -827,18 +827,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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 7726a8f..ebdbc46 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3150,10 +3150,10 @@
BatObjState_Stone, # 石化 12
BatObjState_Disarm, # 缴械 13
BatObjState_ParryYJ, # 格挡印记 14
-) = range(15)
-
-# 被控制的状态列表,无法行动,处于某些控制类buff影响状态下,如晕眩,冰冻,石化
-InControlledStateList = [BatObjState_Frozen, BatObjState_Stun, BatObjState_Stone]
+ BatObjState_Weak, # 虚弱 15
+ BatObjState_Charm, # 魅惑 16
+ BatObjState_Chaos, # 混乱 17
+) = range(18)
#玩家状态定义,不能超过31个,如超过,需扩展多个key支持
Def_PlayerStateList = (
@@ -4288,7 +4288,9 @@
TriggerWay_KillOneObj, # 击杀目标后(单次击杀多目标只触发一次) 15
TriggerWay_KillTagObj, # 击杀每目标后(单次击杀多目标每个目标触发一次) 16
TriggerWay_BuffDel, # buff消失后 17
-) = range(1, 1 + 17)
+TriggerWay_BeCombo, # 被连击时 18
+TriggerWay_BePursue, # 被追击时 19
+) = range(1, 1 + 19)
# 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index c93bd71..067de62 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -133,7 +133,7 @@
("BYTE", "TriggerWay3", 0),
("BYTE", "TriggerSrc3", 0),
("WORD", "CoolDownTime", 0),
- ("list", "IgnoreStates", 0),
+ ("WORD", "BuffStateLimit", 0),
("BYTE", "CurBuffState", 0),
("WORD", "LastTime", 0),
("BYTE", "LayerCnt", 0),
@@ -2701,7 +2701,7 @@
def GetTriggerWay3(self): return self.attrTuple[28] # 触发方式 BYTE
def GetTriggerSrc3(self): return self.attrTuple[29] # 有效来源 BYTE
def GetCoolDownTime(self): return self.attrTuple[30] # 技能冷却时间 WORD
- def GetIgnoreStates(self): return self.attrTuple[31] # 无视限制列表 list
+ def GetBuffStateLimit(self): return self.attrTuple[31] # Buff状态限制组 WORD
def GetCurBuffState(self): return self.attrTuple[32] # Buff状态值 BYTE
def GetLastTime(self): return self.attrTuple[33] # 持续时间 WORD
def GetLayerCnt(self): return self.attrTuple[34] # Buff层数 BYTE
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5013.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5013.py
new file mode 100644
index 0000000..195faae
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5013.py
@@ -0,0 +1,39 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_5013
+#
+# @todo:触发释放技能(buff施法方对该buff携带方进行释放技能)
+# @author hxp
+# @date 2025-09-23
+# @version 1.0
+#
+# 详细描述: 触发释放技能(buff施法方对该buff携带方进行释放技能)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-09-23 11:00"""
+#-------------------------------------------------------------------------------
+
+import TurnSkill
+import IpyGameDataPY
+import BattleObj
+
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
+ ownerID = effBuff.GetOwnerID()
+ if not ownerID:
+ return
+ buffOwner = BattleObj.GetBatObjMgr().getBatObj(ownerID)
+ if not buffOwner or not buffOwner.IsAlive():
+ return
+ effSkill = effBuff.GetSkillData().GetIpyData()
+ skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
+ if not skillID:
+ passiveSkill = effSkill
+ else:
+ passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+ if not passiveSkill:
+ return
+ effectID = curEffect.GetEffectID()
+ effSkillID = effSkill.GetSkillID()
+ return TurnSkill.OnUsePassiveSkill(turnFight, buffOwner, batObj, passiveSkill, connSkill, effSkillID, effectID, connBuff)
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 67bb230..21b75cf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,6 +59,16 @@
if not skillID:
return
+ if not curBatObj.CanAction():
+ return
+
+ buffStateLimit = useSkill.GetBuffStateLimit()
+ if buffStateLimit:
+ limitState = curBatObj.IsInBuffStateGroup(buffStateLimit)
+ if limitState:
+ GameWorld.DebugLog("技能使用处于buff状态限制中! skillID=%s,buffStateLimit=%s,limitState=%s" % (skillID, buffStateLimit, limitState))
+ return
+
#没有指定目标,则按技能自身的目标逻辑
if not tagObjList:
tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
@@ -792,6 +802,7 @@
tagObj = batObjMgr.getBatObj(tagObjID)
TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
+ batType = useSkill.GetBatType()
for tagObj in useSkill.GetTagObjList():
tagID = tagObj.GetID()
if tagID in effIgnoreObjIDList:
@@ -805,6 +816,13 @@
# 使用技能后
if isUseSkill:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_UseSkillOver, tagObj, connSkill=useSkill)
+
+ # 连击
+ if batType == ChConfig.TurnBattleType_Combo:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeCombo, curObj, connSkill=useSkill)
+ # 追击
+ elif batType == ChConfig.TurnBattleType_Pursue:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
if killObjList:
tagObj = killObjList[0]
@@ -1097,7 +1115,7 @@
GameWorld.DebugLog("XP必命中! curXP=%s,angerOverflow=%s" % (curXP, angerOverflow))
#命中公式 攻击方类型不同,公式不同
- if isTurnNormalSkill and not mustHit:
+ if isTurnNormalSkill and not mustHit and not defObj.IsInControlledHard():
aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率
missNum = curSkill.GetTagMissNum(defID)
@@ -1268,8 +1286,8 @@
return False
def CanParry(turnFight, atkObj, defObj, curSkill):
- if defObj.IsInControlled():
- #被控制无法格挡
+ if defObj.IsInControlledHard():
+ #被硬控无法格挡
return False
defID = defObj.GetID()
--
Gitblit v1.8.0