From 649b36b642546062ab5102b6225b9f78ea72309d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 04 十一月 2025 18:11:02 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(优化完整战报仅包含战斗相关封包,结算奖励相关如物品,经验,货币,挑战次数等统一放在战报数据B430后同步)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py |   54 +++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 39 insertions(+), 15 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 daf0220..398e8b0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -75,6 +75,10 @@
         self.beautyObjIDDict = {} # 红颜战斗单位 {位置编号:batObjID, ...}
         self.actionNum = ActionNumStart # 行动位置,从1开始
         self.totalHurt = 0 # 阵容总输出
+        
+        #特殊
+        self.bossID = 0
+        self.bossPosView = 0
         return
     
     def getPlayerID(self): return self.turnFight.playerID # 发起的玩家ID
@@ -88,6 +92,8 @@
         self.ownerID = lineupInfo.get("PlayerID", 0) # 阵容所属的玩家ID
         self.shapeType = lineupInfo.get("ShapeType", 0)
         self.fightPower = lineupInfo.get("FightPower", 0)
+        self.bossID = lineupInfo.get("BossID", 0)
+        self.bossPosView = lineupInfo.get("BossPosView", 0)
         SummonLineupObjs(self, self.faction, self.num, lineupInfo, self.getPlayerID())
         return
     
@@ -176,6 +182,7 @@
         self.isNeedReport = isNeedReport # 是否需要战报
         self.msgDict = {} # 扩展信息字典,一般由MapID绑定的功能决定信息内容  {k:v, ...}
         self._kvDict = {} # 自定义信息字典,不会被重置  {k:v, ...}
+        self.awardData = None # 战斗奖励设置的数据,可以是任意数据格式,由功能自行决定,会传递给 OnTurnFightAward 处理
         
         self.factionDict = {} # 战斗阵营 {faction:BatFaction, ...},一般是只有两个阵营,faction为1或2,每个阵营支持多个阵容
         self.actionSortList = [] # 阵容行动顺序 [[faction, num], ...]
@@ -205,6 +212,7 @@
         self.setPVP()
         self.msgDict = {}
         self._kvDict = {}
+        self.awardData = None
         self.nextTurnFight(msgDict)
         return
     
@@ -384,7 +392,10 @@
                     tfObj.MaxHP = batObj.GetMaxHP() % ChConfig.Def_PerPointValue
                     tfObj.MaxHPEx = batObj.GetMaxHP() / ChConfig.Def_PerPointValue
                     tfObj.LV = batObj.GetLV()
-                    tfObj.PosNum = posNum
+                    if batLineup.bossPosView and batLineup.bossID == batObj.GetNPCID():
+                        tfObj.PosNum = batLineup.bossPosView
+                    else:
+                        tfObj.PosNum = posNum                        
                     tfObj.AngreXP = batObj.GetXP()
                     tfLineup.ObjList.append(tfObj)
                 tfLineup.ObjCnt = len(tfLineup.ObjList)
@@ -600,9 +611,11 @@
     ipyData = IpyGameDataPY.GetIpyGameData("NPCLineup", lineupID)
     if not ipyData:
         return {}
+    bossID = ipyData.GetBossID()
+    bossPosView = ipyData.GetBossPosView()
     
     heroDict = {}
-    for posNum in range(1, 1 + 10):
+    for posNum in range(1, 1 + 6):
         if not hasattr(ipyData, "GetPosNPCID%s" % posNum):
             break
         npcID = getattr(ipyData, "GetPosNPCID%s" % posNum)()
@@ -613,7 +626,7 @@
             continue
         heroDict[str(posNum)] = battleDict
         
-    lineupInfo = {"NPCLineupID":lineupID, "Hero":heroDict}
+    lineupInfo = {"NPCLineupID":lineupID, "Hero":heroDict, "BossID":bossID, "BossPosView":bossPosView}
     return lineupInfo
 
 def GetNPCBattleDict(lineupIpyData, npcID, strongerLV=0, difficulty=0):
@@ -819,6 +832,8 @@
             
         batLineup.posObjIDDict[posNum] = objID
         GameWorld.DebugLog("AddBatObj %s,skill=%s" % (GetObjName(batObj), skillManager.GetSkillIDList()))
