From 985bdf70fd0022733f75bf2106e69c6de77c26b1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 28 十一月 2025 17:29:51 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(卑弥呼所有技能;技能表增加字段Buff保留-BuffRetain,支持死亡保留、复活保留;增加触发方式42-大回合开始时(死亡后有效);增加属性ID 73复活生命加成、74复活怒气加成;优化效果6014-支持失败次数额外概率;优化死亡、复活时的buff处理;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py                       |   78 ++++++++++++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py                     |   16 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                        |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py                    |    3 
 PySysDB/PySysDBPY.h                                                                                         |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py |   24 +++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                    |   22 +----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py                |    9 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py                      |   56 ++++++++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                             |   18 +++
 10 files changed, 188 insertions(+), 43 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index b480d82..a164c34 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -120,6 +120,7 @@
 	BYTE		LayerMax;	//最大层数
 	DWORD		BuffRepeat;	//Buff叠加规则
 	BYTE		DispersedLimit;	//驱散限制
+	BYTE		BuffRetain;	//Buff保留规则
 	DWORD		FightPower;	//技能战斗力
 };
 
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 3bc1cff..251aecb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -365,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():
@@ -392,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
@@ -661,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()
     
     ## ---------------------------------- 非技能表内容 ----------------------------------
@@ -844,6 +848,7 @@
         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)
@@ -909,6 +914,7 @@
         return
     
     def ResetBattleEffect(self):
+        ## 重置战斗属性,一般刷属性前调用
         self._batAttrDict = {}
         self._batAttrDict.update(self._initAttrDict)
         self.__onUpdBatAttr()
@@ -1077,9 +1083,19 @@
         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
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 fb773af..8b88731 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -1569,8 +1569,6 @@
             batObj = batObjMgr.getBatObj(objID)
             if not batObj:
                 continue
-            if not batObj.IsAlive():
-                continue
             
             turnFight.ResetOneActionUseSkillCnt()
             batObj.SetTiming(ChConfig.TurnTiming_Before) # 重置时机到回合前
@@ -1578,8 +1576,12 @@
                 RefreshObjSkillByBigTurn(batObj)
                 RefreshObjByBigTurn(turnFight, batObj)
             batObj.ResetBigTurn() # 每大回合重置
-            TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStart)
             
+            if not batObj.IsAlive():
+                TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStartByDead)
+            else:
+                TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStart)
+                
     return
 
 def TurnFightPerTurnBigEnd(turnFight, turnNum):
@@ -1861,6 +1863,7 @@
     skillID = useSkill.GetSkillID() if useSkill else 0
     GameWorld.DebugLog("        %s 回合战斗主体被击杀: curID=%s,killerObjID=%s,skillID=%s" % (GetObjName(gameObj), objID, killerObjID, skillID))
     gameObj.SetDead()
+    TurnBuff.DoBuffByDead(turnFight, gameObj)
     
     clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCTurnFightObjDead)
     clientPack.ObjID = objID
@@ -1871,19 +1874,6 @@
     # 暂时只算主线小怪
     if curPlayer and turnFight.mapID == ChConfig.Def_FBMapID_Main and gameObj.GetFaction() != ChConfig.Def_FactionA:
         GetMainFightMgr(curPlayer).killNPCCnt += 1
-        
-    # 清除光源buff
-    buffMgr = gameObj.GetBuffManager()
-    for index in range(buffMgr.GetBuffCount())[::-1]:
-        buff = buffMgr.GetBuffByIndex(index)
-        skillID = buff.GetSkillID()
-        skillData = buff.GetSkillData()
-        if skillData.GetSkillType() != ChConfig.Def_SkillType_Halo:
-            continue
-        if buff.GetOwnerID() != objID:
-            continue
-        GameWorld.DebugLog("删除光环buff: objID=%s,skillID=%s" % (objID, skillID))
-        TurnBuff.DoBuffDel(turnFight, gameObj, buff)
     return True
 
 def OnTurnAllOver(guid):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 39a115b..cc573b3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -93,6 +93,12 @@
 
 Def_BuffValue_Count = 3     # buff记录的value个数
 
+# buff保留类型定义
+(
+BuffRetainType_Dead, # 死亡保留 1
+BuffRetainType_Revive, # 复活保留 2
+) = range(1, 1 + 2)
+
 #游戏对象属性--------------------------------------------
 # 属性ID列表,所有对象类型通用,如Player、NPC
 AttrIDList = (
@@ -168,7 +174,9 @@
 AttrID_ComboDamPerDef,                      # 连击减伤 70
 AttrID_PVPDamPer,                           # PVP增伤 71
 AttrID_PVPDamPerDef,                        # PVP减伤 72
-) = range(1, 1 + 72)
+AttrID_ReviveHPPer,                         # 复活生命加成 73
+AttrID_ReviveXPPer,                         # 复活怒气加成 74
+) = range(1, 1 + 74)
 
 # 需要计算的武将战斗属性ID列表
 CalcBattleAttrIDList = [AttrID_Atk, AttrID_Def, AttrID_MaxHP, AttrID_StunRate, AttrID_StunRateDef, 
@@ -182,7 +190,8 @@
                         AttrID_WeiFinalDamPer, AttrID_WeiFinalDamPerDef, AttrID_ShuFinalDamPer, AttrID_ShuFinalDamPerDef,
                         AttrID_WuFinalDamPer, AttrID_WuFinalDamPerDef, AttrID_QunFinalDamPer, AttrID_QunFinalDamPerDef,
                         AttrID_BatDamPer, AttrID_BatDamPerDef, AttrID_PursueDamPer, AttrID_PursueDamPerDef,
-                        AttrID_ComboDamPer, AttrID_ComboDamPerDef, AttrID_XPRecoverPer, AttrID_PVPDamPer, AttrID_PVPDamPerDef
+                        AttrID_ComboDamPer, AttrID_ComboDamPerDef, AttrID_XPRecoverPer, AttrID_PVPDamPer, AttrID_PVPDamPerDef,
+                        AttrID_ReviveHPPer, AttrID_ReviveXPPer,
                         ]
 
 # 基础三维属性ID列表
@@ -3997,10 +4006,13 @@
 TriggerWay_BeAtkBack, # 被反击时 39
 TriggerWay_InBattlefield, # 在场时 40
 TriggerWay_Revive, # 复活时 41
-) = range(1, 1 + 41)
+TriggerWay_BigTurnStartByDead, # 大回合开始时(死亡后有效) 42
+) = range(1, 1 + 42)
 
 # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
 TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
+# 死亡可以触发的方式
+DeadCanTriggerWayList = [TriggerWay_BigTurnStartByDead]
 
 # 被动触发有效来源
 TriggerSrc_Skill = 1    # 身上技能有效
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py
index e23483b..e2f98f4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/TurnFight.py
@@ -235,8 +235,15 @@
             GameWorld.DebugAnswer(curPlayer, "--- %s%s" % (objName, "" if batObj.IsAlive() else " [被击杀]"))
             GameWorld.DebugAnswer(curPlayer, "HP:%s/%s" % (batObj.GetHP(), batObj.GetMaxHP()))
             GameWorld.DebugAnswer(curPlayer, "攻:%s,防:%s,怒:%s" % (batObj.GetAtk(), batObj.GetDef(), batObj.GetXP()))
+            attrStr = ""
             attrDict = batObj.GetBatAttrDict()
-            GameWorld.DebugAnswer(curPlayer, "属性:%s" % attrDict)
+            attrIDList = attrDict.keys()
+            attrIDList.sort()
+            for attrID in attrIDList:
+                attrValue = attrDict[attrID]
+                if attrValue:
+                    attrStr += "%s=%s;" % (attrID, attrValue)
+            GameWorld.DebugAnswer(curPlayer, "属性:%s" % attrStr)
             skillMgr = batObj.GetSkillManager()
             skillIDList = skillMgr.GetSkillIDList()
             GameWorld.DebugAnswer(curPlayer, "技能: %s,%s" % (len(skillIDList), skillIDList))
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 1d2c9da..5e912cc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -142,6 +142,7 @@
                         ("BYTE", "LayerMax", 0),
                         ("DWORD", "BuffRepeat", 0),
                         ("BYTE", "DispersedLimit", 0),
