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