From fd3137f3c58f6fb5f53c0bfc38c55c74e7709f72 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 04 八月 2025 15:07:05 +0800
Subject: [PATCH] 121 【武将】武将系统-服务端(阵容通知B124)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py   |   45 +++++++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py |    7 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py     |  131 ++++++++++++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py     |    6 
 4 files changed, 175 insertions(+), 14 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 4ddf44f..c44e72b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -44314,6 +44314,137 @@
 
 
 #------------------------------------------------------
+# B1 24 阵容信息 #tagSCLineupInfo
+
+class  tagSCLineup(Structure):
+    LineupID = 0    #(BYTE LineupID)// 阵容ID
+    ShapeType = 0    #(BYTE ShapeType)// 阵型
+    HeroCnt = 0    #(BYTE HeroCnt)
+    HeroItemIndexList = list()    #(vector<WORD> HeroItemIndexList)// 所在武将背包索引+1列表 [站位1物品索引+1, 站位2, ...],站位无武将时为0
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.LineupID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ShapeType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HeroCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.HeroCnt):
+            value,_pos=CommFunc.ReadWORD(_lpData,_pos)
+            self.HeroItemIndexList.append(value)
+        return _pos
+
+    def Clear(self):
+        self.LineupID = 0
+        self.ShapeType = 0
+        self.HeroCnt = 0
+        self.HeroItemIndexList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 1
+        length += 1
+        length += 2 * self.HeroCnt
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.LineupID)
+        data = CommFunc.WriteBYTE(data, self.ShapeType)
+        data = CommFunc.WriteBYTE(data, self.HeroCnt)
+        for i in range(self.HeroCnt):
+            data = CommFunc.WriteWORD(data, self.HeroItemIndexList[i])
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                LineupID:%d,
+                                ShapeType:%d,
+                                HeroCnt:%d,
+                                HeroItemIndexList:%s
+                                '''\
+                                %(
+                                self.LineupID,
+                                self.ShapeType,
+                                self.HeroCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagSCLineupInfo(Structure):
+    Head = tagHead()
+    LineupCnt = 0    #(BYTE LineupCnt)
+    LineupList = list()    #(vector<tagSCLineup> LineupList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x24
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.LineupCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.LineupCnt):
+            temLineupList = tagSCLineup()
+            _pos = temLineupList.ReadData(_lpData, _pos)
+            self.LineupList.append(temLineupList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x24
+        self.LineupCnt = 0
+        self.LineupList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.LineupCnt):
+            length += self.LineupList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.LineupCnt)
+        for i in range(self.LineupCnt):
+            data = CommFunc.WriteString(data, self.LineupList[i].GetLength(), self.LineupList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                LineupCnt:%d,
+                                LineupList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.LineupCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagSCLineupInfo=tagSCLineupInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCLineupInfo.Head.Cmd,m_NAtagSCLineupInfo.Head.SubCmd))] = m_NAtagSCLineupInfo
+
+
+#------------------------------------------------------
 # B1 06 通知玩家向目标点移动 #tagMCNotifyPlayerMove
 
 class  tagMCNotifyPlayerMove(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index fbcc07c..e026c22 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -505,7 +505,9 @@
         # 离线过久恢复为非跨服状态
         if PlayerControl.GetCrossMapID(curPlayer):
             PlayerControl.SetCrossMapID(curPlayer, 0)
-        
+            
+    __FirstLoginOnEnter(curPlayer)
+    
     TurnAttack.OnPlayerLogin(curPlayer)
     SyncGuideState(curPlayer)
     
@@ -538,8 +540,6 @@
     PlayerPrestigeSys.OnLogin(curPlayer)
     #DataRecordPack.DR_PlayerLogin(curPlayer)
     EventReport.WriteEvent_login(curPlayer)
-    
-    __FirstLoginOnEnter(curPlayer)
     
     # 合服首登处理
     __DoMixServerFirstLogin(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
index 8165538..2284597 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -1220,15 +1220,6 @@
     PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroBook, heroBookAttrDict)
     return
 
-def RefreshLineupHeroAttr(curPlayer):
-    ## 刷新阵容武将属性
-    
-    # 计算阵容总战力 = 角色总战力为主阵容战力,需同步计算不同阵容战力
-    return
-
-def CaclHeroCardAttr():
-    return
-
 def Sync_HeroInfo(curPlayer, heroIDList=None):
     if heroIDList != None:
         syncHeroIDList = heroIDList
@@ -1266,3 +1257,39 @@
     clientPack.HeroCnt = len(clientPack.HeroInfoList)    
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
+
+def Sync_Lineup(curPlayer, lineupID=None):
+    if lineupID:
+        syncIDList = [lineupID]
+    else:
+        syncIDList = ShareDefine.LineupList
+        
+    lineupList = []
+    olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
+    for lineupID in syncIDList:
+        lineup = olPlayer.GetLineup(lineupID)
+        if not lineup:
+            continue
+        
+        posNumItemIndexDict = {v:k for k, v in lineup.heroItemDict.items()}
+        heroItemIndexList = [] # 所在武将背包索引+1列表 [站位1物品索引+1, 站位2, ...],站位无武将时为0
+        for posNum in range(1, 1 + ShareDefine.LineupObjMax):
+            if posNum in posNumItemIndexDict:
+                heroItemIndexList.append(posNumItemIndexDict[posNum] + 1)
+            else:
+                heroItemIndexList.append(0)
+        packLineup = ChPyNetSendPack.tagSCLineup()
+        packLineup.LineupID = lineup.lineupID
+        packLineup.ShapeType = lineup.shapeType
+        packLineup.HeroItemIndexList = heroItemIndexList
+        packLineup.HeroCnt = len(packLineup.HeroItemIndexList)
+        lineupList.append(packLineup)
+        
+    if not lineupList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagSCLineupInfo()
+    clientPack.LineupList = lineupList
+    clientPack.LineupCnt = len(clientPack.LineupList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
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 2a29643..e51d59f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -62,7 +62,7 @@
         self.fightPower = 0 # 阵容总战力
         return
     
-    def UpdLineup(self, heroItemDict, shapeType=0, refreshForce=False):
+    def UpdLineup(self, heroItemDict, shapeType=0, refreshForce=False, syncLineup=True):
         '''变更阵容时更新
         @param heroItemDict: 武将背包索引信息  {itemIndex:posNum, ...}
         @param shapeType: 阵型
@@ -72,6 +72,8 @@
         self.heroItemDict = heroItemDict
         GameWorld.DebugLog("更新阵容: lineupID=%s,%s" % (self.lineupID, heroItemDict), self.playerID)
         self.RefreshLineupAttr(refreshForce)
+        if syncLineup and self.olPlayer.curPlayer:
+            PlayerHero.Sync_Lineup(self.olPlayer.curPlayer, self.lineupID)
         return
     
     def FreeLineupHero(self):
@@ -384,8 +386,9 @@
         # 获取其他绑定该阵容的功能,如红颜、灵兽等
         
         shapeType = lineShapeTypeDict.get(lineupID, 0)
-        lineup.UpdLineup(heroItemDict, shapeType)
+        lineup.UpdLineup(heroItemDict, shapeType, syncLineup=False)
         
+    PlayerHero.Sync_Lineup(curPlayer)
     return
 
 def doCalcAllAttr(curPlayer):

--
Gitblit v1.8.0