From 3432541b467d53ffe4ed3872c734e76638e30df8 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 24 十月 2025 17:58:12 +0800
Subject: [PATCH] 302 【公会】BOSS讨伐-服务端

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py |   87 ++++++++++++++++++++++++++++++-------------
 1 files changed, 61 insertions(+), 26 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 63fdd02..9ccdedd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -23,7 +23,11 @@
 import PlayerControl
 import IpyGameDataPY
 import FormulaControl
+import PlayerPrestigeSys
+import PlayerFamily
+import PlayerGubao
 import PlayerHero
+import PlayerHJG
 import GameWorld
 import ChConfig
 import ChEquip
@@ -61,7 +65,7 @@
         self.__refreshState = 0 # 刷属性标记, 0-不需要刷新了,1-需要刷新
         
         self.__freeLineupHeroObjs = [] # 释放的空闲对象[LineupHero, ...]
-        self.lineupHeroDict = {} # 阵容武将 {posNum:LineupHero, ...}
+        self.__lineupHeroDict = {} # 刷新阵容后的武将信息 {posNum:LineupHero, ...}
         self.fightPower = 0 # 阵容总战力
         return
     
@@ -81,42 +85,41 @@
             PlayerHero.Sync_Lineup(self.olPlayer.curPlayer, self.lineupID)
         return
     
+    def IsEmpty(self): return (not self.__lineupHeroDict or not self.heroItemDict)
+    
+    def GetPosNumList(self): return self.__lineupHeroDict.keys()
+    
     def FreeLineupHero(self):
         ## 释放阵容武将对象,重新计算
-        for freeObj in self.lineupHeroDict.values():
+        for freeObj in self.__lineupHeroDict.values():
             if freeObj not in self.__freeLineupHeroObjs:
                 self.__freeLineupHeroObjs.append(freeObj)
-        self.lineupHeroDict = {}
+        self.__lineupHeroDict = {}
         self.fightPower = 0
         return
     
     def GetLineupHero(self, posNum):
         lineupHero = None
-        if posNum in self.lineupHeroDict:
-            lineupHero = self.lineupHeroDict[posNum]
+        if posNum in self.__lineupHeroDict:
+            lineupHero = self.__lineupHeroDict[posNum]
         elif self.__freeLineupHeroObjs:
             lineupHero = self.__freeLineupHeroObjs.pop(0)
             lineupHero.Clear()
-            self.lineupHeroDict[posNum] = lineupHero
+            self.__lineupHeroDict[posNum] = lineupHero
         else:
             lineupHero = LineupHero()
-            self.lineupHeroDict[posNum] = lineupHero
+            self.__lineupHeroDict[posNum] = lineupHero
         return lineupHero
     
     def GetLineupHeroByID(self, heroID):
         lineupHero = None
-        for posNum in self.lineupHeroDict.keys():
+        for posNum in self.__lineupHeroDict.keys():
             lineupHero = self.GetLineupHero(posNum)
             if lineupHero.heroID == heroID:
                 return lineupHero
         if False:
             lineupHero = LineupHero()
         return lineupHero
-    
-    def GetLineupInfo(self):
-        ## 获取阵容信息,即要用到该阵容了,如战斗或者保存缓存信息等
-        self.DoRefreshLineupAttr() # 取阵容时先检查
-        return
     
     def SetNeedRefreshState(self):
         ## 设置需要刷属性
@@ -126,15 +129,16 @@
     def RefreshLineupAttr(self, refreshForce=False):
         self.__refreshState = 1 # 标记要刷新
         if refreshForce:
-            self.DoRefreshLineupAttr()
+            self.CheckRefreshLineupAttr()
         return
     
-    def DoRefreshLineupAttr(self):
+    def CheckRefreshLineupAttr(self):
+        ## 检查刷新阵容属性
         if not self.__refreshState:
             return False
+        self.__refreshState = 0
         doRefreshLineupAttr(self.olPlayer.curPlayer, self.olPlayer, self)
         self.lineupChange = False
