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