+        ResetObjSkill(batObj)
+        
         if npcID:
             #副本指定NPC属性
             fbNPCInitAttrDict = FBLogic.GetFBNPCInitAttr(curPlayer, turnFight, batObj)
@@ -853,8 +868,7 @@
         buffMgr.ClearBuff()
         
         # 重置技能
-        batObj.ResetSkillUseCnt()
-        ResetObjSkillCD(batObj)
+        ResetObjSkill(batObj)
         
         # 重刷属性、被动
         TurnBuff.RefreshBuffAttr(batObj)
@@ -1000,6 +1014,7 @@
         
     PlayerOnline.GetOnlinePlayer(curPlayer).SetLastBatBuffer(guid, turnFight.batBuffer)
     SyncTurnFightReport(curPlayer, guid, turnFight.batBuffer)
+    FBLogic.OnTurnFightAward(curPlayer, turnFight, mapID, funcLineID, turnFight.awardData)
     tfMgr.delTurnFight(guid)
     return True
 
@@ -1038,6 +1053,7 @@
     
     PlayerOnline.GetOnlinePlayer(curPlayer).SetLastBatBuffer(guid, turnFight.batBuffer)
     SyncTurnFightReport(curPlayer, guid, turnFight.batBuffer)
+    FBLogic.OnTurnFightAward(curPlayer, turnFight, mapID, funcLineID, turnFight.awardData)
     tfMgr.delTurnFight(guid)
     return True
 
@@ -1413,8 +1429,9 @@
             
             turnFight.ResetOneActionUseSkillCnt()
             batObj.SetTiming(ChConfig.TurnTiming_Before) # 重置时机到回合前
-            RefreshObjSkillByTurn(batObj) # 优先刷技能CD
-            
+            if turnNum > 1: # 第1回合不用刷新技能
+                RefreshObjSkillByTurn(batObj)
+                
             TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStart)
             
     return
@@ -1469,21 +1486,28 @@
     RefreshObjBuffTime(turnFight, batObj)
     return
 
-def ResetObjSkillCD(batObj):
-    ## 重置所有技能CD
+def ResetObjSkill(batObj):
+    ## 重置所有技能,一般是每场战斗开始的重置
+    curID = batObj.GetID()
+    batObj.ResetSkillUseCnt() # 使用次数
     skillManager = batObj.GetSkillManager()
     for index in range(0, skillManager.GetSkillCount()):
         curSkill = skillManager.GetSkillByIndex(index)
         if not curSkill:
             continue
-        remainTime = curSkill.GetRemainTime()
-        if remainTime <= 0:
-            continue
-        curSkill.SetRemainTime(0)
+        skillID = curSkill.GetSkillID()
+        initCD = curSkill.GetCoolDownInit()
+        if initCD:
+            curSkill.SetRemainTime(initCD)
+            GameWorld.DebugLog("技能初始CD: curID=%s,skillID=%s,initCD=%s" % (curID, skillID, initCD))
+        elif curSkill.GetRemainTime():
+            curSkill.SetRemainTime(0)
+        curSkill.SetEnergy(0)
+        
     return
 
 def RefreshObjSkillByTurn(batObj):
-    '''按回合刷新技能:默认以大回合统一减1回合,使用技能后设置剩余CD统一默认加1回合,即配置1回合,设置的CD是2
+    '''按回合刷新技能:默认以大回合统一减1回合
     '''
     curID = batObj.GetID()
     skillManager = batObj.GetSkillManager()
@@ -1493,7 +1517,6 @@
             continue
         skillID = curSkill.GetSkillID()
         preTurnUseCnt = batObj.GetSkillTurnUseCnt(skillID)
-        batObj.ResetSkillTurnUseCnt() # 重置回合使用次数
         remainTime = curSkill.GetRemainTime()
         if remainTime <= 0:
             continue
@@ -1504,6 +1527,7 @@
         curSkill.SetRemainTime(remainTime)
         GameWorld.DebugLog("    更新技能CD: curID=%s,skillID=%s,remainTime=%s" % (curID, skillID, remainTime))
         
+    batObj.ResetSkillTurnUseCnt() # 重置回合使用次数,放刷新CD后重置
     return
 
 def RefreshObjBuffTime(turnFight, batObj):

--
Gitblit v1.8.0