hxp
2025-12-31 46dbf29a22bd25d8e9c6ea4c34fea35a4828d712
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
@@ -38,15 +38,19 @@
        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 t 武将ID 图鉴星级 图鉴突破等级")
        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 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
    
    PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
@@ -57,6 +61,11 @@
    # 阵容上阵
    if value == "f":
        __oneKeyLineup(curPlayer, msgList)
        return
    # 一键满级
    if value == "max":
        __oneKeyMax(curPlayer, msgList)
        return
    
    # 阵容武将
@@ -78,6 +87,7 @@
            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):
@@ -85,17 +95,29 @@
                syncHeroIDList.append(heroID)
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, 0)
            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))
            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
    
@@ -113,29 +135,87 @@
        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.GetUserAttr(ShareDefine.Def_IudetHeroCardEffective):
                    continue
            curItem.Clear()
        if isAll:
            PlayerOnline.GetOnlinePlayer(curPlayer).SetEffectiveCardDict({}) # 清空生效缓存
        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()
        GameWorld.DebugAnswer(curPlayer, "重置武将: itemIndex=%s" % (itemIndex))
        return
    # 等级
    if value == "l":
    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))
        return
    # 星级
    if value == "s":
    elif value == "s":
        addStar = msgList[2] if len(msgList) > 2 else 1
        curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
        starMax = PlayerHero.GetHeroStarMax(heroItem)
@@ -145,22 +225,64 @@
        updStar = min(curStar + addStar, starMax)
        PlayerHero.DoHeroUpdStar(curPlayer, heroItem, updStar)
        GameWorld.DebugAnswer(curPlayer, "更新武将星级: %s,itemIndex=%s" % (updStar, itemIndex))
        return
    # 突破
    if value == "b":
    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))
        return
    # 觉醒
    if value == "a":
    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))
        return
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # GM修改
    return
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
    
    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 __oneKeyLineup(curPlayer, msgList):
@@ -238,7 +360,7 @@
    for syncItem in syncItemDict.values():
        syncItem.Sync_Item()
        
    lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID)
    lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID, False)
    lineup.UpdLineup(heroItemDict, shapeType)
    GameWorld.DebugAnswer(curPlayer, "阵容(%s)上阵OK: %s" % (lineupID, heroItemDict))
    return
@@ -272,79 +394,84 @@
        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:
            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
        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:
            breakLV = 0
            for bLV in range(1, 100):
                if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityBreak", quality, bLV):
                    break
                breakLV = bLV
        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 = 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([itemIndex])
        __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)
    if not heroIpyData:
        return
    quality = heroIpyData.GetQuality()
    qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
    if not qualityIpyData:
        return
    singleItem = heroItem.GetItem()
    # 天赋
    if setAwakeLV != None:
        awakeLV = setAwakeLV
        if not IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV):
            GameWorld.DebugAnswer(curPlayer, "觉醒等级不存在:%s 品质:%s" % (awakeLV, quality))
            return
    else:
        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
    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)
    # 突破
    if setBreakLV != None:
        breakLV = setBreakLV
        if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV):
            GameWorld.DebugAnswer(curPlayer, "突破等级不存在:%s 品质:%s" % (breakLV, quality))
            return
    else:
        breakLV = 0
        for bLV in range(1, 100):
            if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityBreak", quality, bLV):
                break
            breakLV = bLV
    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 = 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