hxp
2025-10-30 e65a33757a3ca9fad94f05f8309654585902d097
326 【武将】阵容推荐-服务端
7个文件已修改
232 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
{
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
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):
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]
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
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)
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