From 6aeee7efd261fc1f553a4f3a748402f6dbb3cd79 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 27 二月 2026 16:07:54 +0800
Subject: [PATCH] 501 【武将】武将时装-服务端(武将时装激活、升级、穿戴、属性;武将战斗预览;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py | 257 ++++++++++++++++++++++++++++-----------------------
1 files changed, 141 insertions(+), 116 deletions(-)
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 fa1abbe..aa603eb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -229,55 +229,21 @@
GameWorld.DebugLog("设置武将图鉴激活状态:%s,bookState=%s,updBookState=%s" % (isAct, bookState, updBookState), curPlayer.GetPlayerID())
return
-#def GetHeroBookStarLV(curPlayer, heroID):
-# ## 武将图鉴星级等级
-# bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
-# return GameWorld.GetValue(bookState, 4, 3)
-#def SetHeroBookStarLV(curPlayer, heroID, starLV):
-# ## 设置武将图鉴星级等级,支持三位数 0~999 级
-# bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
-# updBookState = GameWorld.SetValue(bookState, 4, 3, starLV)
-# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
-# 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)
-# return GameWorld.GetValue(bookState, 7, 3)
-#def SetHeroBookBreakLV(curPlayer, heroID, breakLV):
-# ## 设置武将图鉴突破等级,支持三位数 0~999 级
-# bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
-# 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_PDict_HeroSkinInfo 星级*10+是否已激活
+def GetHeroSkinState(curPlayer, skinID):
+ ## 武将时装激活状态
+ return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID) % 10
+def SetHeroSkinState(curPlayer, skinID, state):
+ info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID)
+ info = info / 10 * 10 + min(1, state)
+ return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkinInfo % skinID, info)
+def GetHeroSkinStar(curPlayer, skinID):
+ ## 武将时装星级
+ return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID) / 10
+def SetHeroSkinStar(curPlayer, skinID, star):
+ info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID)
+ info = star * 10 + info % 10
+ return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkinInfo % skinID, info)
def GetHeroItem(curPlayer, itemIndex):
curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
@@ -1020,19 +986,38 @@
PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 替换洗炼天赋
return
-#// B2 36 武将换肤 #tagCSHeroWearSkin
+#// B2 36 武将皮肤操作 #tagCSHeroSkinOP
#
-#struct tagCSHeroWearSkin
+#struct tagCSHeroSkinOP
#{
# tagHead Head;
-# WORD ItemIndex; //武将物品所在武将背包位置索引
-# BYTE SkinIndex; //皮肤索引
+# DWORD HeroID; //武将ID
+# DWORD SkinID; //时装ID
+# BYTE OPType; //操作 1-激活;2-佩戴;3-升星
+# WORD ItemIndex; //武将物品所在武将背包位置索引,仅佩戴时有效
#};
-def OnHeroWearSkin(index, clientData, tick):
+def OnHeroSkinOP(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ heroID = clientData.HeroID
+ skinID = clientData.SkinID
+ opType = clientData.OPType
itemIndex = clientData.ItemIndex
- skinIndex = clientData.SkinIndex
- DoHeroWearSkin(curPlayer, itemIndex, skinIndex)
+
+ heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
+ if not heroIpyData:
+ return
+ skinIDList = heroIpyData.GetSkinIDList()
+ if skinID not in skinIDList:
+ GameWorld.DebugLog("不存在该皮肤! heroID=%s,skinID=%s not in %s" % (heroID, skinID, skinIDList))
+ return
+ skinIndex = skinIDList.index(skinID)
+
+ if opType == 1:
+ ActiveHeroSkin(curPlayer, heroID, skinID)
+ elif opType == 2:
+ DoHeroWearSkin(curPlayer, itemIndex, skinIndex)
+ elif opType == 3:
+ DoHeroSkinStarUP(curPlayer, heroID, skinID)
return
def DoHeroWearSkin(curPlayer, itemIndex, skinIndex):
@@ -1048,29 +1033,81 @@
if skinIndex >= len(skinIDList):
GameWorld.DebugLog("该武将不存在该皮肤! heroID=%s,skinIndex=%s" % (heroID, skinIndex))
return
- skinState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkin % heroID)
- if not skinState & pow(2, skinIndex):
- GameWorld.DebugLog("该武将皮肤未解锁! heroID=%s,skinIndex=%s,skinState=%s" % (heroID, skinIndex, skinState))
+ skinID = skinIDList[skinIndex]
+ if not GetHeroSkinState(curPlayer, skinID):
+ GameWorld.DebugLog("该武将皮肤未解锁! heroID=%s,skinIndex=%s" % (heroID, skinIndex))
return
heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 切换皮肤
return True
-def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True):
- skinState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkin % heroID)
- if isActive:
- updState = skinState | pow(2, skinIndex)
- GameWorld.DebugLog("激活武将皮肤: heroID=%s,skinIndex=%s,skinState=%s,updState=%s"
- % (heroID, skinIndex, skinState, updState), curPlayer.GetPlayerID())
- else:
- updState = GameWorld.SetBitValue(skinState, skinIndex, 0)
- GameWorld.DebugLog("失效武将皮肤: heroID=%s,skinIndex=%s,skinState=%s,updState=%s"
- % (heroID, skinIndex, skinState, updState), curPlayer.GetPlayerID())
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkin % heroID, updState)
+def GMSetHeroSkin(curPlayer, heroID, skinIndex, isActive=1):
+ heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
+ if not heroIpyData:
+ return
+ skinIDList = heroIpyData.GetSkinIDList()
+ if not skinIDList or len(skinIDList) >= skinIndex:
+ return
+ skinID = skinIDList[skinIndex]
+ __onHeroSkinActive(curPlayer, heroID, skinID, isActive)
+ return
+
+def ActiveHeroSkin(curPlayer, heroID, skinID):
+ skinIpyData = IpyGameDataPY.GetIpyGameData("HeroSkinAttr", skinID)
+ if not skinIpyData:
+ return
+ if GetHeroSkinState(curPlayer, skinID):
+ GameWorld.DebugLog("该武将皮肤已经激活了: heroID=%s,skinID=%s" % (heroID, skinID))
+ return
+ needItemID = skinIpyData.GetNeedItemID()
+ needItemCnt = 1
+ costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, needItemID, needItemCnt)
+ lackCnt = needItemCnt - bindCnt - unBindCnt
+ if lackCnt > 0:
+ GameWorld.DebugLog("激活武将时装物品不足! heroID=%s,needItemID=%s,needItemCnt=%s,lackCnt=%s" % (heroID, needItemID, needItemCnt, lackCnt))
+ return
+ ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, needItemCnt, "HeroSkin")
+ GameWorld.DebugLog("激活武将皮肤: heroID=%s,skinID=%s" % (heroID, skinID), curPlayer.GetPlayerID())
+ __onHeroSkinActive(curPlayer, heroID, skinID, 1)
+ return
+
+def __onHeroSkinActive(curPlayer, heroID, skinID, isActive):
+ SetHeroSkinState(curPlayer, skinID, isActive)
Sync_HeroInfo(curPlayer, [heroID])
+ RefreshLordAttr(curPlayer) # 时装激活 - 全体属性
+ return
+
+def DoHeroSkinStarUP(curPlayer, heroID, skinID):
+ playerID = curPlayer.GetPlayerID()
+ if not GetHeroSkinState(curPlayer, skinID):
+ GameWorld.DebugLog("该武将时装未激活! heroID=%s,skinID=%s" % (heroID, skinID), playerID)
+ return
+ skinIpyData = IpyGameDataPY.GetIpyGameData("HeroSkinAttr", skinID)
+ if not skinIpyData:
+ return
+ starMax = skinIpyData.GetStarMax()
+ curStar = GetHeroSkinStar(curPlayer, skinID)
+ if curStar >= starMax:
+ GameWorld.DebugLog("武将时装星级已满! heroID=%s,skinID=%s,curStar=%s >= %s" % (heroID, skinID, curStar, starMax), playerID)
+ return
+ needItemID = skinIpyData.GetNeedItemID()
+ needItemCnt = 1
+ if not needItemID or not needItemCnt:
+ return
- #RefreshLordAttr(curPlayer)
+ costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, needItemID, needItemCnt)
+ lackCnt = needItemCnt - bindCnt - unBindCnt
+ if lackCnt > 0:
+ GameWorld.DebugLog("武将时装升星物品不足! heroID=%s,skinID=%s,needItemID=%s,needItemCnt=%s,lackCnt=%s" % (heroID, skinID, needItemID, needItemCnt, lackCnt))
+ return
+ ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, needItemCnt, "Hero")
+
+ nextStar = curStar + 1
+ GameWorld.DebugLog("武将时装升星! heroID=%s,skinID=%s,nextStar=%s" % (heroID, skinID, nextStar), playerID)
+ SetHeroSkinStar(curPlayer, skinID, nextStar)
+ Sync_HeroInfo(curPlayer, [heroID])
+ RefreshLordAttr(curPlayer) # 时装升星 - 全体属性
return
#// B2 37 武将图鉴激活升级 #tagCSHeroBookUP
@@ -1136,48 +1173,10 @@
Sync_HeroInfo(curPlayer, [heroID])
- #RefreshLordAttr(curPlayer) 图鉴属性去除了
-
bookCnt = GetHeroBookActCnt(curPlayer)
PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_HeroBook)
PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroBook, bookCnt)
return
-
-#def __doHeroBookStarLVUP(curPlayer, heroID):
-# ## 图鉴星级升级,废弃
-# playerID = curPlayer.GetPlayerID()
-# if not GetHeroBookInitState(curPlayer, heroID):
-# GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
-# return
-# bookStar = GetHeroBookStarLV(curPlayer, heroID)
-# 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,bookStarH=%s" % (heroID, bookStar, bookStarH), playerID)
-# SetHeroBookStarLV(curPlayer, heroID, bookStar + 1)
-# Sync_HeroInfo(curPlayer, [heroID])
-#
-# RefreshLordAttr(curPlayer)
-# return
-
-#def __doHeroBookBreakLVUP(curPlayer, heroID):
-# ## 图鉴突破升级,废弃
-# playerID = curPlayer.GetPlayerID()
-# if not GetHeroBookInitState(curPlayer, heroID):
-# GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
-# return
-# bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
-# 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,bookBreakLVH=%s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
-# SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1)
-# Sync_HeroInfo(curPlayer, [heroID])
-#
-# RefreshLordAttr(curPlayer)
-# return
#// B2 38 武将锁定 #tagCSHeroLock
#
@@ -1726,10 +1725,33 @@
def CalcHeroAddAttr(curPlayer):
## 计算武将对主公增加的属性
+ skinAttrDict = {}
fatesAttrDict = {}
playerID = curPlayer.GetID()
ipyDataMgr = IpyGameDataPY.IPY_Data()
+
+ # 武将时装
+ for index in range(ipyDataMgr.GetHeroSkinAttrCount()):
+ ipyData = ipyDataMgr.GetHeroSkinAttrByIndex(index)
+ skinID = ipyData.GetSkinID()
+ if not GetHeroSkinState(curPlayer, skinID):
+ continue
+ skinStar = GetHeroSkinStar(curPlayer, skinID)
+
+ attrIDList = ipyData.GetRoleAttrIDList()
+ attrValueList = ipyData.GetRoleAttrValueList()
+ perStarAddList = ipyData.GetRoleAttrPerStarAddList()
+ for i in range(min(len(attrIDList), len(attrValueList))):
+ attrID = attrIDList[i]
+ attrValuePerStar = perStarAddList[i] if len(perStarAddList) > i else 0
+ attrValue = attrValueList[i] + attrValuePerStar * skinStar
+ skinAttrDict[attrID] = skinAttrDict.get(attrID, 0) + attrValue
+
+ GameWorld.DebugLog("时装属性: %s" % skinAttrDict, playerID)
+ PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroSkin, skinAttrDict)
+
+ # 宿缘
for index in range(ipyDataMgr.GetHeroFatesCount()):
ipyData = ipyDataMgr.GetHeroFatesByIndex(index)
fatesID = ipyData.GetFatesID()
@@ -1770,18 +1792,21 @@
heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
if not heroIpyData:
continue
- if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) \
- and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID):
+ if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID):
continue
+ skinIDList = heroIpyData.GetSkinIDList()
hero = ChPyNetSendPack.tagSCHero()
hero.HeroID = heroID
- hero.SkinState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkin % heroID)
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)
+ hero.SkinList = []
+ for skinID in skinIDList[1:]: # 第1个默认激活的不同步
+ skin = ChPyNetSendPack.tagSCHeroSkin()
+ skin.SkinID = skinID
+ skin.State = GetHeroSkinState(curPlayer, skinID)
+ skin.Star = GetHeroSkinStar(curPlayer, skinID)
+ hero.SkinList.append(skin)
+ hero.SkinCnt = len(hero.SkinList)
syncInfoList.append(hero)
if not syncInfoList:
--
Gitblit v1.8.0