ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -43,8 +43,6 @@
        singleItem.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, 0)
    if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroSkin):
        singleItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, 0)
    if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroPosNum):
        singleItem.SetUserAttr(ShareDefine.Def_IudetHeroPosNum, 0)
        
    if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID):
        singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentID)
@@ -56,6 +54,8 @@
        singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentWashID)
    if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand):
        singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentIDAwakeRand)
    if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup):
        singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroLineup)
        
    InitHeroTalent(singleItem)
    return
@@ -192,6 +192,21 @@
        return
    return heroItem
def GetHeroLineupPosNum(heroItem, lineupID=ShareDefine.Lineup_Main):
    ## 获取英雄所在阵型站位
    # @param lineupID: 阵型ID,默认主阵型
    # @return: 0-没有在该阵型;>0-在该阵型中的站位编号
    lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)
    if not lineupCount:
        return 0
    for lpIndex in range(lineupCount)[::-1]:
        lineupValue = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
        #阵容类型*10000+阵型类型*100+位置编号
        if lineupValue / 10000 != lineupID:
            continue
        return lineupValue % 100
    return 0
#// B2 30 武将升级 #tagCSHeroLVUP
#
#struct    tagCSHeroLVUP
@@ -239,8 +254,9 @@
    GameWorld.DebugLog("武将升级: itemIndex=%s,heroID=%s,updHeroLV=%s" % (itemIndex, heroID, updHeroLV), playerID)
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV)
    
    # 刷属性,之后扩展
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    return
def GetHeroLVMax(heroItem):
@@ -353,8 +369,9 @@
        __DoHeroStarTalentUp(item, addStar)
    heroItem.Sync_Item()
    
    # 刷属性,之后扩展
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    return
def __DoHeroStarTalentUp(singleItem, addLV):
@@ -496,8 +513,9 @@
    GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID)
    SetHeroBreakLV(heroItem, nextBreakLV)
    
    # 刷属性,之后扩展
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    return
def SetHeroBreakLV(heroItem, breakLV):
@@ -555,8 +573,9 @@
    GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
    SetHeroAwakeLV(heroItem, nextAwakeLV)
    
    # 刷属性,之后扩展
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    return
def SetHeroAwakeLV(heroItem, awakeLV):
@@ -688,8 +707,9 @@
    
    heroItem.Sync_Item()
    
    # 刷属性,之后扩展
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    return
#// B2 35 武将洗炼 #tagCSHeroWash
@@ -825,8 +845,9 @@
    heroItem.Sync_Item()
    GameWorld.DebugLog("武将洗炼替换! itemIndex=%s,heroID=%s,washIDList=%s" % (itemIndex, heroID, washIDList))
    
    # 刷属性,之后扩展
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    return
#// B2 36 武将换肤 #tagCSHeroWearSkin
@@ -848,9 +869,9 @@
    heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
    if not heroIpyData:
        return
    skinNPCIDList = heroIpyData.GetSkinNPCIDList()
    skinIDList = heroIpyData.GetSkinIDList()
    if skinIndex > 0: # 0的为默认皮肤,不做限制
        if skinIndex >= len(skinNPCIDList):
        if skinIndex >= len(skinIDList):
            GameWorld.DebugLog("该武将不存在该皮肤! heroID=%s,skinIndex=%s" % (heroID, skinIndex))
            return
        skinState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkin % heroID)
@@ -860,7 +881,9 @@
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    return
def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True):
@@ -875,6 +898,8 @@
                           % (heroID, skinIndex, skinState, updState), curPlayer.GetPlayerID())
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkin % heroID, updState)
    Sync_HeroInfo(curPlayer, [heroID])
    RefreshLordAttr(curPlayer)
    return
#// B2 37 武将图鉴激活升级 #tagCSHeroBookUP
@@ -926,6 +951,8 @@
            PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "HeroBookAct")
                    
    Sync_HeroInfo(curPlayer, [heroID])
    RefreshLordAttr(curPlayer)
    return
def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex):
@@ -946,8 +973,7 @@
    SetHeroBookStarLV(curPlayer, heroID, bookStar + 1)
    Sync_HeroInfo(curPlayer, [heroID])
    
    # 刷属性
    RefreshLordAttr(curPlayer)
    return
def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex):
@@ -968,8 +994,7 @@
    SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1)
    Sync_HeroInfo(curPlayer, [heroID])
    
    # 刷属性
    RefreshLordAttr(curPlayer)
    return
#// B2 38 武将锁定 #tagCSHeroLock
@@ -990,24 +1015,26 @@
    heroItem.SetIsLocked(1 if isLock else 0)
    return
#// B4 12 战斗阵型保存 #tagCSHeroBattlePosSave
#// B4 12 战斗阵容保存 #tagCSHeroLineupSave
#
#struct    tagCSHeroBattlePos
#struct    tagCSHeroLineupPos
#{
#    WORD        ItemIndex;    //武将物品所在武将背包位置索引
#    BYTE        PosNum;        //1~n上阵位置编号  
#};
#
#struct    tagCSHeroBattlePosSave
#struct    tagCSHeroLineupSave
#{
#    tagHead        Head;
#    BYTE        FuncType;    //布阵功能类型:0-默认主阵型;其他待扩展,如某个活动的防守阵型
#    BYTE        LineupID;        //阵容ID:1-主阵容;其他待扩展,如某个防守阵容
#    BYTE        ShapeType;    //本阵容阵型,0为默认阵型,可扩展不同的阵型
#    BYTE        PosCnt;
#    tagCSHeroBattlePos    HeroPosList[PosCnt];    // 保存的阵型,只要发送最终的阵型武将位置即可
#    tagCSHeroLineupPos    HeroPosList[PosCnt];    // 保存的阵容,只发送最终的阵容武将位置即可
#};
def OnHeroBattlePosSave(index, clientData, tick):
def OnHeroLineupSave(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    funcType = clientData.FuncType
    lineupID = clientData.LineupID
    shapeType = clientData.ShapeType
    heroPosList = clientData.HeroPosList
    
    heroPosDict = {}
@@ -1021,40 +1048,61 @@
        indexList.append(itemIndex)
        heroPosDict[posNum] = itemIndex
        
    # 主阵型
    if funcType == 0:
        MainBattlePosSave(curPlayer, heroPosDict)
    # 其他待扩展
    elif funcType == 1:
        pass
    if lineupID not in ShareDefine.LineupList:
        GameWorld.DebugLog("不存在该阵容,无法保存! lineupID=%s" % lineupID)
        return
    
    return
def MainBattlePosSave(curPlayer, heroPosDict):
    GameWorld.DebugLog("保留主战斗阵型: %s" % heroPosDict, curPlayer.GetPlayerID())
    GameWorld.DebugLog("保存阵容: lineupID=%s, %s" % (lineupID, heroPosDict), curPlayer.GetPlayerID())
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
    # 直接重置旧阵型
    delCount = 0
    syncItemDict = {}
    for index in range(curPack.GetCount()):
        heroItem = curPack.GetAt(index)
        if not heroItem or heroItem.IsEmpty():
            continue
        if not heroItem.GetUserAttr(ShareDefine.Def_IudetHeroPosNum):
        lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)
        if not lineupCount:
            continue
        item = heroItem.GetItem()
        item.ClearUserAttr(ShareDefine.Def_IudetHeroPosNum)
        for lpIndex in range(lineupCount)[::-1]:
            lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
            #阵容类型*10000+阵型类型*100+位置编号
            if lineupValue / 10000 != lineupID:
                continue
            item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
            delCount += 1
            if delCount >= ShareDefine.LineupObjMax:
                break
            syncItemDict[index] = heroItem
    # 更新新阵型
    heroIDList = []
    for posNum, itemIndex in heroPosDict.items():
        if itemIndex < 0 or itemIndex >= curPack.GetCount():
            continue
        heroItem = curPack.GetAt(itemIndex)
        if not heroItem or heroItem.IsEmpty():
            continue
        itemID = heroItem.GetItemTypeID()
        if itemID in heroIDList:
            GameWorld.DebugLog("同个武将只能上阵一个! itemIndex=%s,itemID=%s" % (itemIndex, itemID))
            continue
        heroIDList.append(itemID)
        item = heroItem.GetItem()
        item.SetUserAttr(ShareDefine.Def_IudetHeroPosNum, posNum)
        lineupValue = lineupID * 10000 + shapeType * 100 + posNum
        item.AddUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
        if itemIndex not in syncItemDict:
            syncItemDict[itemIndex] = heroItem
        
    ResetHeroPack(curPlayer)
    # 主阵容修改时重整背包
    if lineupID == ShareDefine.Lineup_Main:
        ResetHeroPack(curPlayer)
    else:
        for syncItem in syncItemDict.values():
            syncItem.Sync_Item()
    RefreshLordAttr(curPlayer)
    return
def ResetHeroPack(curPlayer):
@@ -1063,6 +1111,24 @@
    ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick)
    return
    
def RefreshLordAttr(curPlayer):
    ## 刷新主公属性
    CalcHeroItemAddAttr(curPlayer)
    return
def CalcHeroItemAddAttr(curPlayer):
    #allAttrListPet = [{} for _ in range(4)]
    return
def RefreshLineupHeroAttr(curPlayer):
    ## 刷新阵容武将属性
    # 计算阵容总战力 = 角色总战力为主阵容战力,需同步计算不同阵容战力
    return
def CaclHeroCardAttr():
    return
def Sync_HeroInfo(curPlayer, heroIDList=None):
    if heroIDList != None:
        syncHeroIDList = heroIDList