-        self.__refreshState = 0
         return True
     
     def CheckHeroItemUpdate(self, itemIndex):
@@ -156,6 +160,8 @@
         
         # 主线战斗
         self.mainFight = TurnAttack.MainFight(playerID)
+        
+        self._lastBatBufferInfo = [] # 最后一场战斗临时回放 ["guid", "buffer"]
         return
     
     def OnClear(self):
@@ -171,7 +177,8 @@
         ## 是否真的在线
         return self.curPlayer != None
     
-    def GetLineup(self, lineupID):
+    def GetLineup(self, lineupID, checkAttr=True):
+        # @param checkAttr: 检查刷新到最新阵容属性
         lineup = None
         if lineupID in self.lineupDict:
             lineup = self.lineupDict[lineupID]
@@ -179,6 +186,8 @@
             lineup = Lineup(self.playerID, lineupID)
             self.lineupDict[lineupID] = lineup
         lineup.olPlayer = self
+        if checkAttr:
+            lineup.CheckRefreshLineupAttr()
         return lineup
     
     def GetCalcAttr(self, calcIndex): return self.calcAttrDict.get(calcIndex, {})
@@ -226,7 +235,7 @@
         for lineupID, lineup in self.lineupDict.items():
             if not isAllLineup and lineupID != ShareDefine.Lineup_Main:
                 continue
-            if lineup.DoRefreshLineupAttr():
+            if lineup.CheckRefreshLineupAttr():
                 isRefresh = True
                 
         return isRefresh
@@ -246,6 +255,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():
     ## 准在线玩家管理
@@ -387,7 +401,7 @@
         
     GameWorld.DebugLog("重载阵容: %s" % lineupDict, curPlayer.GetPlayerID())
     for lineupID, heroItemDict in lineupDict.items():
-        lineup = olPlayer.GetLineup(lineupID)
+        lineup = olPlayer.GetLineup(lineupID, False)
         
         # 获取其他绑定该阵容的功能,如红颜、灵兽等
         
@@ -403,6 +417,9 @@
     CalcRoleBase(curPlayer)
     ChEquip.CalcRoleEquipAttr(curPlayer)
     PlayerHero.CalcHeroAddAttr(curPlayer)
+    PlayerPrestigeSys.CalcOfficialRankAttr(curPlayer)
+    PlayerGubao.CalcGubaoAttr(curPlayer)
+    PlayerHJG.CalcHJGAttr(curPlayer)
     return
 
 def doRefreshLineupAttr(curPlayer, olPlayer, lineup):
@@ -468,10 +485,11 @@
         elif skinIDList:
             skinID = skinIDList[0]
             
+        starMax = PlayerHero.GetHeroStarMax(heroItem)
         InitAddPer += qualityIpyData.GetInitAddPer()
         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:
@@ -623,7 +641,10 @@
     lvAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_LV)
     equipAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_MainEquip)
     bookAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_HeroBook)
-
+    realmAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Realm)
+    gubaoAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Gubao)
+    hjgAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_HJG)
+    
     GameWorld.DebugLog("    国家武将统计=%s" % countryHeroInfo, playerID)
     GameWorld.DebugLog("    羁绊武将统计=%s" % fetterHeroInfo, playerID)
     GameWorld.DebugLog("    武将自身属性=%s" % heroSelfAttrInfo, playerID)
@@ -637,6 +658,9 @@
     GameWorld.DebugLog("    主公等级属性=%s" % lvAttrDict, playerID)
     GameWorld.DebugLog("    主公装备属性=%s" % equipAttrDict, playerID)
     GameWorld.DebugLog("    主公图鉴属性=%s" % bookAttrDict, playerID)
+    GameWorld.DebugLog("    主公官职属性=%s" % realmAttrDict, playerID)
+    GameWorld.DebugLog("    主公古宝属性=%s" % gubaoAttrDict, playerID)
+    GameWorld.DebugLog("    主幻境阁属性=%s" % hjgAttrDict, playerID)
     
     PlayerLV = curPlayer.GetLV()
     OfficialLV = curPlayer.GetOfficialRank()
