From 9bc8c9c3e4b48dab63efbca946713465ee30b4cd Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 17 一月 2024 15:47:31 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(副本回合制NPC支持配置精怪技能、神通技能;增加属性强化治疗215、弱化治疗216;NPC支持触发被动效果;被动效果触发方式增加按回合触发-效果ID5000;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py                    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                         |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_8.py      |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                   |   87 ++++++++++++----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py     |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/ChNPC.py                           |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py             |    5 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py                     |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                       |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py                   |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                       |   58 ++++++----
 PySysDB/PySysDBPY.h                                                                                        |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5000.py |   46 +++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py                             |   15 +++
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                              |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py                |    6 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py        |   23 ++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                            |   14 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py          |    2 
 19 files changed, 219 insertions(+), 77 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index fff634f..8895cf0 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -883,6 +883,8 @@
 	WORD		_LineID;	//功能线路ID
 	DWORD		NPCID;	//NPCID
 	list		PetNPCIDList;	//灵宠NPCID列表
+	list		ElfSkillIDList;	//精怪技能ID列表
+	list		STSkillIDList;	//神通技能ID列表
 	list		AwardItemListFirst;	//首次过关奖励列表[[物品ID,个数,是否拍品], ...]
 	list		AwardItemList;	//再次过关奖励列表[[物品ID,个数,是否拍品], ...]
 };
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 361cc5d..faec856 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -699,6 +699,8 @@
 Def_Effect_AtkBackDefRate = 212 # 抗反击概率
 Def_Effect_SuckHPPer = 213 # 吸血比率
 Def_Effect_SuckHPDefPer = 214 # 抗吸血比率
+Def_Effect_CurePer = 215 # 强化治疗
+Def_Effect_CureDefPer = 216 # 弱化治疗
 
 #增加%d物理伤害值,其中a值为伤害值
 Def_Effect_AddAtk = 1005
@@ -1073,7 +1075,9 @@
 CDBPlayerRefresh_SuckHPPer, # 吸血比率 252
 CDBPlayerRefresh_SuckHPDefPer, # 抗吸血比率 253
 CDBPlayerRefresh_Xiantao, # 仙桃  254
-) = range(146, 255)
+CDBPlayerRefresh_CurePer, # 强化治疗 255
+CDBPlayerRefresh_CureDefPer, # 弱化治疗 256
+) = range(146, 257)
 
 TYPE_Price_Gold_Paper_Money = 5    # 金钱类型,(先用礼券,再用金子)
 TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index ba2bf0b..09e11b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -2649,14 +2649,14 @@
     suckHPByPer = int(hurtValue * suckHPPerFinal*1.0 / ChConfig.Def_MaxRateValue)
     
     suckHPTotal = suckHPByPer + suckHP
-    #GameWorld.DebugLog("        吸血: atkID=%s,suckHPPer=%s,defID=%s,suckHPDefPer=%s,suckHPPerFinal=%s,suckHPByPer=%s,hurtValue=%s,suckHP=%s" 
-    #                   % (atkObj.GetID(), suckHPPer, defObj.GetID(), suckHPDefPer, suckHPPerFinal, suckHPByPer, hurtValue, suckHP))
     if suckHPTotal <= 0:
         return
     
-    GameObj.SetHP(atkObj, min(GameObj.GetMaxHP(atkObj), GameObj.GetHP(atkObj) + suckHPTotal), False)
+    GameObj.SetHP(atkObj, min(GameObj.GetMaxHP(atkObj), GameObj.GetHP(atkObj) + suckHPTotal), False)    
     
     ChangeHPView(atkObj, None, 0, suckHPTotal, ChConfig.Def_HurtTYpe_Recovery)
+    GameWorld.DebugLog("        吸血: atkID=%s,defID=%s,最终比例=%s(%s-%s),伤血=%s,总吸血=%s(%s+%s),HP=%s" 
+                       % (atkObj.GetID(), defObj.GetID(), suckHPPerFinal, suckHPPer, suckHPDefPer, hurtValue, suckHPTotal, suckHPByPer, suckHP, GameObj.GetHP(atkObj)))
     return
 
 ## 攻击者回蓝逻辑
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 95fe4ff..0c68175 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -34,7 +34,7 @@
 import BuffSkill
 import FBCommon
 import ItemControler
-import PlayerPet
+import PassiveBuffEffMng
 
 # 回合战斗流程状态
 (
@@ -99,14 +99,10 @@
 
 def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick):
     playerID = curPlayer.GetPlayerID()
-    
-    PlayerViewCacheTube.UpdPlayerPropPlusCache(curPlayer) # 强制刷一下自己的镜像缓存
-    factionInfoA = {"playerID":playerID, "pet":PlayerPet.GetPetCacheInfo(curPlayer)}
-    factionInfoB = {}
+    factionInfoA = GetPlayerFactionInfoByCache(playerID)
     ipyData = None
     if tagPlayerID:
-        PlusData = PlayerViewCacheTube.GetPlayerPropPlusDictByID(tagPlayerID)[1] # 从缓存中获取
-        factionInfoB = {"playerID":tagPlayerID, "pet":PlusData.get("Pet")}
+        factionInfoB = GetPlayerFactionInfoByCache(tagPlayerID)
     else:
         ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID)
         if not ipyData:
