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/Attack/TurnAttack.py |   87 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 64 insertions(+), 23 deletions(-)

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):

--
Gitblit v1.8.0