@@ -668,6 +692,15 @@
             bookValue = bookAttrDict.get(attrID, 0)
             bookPer = bookAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
             
+            realmValue = realmAttrDict.get(attrID, 0)
+            realmPer = realmAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
+            
+            gubaoValue = gubaoAttrDict.get(attrID, 0)
+            gubaoPer = gubaoAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
+            
+            hjgValue = hjgAttrDict.get(attrID, 0)
+            hjgPer = hjgAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
+            
             lineupInitAddPer, lineupLVAddPer, lineupBreakLVAddPer, lineupStarAddPer = 0, 0, 0, 0
             if attrID in ChConfig.BaseAttrIDList:
                 lineupInitAddPer, lineupLVAddPer, lineupBreakLVAddPer, lineupStarAddPer = InitAddPer, LVAddPer, BreakLVAddPer, StarAddPer
@@ -693,7 +726,8 @@
                 awakeTalentPer = awakeTalentAttrDict.get(attrPerID, 0) / 10000.0
                 
             # 计算
-            attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "bookValue":bookValue, "bookPer":bookPer, 
+            attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "bookValue":bookValue, "bookPer":bookPer, "realmValue":realmValue, "realmPer":realmPer, 
+                             "gubaoValue":gubaoValue, "gubaoPer":gubaoPer, "hjgValue":hjgValue, "hjgPer":hjgPer,
                              "lineupInitAddPer":lineupInitAddPer, "lineupLVAddPer":lineupLVAddPer, "lineupBreakLVAddPer":lineupBreakLVAddPer, "lineupStarAddPer":lineupStarAddPer,
                              "heroSelfValue":heroSelfValue, "heroSelfPer":heroSelfPer, "inheritPer":inheritPer,
                              "lineupHaloValue":lineupHaloValue, "lineupHaloPer":lineupHaloPer, "fetterValue":fetterValue, "fetterPer":fetterPer,
@@ -702,9 +736,9 @@
                              }
             
             if attrID in ChConfig.BaseAttrIDList:
-                attrValue = FormulaControl.Eval("baseAttrFormula", baseAttrFormula, attrParamDict)
+                attrValue = FormulaControl.Eval("baseAttrFormula", baseAttrFormula, attrParamDict, toInt=False, ndigits=3)
             else:
-                attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict)
+                attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict, toInt=False, ndigits=3)
             #GameWorld.DebugLog("    attrID=%s,attrValue=%s,attrParamDict=%s" % (attrID, attrValue, attrParamDict))
             
             attrIpyData = IpyGameDataPY.GetIpyGameData("PlayerAttr", attrID)
@@ -720,7 +754,7 @@
                 logAttrDict["%s-%s" % (attrID, attrName)] = attrValue
             
         # 计算战力
-        fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict)
+        fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict, toInt=True)
         
         GameWorld.DebugLog("    heroID=%s,fightPower=%s,heroSkillIDList=%s" % (heroID, fightPower, lineupHero.heroSkillIDList), playerID)
         skillTypeIDDict = {}
@@ -744,7 +778,7 @@
             skillID = skillData.GetSkillID()
             lineupHero.heroSkillIDList.append(skillID)
             paramDict = {"SkillPower":skillData.GetFightPower(), "PlayerLV":PlayerLV, "OfficialLV":OfficialLV}
-            sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict)
+            sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict, toInt=True)
             skillFightPower += sFightPower
         GameWorld.DebugLog("    skillFightPower=%s,heroSkillIDList=%s" % (skillFightPower, lineupHero.heroSkillIDList), playerID)
         
@@ -794,6 +828,7 @@
     else:
         GameWorld.DebugLog("主阵容没有在战斗中,不需要处理", playerID)
         
+    PlayerFamily.RefreshFamilyMember(curPlayer) # 更新公会
     # 更新排行榜
     
     return

--
Gitblit v1.8.0