@@ -118,7 +114,10 @@
         petCacheInfo = [] # 从配表中读取组合,技能默认取NPC表配置的
         for state, petNPCID in enumerate(petNPCIDList, 1):
             petCacheInfo.append({"npcID":petNPCID, "state":state, "quality":0})
-        factionInfoB = {"npcID":npcID, "pet":petCacheInfo}
+        skillIDExList = [] # NPC为附加技能,因为NPC表本身可能有配置技能
+        skillIDExList.extend(ipyData.GetElfSkillIDList())
+        skillIDExList.extend(ipyData.GetSTSkillIDList())
+        factionInfoB = {"npcID":npcID, "pet":petCacheInfo, "skillIDExList":skillIDExList}
         
     ret = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer)
     if not ret:
@@ -138,6 +137,20 @@
     playbackID and overMsg.update({"playbackID":playbackID})
     SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Award, turnNum, turnMax, overMsg)
     return
+
+def GetPlayerFactionInfoByCache(playerID):
+    ## 根据玩家缓存数据获取对阵玩家阵营信息字典
+    _, PlusDict = PlayerViewCacheTube.GetPlayerPropPlusDictByID(playerID, True) # 从缓存中获取,强刷一次最新属性
+    skillIDList = []
+    SkillInfo = PlusDict.get("SkillInfo", {})
+    for _, skillLVDict in SkillInfo.items():
+        for skillID, _ in skillLVDict.items():
+            skillID = GameWorld.ToIntDef(skillID)
+            skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
+            if not skillData:
+                continue
+            skillIDList.append(skillID)
+    return {"playerID":playerID, "pet":PlusDict.get("Pet"), "skillIDList":skillIDList}
 
 def ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False):
     ''' 处理自动回合战斗过程,仅做战斗流程处理,不做及其他功能逻辑
@@ -182,6 +195,8 @@
     # 设置战斗主体
     objA.SetDict(ChConfig.Def_Obj_Dict_TurnFightMainRole, 1)
     objB.SetDict(ChConfig.Def_Obj_Dict_TurnFightMainRole, 1)
+    objA.SetDict(ChConfig.Def_Obj_Dict_TurnEnemyID, objB.GetID())
+    objB.SetDict(ChConfig.Def_Obj_Dict_TurnEnemyID, objA.GetID())
     
     # 战斗前初始化,可能会改变攻速,所以先初始化
     for faction, factionObjList in enumerate(atkFactionList, 1):
@@ -212,7 +227,11 @@
         
         # 回合开始: 做一些每回合重置逻辑或者某些根据回合触发的效果等
         for gameObj in fightObjList:
-            TurnFightObjPerTurnStart(gameObj, turnNum, tick)
+            if not gameObj:
+                continue
+            faction = GameObj.GetFaction(gameObj)
+            tagGameObj = objB if faction == 1 else objA
+            TurnFightObjPerTurnStart(gameObj, tagGameObj, turnNum, tick)
             
         isWin = CheckIswin(objA, objB)
         if isWin != None:
@@ -298,12 +317,14 @@
     factionSyncInfo = {} # 同步前端的阵营信息,包含主ID、灵宠、其他灵通等
     playerID = factionInfo.get("playerID")
     npcID = factionInfo.get("npcID")
+    skillIDList = factionInfo.get("skillIDList") # 技能ID列表
+    skillIDExList = factionInfo.get("skillIDExList") # 附加技能ID列表
     if playerID:
         npcID = ChConfig.Def_NPCID_PVP
-        mainObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=sightLevel, mirrorPlayerID=playerID)
+        mainObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=sightLevel, mirrorPlayerID=playerID, skillIDList=skillIDList, skillIDExList=skillIDExList)
         factionSyncInfo["playerID"] = playerID
     elif npcID:
-        mainObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=sightLevel)
+        mainObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=sightLevel, skillIDList=skillIDList, skillIDExList=skillIDExList)
         factionSyncInfo["npcID"] = npcID
     else:
         return
@@ -360,6 +381,18 @@
     clientPack.ObjType = gameObj.GetGameObjType()
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return True
+
+def GetEnemyCureDefPer(gameObj):
+    ## 获取敌对方弱化治疗值
+    tagID = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnEnemyID)
+    if not tagID:
+        return 0
+    tagObj = GameWorld.FindNPCByID(tagID)
+    if not tagObj:
+        return 0
+    cureDefPer = GameObj.GetCureDefPer(tagObj)
+    #其他的...
+    return cureDefPer
 
 def GetRebornTypeInfo(gameObj):
     ''' 获取可复活的方式信息
@@ -476,17 +509,9 @@
     objName = GetObjName(gameObj)
     fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum)
     
