From 46f1b3554ca7c3eeea118aaf80fe756bebdfde93 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 09 二月 2026 13:46:54 +0800
Subject: [PATCH] 121 【武将】武将系统-服务端(修复武将修改皮肤战斗时不生效bug;Hero命令增加切换皮肤;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py | 338 +++++++++++++++++++++++++++----------------------------
1 files changed, 166 insertions(+), 172 deletions(-)
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 c97c796..3188e94 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
@@ -42,11 +42,12 @@
GameWorld.DebugAnswer(curPlayer, "重置图鉴: Hero t 0 [重置阵容推荐]")
GameWorld.DebugAnswer(curPlayer, "重置重生: Hero r")
GameWorld.DebugAnswer(curPlayer, "武将皮肤: Hero sk 武将ID 皮肤索引 是否解锁")
- GameWorld.DebugAnswer(curPlayer, "清空武将: ClearPack 35")
+ GameWorld.DebugAnswer(curPlayer, "切换皮肤: Hero ss 背包位置 皮肤索引")
+ GameWorld.DebugAnswer(curPlayer, "重置宿缘: Hero sy 0")
+ GameWorld.DebugAnswer(curPlayer, "设置宿缘: Hero sy 宿缘ID 等级 [是否激活]")
GameWorld.DebugAnswer(curPlayer, "新增武将: MakeItemCount 英雄ID [个数]")
- GameWorld.DebugAnswer(curPlayer, "阵容上阵: Hero f 阵容ID [武将ID ...]")
- GameWorld.DebugAnswer(curPlayer, "阵容武将: Hero h 阵容ID 武将ID 等级 星级 突破等级 觉醒等级 皮肤")
- GameWorld.DebugAnswer(curPlayer, "阵容满级: Hero h 阵容ID 1")
+ GameWorld.DebugAnswer(curPlayer, "一键满级: Hero max [指定等级 星级 突破 觉醒]")
+ GameWorld.DebugAnswer(curPlayer, "清空武将: Hero clear [是否包含生效卡]")
return
PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
@@ -54,14 +55,9 @@
value = msgList[0]
value2 = msgList[1] if len(msgList) > 1 else 0
- # 阵容上阵
- if value == "f":
- __oneKeyLineup(curPlayer, msgList)
- return
-
- # 阵容武将
- if value == "h":
- __lineupHero(curPlayer, msgList)
+ # 一键满级
+ if value == "max":
+ __oneKeyMax(curPlayer, msgList)
return
# 图鉴
@@ -126,6 +122,60 @@
PlayerHero.ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive)
return
+ if value == "clear":
+ isAll = value2
+ backPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
+ for i in range(backPack.GetCount()):
+ curItem = backPack.GetAt(i)
+ if not curItem or curItem.IsEmpty():
+ continue
+ if not isAll:
+ if curItem.GetUserAttrCount(ShareDefine.Def_IudetHeroEffPresetID):
+ continue
+ curItem.Clear()
+
+ if isAll:
+ PlayerOnline.GetOnlinePlayer(curPlayer).ReCalcAllAttr()
+ return
+
+ # 宿缘
+ if value == "sy":
+ syncIDList = []
+ if not value2:
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in range(ipyDataMgr.GetHeroFatesCount()):
+ ipyData = ipyDataMgr.GetHeroFatesByIndex(index)
+ fatesID = ipyData.GetFatesID()
+ if not PlayerHero.GetHeroFatesState(curPlayer, fatesID):
+ continue
+ PlayerHero.SetHeroFatesState(curPlayer, fatesID, 0)
+ PlayerHero.SetHeroFatesLV(curPlayer, fatesID, 0)
+ syncIDList.append(fatesID)
+ GameWorld.DebugAnswer(curPlayer, "重置宿缘")
+ else:
+ fatesID = value2
+ fatesLV = msgList[2] if len(msgList) > 2 else 0
+ fatesState = msgList[3] if len(msgList) > 3 else None
+ ipyData = IpyGameDataPY.GetIpyGameData("HeroFates", fatesID)
+ if not ipyData:
+ GameWorld.DebugAnswer(curPlayer, "宿缘ID不存在: %s" % fatesID)
+ return
+ if fatesLV:
+ fatesQuality = ipyData.GetFatesQuality()
+ if not IpyGameDataPY.GetIpyGameData("HeroFatesQualityLV", fatesQuality, fatesLV):
+ GameWorld.DebugAnswer(curPlayer, "宿缘品质(%s)等级(%s)不存在" % (fatesQuality, fatesLV))
+ return
+ syncIDList.append(fatesID)
+ if fatesState != None:
+ PlayerHero.SetHeroFatesState(curPlayer, fatesID, fatesState)
+ else:
+ fatesState = PlayerHero.GetHeroFatesState(curPlayer, fatesID)
+ PlayerHero.SetHeroFatesLV(curPlayer, fatesID, fatesLV)
+ GameWorld.DebugAnswer(curPlayer, "设置宿缘ID=%s,LV=%s,State=%s" % (fatesID, fatesLV, fatesState))
+ PlayerHero.Sync_HeroFatesInfo(curPlayer, syncIDList)
+ PlayerHero.RefreshLordAttr(curPlayer)
+ return
+
itemIndex = value2
heroItem = PlayerHero.GetHeroItem(curPlayer, itemIndex)
if not heroItem:
@@ -141,6 +191,8 @@
if value == 0:
PlayerHero.InitHeroItem(heroItem.GetItem())
heroItem.Sync_Item()
+ if heroItem.GetUserAttr(ShareDefine.Def_IudetHeroCardEffective):
+ heroItem.SetUserAttr(ShareDefine.Def_IudetHeroCardEffective, 0)
GameWorld.DebugAnswer(curPlayer, "重置武将: itemIndex=%s" % (itemIndex))
# 等级
@@ -181,191 +233,133 @@
PlayerHero.SetHeroAwakeLV(heroItem, awakeLV)
GameWorld.DebugAnswer(curPlayer, "设置武将觉醒: %s,itemIndex=%s" % (awakeLV, itemIndex))
+ # 切换皮肤
+ elif value == "ss":
+ skinIndex = msgList[2] if len(msgList) > 2 else 0
+ PlayerHero.ActiveHeroSkin(curPlayer, heroID, skinIndex, 1)
+ if not PlayerHero.DoHeroWearSkin(curPlayer, itemIndex, skinIndex):
+ GameWorld.DebugAnswer(curPlayer, "切换皮肤失败查看地图日志")
+ return
+
PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # GM修改
return
-def __oneKeyLineup(curPlayer, msgList):
- ## 阵容上阵: Hero f 阵容ID [武将ID ...]
- lineupID = msgList[1] if len(msgList) > 1 else 0
+def __oneKeyMax(curPlayer, msgList):
+ ## 一键满级: Hero max [指定等级 星级 突破 觉醒]
+ setLV = msgList[1] if len(msgList) > 1 else None
+ setStar = msgList[2] if len(msgList) > 2 else None
+ setBreakLV = msgList[3] if len(msgList) > 3 else None
+ setAwakeLV = msgList[4] if len(msgList) > 4 else None
+
heroIDList = []
- for heroID in msgList[2:]: # 去重,单阵容武将ID不能重复
- if heroID not in heroIDList:
- heroIDList.append(heroID)
- if lineupID not in ShareDefine.LineupList:
- GameWorld.DebugAnswer(curPlayer, "不存在该阵容: %s" % lineupID)
- return
-
- if not heroIDList:
- GameWorld.DebugAnswer(curPlayer, "没有指定阵容武将ID列表!")
- return
-
- for heroID in heroIDList:
- if not GameWorld.GetGameData().GetItemByTypeID(heroID):
- GameWorld.DebugAnswer(curPlayer, "不存在该武将: %s" % heroID)
- return
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in range(ipyDataMgr.GetHeroCount()):
+ ipyData = ipyDataMgr.GetHeroByIndex(index)
+ if not ipyData.GetPlayerCanUse():
+ continue
+ heroIDList.append(ipyData.GetHeroID())
- shapeType = 0
- haveHeroIDList = []
curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
- # 直接重置旧阵型
- syncItemDict = {}
for index in range(curPack.GetCount()):
heroItem = curPack.GetAt(index)
if not heroItem or heroItem.IsEmpty():
continue
heroID = heroItem.GetItemTypeID()
- if heroID in heroIDList and heroID not in haveHeroIDList:
- haveHeroIDList.append(heroID)
- lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)
- if not lineupCount:
- continue
- item = heroItem.GetItem()
- for lpIndex in range(lineupCount)[::-1]:
- lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
- if PlayerHero.GetLineupValue(lineupValue)[0] != lineupID:
- continue
- item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
- syncItemDict[index] = heroItem
+ if heroID in heroIDList:
+ heroIDList.remove(heroID)
# 给没有的武将
for heroID in heroIDList:
- if heroID in haveHeroIDList:
- continue
- if not ItemControler.GivePlayerItem(curPlayer, heroID, 1, False):
- break
+ ItemControler.GivePlayerItem(curPlayer, heroID, 1, False)
- # 更新新阵型
- heroItemDict = {}
- updHeroIDList = []
+ # 设置一键满
for index in range(curPack.GetCount()):
heroItem = curPack.GetAt(index)
if not heroItem or heroItem.IsEmpty():
continue
- heroID = heroItem.GetItemTypeID()
- if heroID not in heroIDList:
- continue
- if heroID in updHeroIDList:
- # 已经上过该武将了
- continue
- updHeroIDList.append(heroID)
- posNum = heroIDList.index(heroID) + 1
- item = heroItem.GetItem()
- lineupValue = PlayerHero.ComLineupValue(lineupID, shapeType, posNum)
- item.AddUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
- if index not in syncItemDict:
- syncItemDict[index] = heroItem
- heroItemDict[index] = posNum
+ __setHeroItem(curPlayer, heroItem, setLV, setStar, setBreakLV, setAwakeLV)
- for syncItem in syncItemDict.values():
- syncItem.Sync_Item()
-
- lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID, False)
- lineup.UpdLineup(heroItemDict, shapeType)
- GameWorld.DebugAnswer(curPlayer, "阵容(%s)上阵OK: %s" % (lineupID, heroItemDict))
+ GameWorld.DebugAnswer(curPlayer, "一键OK!")
return
-def __lineupHero(curPlayer, msgList):
- #阵容武将: Hero h 阵容ID 武将ID 等级 星级 突破等级 觉醒等级 皮肤
- #阵容满级: Hero h 阵容ID 1
- lineupID = msgList[1] if len(msgList) > 1 else 0
- heroID = msgList[2] if len(msgList) > 2 else 0
- setLV = msgList[3] if len(msgList) > 3 else None
- setStar = msgList[4] if len(msgList) > 4 else None
- setBreakLV = msgList[5] if len(msgList) > 5 else None
- setAwakeLV = msgList[6] if len(msgList) > 6 else None
- setSkinID = msgList[7] if len(msgList) > 7 else None
+def __setHeroItem(curPlayer, heroItem, setLV=None, setStar=None, setBreakLV=None, setAwakeLV=None, setSkinID=None):
+ heroID = heroItem.GetItemTypeID()
+ heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
+ if not heroIpyData:
+ return
+ quality = heroIpyData.GetQuality()
+ qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
+ if not qualityIpyData:
+ return
+ singleItem = heroItem.GetItem()
- olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
- lineup = olPlayer.GetLineup(lineupID)
- if heroID == 1:
- setIndexList = lineup.heroItemDict.keys()
- else:
- lineupHero = lineup.GetLineupHeroByID(heroID)
- if not lineupHero:
- GameWorld.DebugAnswer(curPlayer, "该阵容不存在该武将: %s" % heroID)
- return
- setIndexList = [lineupHero.itemIndex]
-
- curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
- for itemIndex in setIndexList:
- if itemIndex < 0 or itemIndex >= curPack.GetCount():
- continue
- heroItem = curPack.GetAt(itemIndex)
- if not heroItem or heroItem.IsEmpty():
- continue
- heroID = heroItem.GetItemTypeID()
- heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
- if not heroIpyData:
- continue
- quality = heroIpyData.GetQuality()
- qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
- if not qualityIpyData:
- continue
- singleItem = heroItem.GetItem()
-
- # 天赋
- if setAwakeLV != None:
- awakeLV = setAwakeLV
- if not IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV):
- GameWorld.DebugAnswer(curPlayer, "觉醒等级不存在:%s 品质:%s" % (awakeLV, quality))
- return
- else:
+ # 重置
+ PlayerHero.InitHeroItem(singleItem)
+
+ # 天赋
+ awakeLVMax = 0
+ for aLV in range(1, 100):
+ if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityAwake", quality, aLV):
+ break
+ awakeLVMax = aLV
+ if setAwakeLV != None:
+ awakeLV = min(setAwakeLV, awakeLVMax)
+ if not IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV):
+ #GameWorld.DebugAnswer(curPlayer, "觉醒等级不存在:%s 品质:%s" % (awakeLV, quality))
awakeLV = 0
- for aLV in range(1, 100):
- if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityAwake", quality, aLV):
- break
- awakeLV = aLV
- PlayerHero.SetHeroAwakeLV(heroItem, awakeLV, False)
-
- doCnt = 0
+ else:
+ awakeLV = awakeLVMax
+ PlayerHero.SetHeroAwakeLV(heroItem, awakeLV, False)
+
+ doCnt = 0
+ awakeRandCnt = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand)
+ while awakeRandCnt and doCnt <= 10:
+ doCnt += 1
+ selectIndex = random.randint(0, awakeRandCnt - 1)
+ itemIndex = heroItem.GetItemPlaceIndex()
+ PlayerHero.doSelectAwakeTalent(curPlayer, itemIndex, selectIndex, False)
awakeRandCnt = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand)
- while awakeRandCnt and doCnt <= 10:
- doCnt += 1
- selectIndex = random.randint(0, awakeRandCnt - 1)
- PlayerHero.doSelectAwakeTalent(curPlayer, itemIndex, selectIndex, False)
- awakeRandCnt = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand)
-
- # 突破
- if setBreakLV != None:
- breakLV = setBreakLV
- if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV):
- GameWorld.DebugAnswer(curPlayer, "突破等级不存在:%s 品质:%s" % (breakLV, quality))
- return
- else:
+
+ # 突破
+ breakLVMax = 0
+ for bLV in range(1, 100):
+ if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityBreak", quality, bLV):
+ break
+ breakLVMax = bLV
+ if setBreakLV != None:
+ breakLV = min(setBreakLV, breakLVMax)
+ if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV):
+ #GameWorld.DebugAnswer(curPlayer, "突破等级不存在:%s 品质:%s" % (breakLV, quality))
breakLV = 0
- for bLV in range(1, 100):
- if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityBreak", quality, bLV):
- break
- breakLV = bLV
- PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV, False)
+ else:
+ breakLV = breakLVMax
+ PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV, False)
+
+ # 星级
+ starMax = PlayerHero.GetHeroStarMax(heroItem)
+ if setStar != None:
+ updStar = min(setStar, starMax)
+ else:
+ updStar = starMax
+ PlayerHero.DoHeroUpdStar(curPlayer, heroItem, updStar, False)
+
+ # 等级
+ lvMax = PlayerHero.GetHeroLVMax(heroItem)
+ if setLV != None:
+ updHeroLV = max(1, min(setLV, lvMax))
+ else:
+ updHeroLV = lvMax
+ singleItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV)
+
+ # 皮肤
+ skinIDList = heroIpyData.GetSkinIDList()
+ if setSkinID != None:
+ if setSkinID not in skinIDList:
+ GameWorld.DebugAnswer(curPlayer, "皮肤不存在:%s 品质:%s" % (heroID, setSkinID))
+ return
+ skinIndex = skinIDList.index(setSkinID)
+ singleItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
- # 星级
- starMax = PlayerHero.GetHeroStarMax(heroItem)
- if setStar != None:
- updStar = min(setStar, starMax)
- else:
- updStar = starMax
- PlayerHero.DoHeroUpdStar(curPlayer, heroItem, updStar, False)
-
- # 等级
- lvMax = PlayerHero.GetHeroLVMax(heroItem)
- if setLV != None:
- updHeroLV = min(setLV, lvMax)
- else:
- updHeroLV = lvMax
- singleItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV)
-
- # 皮肤
- skinIDList = heroIpyData.GetSkinIDList()
- if setSkinID != None:
- if setSkinID not in skinIDList:
- GameWorld.DebugAnswer(curPlayer, "皮肤不存在:%s 品质:%s" % (heroID, setSkinID))
- return
- skinIndex = skinIDList.index(setSkinID)
- singleItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
-
- heroItem.Sync_Item()
- PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # GM修改阵容
-
- GameWorld.DebugAnswer(curPlayer, "设置阵容武将OK")
+ heroItem.Sync_Item()
+ PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # GM修改阵容
return
--
Gitblit v1.8.0