From e65a33757a3ca9fad94f05f8309654585902d097 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 30 十月 2025 19:50:48 +0800
Subject: [PATCH] 326 【武将】阵容推荐-服务端

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py |   63 +++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py   |  108 +++++++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py     |   27 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py   |    8 +
 PySysDB/PySysDBPY.h                                                                      |    8 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py  |   15 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py          |    3 
 7 files changed, 226 insertions(+), 6 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index dc81b01..1a339b5 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -220,6 +220,7 @@
 	DWORD		BookStarAddPer;	// 图鉴每星级加成
 	DWORD		BookBreakLVAddPer;	// 图鉴每突破等级加成
 	list		DismissReturnItems;	// 遣散每星返还道具 [[物品ID,个数], ...]
+	list		RecommendAwardMoney;	// 阵容推荐激活奖励货币 类型|值
 };
 
 //武将品质突破表
@@ -248,6 +249,13 @@
 	list		UPCostItem;	// 升级到下级消耗道具
 };
 
+//推荐阵容表
+struct	LineupRecommend
+{
+	DWORD		_RecommendID;	//推荐ID
+	list		HeroIDList;	// 推荐武将ID列表
+};
+
 //属性条目表
 struct	PlayerAttr
 {
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index f0eb727..133feb9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3911,6 +3911,7 @@
 Def_PDict_HeroBook = "HeroBook_%s" # 武将图鉴激活等级,参数(武将ID) cccbbba a-初始激活状态1-英雄激活,2-初始图鉴激活; bbb-存星级图鉴激活等级;ccc-存突破图鉴激活等级
 Def_PDict_HeroBookH = "HeroBookH_%s" # 武将图鉴历史最高等级,参数(武将ID) cccbbba: bbb-存星级图鉴最高等级;ccc-存突破图鉴最高等级
 Def_PDict_HeroAwakeRebirthCnt = "HeroAwakeRebirthCnt" # 已觉醒过的武将今日已重生次数,共享次数
+Def_PDict_HeroRecommend = "HeroRecommend_%s" # 阵容推荐领奖状态,参数(推荐ID) 根据武将ID所在索引位记录是否领取
 
 #主线
 Def_PDict_UnXiantaoCntExp = "UnXiantaoCntExp" # 累计未结算经验的战锤数
@@ -4894,7 +4895,7 @@
 Def_RewardType_DailyTask,  # 每日任务奖励 1
 Def_RewardType_LLMJLVUp,  # 历练秘笈升级 2
 Def_RewardType_FamilyTaofaBox,  # 公会讨伐领取宝箱奖励 3
-Def_RewardType_FamilyDayAward,  # 仙盟每日福利奖励 4
+Def_RewardType_LineupRecommend,  # 阵容推荐奖励 4
 Def_RewardType_LVAward,  # 玩家等级奖励5
 Def_RewardType_XBXZ, # 仙宝寻主奖励6
 Def_RewardType_DayRealmPoint, # 每日任务修行点奖励7
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index c0f9f16..52a1641 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -34290,6 +34290,114 @@
 
 
 #------------------------------------------------------
+# B1 29 阵容推荐信息 #tagSCLineupRecommendInfo
+
+class  tagSCLineupRecommend(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("RecommendID", c_ubyte),    #推荐阵容表ID
+                  ("AwardState", c_int),    #推荐武将领奖状态,按武将配置的顺序位存储是否已领取
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.RecommendID = 0
+        self.AwardState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagSCLineupRecommend)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 29 阵容推荐信息 //tagSCLineupRecommendInfo:
+                                RecommendID:%d,
+                                AwardState:%d
+                                '''\
+                                %(
+                                self.RecommendID,
+                                self.AwardState
+                                )
+        return DumpString
+
+
+class  tagSCLineupRecommendInfo(Structure):
+    Head = tagHead()
+    Count = 0    #(BYTE Count)
+    RecommendList = list()    #(vector<tagSCLineupRecommend> RecommendList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x29
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temRecommendList = tagSCLineupRecommend()
+            _pos = temRecommendList.ReadData(_lpData, _pos)
+            self.RecommendList.append(temRecommendList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x29
+        self.Count = 0
+        self.RecommendList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Count):
+            length += self.RecommendList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.RecommendList[i].GetLength(), self.RecommendList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                RecommendList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagSCLineupRecommendInfo=tagSCLineupRecommendInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCLineupRecommendInfo.Head.Cmd,m_NAtagSCLineupRecommendInfo.Head.SubCmd))] = m_NAtagSCLineupRecommendInfo
+
+
+#------------------------------------------------------
 # B1 28 历练秘笈信息 #tagSCLLMJInfo
 
 class  tagSCLLMJInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
index 8c7a3ef..009e7cd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
@@ -39,7 +39,7 @@
         GameWorld.DebugAnswer(curPlayer, "武将突破: Hero b 背包位置 设置等级")
         GameWorld.DebugAnswer(curPlayer, "武将觉醒: Hero a 背包位置 设置等级")
         GameWorld.DebugAnswer(curPlayer, "武将图鉴: Hero t 武将ID 图鉴星级 图鉴突破等级")
-        GameWorld.DebugAnswer(curPlayer, "重置图鉴: Hero t 0")
+        GameWorld.DebugAnswer(curPlayer, "重置图鉴: Hero t 0 [重置阵容推荐]")
         GameWorld.DebugAnswer(curPlayer, "重置重生: Hero r")
         GameWorld.DebugAnswer(curPlayer, "武将皮肤: Hero sk 武将ID 皮肤索引 是否解锁")
         GameWorld.DebugAnswer(curPlayer, "清空武将: ClearPack 35")
@@ -78,6 +78,7 @@
             heroIDList = [value2]
             
         if value2 == 0:
+            recommendReset = msgList[2] if len(msgList) > 2 else 0
             syncHeroIDList = []
             for heroID in heroIDList:
                 if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID):
@@ -85,6 +86,18 @@
                 syncHeroIDList.append(heroID)
                 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, 0)
             GameWorld.DebugAnswer(curPlayer, "重置图鉴OK!")
+            if recommendReset:
+                syncIDList = []
+                ipyDataMgr = IpyGameDataPY.IPY_Data()
+                for index in range(ipyDataMgr.GetLineupRecommendCount()):
+                    ipyData = ipyDataMgr.GetLineupRecommendByIndex(index)
+                    recommendID = ipyData.GetRecommendID()
+                    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroRecommend % recommendID):
+                        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroRecommend % recommendID, 0)
+                        syncIDList.append(recommendID)
+                PlayerHero.Sync_LineupRecommendInfo(curPlayer, syncIDList)
+                GameWorld.DebugAnswer(curPlayer, "重置推荐OK!")
+                
         else:
             heroID = value2
             syncHeroIDList = [heroID]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index e36e757..ad3240d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -226,6 +226,7 @@
                         ("DWORD", "BookStarAddPer", 0),
                         ("DWORD", "BookBreakLVAddPer", 0),
                         ("list", "DismissReturnItems", 0),
+                        ("list", "RecommendAwardMoney", 0),
                         ),
 
                 "HeroQualityBreak":(
@@ -246,6 +247,11 @@
                         ("DWORD", "Quality", 1),
                         ("DWORD", "HeroLV", 1),
                         ("list", "UPCostItem", 0),
+                        ),
+
+                "LineupRecommend":(
+                        ("DWORD", "RecommendID", 1),
+                        ("list", "HeroIDList", 0),
                         ),
 
                 "PlayerAttr":(
@@ -2658,7 +2664,8 @@
     def GetBookInitAddPer(self): return self.attrTuple[8] #  图鉴初始加成 DWORD
     def GetBookStarAddPer(self): return self.attrTuple[9] #  图鉴每星级加成 DWORD
     def GetBookBreakLVAddPer(self): return self.attrTuple[10] #  图鉴每突破等级加成 DWORD
-    def GetDismissReturnItems(self): return self.attrTuple[11] #  遣散每星返还道具 [[物品ID,个数], ...] list
+    def GetDismissReturnItems(self): return self.attrTuple[11] #  遣散每星返还道具 [[物品ID,个数], ...] list
+    def GetRecommendAwardMoney(self): return self.attrTuple[12] #  阵容推荐激活奖励货币 类型|值 list
 
 # 武将品质突破表
 class IPY_HeroQualityBreak():
@@ -2694,6 +2701,16 @@
     def GetQuality(self): return self.attrTuple[0] # 品质 DWORD
     def GetHeroLV(self): return self.attrTuple[1] # 武将等级 DWORD
     def GetUPCostItem(self): return self.attrTuple[2] #  升级到下级消耗道具 list
+
+# 推荐阵容表
+class IPY_LineupRecommend():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetRecommendID(self): return self.attrTuple[0] # 推荐ID DWORD
+    def GetHeroIDList(self): return self.attrTuple[1] #  推荐武将ID列表 list
 
 # 属性条目表
 class IPY_PlayerAttr():
@@ -6029,6 +6046,7 @@
         self.__LoadFileData("HeroQualityBreak", onlyCheck)
         self.__LoadFileData("HeroQualityAwake", onlyCheck)
         self.__LoadFileData("HeroQualityLV", onlyCheck)
+        self.__LoadFileData("LineupRecommend", onlyCheck)
         self.__LoadFileData("PlayerAttr", onlyCheck)
         self.__LoadFileData("FightPowerRatio", onlyCheck)
         self.__LoadFileData("MainChapter", onlyCheck)
@@ -6589,6 +6607,13 @@
         self.CheckLoadData("HeroQualityLV")
         return self.ipyHeroQualityLVCache[index]
 
+    def GetLineupRecommendCount(self):
+        self.CheckLoadData("LineupRecommend")
+        return self.ipyLineupRecommendLen
+    def GetLineupRecommendByIndex(self, index):
+        self.CheckLoadData("LineupRecommend")
+        return self.ipyLineupRecommendCache[index]
+
     def GetPlayerAttrCount(self):
         self.CheckLoadData("PlayerAttr")
         return self.ipyPlayerAttrLen
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 c80f766..b9e9a60 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -3254,12 +3254,14 @@
     # 公会讨伐领取宝箱奖励
     elif rewardType == ChConfig.Def_RewardType_FamilyTaofaBox:
         PlayerFamilyTaofa.GetTaofaBoxAward(curPlayer)
+    # 阵容推荐奖励
+    elif rewardType == ChConfig.Def_RewardType_LineupRecommend:
+        PlayerHero.GetLineupRecommendAward(curPlayer, dataEx, dataExStr)
+        
+        
     # 每日免费直购礼包
     elif rewardType == ChConfig.Def_RewardType_DayFreeGoldGift:
         PlayerDailyGiftbag.OnGetDailyFreeGiftbag(curPlayer)
-    # 仙盟每日福利奖励
-    #elif rewardType == ChConfig.Def_RewardType_FamilyDayAward:
-    #    PlayerFamily.GetFamilyDayAward(curPlayer)
     # 玩家等级奖励
     elif rewardType == ChConfig.Def_RewardType_LVAward:
         PlayerLVAward.GetPlayerLVAward(curPlayer, dataEx)
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 d1ca320..935a97b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -38,6 +38,7 @@
 def OnPlayerLogin(curPlayer):
     Sync_HeroInfo(curPlayer)
     Sync_PlayerHeroInfo(curPlayer)
+    Sync_LineupRecommendInfo(curPlayer)
     return
 
 def OnPlayerFirstLogin(curPlayer):
@@ -1432,6 +1433,41 @@
 #    ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick)
 #    return
 
+def GetLineupRecommendAward(curPlayer, recommendID, index):
+    ## 领取阵容推荐奖励
+    index = GameWorld.ToIntDef(index)
+    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroRecommend % recommendID)
+    if awardState & pow(2, index):
+        GameWorld.DebugLog("阵容推荐奖励已领取! recommendID=%s,index=%s" % (recommendID, index))
+        return
+    ipyData = IpyGameDataPY.GetIpyGameData("LineupRecommend", recommendID)
+    if not ipyData:
+        return
+    heroIDList = ipyData.GetHeroIDList()
+    if index >= len(heroIDList):
+        return
+    heroID = heroIDList[index]
+    heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
+    if not heroIpyData:
+        return
+    quality = heroIpyData.GetQuality()
+    qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
+    if not qualityIpyData:
+        return
+    awardMoneyInfo = qualityIpyData.GetRecommendAwardMoney()
+    if not awardMoneyInfo or len(awardMoneyInfo) != 2:
+        return
+    moneyType, moneyValue = awardMoneyInfo
+    if GetHeroActivite(curPlayer, heroID) != 1:
+        GameWorld.DebugLog("武将未获得过,不可激活阵容推荐! heroID=%s" % (heroID))
+        return
+    awardState |= pow(2, index)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroRecommend % recommendID, awardState)
+    GameWorld.DebugLog("阵容推荐领奖! recommendID=%s,index=%s,heroID=%s,awardState=%s" % (recommendID, index, heroID, awardState))
+    PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "LineupRecommend", notifyAward=True)
+    Sync_LineupRecommendInfo(curPlayer, [recommendID])
+    return
+
 def RefreshLordAttr(curPlayer):
     ## 刷新主公属性
     CalcHeroAddAttr(curPlayer)
@@ -1555,3 +1591,30 @@
     clientPack.AwakeRebirthCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt)
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
+
+def Sync_LineupRecommendInfo(curPlayer, syncIDList=None):
+    
+    recommendList = []
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in range(ipyDataMgr.GetLineupRecommendCount()):
+        ipyData = ipyDataMgr.GetLineupRecommendByIndex(index)
+        recommendID = ipyData.GetRecommendID()
+        awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroRecommend % recommendID)
+        if syncIDList != None:
+            if recommendID not in syncIDList:
+                continue
+        elif not awardState:
+            continue
+        recommend = ChPyNetSendPack.tagSCLineupRecommend()
+        recommend.RecommendID = recommendID
+        recommend.AwardState = awardState
+        recommendList.append(recommend)
+        
+    if not recommendList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagSCLineupRecommendInfo()
+    clientPack.RecommendList = recommendList
+    clientPack.Count = len(clientPack.RecommendList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return

--
Gitblit v1.8.0