From 3fe522bb3eeb291cc0414677364f0de631264f47 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 09 九月 2025 10:26:45 +0800
Subject: [PATCH] 121 【武将】武将系统-服务端(优化图鉴升级,增加记录历史最高星级、突破等级;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py |   82 +++++++++++++++++++++++++++--------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py       |    4 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py   |   12 +++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py  |    4 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py          |    1 
 5 files changed, 67 insertions(+), 36 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 8ad51ea..7174656 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4150,6 +4150,7 @@
 #武将
 Def_PDict_HeroSkin = "HeroSkin_%s" # 武将皮肤解锁状态,按皮肤索引二进制存储,参数(武将ID)
 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" # 已觉醒过的武将今日已重生次数,共享次数
 
 #主线
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index ee35ff6..e01a6e6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -14722,7 +14722,6 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("HeroID", c_int),    #武将ID
-                  ("ItemIndex", c_ushort),    #关联武将物品所在武将背包索引,激活时可不用发
                   ("BookType", c_ubyte),    #图鉴激活类型: 0-初始激活;1-星级升级;2-突破等级升级
                   ]
 
@@ -14741,7 +14740,6 @@
         self.Cmd = 0xB2
         self.SubCmd = 0x37
         self.HeroID = 0
-        self.ItemIndex = 0
         self.BookType = 0
         return
 
@@ -14756,14 +14754,12 @@
                                 Cmd:%s,
                                 SubCmd:%s,
                                 HeroID:%d,
-                                ItemIndex:%d,
                                 BookType:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
                                 self.HeroID,
-                                self.ItemIndex,
                                 self.BookType
                                 )
         return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 62b85f1..369a2ec 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -38000,6 +38000,8 @@
                   ("BookInitState", c_ubyte),    # 图鉴激活状态:0-未激活;1-可激活;2-已激活
                   ("BookStarLV", c_ushort),    # 图鉴星级等级
                   ("BookBreakLV", c_ushort),    # 图鉴突破等级
+                  ("BookStarLVH", c_ushort),    # 图鉴星级历史最高等级
+                  ("BookBreakLVH", c_ushort),    # 图鉴突破历史最高等级
                   ]
 
     def __init__(self):
@@ -38017,6 +38019,8 @@
         self.BookInitState = 0
         self.BookStarLV = 0
         self.BookBreakLV = 0
+        self.BookStarLVH = 0
+        self.BookBreakLVH = 0
         return
 
     def GetLength(self):
@@ -38031,14 +38035,18 @@
                                 SkinState:%d,
                                 BookInitState:%d,
                                 BookStarLV:%d,