-    GameWorld.DebugLog("【 %s 初始化 %s 】 objID=%s,npcID=%s,atkSpeed=%s,HP=%s,Atk=%s,Def=%s,isMainRole=%s" 
-                       % (objName, BaseAttack.GetObjAttackName(gameObj), gameObj.GetID(), npcID,
-                          GameObj.GetAtkSpeed(gameObj), GameObj.GetHP(gameObj), gameObj.GetMaxAtk(), gameObj.GetDef(), isMainRole))
-    GameWorld.DebugLog("    闪避(%s,%s),暴击(%s,%s),击晕(%s,%s),连击(%s,%s),反击(%s,%s),吸血(%s,%s)" 
-                       % (GameObj.GetMissRate(gameObj), GameObj.GetMissDefRate(gameObj),
-                          GameObj.GetSuperHitRate(gameObj), GameObj.GetSuperHitRateReduce(gameObj),
-                          GameObj.GetFaintRate(gameObj), GameObj.GetFaintDefRate(gameObj),
-                          GameObj.GetComboRate(gameObj), GameObj.GetComboDefRate(gameObj),
-                          GameObj.GetAtkBackRate(gameObj), GameObj.GetAtkBackDefRate(gameObj),
-                          GameObj.GetSuckHPPer(gameObj), GameObj.GetSuckHPDefPer(gameObj),
-                          ))
+    GameWorld.DebugLog("【 %s 初始化 %s 】 objID=%s,npcID=%s,atkSpeed=%s,isMainRole=%s" 
+                       % (objName, BaseAttack.GetObjAttackName(gameObj), gameObj.GetID(), npcID, GameObj.GetAtkSpeed(gameObj), isMainRole))
+    __logGameObjAttr(gameObj)
     
     # 重置技能CD、战斗buff
     if objType == IPY_GameWorld.gotPlayer:            
@@ -512,7 +537,19 @@
         
     return
 
-def TurnFightObjPerTurnStart(gameObj, turnNum, tick):
+def __logGameObjAttr(gameObj):
+    GameWorld.DebugLog("    HP=%s,Atk=%s,Def=%s,atkSpeed=%s" % (GameObj.GetHP(gameObj), gameObj.GetMaxAtk(), gameObj.GetDef(), GameObj.GetAtkSpeed(gameObj)))
+    GameWorld.DebugLog("    闪(%s,%s),暴(%s,%s),晕(%s,%s),连(%s,%s),反(%s,%s),吸(%s,%s)" 
+                       % (GameObj.GetMissRate(gameObj), GameObj.GetMissDefRate(gameObj),
+                          GameObj.GetSuperHitRate(gameObj), GameObj.GetSuperHitRateReduce(gameObj),
+                          GameObj.GetFaintRate(gameObj), GameObj.GetFaintDefRate(gameObj),
+                          GameObj.GetComboRate(gameObj), GameObj.GetComboDefRate(gameObj),
+                          GameObj.GetAtkBackRate(gameObj), GameObj.GetAtkBackDefRate(gameObj),
+                          GameObj.GetSuckHPPer(gameObj), GameObj.GetSuckHPDefPer(gameObj),
+                          ))
+    return
+
+def TurnFightObjPerTurnStart(gameObj, tagObj, turnNum, tick):
     ## 回合制战斗实例 - 每回合开始时处理
     if not gameObj:
         return
@@ -542,6 +579,10 @@
         
     # 刷新定时处理的buff效果
     SkillShell.ProcessPersistBuff(gameObj, tick)
+    
+    PassiveBuffEffMng.OnPassiveSkillTrigger(gameObj, tagObj, None, ChConfig.TriggerType_TurnNum, tick)
+    
+    __logGameObjAttr(gameObj)
     return
 
 def TurnFightObjPerTurnActionnum(turnNum, actionNum, gameObj, tick):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 18a1c3e..4c428aa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -74,7 +74,7 @@
 Def_BuffValue_Count = 3     # buff记录的value个数
 
 #游戏对象属性--------------------------------------------
-Def_Calc_AllAttrType_MAX = 171
+Def_Calc_AllAttrType_MAX = 172
 #基本属性BUFF计算,顺序与 ObjProperty_AttrByIndex 对应,同时也为buff效果ID同步通知策划
 TYPE_Calc_AttrList = (
 TYPE_Calc_Metal,                        # 金 1
@@ -203,7 +203,7 @@
 TYPE_Calc_MissSucessRate,               # 闪避成功率
 TYPE_Calc_AtkInterval,                  # NPC攻击频率
 TYPE_Calc_FuncDef,                      # 功能层防御 
-TYPE_Calc_CurePer,                      # 治疗效果加成,默认100% 115
+TYPE_Calc_CurePer,                      # 强化治疗  115
 TYPE_Calc_BeHurtPer,                    # 加深受到伤害百分比
 TYPE_Calc_HorseAtkPer,                  # 坐骑攻击百分比
 TYPE_Calc_StoneBasePer,                 # 宝石基础属性百分比
@@ -259,6 +259,7 @@
 TYPE_Calc_AtkBackDefRate,                # 抗反击概率
 TYPE_Calc_SuckHPPer,                     # 吸血比率
 TYPE_Calc_SuckHPDefPer,                  # 抗吸血比率 170
+TYPE_Calc_CureDefPer,                    # 弱化对方治疗效果
 ) = range(1, Def_Calc_AllAttrType_MAX)
 
 ## 支持大数值属性,超过20E
