hxp
2026-01-16 750ff5ee6204bb088713b0ce10d53d05f22679e0
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
@@ -44,11 +44,7 @@
        GameWorld.DebugAnswer(curPlayer, "武将皮肤: Hero sk 武将ID 皮肤索引 是否解锁")
        GameWorld.DebugAnswer(curPlayer, "重置宿缘: Hero sy 0")
        GameWorld.DebugAnswer(curPlayer, "设置宿缘: Hero sy 宿缘ID 等级 [是否激活]")
        #GameWorld.DebugAnswer(curPlayer, "清空武将: ClearPack 35")
        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
@@ -58,19 +54,9 @@
    value = msgList[0]
    value2 = msgList[1] if len(msgList) > 1 else 0
    
    # 阵容上阵
    if value == "f":
        __oneKeyLineup(curPlayer, msgList)
        return
    # 一键满级
    if value == "max":
        __oneKeyMax(curPlayer, msgList)
        return
    # 阵容武将
    if value == "h":
        __lineupHero(curPlayer, msgList)
        return
    
    # 图鉴
@@ -143,12 +129,12 @@
            if not curItem or curItem.IsEmpty():
                continue
            if not isAll:
                if curItem.GetUserAttr(ShareDefine.Def_IudetHeroCardEffective):
                if curItem.GetUserAttrCount(ShareDefine.Def_IudetHeroEffPresetID):
                    continue
            curItem.Clear()
            
        if isAll:
            PlayerOnline.GetOnlinePlayer(curPlayer).SetEffectiveCardDict({}) # 清空生效缓存
            PlayerOnline.GetOnlinePlayer(curPlayer).ReCalcAllAttr()
        return
        
    # 宿缘
@@ -204,6 +190,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))
        
    # 等级
@@ -249,10 +237,10 @@
def __oneKeyMax(curPlayer, msgList):
    ## 一键满级: Hero max [指定等级 星级 突破 觉醒]
    setLV = msgList[2] if len(msgList) > 2 else None
    setStar = msgList[3] if len(msgList) > 3 else None
    setBreakLV = msgList[4] if len(msgList) > 4 else None
    setAwakeLV = msgList[5] if len(msgList) > 5 else None
    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()
@@ -285,120 +273,6 @@
    GameWorld.DebugAnswer(curPlayer, "一键OK!")
    return
def __oneKeyLineup(curPlayer, msgList):
    ## 阵容上阵: Hero f 阵容ID [武将ID ...]
    lineupID = msgList[1] if len(msgList) > 1 else 0
    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
    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
    # 给没有的武将
    for heroID in heroIDList:
        if heroID in haveHeroIDList:
            continue
        if not ItemControler.GivePlayerItem(curPlayer, heroID, 1, False):
            break
    # 更新新阵型
    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
    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))
    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
    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
        __setHeroItem(curPlayer, heroItem, setLV, setStar, setBreakLV, setAwakeLV, setSkinID)
    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)
@@ -410,18 +284,22 @@
        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 = setAwakeLV
        awakeLV = min(setAwakeLV, awakeLVMax)
        if not IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV):
            GameWorld.DebugAnswer(curPlayer, "觉醒等级不存在:%s 品质:%s" % (awakeLV, quality))
            return
            #GameWorld.DebugAnswer(curPlayer, "觉醒等级不存在:%s 品质:%s" % (awakeLV, quality))
            awakeLV = 0
    else:
        awakeLV = 0
        for aLV in range(1, 100):
            if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityAwake", quality, aLV):
                break
            awakeLV = aLV
        awakeLV = awakeLVMax
    PlayerHero.SetHeroAwakeLV(heroItem, awakeLV, False)
    
    doCnt = 0
@@ -434,17 +312,18 @@
        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 = setBreakLV
        breakLV = min(setBreakLV, breakLVMax)
        if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV):
            GameWorld.DebugAnswer(curPlayer, "突破等级不存在:%s 品质:%s" % (breakLV, quality))
            return
            #GameWorld.DebugAnswer(curPlayer, "突破等级不存在:%s 品质:%s" % (breakLV, quality))
            breakLV = 0
    else:
        breakLV = 0
        for bLV in range(1, 100):
            if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityBreak", quality, bLV):
                break
            breakLV = bLV
        breakLV = breakLVMax
    PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV, False)
    
    # 星级
@@ -458,7 +337,7 @@
    # 等级
    lvMax = PlayerHero.GetHeroLVMax(heroItem)
    if setLV != None:
        updHeroLV = min(setLV, lvMax)
        updHeroLV = max(1, min(setLV, lvMax))
    else:
        updHeroLV = lvMax
    singleItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV)