From 3ed128401680ce3755dee186f48c7fb965f7aca8 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 18 九月 2025 10:11:12 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(诸葛果技能;追击支持;优化连击追击;程序内置限制单武将单次行动中每个对象累计使用技能次数20次;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py |   64 ++++++++++++++++++-------------
 1 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
index 179464b..2f18a62 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -65,18 +65,19 @@
         self.fightPower = 0 # 阵容总战力
         return
     
-    def UpdLineup(self, heroItemDict, shapeType=0, refreshForce=False, syncLineup=True):
+    def UpdLineup(self, heroItemDict, shapeType=0, refreshForce=False, isReload=False):
         '''变更阵容时更新
         @param heroItemDict: 武将背包索引信息  {itemIndex:posNum, ...}
         @param shapeType: 阵型
         @param refreshForce: 是否强制刷属性
         '''
-        self.lineupChange = True
+        if not isReload: # 非重读阵容的视为变更
+            self.lineupChange = True
         self.shapeType = shapeType
         self.heroItemDict = heroItemDict
         GameWorld.DebugLog("更新阵容: lineupID=%s,%s" % (self.lineupID, heroItemDict), self.playerID)
         self.RefreshLineupAttr(refreshForce)
-        if syncLineup and self.olPlayer.curPlayer:
+        if not isReload and self.olPlayer.curPlayer:
             PlayerHero.Sync_Lineup(self.olPlayer.curPlayer, self.lineupID)
         return
     
@@ -155,6 +156,8 @@
         
         # 主线战斗
         self.mainFight = TurnAttack.MainFight(playerID)
+        
+        self._lastBatBufferInfo = [] # 最后一场战斗临时回放 ["guid", "buffer"]
         return
     
     def OnClear(self):
@@ -245,6 +248,11 @@
                         
         GameWorld.DebugLog("武将物品养成更新索引: %s, 影响阵容:%s" % (itemIndexList, effLineupIDList), self.playerID)
         return effLineupIDList
+    
+    def GetLastBatBuffer(self): return self._lastBatBufferInfo
+    def SetLastBatBuffer(self, guid, batBuffer):
+        self._lastBatBufferInfo = [guid, batBuffer]
+        return
     
 class OnlineMgr():
     ## 准在线玩家管理
@@ -391,7 +399,7 @@
         # 获取其他绑定该阵容的功能,如红颜、灵兽等
         
         shapeType = lineShapeTypeDict.get(lineupID, 0)
-        lineup.UpdLineup(heroItemDict, shapeType, syncLineup=False)
+        lineup.UpdLineup(heroItemDict, shapeType, isReload=True)
         
     PlayerHero.Sync_Lineup(curPlayer)
     return
@@ -467,10 +475,11 @@
         elif skinIDList:
             skinID = skinIDList[0]
             
+        starMax = PlayerHero.GetHeroStarMax(heroItem)
         InitAddPer += qualityIpyData.GetInitAddPer()
-        LVAddPer += qualityIpyData.GetLVAddPer() * heroLV
+        LVAddPer += qualityIpyData.GetLVAddPer() * max(0, heroLV - 1)
         BreakLVAddPer += qualityIpyData.GetBreakLVAddPer() * breakLV
-        StarAddPer += qualityIpyData.GetStarAddPer() * star
+        StarAddPer += qualityIpyData.GetStarAddPer() * min(star, starMax)
         
         lineupHero = lineup.GetLineupHero(posNum)
         #if False:
@@ -497,26 +506,11 @@
             selfAttrDict[int(k)] = v
         heroSelfAttrInfo[heroID] = selfAttrDict
         
-        # 星级天赋
-        starTalentAttrDict = {}
-        idCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID)
-        lvCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV)
-        for aIndex in range(min(idCount, lvCount)):
-            talentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, aIndex)
-            talentLV = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, aIndex)
-            stIpyData = IpyGameDataPY.GetIpyGameData("HeroTalent", talentID)
-            if not stIpyData:
-                continue
-            attrID = stIpyData.GetAttrID()
-            attrValue = stIpyData.GetAttrValue() * talentLV
-            starTalentAttrDict[attrID] = starTalentAttrDict.get(attrID, 0) + attrValue
-        heroStarTalentInfo[heroID] = starTalentAttrDict
-        
         # 突破潜能
         breakAttrDict = {}
-        awakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroBreak", heroID)
-        if awakeIpyDataList:
-            for breakIpyData in awakeIpyDataList:
+        breakIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroBreak", heroID)
+        if breakIpyDataList:
+            for breakIpyData in breakIpyDataList:
                 if breakIpyData.GetBreakLV() > breakLV:
                     break
                 attrIDList = breakIpyData.GetAttrIDList()
@@ -531,12 +525,15 @@
         heroBreakAttrInfo[heroID] = breakAttrDict
         
         # 觉醒天赋
+        maxUnlockSlot = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 1) # 常规天赋槽个数
         awakeTalentAttrDict = {}
-        awakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroAwake", heroID)
+        awakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID)
         if awakeIpyDataList:
             for awakeIpyData in awakeIpyDataList:
                 if awakeIpyData.GetAwakeLV() > awakeLV:
                     break
+                unlockTalentSlot = awakeIpyData.GetUnlockTalentSlot()
+                maxUnlockSlot = max(maxUnlockSlot, unlockTalentSlot)
                 attrIDList = awakeIpyData.GetAttrIDList()
                 attrValueList = awakeIpyData.GetAttrValueList()
                 for aIndex in range(min(len(attrIDList), len(attrValueList))):
@@ -547,6 +544,21 @@
                 if skillID:
                     lineupHero.heroSkillIDList.append(skillID)
         heroAwakeTalentInfo[heroID] = awakeTalentAttrDict
+        
+        # 星级天赋
+        starTalentAttrDict = {}
+        idCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID)
+        lvCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV)
+        for aIndex in range(min(idCount, lvCount, maxUnlockSlot)): # 重生导致已觉醒槽位失效时属性也无效
+            talentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, aIndex)
+            talentLV = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, aIndex)
+            stIpyData = IpyGameDataPY.GetIpyGameData("HeroTalent", talentID)
+            if not stIpyData:
+                continue
+            attrID = stIpyData.GetAttrID()
+            attrValue = stIpyData.GetAttrValue() * talentLV
+            starTalentAttrDict[attrID] = starTalentAttrDict.get(attrID, 0) + attrValue
+        heroStarTalentInfo[heroID] = starTalentAttrDict
         
         # 羁绊统计
         for fetterID in heroIpyData.GetFetterIDList():
@@ -771,8 +783,6 @@
             GameWorld.DebugLog("主阵容变化,重新开始战斗", playerID)
             if mainTurnFight.mapID == ChConfig.Def_FBMapID_Main:
                 TurnAttack.__doMainLevelWave(curPlayer, True)
-            elif mainTurnFight.mapID == ChConfig.Def_FBMapID_MainBoss:
-                TurnAttack.__doMainBossStart(curPlayer)
                 
         # 否则只重新设置战斗属性
         else:

--
Gitblit v1.8.0