@@ -3075,6 +3076,7 @@
 Def_Obj_Dict_TurnTotalHurtEx = 'TurnTotalHurtEx' # 本回合制战斗总伤害,整除亿部分
 Def_Obj_Dict_FightPetPlaceNum = 'FightPetPlaceNum' # 出战灵宠上阵位置,1~n
 Def_Obj_Dict_FightPetQuality = 'FightPetQuality' # 出战灵宠品质
+Def_Obj_Dict_TurnEnemyID = 'TurnEnemyID' # 回合制战斗对手实例ID
 
 #---NPC字典-------
 #每道龙卷风最终坐标
@@ -3368,7 +3370,6 @@
 Def_PlayerKey_PVPAtkBackHP = "PVPAtkBackHP"   # PVP攻击回血
 Def_PlayerKey_HitSucessRate = "HitSucessRate"   # 命中成功率
 Def_PlayerKey_MissSucessRate = "MissSucessRate"   # 闪避成功率
-Def_PlayerKey_CurePer = "CurePer"   # 治疗加成 默认百分百
 Def_PlayerKey_BeHurtPer = "BeHurtPer"   # 加深受到伤害百分比
 Def_PlayerKey_HorseAtkPer = "HorseAtkPer"   # 坐骑攻击百分比
 Def_PlayerKey_HorseMaxHPPer = "HorseMaxHPPer"   # 坐骑生命加成
@@ -4516,6 +4517,8 @@
 AttrName_AtkBackDefRate = "AtkBackDefRate"  # 抗反击概率
 AttrName_SuckHPPer = "SuckHPPer"  # 吸血比率
 AttrName_SuckHPDefPer = "SuckHPDefPer"  # 抗吸血比率
+AttrName_CurePer = "CurePer"  # 强化治疗
+AttrName_CureDefPer = "CureDefPer"  # 弱化治疗
 
 #物品效果(ID或指定类型)对应的属性计算信息 {效果(ID/指定类型):[[属性索引, ...], 是否基础属性,(非)线性]}
 #对应 Def_Calc_AllAttrType_MAX
@@ -4714,6 +4717,8 @@
     AttrName_SuckHPPer:[[TYPE_Calc_SuckHPPer], False, TYPE_Linear],
     ShareDefine.Def_Effect_SuckHPDefPer:[[TYPE_Calc_SuckHPDefPer], False, TYPE_Linear],
     AttrName_SuckHPDefPer:[[TYPE_Calc_SuckHPDefPer], False, TYPE_Linear],
+    ShareDefine.Def_Effect_CurePer:[[TYPE_Calc_CurePer], False, TYPE_Linear],
+    ShareDefine.Def_Effect_CureDefPer:[[TYPE_Calc_CureDefPer], False, TYPE_Linear],
     
     #战斗非线性
     ShareDefine.Def_Effect_SuperHitPer:[[TYPE_Calc_SuperHit], False, TYPE_NoLinear],
@@ -5080,7 +5085,8 @@
 TriggerType_ThumpSkillValue, # 重击增加技能固定值伤害 88
 TriggerType_HitValue, # 记录命中个数 89
 TriggerType_ChangeSkillEff, # 改变技能特效广播 90
-) = range(1, 91)
+TriggerType_TurnNum, # 回合触发 91
+) = range(1, 92)
 
 
 #不可以佩戴翅膀的地图
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index ae67f97..821977f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -319,3 +319,18 @@
     else:
         gameObj.SetDict(ChConfig.AttrName_AtkBackHP, value)
     return
+
+def GetCurePer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_CurePer)
+def SetCurePer(gameObj, value):
+    ## 强化治疗
+    gameObj.SetDict(ChConfig.AttrName_CurePer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_CurePer, value)
+    return
+def GetCureDefPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_CureDefPer)
+def SetCureDefPer(gameObj, value):
+    ## 弱化治疗
+    gameObj.SetDict(ChConfig.AttrName_CureDefPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_CureDefPer, value)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 8254e50..c3611bc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -726,6 +726,8 @@
                         ("WORD", "LineID", 1),
                         ("DWORD", "NPCID", 0),
                         ("list", "PetNPCIDList", 0),
+                        ("list", "ElfSkillIDList", 0),
+                        ("list", "STSkillIDList", 0),
                         ("list", "AwardItemListFirst", 0),
                         ("list", "AwardItemList", 0),
                         ),
@@ -3710,6 +3712,8 @@
         self.LineID = 0
         self.NPCID = 0
         self.PetNPCIDList = []
+        self.ElfSkillIDList = []
+        self.STSkillIDList = []
         self.AwardItemListFirst = []
         self.AwardItemList = []
         return
@@ -3718,6 +3722,8 @@
     def GetLineID(self): return self.LineID # 功能线路ID
     def GetNPCID(self): return self.NPCID # NPCID
     def GetPetNPCIDList(self): return self.PetNPCIDList # 灵宠NPCID列表
