#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package GM.Commands.Hero
|
#
|
# @todo:Î佫ӢÐÛ
|
# @author hxp
|
# @date 2025-06-11
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: Î佫ӢÐÛ
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-06-11 11:00"""
|
#-------------------------------------------------------------------------------
|
|
import PlayerHero
|
import ShareDefine
|
import IpyGameDataPY
|
import PlayerControl
|
import ItemControler
|
import PlayerOnline
|
import GameWorld
|
import ChConfig
|
import random
|
|
## GMÃüÁîÖ´ÐÐÈë¿Ú
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param msgList ²ÎÊýÁбí
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def OnExec(curPlayer, msgList):
|
|
if not msgList:
|
GameWorld.DebugAnswer(curPlayer, "Î佫֨ÖÃ: Hero 0 ±³°üλÖÃ")
|
GameWorld.DebugAnswer(curPlayer, "Î佫µÈ¼¶: Hero l ±³°üλÖà ÉèÖõȼ¶")
|
GameWorld.DebugAnswer(curPlayer, "Î佫ÉýÐÇ: Hero s ±³°üλÖà ÉýxÐÇ")
|
GameWorld.DebugAnswer(curPlayer, "Îä½«Í»ÆÆ: Hero b ±³°üλÖà ÉèÖõȼ¶")
|
GameWorld.DebugAnswer(curPlayer, "Î佫¾õÐÑ: Hero a ±³°üλÖà ÉèÖõȼ¶")
|
#GameWorld.DebugAnswer(curPlayer, "Î佫ͼ¼ø: Hero t Î佫ID ͼ¼øÐǼ¶ ͼ¼øÍ»ÆÆµÈ¼¶")
|
GameWorld.DebugAnswer(curPlayer, "ÖØÖÃͼ¼ø: Hero t 0 [ÖØÖÃÕóÈÝÍÆ¼ö]")
|
GameWorld.DebugAnswer(curPlayer, "ÖØÖÃÖØÉú: Hero r")
|
GameWorld.DebugAnswer(curPlayer, "Î佫Ƥ·ô: Hero sk Î佫ID Ƥ·ôË÷Òý ÊÇ·ñ½âËø")
|
GameWorld.DebugAnswer(curPlayer, "ÖØÖÃËÞÔµ: Hero sy 0")
|
GameWorld.DebugAnswer(curPlayer, "ÉèÖÃËÞÔµ: Hero sy ËÞÔµID µÈ¼¶ [ÊÇ·ñ¼¤»î]")
|
GameWorld.DebugAnswer(curPlayer, "ÐÂÔöÎ佫: MakeItemCount Ó¢ÐÛID [¸öÊý]")
|
GameWorld.DebugAnswer(curPlayer, "Ò»¼üÂú¼¶: Hero max [Ö¸¶¨µÈ¼¶ ÐǼ¶ Í»ÆÆ ¾õÐÑ]")
|
GameWorld.DebugAnswer(curPlayer, "Çå¿ÕÎ佫: Hero clear [ÊÇ·ñ°üº¬ÉúЧ¿¨]")
|
return
|
|
PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
|
|
value = msgList[0]
|
value2 = msgList[1] if len(msgList) > 1 else 0
|
|
# Ò»¼üÂú¼¶
|
if value == "max":
|
__oneKeyMax(curPlayer, msgList)
|
return
|
|
# ͼ¼ø
|
if value == "t":
|
if not value2:
|
heroIDList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetHeroCount()):
|
ipyData = ipyDataMgr.GetHeroByIndex(index)
|
if not ipyData.GetPlayerCanUse():
|
continue
|
heroIDList.append(ipyData.GetHeroID())
|
else:
|
heroIDList = [value2]
|
|
if value2 == 0:
|
recommendReset = msgList[2] if len(msgList) > 2 else 0
|
syncHeroIDList = []
|
for heroID in heroIDList:
|
if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID):
|
continue
|
syncHeroIDList.append(heroID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, 0)
|
GameWorld.DebugAnswer(curPlayer, "ÖØÖÃͼ¼øOK!")
|
if recommendReset:
|
syncIDList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetLineupRecommendCount()):
|
ipyData = ipyDataMgr.GetLineupRecommendByIndex(index)
|
recommendID = ipyData.GetRecommendID()
|
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroRecommend % recommendID):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroRecommend % recommendID, 0)
|
syncIDList.append(recommendID)
|
PlayerHero.Sync_LineupRecommendInfo(curPlayer, syncIDList)
|
GameWorld.DebugAnswer(curPlayer, "ÖØÖÃÍÆ¼öOK!")
|
|
#else:
|
# heroID = value2
|
# syncHeroIDList = [heroID]
|
# bookStarLV = msgList[2] if len(msgList) > 2 else 0
|
# bookBreakLV = msgList[3] if len(msgList) > 3 else 0
|
# if (bookStarLV or bookStarLV) and not PlayerHero.GetHeroBookInitState(curPlayer, heroID):
|
# PlayerHero.SetHeroBookInitState(curPlayer, heroID, 1)
|
# PlayerHero.SetHeroBookStarLV(curPlayer, heroID, bookStarLV)
|
# PlayerHero.SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV)
|
# GameWorld.DebugAnswer(curPlayer, "ÉèÖÃÎ佫(%s)ͼ¼øÐǼ¶(%s),Í»ÆÆ(%s)" % (heroID, bookStarLV, bookBreakLV))
|
|
PlayerHero.Sync_HeroInfo(curPlayer, syncHeroIDList)
|
return
|
|
# ÖØÉú
|
if value == "r":
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroAwakeRebirthCnt, 0)
|
PlayerHero.Sync_PlayerHeroInfo(curPlayer)
|
return
|
|
# Ƥ·ô
|
if value == "sk":
|
heroID = value2
|
skinIndex = msgList[2] if len(msgList) > 2 else 0
|
isActive = msgList[3] if len(msgList) > 3 else 0
|
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:
|
GameWorld.DebugAnswer(curPlayer, "²»´æÔÚÎ佫: itemIndex=%s" % itemIndex)
|
return
|
|
heroID = heroItem.GetItemTypeID()
|
heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
|
if not heroIpyData:
|
return
|
quality = heroIpyData.GetQuality()
|
|
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))
|
|
# µÈ¼¶
|
elif value == "l":
|
heroLV = msgList[2] if len(msgList) > 2 else 1
|
LVMax = PlayerHero.GetHeroLVMax(heroItem)
|
heroLV = min(LVMax, heroLV)
|
heroItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, heroLV)
|
GameWorld.DebugAnswer(curPlayer, "ÉèÖÃÎ佫µÈ¼¶: %s,itemIndex=%s" % (heroLV, itemIndex))
|
|
# ÐǼ¶
|
elif value == "s":
|
addStar = msgList[2] if len(msgList) > 2 else 1
|
curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
|
starMax = PlayerHero.GetHeroStarMax(heroItem)
|
if curStar >= starMax:
|
GameWorld.DebugAnswer(curPlayer, "Î佫ÒÑÂúÐÇ: %s,itemIndex=%s" % (curStar, itemIndex))
|
return
|
updStar = min(curStar + addStar, starMax)
|
PlayerHero.DoHeroUpdStar(curPlayer, heroItem, updStar)
|
GameWorld.DebugAnswer(curPlayer, "¸üÐÂÎ佫ÐǼ¶: %s,itemIndex=%s" % (updStar, itemIndex))
|
|
# Í»ÆÆ
|
elif value == "b":
|
breakLV = msgList[2] if len(msgList) > 2 else 0
|
if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV):
|
GameWorld.DebugAnswer(curPlayer, "Í»ÆÆµÈ¼¶²»´æÔÚ:%s Æ·ÖÊ:%s" % (breakLV, quality))
|
return
|
PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV)
|
GameWorld.DebugAnswer(curPlayer, "ÉèÖÃÎä½«Í»ÆÆ: %s,itemIndex=%s" % (breakLV, itemIndex))
|
|
# ¾õÐÑ
|
elif value == "a":
|
awakeLV = msgList[2] if len(msgList) > 2 else 0
|
if not IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV):
|
GameWorld.DebugAnswer(curPlayer, "¾õÐѵȼ¶²»´æÔÚ:%s Æ·ÖÊ:%s" % (awakeLV, quality))
|
return
|
PlayerHero.SetHeroAwakeLV(heroItem, awakeLV)
|
GameWorld.DebugAnswer(curPlayer, "ÉèÖÃÎ佫¾õÐÑ: %s,itemIndex=%s" % (awakeLV, itemIndex))
|
|
PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # GMÐÞ¸Ä
|
return
|
|
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 = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetHeroCount()):
|
ipyData = ipyDataMgr.GetHeroByIndex(index)
|
if not ipyData.GetPlayerCanUse():
|
continue
|
heroIDList.append(ipyData.GetHeroID())
|
|
curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
|
for index in range(curPack.GetCount()):
|
heroItem = curPack.GetAt(index)
|
if not heroItem or heroItem.IsEmpty():
|
continue
|
heroID = heroItem.GetItemTypeID()
|
if heroID in heroIDList:
|
heroIDList.remove(heroID)
|
|
# ¸øÃ»ÓеÄÎ佫
|
for heroID in heroIDList:
|
ItemControler.GivePlayerItem(curPlayer, heroID, 1, False)
|
|
# ÉèÖÃÒ»¼üÂú
|
for index in range(curPack.GetCount()):
|
heroItem = curPack.GetAt(index)
|
if not heroItem or heroItem.IsEmpty():
|
continue
|
__setHeroItem(curPlayer, heroItem, setLV, setStar, setBreakLV, setAwakeLV)
|
|
GameWorld.DebugAnswer(curPlayer, "Ò»¼üOK!")
|
return
|
|
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()
|
|
# ÖØÖÃ
|
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
|
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)
|
|
# Í»ÆÆ
|
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
|
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)
|
|
heroItem.Sync_Item()
|
PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # GMÐÞ¸ÄÕóÈÝ
|
return
|