From 0312684d12e68285b0a0feecb5904c78ecba4731 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 22 七月 2025 20:10:51 +0800
Subject: [PATCH] 121 【武将】武将系统-服务端(Hero命令支持一件上阵;一键满级;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py |  198 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 198 insertions(+), 0 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 37ad243..95f6e59 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
@@ -19,9 +19,11 @@
 import ShareDefine
 import IpyGameDataPY
 import PlayerControl
+import ItemControler
 import PlayerOnline
 import GameWorld
 import ChConfig
+import random
 
 ## GM命令执行入口
 #  @param curPlayer 当前玩家
@@ -41,12 +43,25 @@
         GameWorld.DebugAnswer(curPlayer, "武将皮肤: Hero sk 武将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")
         return
     
     PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
     
     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)
+        return
     
     # 图鉴
     if value == "t":
@@ -139,3 +154,186 @@
     
     return
 
+def __oneKeyLineup(curPlayer, msgList):
+    ## 阵容上阵: Hero f 阵容ID [武将ID ...]
+    lineupID = msgList[1] if len(msgList) > 1 else 0
+    heroIDList = list(set(msgList[2:])) # 去重,单阵容武将ID不能重复
+    
+    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)
+    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
+        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(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])
+        
+    GameWorld.DebugAnswer(curPlayer, "设置阵容武将OK")
+    return

--
Gitblit v1.8.0