+    def GetElfSkillIDList(self): return self.ElfSkillIDList # 精怪技能ID列表
+    def GetSTSkillIDList(self): return self.STSkillIDList # 神通技能ID列表
     def GetAwardItemListFirst(self): return self.AwardItemListFirst # 首次过关奖励列表[[物品ID,个数,是否拍品], ...]
     def GetAwardItemList(self): return self.AwardItemList # 再次过关奖励列表[[物品ID,个数,是否拍品], ...]
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/ChNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/ChNPC.py
index dbaf5d3..649ccc4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/ChNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/ChNPC.py
@@ -89,7 +89,6 @@
 #  @return None
 #  @remarks 函数详细说明.
 def OnNPCDie(curNPC,HurtType,HurtID):
-    PassiveBuffEffMng.GetPassiveEffManager().RemovePassiveEff((curNPC.GetID(), IPY_GameWorld.gotNPC))
     
     # 召唤NPC死亡触发被动技能
     owner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curNPC)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 76bfdd2..ea9f691 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -76,6 +76,7 @@
 import PlayerVip
 import GameObj
 import ChNPC
+import PassiveBuffEffMng
 
 import random
 import math
@@ -2268,7 +2269,7 @@
 # @param aiType: AI类型
 # @return 如果召唤失败返回None 否则返回召唤的NPC的实例
 # @remarks 在地图里召唤NPC 根据NPCID 出生点 AI类型 和TICK
-def SummonMapNpc(npcId, rebornX, rebornY, aiType=0, lastTime=0, playerID=0, sightLevel=0, refreshID=0, mirrorPlayerID=0):
+def SummonMapNpc(npcId, rebornX, rebornY, aiType=0, lastTime=0, playerID=0, sightLevel=0, refreshID=0, mirrorPlayerID=0, skillIDList=None, skillIDExList=None):
     npcData = GameWorld.GetGameData().FindNPCDataByID(npcId)
     if not npcData:
         GameWorld.ErrLog("找不到该NPCID: %s" % npcId)
@@ -2304,10 +2305,28 @@
         curSummon.SetDict(ChConfig.Def_NPC_Dict_MirrorPlayerID, mirrorPlayerID)
         
     curSummon.Reborn(rebornX, rebornY, False)
+    skillManager = curSummon.GetSkillManager()
+    #有指定的技能,重新学习
+    if skillIDList:
+        #GameWorld.DebugLog("指定召唤兽技能: npcID=%s,skillIDList=%s" % (npcID, skillIDList))
+        skillManager.ResetSkill()
+        for skillID in skillIDList:
+            skillManager.LVUPSkillByID(skillID)
+    #附加学习技能
+    if skillIDExList:
+        for skillID in skillIDExList:
+            if not skillManager.FindSkillBySkillID(skillID):
+                skillManager.LVUPSkillByID(skillID)
     NPCControl(curSummon).DoNPCRebornCommLogic(tick)
     
     FBLogic.DoFBRebornSummonNPC(curSummon, tick)
     #__NotifyMapPlayerSummonMapNPC(npcId, rebornX, rebornY)
+    if skillIDList or skillIDExList:
+        learnSkillIDList = []
+        for index in range(0, skillManager.GetSkillCount()):
+            useSkill = skillManager.GetSkillByIndex(index)
+            learnSkillIDList.append(useSkill.GetSkillID())
+        GameWorld.DebugLog("召唤的NPC所有技能: curID=%s,npcID=%s,skill=%s" % (curSummon.GetID(), npcId, learnSkillIDList))
     return curSummon
 
 def SummonNPC(gameObj, npcID, rebornX, rebornY, skillIDList=None):
@@ -2552,6 +2571,8 @@
                     PyGameData.g_playerPriWoodPileNPCDict.pop(priWoodPilePlayerID)
                 break
             
+    PassiveBuffEffMng.GetPassiveEffManager().RemovePassiveEff((curNPC.GetID(), IPY_GameWorld.gotNPC))
+    
     # C++设置npc死亡
     curNPC.SetDead(curNPC.GetDictByKey(ChConfig.Def_NPCDead_Reason),
                    curNPC.GetDictByKey(ChConfig.Def_NPCDead_KillerType),
@@ -4120,13 +4141,13 @@
 #
 #        #清空禁止
 #        curNPC.ForbiddenSkillTypeList_Clear()
-    
-        #宠物特殊处理
-        if PetControl.RefurbishPetAttr(curNPC):
-            return
         
+        isPetNPC = PetControl.IsPetNPC(curNPC)
         mirrorPlayerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID)
-        if mirrorPlayerID:
+        #宠物特殊处理
+        if isPetNPC:
+            PetControl.RefurbishPetAttr(curNPC)
+        elif mirrorPlayerID:
             self.SetMirrorPlayerNPCAttr(mirrorPlayerID, isReborn)
         else:
             DoNPCAttrStrengthen(curNPC, isReborn)
@@ -4139,12 +4160,13 @@
         #客户端自己算血量上限
 #        if GameObj.GetMaxHP(curNPC) != curNPCMaxHP_Before:
 #            curNPC.Notify_MaxHP()