+                        ("BYTE", "BuffRetain", 0),
                         ("DWORD", "FightPower", 0),
                         ),
 
@@ -2355,7 +2356,8 @@
     def GetLayerMax(self): return self.attrTuple[37] # 最大层数 BYTE
     def GetBuffRepeat(self): return self.attrTuple[38] # Buff叠加规则 DWORD
     def GetDispersedLimit(self): return self.attrTuple[39] # 驱散限制 BYTE
-    def GetFightPower(self): return self.attrTuple[40] # 技能战斗力 DWORD
+    def GetBuffRetain(self): return self.attrTuple[40] # Buff保留规则 BYTE
+    def GetFightPower(self): return self.attrTuple[41] # 技能战斗力 DWORD
 
 # 武将表
 class IPY_Hero():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py
index 138239b..34f9b4d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6014.py
@@ -16,11 +16,13 @@
 #-------------------------------------------------------------------------------
 
 import GameWorld
+import ChConfig
 
 def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, connSkill, **skillkwargs):
+    addRate = curEffect.GetEffectValue(0)
     onlyFirstUse = curEffect.GetEffectValue(1) # 是否仅首次释放技能有效
+    skillID = connSkill.GetSkillID() if connSkill else skillkwargs.get("connSkillID", 0)
     if onlyFirstUse:
-        skillID = connSkill.GetSkillID() if connSkill else skillkwargs.get("connSkillID", 0)
         if not skillID:
             #GameWorld.DebugLog("没有增加概率的技能ID! %s" % skillkwargs)
             return
@@ -28,4 +30,22 @@
         if useCnt > 0:
             GameWorld.DebugLog("技能非首次使用不增加额外概率! skillID=%s,useCnt=%s" % (skillID, useCnt))
             return
-    return curEffect.GetEffectValue(0)
+        
+    failAddRateEx = curEffect.GetEffectValue(2) # 失败次数额外增加概率
+    if failAddRateEx:
+        failCnt = attacker.GetSkillHappenFailCnt(skillID)
+        mustHappenFailCnt = curEffect.GetEffectValue(3) # x次失败后必定释放,大于0有效
+        if mustHappenFailCnt and failCnt >= mustHappenFailCnt:
+            addRate = ChConfig.Def_MaxRateValue # 强制增加满概率
+            GameWorld.DebugLog("技能概率失败次数必定成功: mustHappenFailCnt=%s,failCnt=%s,addRate=%s" % (mustHappenFailCnt, failCnt, addRate))
+        elif failCnt > 0:
+            addRate = failAddRateEx * failCnt
+            GameWorld.DebugLog("技能概率失败次数增加概率: failAddRateEx=%s,failCnt=%s,addRate=%s" % (failAddRateEx, failCnt, addRate))
+            
+    if effBuff:
+        buffLayer = effBuff.GetLayer()
+        if buffLayer > 1:
+            addRate *= buffLayer
+            GameWorld.DebugLog("多层buff增加技能概率! skillID=%s,buffLayer=%s,addRate=%s" % (effBuff.GetSkillID(), buffLayer, addRate))
+            
+    return addRate
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 193fe3a..831c4f4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -336,15 +336,17 @@
     DoBuffDel(turnFight, batObj, curBuff, relatedSkill)
     return
 
-def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None):
+def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None, noRefreshAttr=False, isSync=True):
     '''删除buff
     @param relatedSkill: 关联的技能
     @param afterLogic: 是否需要在关联技能处理完毕后才处理删除后续逻辑,如通知,触发被动等
     @param tagObj: 由谁引起的buff删除
+    @param noRefreshAttr: 不刷新属性
+    @return: isRefreshAttr 是否需要刷属性,如果设置了 noRefreshAttr,则要在外层刷属性
     '''
     
-    release = True
-    isSync = True
+    release = True # 释放buff实例
+    #isSync = True
     relatedSkillID = relatedSkill.GetSkillID() if relatedSkill else 0
     if afterLogic and relatedSkill:
         release = False
