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