-            
+        
+        PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curNPC)
         return
     
     def SetMirrorPlayerNPCAttr(self, mirrorPlayerID, isReborn):
         ## 设置镜像玩家NPC属性
-        PropDict, PlusDict = PlayerViewCacheTube.GetPlayerPropPlusDictByID(mirrorPlayerID)
+        PropDict, _ = PlayerViewCacheTube.GetPlayerPropPlusDictByID(mirrorPlayerID)
         if not PropDict:
             return
         curNPC = self.__Instance
@@ -4167,26 +4189,14 @@
         GameObj.SetAtkBackDefRate(curNPC, PropDict.get("AtkBackDefRate", 0))
         GameObj.SetSuckHPPer(curNPC, PropDict.get("SuckHPPer", 0))
         GameObj.SetSuckHPDefPer(curNPC, PropDict.get("SuckHPDefPer", 0))
+        GameObj.SetCurePer(curNPC, PropDict.get("CurePer", 0))
+        GameObj.SetCureDefPer(curNPC, PropDict.get("CureDefPer", 0))
         
         if not isReborn:
             return
         
-        skillManager = curNPC.GetSkillManager()
-        SkillInfo = PlusDict.get("SkillInfo", {})
-        for _, skillLVDict in SkillInfo.items():
-            for skillID, _ in skillLVDict.items():
-                skillID = GameWorld.ToIntDef(skillID)
-                skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
-                if not skillData:
-                    continue
-                skillManager.LearnSkillByID(skillID)
-                
-        learnSkillIDList = []
-        for index in range(0, skillManager.GetSkillCount()):
-            useSkill = skillManager.GetSkillByIndex(index)
-            learnSkillIDList.append(useSkill.GetSkillID())
-        GameWorld.DebugLog("设置镜像玩家: objID=%s,NPCID=%s,mirrorPlayerID=%s,maxHP=%s,learnSkillIDList=%s" 
-                           % (curNPC.GetID(), curNPC.GetNPCID(), mirrorPlayerID, GameObj.GetMaxHP(curNPC), learnSkillIDList))
+        GameWorld.DebugLog("设置镜像玩家: objID=%s,NPCID=%s,mirrorPlayerID=%s,maxHP=%s" 
+                           % (curNPC.GetID(), curNPC.GetNPCID(), mirrorPlayerID, GameObj.GetMaxHP(curNPC)))
         return
     
     def SetHelpBattleRobotRebornAttr(self, fightPower):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
index c9a1e62..2c7a221 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
@@ -187,8 +187,6 @@
 
 def RefurbishPetAttr(curPet):
     ##刷新宠物的属性,仅支持召唤兽,废弃原 IPY_GameWorld.gnotPet
-    if not IsPetNPC(curPet):
-        return
     petOwner = GetPetNPCOwner(curPet)
     if not petOwner:
         return
@@ -220,7 +218,7 @@
             return
         rolePetSkillManager.LearnSkillByID(leSkillID)
         
-    PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(rolePet)
+    #PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(rolePet)
     #rolePet.Sync_PetInfo()
     #rolePet.Sync_SkillList()     
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 813b00e..88525f4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -5421,7 +5421,7 @@
                         ChConfig.TYPE_Calc_AttrGameExpRate:GameWorld.GetGameWorld().GetExpRate(),
                         ChConfig.TYPE_Calc_AttrPetExpRate:GameWorld.GetGameWorld().GetExpRate(),
                         ChConfig.TYPE_Calc_HitSucessRate:ChConfig.Def_MaxRateValue,
-                        ChConfig.TYPE_Calc_CurePer:ChConfig.Def_MaxRateValue,
+                        #ChConfig.TYPE_Calc_CurePer:ChConfig.Def_MaxRateValue,
                         ChConfig.TYPE_Calc_YinjiTime:IpyGameDataPY.GetFuncCfg('Yinji', 1),  # 每X秒自动消失一个印记
                         }
         
@@ -6988,10 +6988,6 @@
 # 闪避成功率
 def GetMissSucessRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MissSucessRate)
 def SetMissSucessRate(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_MissSucessRate, value)
-
-# 治疗加成 默认百分百
-def GetCurePer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CurePer)
-def SetCurePer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_CurePer, value)
 
 # 加深受到伤害百分比
 def GetBeHurtPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_BeHurtPer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
index 2510bfd..57a2334 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -229,6 +229,8 @@
     curPlayerPropDict["SuckHPDefPer"] = GameObj.GetSuckHPDefPer(curPlayer) # 抗吸血比率
     curPlayerPropDict["AtkBackHP"] = GameObj.GetAtkBackHP(curPlayer) # 攻击回复血量固定值
     curPlayerPropDict["PVPAtkBackHP"] = PlayerControl.GetPVPAtkBackHP(curPlayer) # PVP攻击回血
+    curPlayerPropDict["CurePer"] = GameObj.GetCurePer(curPlayer) # 强化治疗
+    curPlayerPropDict["CureDefPer"] = GameObj.GetCureDefPer(curPlayer) # 弱化治疗
     
     #-----------
     #扩展属性缓存
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 361cc5d..faec856 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -699,6 +699,8 @@
 Def_Effect_AtkBackDefRate = 212 # 抗反击概率
 Def_Effect_SuckHPPer = 213 # 吸血比率
 Def_Effect_SuckHPDefPer = 214 # 抗吸血比率