@@ -395,7 +397,7 @@
     if haveBuffPassiveEff:
         batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
         
-    if isRefreshAttr:
+    if isRefreshAttr and not noRefreshAttr:
         RefreshBuffAttr(batObj)
         
     if skillType == ChConfig.Def_SkillType_Halo and ownerID == buffObjID:
@@ -412,7 +414,7 @@
             if not haloBuff:
                 continue
             DoBuffDel(turnFight, haloObj, haloBuff, relatedSkill, afterLogic, tagObj)
-    return
+    return isRefreshAttr
 
 def DoBuffDelAfterLogicOver(turnFight, buffObjID, curBuff, relatedSkill):
     ## buff删除后续处理逻辑处理完毕
@@ -429,7 +431,73 @@
     if callFunc:
         callFunc(turnFight, batObj, curBuff, **kwargs)
     return
+
+def DoBuffByDead(turnFight, batObj):
+    ## 死亡处理buff
+    isRefreshAttr = False
+    objID = batObj.GetID()
+    buffMgr = batObj.GetBuffManager()
+    for index in range(buffMgr.GetBuffCount())[::-1]:
+        buff = buffMgr.GetBuffByIndex(index)
+        buffID = buff.GetBuffID()
+        skillID = buff.GetSkillID()
+        if buff.GetBuffRetain()&pow(2, ChConfig.BuffRetainType_Dead):
+            GameWorld.DebugLog("死亡不清除的buff: objID=%s,buffID=%s,skillID=%s" % (objID, buffID, skillID))
+            continue
+        if DoBuffDel(turnFight, batObj, buff, noRefreshAttr=True, isSync=False): # 可不通知,前端默认都清除,复活后重新同步
+            isRefreshAttr = True
+            
+    if isRefreshAttr:
+        RefreshBuffAttr(batObj)
+        
+    return
+
+def DoBuffByRevive(turnFight, batObj):
+    ## 复活处理buff
     
+    isRefreshAttr = False
+    objID = batObj.GetID()
+    buffMgr = batObj.GetBuffManager()
+    for index in range(buffMgr.GetBuffCount()):
+        buff = buffMgr.GetBuffByIndex(index)
+        buffID = buff.GetBuffID()
+        skillID = buff.GetSkillID()
+        if buff.GetBuffRetain()&pow(2, ChConfig.BuffRetainType_Revive):
+            GameWorld.DebugLog("复活不清除的buff: objID=%s,buffID=%s,skillID=%s" % (objID, buffID, skillID))
+            SyncBuffRefresh(turnFight, batObj, buff, isNewAdd=True) # 复活时还存在的buff通知前端视为新添加的
+            continue
+        if DoBuffDel(turnFight, batObj, buff, noRefreshAttr=True, isSync=False): # 复活可不通知删除的buff
+            isRefreshAttr = True
+            
+    if isRefreshAttr:
+        RefreshBuffAttr(batObj)
+        
+    # 重新添加本阵营有效光环
+    batObjMgr = BattleObj.GetBatObjMgr()
+    batLineup = batObj.GetBatLineup()
+    for tagObjID in batLineup.posObjIDDict.values():
+        tagObj = batObjMgr.getBatObj(tagObjID)
+        if not tagObj.IsAlive():
+            continue
+        tagBuffMgr = tagObj.GetBuffManager()
+        for index in range(tagBuffMgr.GetBuffCount()):
+            buff = tagBuffMgr.GetBuffByIndex(index)
+            haloObjIDList = buff.GetHaloObjIDList()
+            if not haloObjIDList or objID not in haloObjIDList:
+                continue
+            if buff.GetOwnerID() != tagObjID:
+                # 非光源
+                continue
+            haloSkillID = buff.GetSkillID()
+            GameWorld.DebugLog("复活后重新添加本阵营光环: objID=%s,ownerID=%s,haloSkillID=%s" % (objID, tagObjID, haloSkillID))
+            haloSkill = tagObj.GetSkillManager().FindSkillByID(haloSkillID)
+            if not haloSkill:
+                continue
+            OnAddBuff(turnFight, batObj, haloSkill, buffOwner=tagObj)
+            
+    # 光源重新添加有效光环,根据光源是否还有效规则优化,待处理
+    return
+
 def RefreshBuffAttr(batObj, isInit=False):
     ''' 刷新buff属性,如果有涉及到buff属性变更的,只能全部buff重新刷
     '''
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
index 1ac29b3..a53d5a4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -35,7 +35,8 @@
     ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
     '''
     if not batObj.IsAlive():
-        return
+        if triggerWay not in ChConfig.DeadCanTriggerWayList:
+            return
     passiveEffMgr = batObj.GetPassiveEffManager()
     effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff)
     if not effInfoList:
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 4cf9bae..dad7fca 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -61,8 +61,12 @@
         return
     
     if not curBatObj.IsAlive():
-        return
-    
+        if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
+            GameWorld.DebugLog("死亡时使用复活自己的技能! skillID=%s" % skillID)
+        else:
+            # 其他技能死亡状态下无法释放
+            return
+        
     objID = curBatObj.GetID()
     
     if hasattr(useSkill, "GetRemainTime") and useSkill.GetRemainTime() > 0:
@@ -85,10 +89,15 @@
         rate = useSkill.GetHappenRate()
         if rate:
             rate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, useSkill)
+            isRemove = False
             for tagObj in tagObjList[::-1]:
-                if not GameWorld.CanHappen(rate, ChConfig.Def_MaxRateValue):
+                if not curBatObj.IsSkillCanHappen(skillID, rate):
                     tagObjList.remove(tagObj)
-                    
+                    isRemove = True
+                    GameWorld.DebugLog("    概率不触发,移除目标! rate=%s,skillID=%s,tagID=%s" % (rate, skillID, tagObj.GetID()))
+            if not tagObjList and isRemove:
+                return
+            
     if not tagObjList:
         # 可扩展其他目标选择,如复活技能没有死亡单位时则使用另外的效果
         GameWorld.DebugLog("找不到技能目标! skillID=%s,mapID=%s,funcLineID=%s" % (skillID, turnFight.mapID, turnFight.funcLineID), turnFight.playerID)
@@ -862,21 +871,35 @@
 def SkillModule_3(turnFight, curBatObj, useSkill):
     ## 复活
     
-    skillPer = useSkill.GetSkillPer()
+    initXP = IpyGameDataPY.GetFuncCfg("AngerXP", 1)
+    xpMax = IpyGameDataPY.GetFuncCfg("AngerXP", 2) 
     for tagBatObj in useSkill.GetTagObjList():
-        skillPer += GetAddSkillPer(turnFight, curBatObj, tagBatObj, useSkill) # 复活后的血量百分比
+        skillPer = useSkill.GetSkillPer()
+        skillPer += GetAddSkillPer(turnFight, curBatObj, tagBatObj, useSkill)
+        
+        reviveHPPer = tagBatObj.GetBatAttrValue(ChConfig.AttrID_ReviveHPPer)
+        reviveHPPer += skillPer
+        reviveHPPer += TurnPassive.GetTriggerEffectValue(turnFight, tagBatObj, curBatObj, ChConfig.AttrID_ReviveHPPer, useSkill)
+        
+        reviveXPPer = tagBatObj.GetBatAttrValue(ChConfig.AttrID_ReviveXPPer)
+        reviveXPPer += TurnPassive.GetTriggerEffectValue(turnFight, tagBatObj, curBatObj, ChConfig.AttrID_ReviveXPPer, useSkill)
         
         dID = tagBatObj.GetID()
         dMapHP = tagBatObj.GetMaxHP()
-        cureHP = int(dMapHP * skillPer / 10000.0)
+        
+        cureHP = int(dMapHP * reviveHPPer / 10000.0)
+        xp = initXP + int(xpMax * reviveXPPer / 10000.0)
+        
         tagBatObj.SetRevive(cureHP)
+        tagBatObj.SetXP(xp, False)
         
         hurtObj = useSkill.AddHurtObj(dID)
         hurtObj.AddHurtType(ChConfig.HurtAtkType_Revive)
         hurtObj.SetHurtHP(cureHP)
         hurtObj.SetLostHP(cureHP)
         hurtObj.SetCurHP(tagBatObj.GetHP())
-        GameWorld.DebugLog("    复活: dID=%s,cureHP=%s,skillPer=%s,%s/%s" % (dID, cureHP, skillPer, tagBatObj.GetHP(), dMapHP))
+        GameWorld.DebugLog("    复活: dID=%s,cureHP=%s,skillPer=%s,reviveHPPer=%s,%s/%s,xp=%s,reviveXPPer=%s" 
+                           % (dID, cureHP, skillPer, reviveHPPer, tagBatObj.GetHP(), dMapHP, xp, reviveXPPer))
         
     return
 
@@ -1386,6 +1409,9 @@
                  
     # 复活时
     for tagObj in reviveObjList:
+        # 同步最新的怒气及buff,血量已经在技能中通知了
+        tagObj.SetXP(tagObj.GetXP())
+        TurnBuff.DoBuffByRevive(turnFight, tagObj)
         TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
         TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
         
@@ -1630,7 +1656,8 @@
         GameWorld.DebugLog("继承主技能目标! enhanceSkillID=%s" % enhanceSkillID)
         # 额外触发的技能直接在外层检查概率,如果都没有触发则不需要再处理
         enhanceRate = enhanceSkillData.GetHappenRate()
-        enhanceRate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, connSkillTypeID=enhanceSkillData.GetSkillTypeID(), connSkillID=enhanceSkillID)
+        if enhanceRate:
+            enhanceRate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, connSkillTypeID=enhanceSkillData.GetSkillTypeID(), connSkillID=enhanceSkillID)
         enchanceTagObjList = []
         for tagObj in tagObjList:
             tagID = tagObj.GetID()
@@ -1650,7 +1677,7 @@
             if checkHeroSex and checkHeroSex != tagObj.GetSex():
                 GameWorld.DebugLog("    非目标性别不触发: tagID=%s,sex=%s != %s" % (tagID, tagObj.GetSex(), checkHeroSex))
                 continue
-            if enhanceRate and enhanceRate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(enhanceRate, ChConfig.Def_MaxRateValue):
+            if not curBatObj.IsSkillCanHappen(enhanceSkillID, enhanceRate):
                 GameWorld.DebugLog("    概率不触发: tagID=%s,enhanceRate=%s" % (tagID, enhanceRate))
                 continue
             
@@ -1722,16 +1749,17 @@
     isOK = False
     # 继承主技能目标
     if passiveSkill.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
-        happenRate = passiveSkill.GetHappenRate()
-        happenRate += TurnPassive.GetTriggerEffectValue(turnFight, batObj, None, ChConfig.PassiveEff_AddSkillRate, passiveSkill)
-        GameWorld.DebugLog("被动触发技能,继承主技能目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,happenRate=%s,bySkillID=%s" % (effSkillID, effectID, passiveSkillID, happenRate, bySkillID))
         if not tagObj:
             return
+        happenRate = passiveSkill.GetHappenRate()
+        if happenRate:
+            happenRate += TurnPassive.GetTriggerEffectValue(turnFight, batObj, None, ChConfig.PassiveEff_AddSkillRate, passiveSkill)
+        GameWorld.DebugLog("被动触发技能,继承主技能目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,happenRate=%s,bySkillID=%s" % (effSkillID, effectID, passiveSkillID, happenRate, bySkillID))
         tagID = tagObj.GetID()
         if not tagObj.IsAlive() and passiveSkill.GetSkillType() != ChConfig.Def_SkillType_Revive:
             GameWorld.DebugLog("    已被击杀不触发: tagID=%s" % (tagID))
             return
-        if happenRate and not GameWorld.CanHappen(happenRate, ChConfig.Def_MaxRateValue):
+        if not batObj.IsSkillCanHappen(passiveSkillID, happenRate):
             GameWorld.DebugLog("    概率不触发: tagID=%s,happenRate=%s" % (tagID, happenRate))
             return
         passiveTagObjList = [tagObj]

--
Gitblit v1.8.0