-                                BookBreakLV:%d
+                                BookBreakLV:%d,
+                                BookStarLVH:%d,
+                                BookBreakLVH:%d
                                 '''\
                                 %(
                                 self.HeroID,
                                 self.SkinState,
                                 self.BookInitState,
                                 self.BookStarLV,
-                                self.BookBreakLV
+                                self.BookBreakLV,
+                                self.BookStarLVH,
+                                self.BookBreakLVH
                                 )
         return DumpString
 
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 9150793..be8b637 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
@@ -148,7 +148,7 @@
     # 突破
     if value == "b":
         breakLV = msgList[2] if len(msgList) > 2 else 0
-        PlayerHero.SetHeroBreakLV(heroItem, breakLV)
+        PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV)
         GameWorld.DebugAnswer(curPlayer, "设置武将突破: %s,itemIndex=%s" % (breakLV, itemIndex))
         return
     
@@ -314,7 +314,7 @@
                 if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityBreak", quality, bLV):
                     break
                 breakLV = bLV
-        PlayerHero.SetHeroBreakLV(heroItem, breakLV, False)
+        PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV, False)
         
         # 星级
         starMax = PlayerHero.GetHeroStarMax(heroItem)
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 9a2ca8a..54714df 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -233,6 +233,19 @@
     GameWorld.DebugLog("设置武将图鉴星级等级:%s,bookState=%s,updBookState=%s" % (starLV, bookState, updBookState), curPlayer.GetPlayerID())
     return
 
+def GetHeroBookStarLVH(curPlayer, heroID):
+    ## 武将图鉴星级历史最高等级
+    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
+    return GameWorld.GetValue(bookStateH, 4, 3)
+def SetHeroBookStarLVH(curPlayer, heroID, starLVH):
+    ## 设置武将图鉴星级历史最高等级,支持三位数 0~999 级
+    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
+    updBookStateH = GameWorld.SetValue(bookStateH, 4, 3, starLVH)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBookH % heroID, updBookStateH)
+    GameWorld.DebugLog("设置武将图鉴星级历史最高等级:%s,bookStateH=%s,updBookStateH=%s" % (starLVH, bookStateH, updBookStateH), curPlayer.GetPlayerID())
+    Sync_HeroInfo(curPlayer, [heroID])
+    return
+
 def GetHeroBookBreakLV(curPlayer, heroID):
     ## 武将图鉴突破等级
     bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
@@ -243,6 +256,19 @@
     updBookState = GameWorld.SetValue(bookState, 7, 3, breakLV)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
     GameWorld.DebugLog("设置武将图鉴突破等级:%s,bookState=%s,updBookState=%s" % (breakLV, bookState, updBookState), curPlayer.GetPlayerID())
+    return
+
+def GetHeroBookBreakLVH(curPlayer, heroID):
+    ## 武将图鉴突破历史最高等级
+    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
+    return GameWorld.GetValue(bookStateH, 7, 3)
+def SetHeroBookBreakLVH(curPlayer, heroID, breakLVH):
+    ## 设置武将图鉴突破历史最高等级,支持三位数 0~999 级
+    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
+    updBookStateH = GameWorld.SetValue(bookStateH, 7, 3, breakLVH)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBookH % heroID, updBookStateH)
+    GameWorld.DebugLog("设置武将图鉴突破历史最高等级:%s,bookStateH=%s,updBookStateH=%s" % (breakLVH, bookStateH, updBookStateH), curPlayer.GetPlayerID())
+    Sync_HeroInfo(curPlayer, [heroID])
     return
 
 def GetHeroItem(curPlayer, itemIndex):
@@ -438,6 +464,7 @@
 
 def DoHeroUpdStar(curPlayer, heroItem, updStar, isSync=True):
     ## 执行武将星级更新
+    heroID = heroItem.GetItemTypeID()
     curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
     addStar = updStar - curStar
     item = heroItem.GetItem()
@@ -449,6 +476,10 @@
     
     itemIndex = heroItem.GetItemPlaceIndex()
     PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
+    
+    starLVH = GetHeroBookStarLVH(curPlayer, heroID)
+    if updStar > starLVH:
+        SetHeroBookStarLVH(curPlayer, heroID, updStar)
     return
 
 def __DoHeroStarTalentUp(singleItem, addLV):
@@ -593,17 +624,22 @@
         return
     ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroBreak")
     GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID)
-    SetHeroBreakLV(heroItem, nextBreakLV)
+    SetHeroBreakLV(curPlayer, heroItem, nextBreakLV)
     
     PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
     return
 
-def SetHeroBreakLV(heroItem, breakLV, isSync=True):
+def SetHeroBreakLV(curPlayer, heroItem, breakLV, isSync=True):
     ## 设置武将突破等级
+    heroID = heroItem.GetItemTypeID()
     item = heroItem.GetItem()
     item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, breakLV)
     if isSync:
         heroItem.Sync_Item()
+        
+    breakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
+    if breakLV > breakLVH:
+        SetHeroBookBreakLVH(curPlayer, heroID, breakLV)
     return
 
 #// B2 33 武将觉醒 #tagCSHeroAwake
@@ -992,13 +1028,12 @@
 def OnHeroBookUP(index, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     heroID = clientData.HeroID
-    itemIndex = clientData.ItemIndex
     bookType = clientData.BookType
     
     if bookType == 1:
-        __doHeroBookStarLVUP(curPlayer, heroID, itemIndex)
+        __doHeroBookStarLVUP(curPlayer, heroID)
     elif bookType == 2:
-        __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex)
+        __doHeroBookBreakLVUP(curPlayer, heroID)
     else:
         __doHeroBookAct(curPlayer, heroID)
     return
@@ -1033,48 +1068,36 @@
     RefreshLordAttr(curPlayer)
     return
 
-def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex):
+def __doHeroBookStarLVUP(curPlayer, heroID):
     ## 图鉴星级升级
     playerID = curPlayer.GetPlayerID()
     if not GetHeroBookInitState(curPlayer, heroID):
         GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
         return
-    heroItem = GetHeroItem(curPlayer, itemIndex)
-    if not heroItem:
-        return
-    if heroItem.GetItemTypeID() != heroID:
-        GameWorld.DebugLog("非该武将图鉴关联物品! heroID=%s,itemID=%s" % (heroID, heroItem.GetItemTypeID()), playerID)
-        return
-    heroStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
     bookStar = GetHeroBookStarLV(curPlayer, heroID)
-    if bookStar >= heroStar:
-        GameWorld.DebugLog("该武将图鉴星级已达当前英雄星级! heroID=%s,bookStar=%s,heroStar=%s" % (heroID, bookStar, heroStar), playerID)
+    bookStarH = GetHeroBookStarLVH(curPlayer, heroID)
+    if bookStar >= bookStarH:
+        GameWorld.DebugLog("该武将图鉴星级已达当前英雄最高星级! heroID=%s,bookStar=%s >= %s" % (heroID, bookStar, bookStarH), playerID)
         return
-    GameWorld.DebugLog("武将图鉴星级升级! heroID=%s,bookStar=%s,heroStar=%s" % (heroID, bookStar, heroStar), playerID)
+    GameWorld.DebugLog("武将图鉴星级升级! heroID=%s,bookStar=%s,bookStarH=%s" % (heroID, bookStar, bookStarH), playerID)
     SetHeroBookStarLV(curPlayer, heroID, bookStar + 1)
     Sync_HeroInfo(curPlayer, [heroID])
     
     RefreshLordAttr(curPlayer)
     return
 
-def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex):
+def __doHeroBookBreakLVUP(curPlayer, heroID):
     ## 图鉴突破升级
     playerID = curPlayer.GetPlayerID()
     if not GetHeroBookInitState(curPlayer, heroID):
         GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
         return
-    heroItem = GetHeroItem(curPlayer, itemIndex)
-    if not heroItem:
-        return
-    if heroItem.GetItemTypeID() != heroID:
-        GameWorld.DebugLog("非该武将图鉴关联物品! heroID=%s,itemID=%s" % (heroID, heroItem.GetItemTypeID()), playerID)
-        return
-    heroBreakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
     bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
-    if bookBreakLV >= heroBreakLV:
-        GameWorld.DebugLog("该武将图鉴突破等级已达当前英雄突破等级! heroID=%s,bookBreakLV=%s,heroBreakLV=%s" % (heroID, bookBreakLV, heroBreakLV), playerID)
+    bookBreakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
+    if bookBreakLV >= bookBreakLVH:
+        GameWorld.DebugLog("该武将图鉴突破等级已达当前英雄最高突破等级! heroID=%s,bookBreakLV=%s >= %s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
         return
-    GameWorld.DebugLog("武将图鉴突破升级! heroID=%s,bookBreakLV=%s,heroBreakLV=%s" % (heroID, bookBreakLV, heroBreakLV), playerID)
+    GameWorld.DebugLog("武将图鉴突破升级! heroID=%s,bookBreakLV=%s,bookBreakLVH=%s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
     SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1)
     Sync_HeroInfo(curPlayer, [heroID])
     
@@ -1443,7 +1466,8 @@
         heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
         if not heroIpyData:
             continue
-        if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID):
+        if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) \
+            and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID):
             continue
         
         hero = ChPyNetSendPack.tagSCHero()
@@ -1452,6 +1476,8 @@
         hero.BookInitState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) % 10
         hero.BookStarLV = GetHeroBookStarLV(curPlayer, heroID)
         hero.BookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
+        hero.BookStarLVH = GetHeroBookStarLVH(curPlayer, heroID)
+        hero.BookBreakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
         syncInfoList.append(hero)
         
     if not syncInfoList:

--
Gitblit v1.8.0