+Def_Effect_CurePer = 215 # 强化治疗
+Def_Effect_CureDefPer = 216 # 弱化治疗
 
 #增加%d物理伤害值,其中a值为伤害值
 Def_Effect_AddAtk = 1005
@@ -1073,7 +1075,9 @@
 CDBPlayerRefresh_SuckHPPer, # 吸血比率 252
 CDBPlayerRefresh_SuckHPDefPer, # 抗吸血比率 253
 CDBPlayerRefresh_Xiantao, # 仙桃  254
-) = range(146, 255)
+CDBPlayerRefresh_CurePer, # 强化治疗 255
+CDBPlayerRefresh_CureDefPer, # 弱化治疗 256
+) = range(146, 257)
 
 TYPE_Price_Gold_Paper_Money = 5    # 金钱类型,(先用礼券,再用金子)
 TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
index 4c05949..8db047e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/EffGetSet.py
@@ -154,7 +154,7 @@
    [lambda curObj:PlayerControl.GetMissSucessRate(curObj), lambda curObj, value:PlayerControl.SetMissSucessRate(curObj, value), 0, 0, 0],          # 命中成功率
    [lambda curObj:curObj.GetAtkInterval(), lambda curObj, value:curObj.SetAtkInterval(value), IPY_PlayerDefine.CDBPlayerRefresh_AtkInterval, 0, 0],          # NPC攻击频率
    [lambda curObj:PlayerControl.GetFuncDef(curObj), lambda curObj, value:PlayerControl.SetFuncDef(curObj, value), ShareDefine.CDBPlayerRefresh_FuncDef, 1, 0], # 功能层防御
-   [lambda curObj:PlayerControl.GetCurePer(curObj), lambda curObj, value:PlayerControl.SetCurePer(curObj, value), 0, 0, 0],          # 治疗加成百分比 默认百分百
+   [lambda curObj:GameObj.GetCurePer(curObj), lambda curObj, value:GameObj.SetCurePer(curObj, value), ShareDefine.CDBPlayerRefresh_CurePer, 1, 0],          # 强化治疗
    [lambda curObj:PlayerControl.GetBeHurtPer(curObj), lambda curObj, value:PlayerControl.SetBeHurtPer(curObj, value), 0, 0, 0],      # 加深受到伤害百分比
    [lambda curObj:PlayerControl.GetHorseAtkPer(curObj), lambda curObj, value:PlayerControl.SetHorseAtkPer(curObj, value), 0, 0, 0],      # 坐骑攻击百分比
    [lambda curObj:PlayerControl.GetStoneBasePer(curObj), lambda curObj, value:PlayerControl.SetStoneBasePer(curObj, value), 0, 0, 0],      # 宝石基础属性百分比
@@ -210,6 +210,7 @@
    [lambda curObj:GameObj.GetAtkBackDefRate(curObj), lambda curObj, value:GameObj.SetAtkBackDefRate(curObj, value), ShareDefine.CDBPlayerRefresh_AtkBackDefRate, 1, 0],    # 抗反击概率
    [lambda curObj:GameObj.GetSuckHPPer(curObj), lambda curObj, value:GameObj.SetSuckHPPer(curObj, value), ShareDefine.CDBPlayerRefresh_SuckHPPer, 1, 0],    # 吸血比率
    [lambda curObj:GameObj.GetSuckHPDefPer(curObj), lambda curObj, value:GameObj.SetSuckHPDefPer(curObj, value), ShareDefine.CDBPlayerRefresh_SuckHPDefPer, 1, 0],    # 抗吸血比率
+   [lambda curObj:GameObj.GetCureDefPer(curObj), lambda curObj, value:GameObj.SetCureDefPer(curObj, value), ShareDefine.CDBPlayerRefresh_CureDefPer, 1, 0],          # 弱化对方治疗
 ]
 
 ## 通过索引获得属性值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
index 007e3ad..82737c0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py
@@ -1254,8 +1254,10 @@
         return
     
     # 治疗加成
-    curePer = PlayerControl.GetCurePer(curObj) if curObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue 
-    addValue = int(addValue*curePer*1.0/ChConfig.Def_MaxRateValue)
+    curePer = GameObj.GetCurePer(curObj) + ChConfig.Def_MaxRateValue
+    curePerReduce = TurnAttack.GetEnemyCureDefPer(curObj) # 弱化治疗,取对方的
+    curePerFinal = max(0, curePer - curePerReduce)
+    addValueFianl = int(addValue*curePerFinal*1.0/ChConfig.Def_MaxRateValue)
     
     maxHP = GameObj.GetMaxHP(curObj)
     
@@ -1263,15 +1265,16 @@
     if curHP == maxHP:
         #广播加血类型
         if isNotify:
-            AttackCommon.ChangeHPView(curObj, curObj, skillTypeID, addValue, ChConfig.Def_HurtTYpe_Recovery)
-        return
+            AttackCommon.ChangeHPView(curObj, curObj, skillTypeID, addValueFianl, ChConfig.Def_HurtTYpe_Recovery)
+        GameWorld.DebugLog("        治疗时已满血: curID=%s,skillTypeID=%s,maxHP=%s" % (curObj.GetID(), skillTypeID, maxHP))
+        return addValueFianl
     
-    remainHP = min(curHP + addValue, maxHP)
+    remainHP = min(curHP + addValueFianl, maxHP)
     
     #---玩家处理---
     if curObjType == IPY_GameWorld.gotPlayer:
         GameObj.SetHP(curObj, remainHP, not isNotify)
-        FBLogic.OnFBAddHP(curObj, addValue)
+        FBLogic.OnFBAddHP(curObj, addValueFianl)
     
     #---NPC处理---
     elif curObjType == IPY_GameWorld.gotNPC:
@@ -1287,9 +1290,11 @@
            
     #广播加血类型
     if isNotify:
-        AttackCommon.ChangeHPView(curObj, curObj, skillTypeID, addValue, ChConfig.Def_HurtTYpe_Recovery)
-            
-    return
+        AttackCommon.ChangeHPView(curObj, curObj, skillTypeID, addValueFianl, ChConfig.Def_HurtTYpe_Recovery)
+        
+    GameWorld.DebugLog("        治疗: curID=%s,skillTypeID=%s,curePerFinal=%s(%s-%s),addValue=%s,addValueFianl=%s,HP=%s" 
+                       % (curObj.GetID(), skillTypeID, curePerFinal, curePer, curePerReduce, addValue, addValueFianl, remainHP))
+    return addValueFianl
 
 ## 直接扣血不走公式
 # view 是否广播客户端飘血
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_8.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_8.py
index 250699c..6a49a6d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_8.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillModule_8.py
@@ -50,7 +50,9 @@
 
     if addValue <= 0:
         return
-    SkillCommon.SkillAddHP(defender, curSkill.GetSkillTypeID(), addValue, isEnhanceSkill)
+    addValue = SkillCommon.SkillAddHP(defender, curSkill.GetSkillTypeID(), addValue, isEnhanceSkill)
+    if addValue == None:
+        return
     if isEnhanceSkill:
         return True
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5000.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5000.py
new file mode 100644
index 0000000..a2587db
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_5000.py
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveBuff.PassiveSkill_5000
+#
+# @todo:回合触发
+# @author hxp
+# @date 2024-01-17
+# @version 1.0
+#
+# 详细描述: 回合触发
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-01-17 16:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+
+# 进入XX buff状态触发技能
+def CheckCanHappen(attacker, defender, effect, curSkill):
+    #A-回合编号(0-每回合,>=1-第x回合);B-判断方式(0-等于,1-大于等于,2-小于等于);C-
+    timeLine = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)
+    if not timeLine:
+        return False
+    
+    checkTurnNum = effect.GetEffectValue(0)
+    checkType = effect.GetEffectValue(1)
+    if checkTurnNum:
+        turnNum = timeLine / 100
+        if checkType == 0:
+            if turnNum != checkTurnNum:
+                return False
+        elif checkType == 1:
+            if turnNum < checkTurnNum:
+                return False
+        elif checkType == 2:
+            if turnNum > checkTurnNum:
+                return False
+        else:
+            return False
+        
+    # 其他逻辑...
+    
+    return True
+    
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
index 598b4b1..69e1b33 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -434,6 +434,7 @@
              4108:ChConfig.TriggerType_SkillSuccess,  # 使用技能成功后不触发技能 处理消耗等问题用 87
              4109:ChConfig.TriggerType_SkillValue,   # 增加技能伤害固定值 82
              4110:ChConfig.TriggerType_ChangeSkillEff, # 改变技能特效
+             5000:ChConfig.TriggerType_TurnNum, # 回合触发 91
              }
     return tdict.get(effectID, -1) 
     #===========================================================================
@@ -1234,6 +1235,10 @@
 # 那么ntElf执行人物的伤害计算和被动触发效果
 # 被动技能只处理玩家,宠物,和灵
 def FindRealAttacker(attacker):
+    if attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline):
+        # 回合制下都代表自己
+        return attacker
+    
     if attacker.GetGameObjType() != IPY_GameWorld.gotNPC:
         # --玩家
         return attacker
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
index 58321d4..54c1138 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -3859,7 +3859,7 @@
     
     skillAim = GetSkillFireAim(curSkill)
     affectTag = GetSkillAffectTag(curSkill)
-    GameWorld.DebugLog("释放被动触发技能 : %s- %s"%(skillAim, curSkill.GetSkillID()))
+    GameWorld.DebugLog("释放被动触发技能 : atkID=%s,skillID=%s(%s)" % (attacker.GetID(), curSkill.GetSkillID(), curSkill.GetSkillName()))
 
     if skillAim == ChConfig.Def_UseSkillAim_None:
         if curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List and affectTag != ChConfig.Def_UseSkillTag_Self:

--
Gitblit v1.8.0