From dc0b92c1e2fe9f3d24c183b325dad54d088735c1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 10 七月 2025 17:01:24 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_ServerCode
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py | 175 +++++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 131 insertions(+), 44 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 6801516..efac7e6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -43,8 +43,6 @@
singleItem.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, 0)
if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroSkin):
singleItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, 0)
- if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroPosNum):
- singleItem.SetUserAttr(ShareDefine.Def_IudetHeroPosNum, 0)
if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID):
singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentID)
@@ -56,6 +54,8 @@
singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentWashID)
if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand):
singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentIDAwakeRand)
+ if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup):
+ singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroLineup)
InitHeroTalent(singleItem)
return
@@ -192,6 +192,21 @@
return
return heroItem
+def GetHeroLineupPosNum(heroItem, lineupID=ShareDefine.Lineup_Main):
+ ## 获取英雄所在阵型站位
+ # @param lineupID: 阵型ID,默认主阵型
+ # @return: 0-没有在该阵型;>0-在该阵型中的站位编号
+ lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)
+ if not lineupCount:
+ return 0
+ for lpIndex in range(lineupCount)[::-1]:
+ lineupValue = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
+ #阵容类型*10000+阵型类型*100+位置编号
+ if lineupValue / 10000 != lineupID:
+ continue
+ return lineupValue % 100
+ return 0
+
#// B2 30 武将升级 #tagCSHeroLVUP
#
#struct tagCSHeroLVUP
@@ -239,8 +254,9 @@
GameWorld.DebugLog("武将升级: itemIndex=%s,heroID=%s,updHeroLV=%s" % (itemIndex, heroID, updHeroLV), playerID)
heroItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV)
- # 刷属性,之后扩展
-
+ # 刷属性
+ if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+ RefreshLordAttr(curPlayer)
return
def GetHeroLVMax(heroItem):
@@ -280,6 +296,9 @@
% (itemIndex, heroID, useItemIndex, useHeroID), playerID)
if heroID != useHeroID:
GameWorld.DebugLog("武将材料非本体,无法升星!", playerID)
+ return
+ if useItem.GetIsLocked():
+ GameWorld.DebugLog("材料卡锁定中,无法升星! useItemIndex=%s,heroID=%s" % (useItemIndex, heroID), playerID)
return
washIDCnt = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentWashID)
if washIDCnt:
@@ -350,8 +369,9 @@
__DoHeroStarTalentUp(item, addStar)
heroItem.Sync_Item()
- # 刷属性,之后扩展
-
+ # 刷属性
+ if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+ RefreshLordAttr(curPlayer)
return
def __DoHeroStarTalentUp(singleItem, addLV):
@@ -493,8 +513,9 @@
GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID)
SetHeroBreakLV(heroItem, nextBreakLV)
- # 刷属性,之后扩展
-
+ # 刷属性
+ if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+ RefreshLordAttr(curPlayer)
return
def SetHeroBreakLV(heroItem, breakLV):
@@ -552,8 +573,9 @@
GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
SetHeroAwakeLV(heroItem, nextAwakeLV)
- # 刷属性,之后扩展
-
+ # 刷属性
+ if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+ RefreshLordAttr(curPlayer)
return
def SetHeroAwakeLV(heroItem, awakeLV):
@@ -685,8 +707,9 @@
heroItem.Sync_Item()
- # 刷属性,之后扩展
-
+ # 刷属性
+ if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+ RefreshLordAttr(curPlayer)
return
#// B2 35 武将洗炼 #tagCSHeroWash
@@ -822,8 +845,9 @@
heroItem.Sync_Item()
GameWorld.DebugLog("武将洗炼替换! itemIndex=%s,heroID=%s,washIDList=%s" % (itemIndex, heroID, washIDList))
- # 刷属性,之后扩展
-
+ # 刷属性
+ if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+ RefreshLordAttr(curPlayer)
return
#// B2 36 武将换肤 #tagCSHeroWearSkin
@@ -845,9 +869,9 @@
heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
if not heroIpyData:
return
- skinNPCIDList = heroIpyData.GetSkinNPCIDList()
+ skinIDList = heroIpyData.GetSkinIDList()
if skinIndex > 0: # 0的为默认皮肤,不做限制
- if skinIndex >= len(skinNPCIDList):
+ if skinIndex >= len(skinIDList):
GameWorld.DebugLog("该武将不存在该皮肤! heroID=%s,skinIndex=%s" % (heroID, skinIndex))
return
skinState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkin % heroID)
@@ -857,7 +881,9 @@
heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
# 刷属性
-
+ if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+ RefreshLordAttr(curPlayer)
+
return
def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True):
@@ -872,6 +898,8 @@
% (heroID, skinIndex, skinState, updState), curPlayer.GetPlayerID())
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkin % heroID, updState)
Sync_HeroInfo(curPlayer, [heroID])
+
+ RefreshLordAttr(curPlayer)
return
#// B2 37 武将图鉴激活升级 #tagCSHeroBookUP
@@ -923,6 +951,8 @@
PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "HeroBookAct")
Sync_HeroInfo(curPlayer, [heroID])
+
+ RefreshLordAttr(curPlayer)
return
def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex):
@@ -943,8 +973,7 @@
SetHeroBookStarLV(curPlayer, heroID, bookStar + 1)
Sync_HeroInfo(curPlayer, [heroID])
- # 刷属性
-
+ RefreshLordAttr(curPlayer)
return
def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex):
@@ -965,28 +994,47 @@
SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1)
Sync_HeroInfo(curPlayer, [heroID])
- # 刷属性
-
+ RefreshLordAttr(curPlayer)
return
-#// B4 12 战斗阵型保存 #tagCSHeroBattlePosSave
+#// B2 38 武将锁定 #tagCSHeroLock
#
-#struct tagCSHeroBattlePos
+#struct tagCSHeroLock
+#{
+# tagHead Head;
+# WORD ItemIndex; //武将物品所在武将背包位置索引
+# BYTE IsLock; //0-解锁;1-锁定
+#};
+def OnHeroLock(index, clientData, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ itemIndex = clientData.ItemIndex
+ isLock = clientData.IsLock
+ heroItem = GetHeroItem(curPlayer, itemIndex)
+ if not heroItem:
+ return
+ heroItem.SetIsLocked(1 if isLock else 0)
+ return
+
+#// B4 12 战斗阵容保存 #tagCSHeroLineupSave
+#
+#struct tagCSHeroLineupPos
#{
# WORD ItemIndex; //武将物品所在武将背包位置索引
# BYTE PosNum; //1~n上阵位置编号
#};
#
-#struct tagCSHeroBattlePosSave
+#struct tagCSHeroLineupSave
#{
# tagHead Head;
-# BYTE FuncType; //布阵功能类型:0-默认主阵型;其他待扩展,如某个活动的防守阵型
+# BYTE LineupID; //阵容ID:1-主阵容;其他待扩展,如某个防守阵容
+# BYTE ShapeType; //本阵容阵型,0为默认阵型,可扩展不同的阵型
# BYTE PosCnt;
-# tagCSHeroBattlePos HeroPosList[PosCnt]; // 保存的阵型,只要发送最终的阵型武将位置即可
+# tagCSHeroLineupPos HeroPosList[PosCnt]; // 保存的阵容,只发送最终的阵容武将位置即可
#};
-def OnHeroBattlePosSave(index, clientData, tick):
+def OnHeroLineupSave(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- funcType = clientData.FuncType
+ lineupID = clientData.LineupID
+ shapeType = clientData.ShapeType
heroPosList = clientData.HeroPosList
heroPosDict = {}
@@ -1000,40 +1048,61 @@
indexList.append(itemIndex)
heroPosDict[posNum] = itemIndex
- # 主阵型
- if funcType == 0:
- MainBattlePosSave(curPlayer, heroPosDict)
-
- # 其他待扩展
- elif funcType == 1:
- pass
+ if lineupID not in ShareDefine.LineupList:
+ GameWorld.DebugLog("不存在该阵容,无法保存! lineupID=%s" % lineupID)
+ return
- return
-
-def MainBattlePosSave(curPlayer, heroPosDict):
- GameWorld.DebugLog("保留主战斗阵型: %s" % heroPosDict, curPlayer.GetPlayerID())
+ GameWorld.DebugLog("保存阵容: lineupID=%s, %s" % (lineupID, heroPosDict), curPlayer.GetPlayerID())
curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
# 直接重置旧阵型
+ delCount = 0
+ syncItemDict = {}
for index in range(curPack.GetCount()):
heroItem = curPack.GetAt(index)
if not heroItem or heroItem.IsEmpty():
continue
- if not heroItem.GetUserAttr(ShareDefine.Def_IudetHeroPosNum):
+ lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)
+ if not lineupCount:
continue
item = heroItem.GetItem()
- item.ClearUserAttr(ShareDefine.Def_IudetHeroPosNum)
-
+ for lpIndex in range(lineupCount)[::-1]:
+ lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
+ #阵容类型*10000+阵型类型*100+位置编号
+ if lineupValue / 10000 != lineupID:
+ continue
+ item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
+ delCount += 1
+ if delCount >= ShareDefine.LineupObjMax:
+ break
+ syncItemDict[index] = heroItem
+
# 更新新阵型
+ heroIDList = []
for posNum, itemIndex in heroPosDict.items():
if itemIndex < 0 or itemIndex >= curPack.GetCount():
continue
heroItem = curPack.GetAt(itemIndex)
if not heroItem or heroItem.IsEmpty():
continue
+ itemID = heroItem.GetItemTypeID()
+ if itemID in heroIDList:
+ GameWorld.DebugLog("同个武将只能上阵一个! itemIndex=%s,itemID=%s" % (itemIndex, itemID))
+ continue
+ heroIDList.append(itemID)
item = heroItem.GetItem()
- item.SetUserAttr(ShareDefine.Def_IudetHeroPosNum, posNum)
+ lineupValue = lineupID * 10000 + shapeType * 100 + posNum
+ item.AddUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
+ if itemIndex not in syncItemDict:
+ syncItemDict[itemIndex] = heroItem
- ResetHeroPack(curPlayer)
+ # 主阵容修改时重整背包
+ if lineupID == ShareDefine.Lineup_Main:
+ ResetHeroPack(curPlayer)
+ else:
+ for syncItem in syncItemDict.values():
+ syncItem.Sync_Item()
+
+ RefreshLordAttr(curPlayer)
return
def ResetHeroPack(curPlayer):
@@ -1042,6 +1111,24 @@
ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick)
return
+def RefreshLordAttr(curPlayer):
+ ## 刷新主公属性
+ CalcHeroItemAddAttr(curPlayer)
+ return
+
+def CalcHeroItemAddAttr(curPlayer):
+ #allAttrListPet = [{} for _ in range(4)]
+ return
+
+def RefreshLineupHeroAttr(curPlayer):
+ ## 刷新阵容武将属性
+
+ # 计算阵容总战力 = 角色总战力为主阵容战力,需同步计算不同阵容战力
+ return
+
+def CaclHeroCardAttr():
+ return
+
def Sync_HeroInfo(curPlayer, heroIDList=None):
if heroIDList != None:
syncHeroIDList = heroIDList
--
Gitblit v1.8.0