ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -23,13 +23,77 @@
import ChPyNetSendPack
import NetPackCommon
import PlayerControl
import PlayerOnline
import GameWorld
import ChConfig
import random
def PlayerOnDay(curPlayer):
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt):
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroAwakeRebirthCnt, 0)
        Sync_PlayerHeroInfo(curPlayer)
    return
def OnPlayerLogin(curPlayer):
    Sync_HeroInfo(curPlayer)
    Sync_PlayerHeroInfo(curPlayer)
    return
def OnPlayerFirstLogin(curPlayer):
    OnFirstLoginInitPlayer(curPlayer)
    OnFirstLoginInitHero(curPlayer)
    return
def OnFirstLoginInitPlayer(curPlayer):
    ## 初始化主公
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    if not equipPack.GetCount():
        identifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
        if not identifyPack.GetCount():
            return
    defaultEquipInfo = IpyGameDataPY.GetFuncEvalCfg("NewRoleInit", 1, {})
    if not defaultEquipInfo:
        return
    GameWorld.DebugLog("初始化新手定制装备: %s" % defaultEquipInfo, curPlayer.GetPlayerID())
    for equipID, appointID in defaultEquipInfo.items():
        itemData = GameWorld.GetGameData().GetItemByTypeID(equipID)
        if not itemData:
            continue
        equipPlace = itemData.GetEquipPlace()
        equipPlaceIndex = equipPlace - 1 # 暂固定直接装备位-1
        if equipPlaceIndex < 0 or equipPlaceIndex >= equipPack.GetCount():
            continue
        destEquip = equipPack.GetAt(equipPlaceIndex)
        if not destEquip.IsEmpty():
            continue
        setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID} if appointID else {}
        curItem = ItemControler.GetOutPutItemObj(equipID, 1, curPlayer=curPlayer, setAttrDict=setAttrDict)
        if not curItem:
            continue
        destEquip.AssignItem(curItem)
    return
def OnFirstLoginInitHero(curPlayer):
    ## 初始化默认武将阵型
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
    GameWorld.DebugLog("OnFirstLoginInitHero: %s" % curPack.GetCount(), curPlayer.GetPlayerID())
    if not curPack.GetCount():
        return
    defaultHeroInfo = IpyGameDataPY.GetFuncEvalCfg("NewRoleInit", 2, {})
    if not defaultHeroInfo:
        return
    GameWorld.DebugLog("初始化新手武将: %s" % defaultHeroInfo, curPlayer.GetPlayerID())
    lineupID = ShareDefine.Lineup_Main
    shapeType = 0
    for heroID, posNum in defaultHeroInfo.items():
        lineupValue = ComLineupValue(lineupID, shapeType, posNum)
        setAttrDict = {ShareDefine.Def_IudetHeroLineup:[lineupValue]}
        ItemControler.GivePlayerItem(curPlayer, heroID, 1, False, [ShareDefine.rptHero], setAttrDict=setAttrDict)
    return
def InitHeroItem(singleItem):
@@ -201,10 +265,10 @@
        return 0
    for lpIndex in range(lineupCount)[::-1]:
        lineupValue = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
        #阵容类型*10000+阵型类型*100+位置编号
        if lineupValue / 10000 != lineupID:
        lpID, _, posNum = GetLineupValue(lineupValue)
        if lpID != lineupID:
            continue
        return lineupValue % 100
        return posNum
    return 0
#// B2 30 武将升级 #tagCSHeroLVUP
@@ -234,10 +298,14 @@
    if heroLV >= LVMax:
        GameWorld.DebugLog("该武将已满级!LVMax=%s" % (LVMax), playerID)
        return
    qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
    if not qualityIpyData:
    qualityLVIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, heroLV)
    if not qualityLVIpyData:
        return
    costItemInfo = qualityIpyData.GetUPCostItem()
    nextHeroLV = heroLV + 1
    if not IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, nextHeroLV):
        GameWorld.DebugLog("不存在该武将等级: quality=%s,nextHeroLV=%s" % (quality, nextHeroLV), playerID)
        return
    costItemInfo = qualityLVIpyData.GetUPCostItem()
    if not costItemInfo:
        return
    costItemID, costItemCount = costItemInfo
@@ -250,13 +318,11 @@
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroLVUP")
    
    updHeroLV = heroLV + 1
    updHeroLV = nextHeroLV
    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)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def GetHeroLVMax(heroItem):
@@ -359,7 +425,7 @@
    starMax = InitStarUpper + addStarUpper
    return starMax
def DoHeroUpdStar(curPlayer, heroItem, updStar):
def DoHeroUpdStar(curPlayer, heroItem, updStar, isSync=True):
    ## 执行武将星级更新
    curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
    addStar = updStar - curStar
@@ -367,11 +433,11 @@
    item.SetUserAttr(ShareDefine.Def_IudetHeroStar, updStar)
    if addStar > 0:
        __DoHeroStarTalentUp(item, addStar)
    heroItem.Sync_Item()
    if isSync:
        heroItem.Sync_Item()
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    itemIndex = heroItem.GetItemPlaceIndex()
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def __DoHeroStarTalentUp(singleItem, addLV):
@@ -488,11 +554,16 @@
    if not heroIpyData:
        return
    quality = heroIpyData.GetQuality()
    heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV)
    breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
    GameWorld.DebugLog("请求武将突破: itemIndex=%s,heroID=%s,quality=%s,breakLV=%s"
                       % (itemIndex, heroID, quality, breakLV), playerID)
    GameWorld.DebugLog("请求武将突破: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s"
                       % (itemIndex, heroID, quality, heroLV, breakLV), playerID)
    ipyData = IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV)
    if not ipyData:
        return
    LVMax = ipyData.GetLVMax()
    if heroLV < LVMax:
        GameWorld.DebugLog("未满级,无法突破: heroLV=%s < %s" % (heroLV, LVMax), playerID)
        return
    nextBreakLV = breakLV + 1
    if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, nextBreakLV):
@@ -513,14 +584,15 @@
    GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID)
    SetHeroBreakLV(heroItem, nextBreakLV)
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def SetHeroBreakLV(heroItem, breakLV):
def SetHeroBreakLV(heroItem, breakLV, isSync=True):
    ## 设置武将突破等级
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, breakLV)
    item = heroItem.GetItem()
    item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, breakLV)
    if isSync:
        heroItem.Sync_Item()
    return
#// B2 33 武将觉醒 #tagCSHeroAwake
@@ -570,20 +642,19 @@
        GameWorld.DebugLog("材料不足,武将无法觉醒! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount))
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroAwake")
    GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
    GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextAwakeLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
    SetHeroAwakeLV(heroItem, nextAwakeLV)
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def SetHeroAwakeLV(heroItem, awakeLV):
def SetHeroAwakeLV(heroItem, awakeLV, isSync=True):
    ## 设置武将觉醒等级
    item = heroItem.GetItem()
    item.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, awakeLV)
    unlockTalentSlotByAwake(item)
    heroItem.Sync_Item()
    if isSync:
        heroItem.Sync_Item()
    return
def unlockTalentSlotByAwake(singleItem):
@@ -657,9 +728,13 @@
#};
def OnHeroAwakeSelectTalent(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    itemIndex = clientData.ItemIndex
    selectIndex = clientData.SelectIndex
    doSelectAwakeTalent(curPlayer, itemIndex, selectIndex)
    return
def doSelectAwakeTalent(curPlayer, itemIndex, selectIndex, isSync=True):
    playerID = curPlayer.GetPlayerID()
    heroItem = GetHeroItem(curPlayer, itemIndex)
    if not heroItem:
        return
@@ -702,14 +777,13 @@
    for index, talentID in enumerate(idList):
        singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentID, talentID)
        singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentIDLV, lvList[index])
    unlockTalentSlotByAwake(singleItem)
    
    heroItem.Sync_Item()
    if isSync:
        heroItem.Sync_Item()
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
#// B2 35 武将洗炼 #tagCSHeroWash
@@ -845,9 +919,7 @@
    heroItem.Sync_Item()
    GameWorld.DebugLog("武将洗炼替换! itemIndex=%s,heroID=%s,washIDList=%s" % (itemIndex, heroID, washIDList))
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
#// B2 36 武将换肤 #tagCSHeroWearSkin
@@ -880,10 +952,7 @@
            return
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True):
@@ -958,6 +1027,9 @@
def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex):
    ## 图鉴星级升级
    playerID = curPlayer.GetPlayerID()
    if not GetHeroBookInitState(curPlayer, heroID):
        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
        return
    heroItem = GetHeroItem(curPlayer, itemIndex)
    if not heroItem:
        return
@@ -979,6 +1051,9 @@
def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex):
    ## 图鉴突破升级
    playerID = curPlayer.GetPlayerID()
    if not GetHeroBookInitState(curPlayer, heroID):
        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
        return
    heroItem = GetHeroItem(curPlayer, itemIndex)
    if not heroItem:
        return
@@ -1013,6 +1088,191 @@
    if not heroItem:
        return
    heroItem.SetIsLocked(1 if isLock else 0)
    return
#// B2 39 武将重生 #tagCSHeroRebirth
#
#struct    tagCSHeroRebirth
#{
#    tagHead        Head;
#    WORD        ItemIndex;    //武将物品所在武将背包位置索引
#};
def OnHeroRebirth(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    itemIndex = clientData.ItemIndex
    heroItem = GetHeroItem(curPlayer, itemIndex)
    if not heroItem:
        return
    heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV)
    breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
    awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV)
    if heroLV <= 1 and not breakLV and not awakeLV:
        GameWorld.DebugLog("该武将未进行过等级突破觉醒培养,不需要重生! itemIndex=%s" % (itemIndex))
        return
    if awakeLV:
        rebirthCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt)
        rebirthCntMax = IpyGameDataPY.GetFuncCfg("HeroRebirth", 2)
        if rebirthCntMax and rebirthCnt >= rebirthCntMax:
            GameWorld.DebugLog("今日觉醒过的武将重生次数已达上限! rebirthCnt=%s >= %s" % (rebirthCnt, rebirthCntMax))
            return
    heroID = heroItem.GetItemTypeID()
    heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
    if not heroIpyData:
        return
    quality = heroIpyData.GetQuality()
    ipyData = IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV)
    if not ipyData:
        return
    costMoney = ipyData.GetRebirthCostMoney()
    moneyType = IpyGameDataPY.GetFuncCfg("HeroRebirth", 1)
    if moneyType and costMoney and not PlayerControl.HaveMoney(curPlayer, moneyType, costMoney):
        return
    # 验证通过,可以重生
    GameWorld.DebugLog("武将重生: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s,awakeLV=%s"
                       % (itemIndex, heroID, quality, heroLV, breakLV, awakeLV))
    returnItemDict = {}
    __calcHeroLVReturnitem(quality, heroLV, returnItemDict)
    __calcHeroBreakReturnitem(quality, breakLV, returnItemDict)
    __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict)
    if moneyType and costMoney and not PlayerControl.PayMoney(curPlayer, moneyType, costMoney, "HeroRebirth"):
        return
    # 执行重生
    item = heroItem.GetItem()
    item.SetUserAttr(ShareDefine.Def_IudetHeroLV, 1)
    item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, 0)
    item.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, 0)
    heroItem.Sync_Item()
    if returnItemDict:
        returnItemList = [[k, v] for k, v in returnItemDict.items()]
        ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroRebirth", False, {}])
    if awakeLV:
        rebirthCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroAwakeRebirthCnt, rebirthCnt + 1)
        Sync_PlayerHeroInfo(curPlayer)
    return
def __calcHeroLVReturnitem(quality, heroLV, returnItemDict):
    ## 计算武将等级返还
    returnDict = {}
    for retLV in range(1, heroLV):
        qualityLVIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, retLV)
        if not qualityLVIpyData:
            continue
        costItemInfo = qualityLVIpyData.GetUPCostItem()
        if not costItemInfo:
            continue
        costItemID, costItemCount = costItemInfo
        returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount
        returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount
    GameWorld.DebugLog("    等级返还: quality=%s,heroLV=%s,%s,总%s" % (quality, heroLV, returnDict, returnItemDict))
    return
def __calcHeroBreakReturnitem(quality, breakLV, returnItemDict):
    # 计算武将突破返还
    returnDict = {}
    for retBreakLV in range(0, breakLV):
        qualityBreakIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, retBreakLV)
        if not qualityBreakIpyData:
            continue
        costItemInfo = qualityBreakIpyData.GetUPCostItem()
        if not costItemInfo:
            continue
        costItemID, costItemCount = costItemInfo
        returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount
        returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount
    GameWorld.DebugLog("    突破返还: quality=%s,breakLV=%s,%s,总%s" % (quality, breakLV, returnDict, returnItemDict))
    return
def __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict):
    # 计算武将觉醒返还
    returnDict = {}
    for retAwakeLV in range(0, awakeLV):
        qualityAwakeIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, retAwakeLV)
        if not qualityAwakeIpyData:
            continue
        costItemInfo = qualityAwakeIpyData.GetUPCostItem()
        if not costItemInfo:
            continue
        costItemID, costItemCount = costItemInfo
        returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount
        returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount
    GameWorld.DebugLog("    觉醒返还: quality=%s,awakeLV=%s,%s,总%s" % (quality, awakeLV, returnDict, returnItemDict))
    return
#// B2 40 武将遣散 #tagCSHeroDismiss
#
#struct    tagCSHeroDismiss
#{
#    tagHead         Head;
#    WORD        Count;
#    WORD        ItemIndexList[Count];    // 武将物品所在武将背包位置索引列表
#};
def OnHeroDismiss(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    itemIndexList = clientData.ItemIndexList
    GameWorld.DebugLog("武将遣散: itemIndexList=%s" % itemIndexList)
    dismissItemList = []
    returnItemDict = {}
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
    for itemIndex in itemIndexList:
        if itemIndex < 0 or itemIndex >= curPack.GetCount():
            continue
        heroItem = curPack.GetAt(itemIndex)
        if not heroItem or heroItem.IsEmpty():
            continue
        awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV)
        if awakeLV:
            GameWorld.DebugLog("觉醒过的武将需先重生后才可遣散! itemIndex=%s,awakeLV=%s" % (itemIndex, awakeLV))
            continue
        if heroItem.GetIsLocked():
            GameWorld.DebugLog("锁定的武将无法遣散! itemIndex=%s" % (itemIndex))
            continue
        lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)
        if lineupCount:
            lineupValueList = [heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex) for lpIndex in range(lineupCount)]
            GameWorld.DebugLog("上阵中的武将无法遣散! itemIndex=%s,lineupValueList=%s" % (itemIndex, lineupValueList))
            continue
        heroID = heroItem.GetItemTypeID()
        heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
        if not heroIpyData:
            continue
        quality = heroIpyData.GetQuality()
        heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV)
        breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
        heroStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
        qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
        if not qualityIpyData:
            continue
        GameWorld.DebugLog("Dzɢ: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s,heroStar=%s" % (itemIndex, heroID, quality, heroLV, breakLV, heroStar))
        dismissReturnItems = qualityIpyData.GetDismissReturnItems()
        for itemID, itemCount in dismissReturnItems:
            starRetCnt = (heroStar + 1) * itemCount
            returnItemDict[itemID] = returnItemDict.get(itemID, 0) + starRetCnt
        GameWorld.DebugLog("    星级返还: quality=%s,heroStar=%s,%s,总%s" % (quality, heroStar, dismissReturnItems, returnItemDict))
        __calcHeroLVReturnitem(quality, heroLV, returnItemDict)
        __calcHeroBreakReturnitem(quality, breakLV, returnItemDict)
        dismissItemList.append([itemIndex, heroItem])
    if not dismissItemList:
        return
    for itemIndex, heroItem in dismissItemList:
        ItemCommon.DelItem(curPlayer, heroItem, heroItem.GetCount(), False, "HeroDismiss")
    if returnItemDict:
        returnItemList = [[k, v] for k, v in returnItemDict.items()]
        ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroDismiss", False, {}])
    return
#// B4 12 战斗阵容保存 #tagCSHeroLineupSave
@@ -1067,8 +1327,7 @@
        item = heroItem.GetItem()
        for lpIndex in range(lineupCount)[::-1]:
            lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
            #阵容类型*10000+阵型类型*100+位置编号
            if lineupValue / 10000 != lineupID:
            if GetLineupValue(lineupValue)[0] != lineupID:
                continue
            item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
            delCount += 1
@@ -1078,6 +1337,7 @@
            
    # 更新新阵型
    heroIDList = []
    heroItemDict = {}
    for posNum, itemIndex in heroPosDict.items():
        if itemIndex < 0 or itemIndex >= curPack.GetCount():
            continue
@@ -1090,43 +1350,70 @@
            continue
        heroIDList.append(itemID)
        item = heroItem.GetItem()
        lineupValue = lineupID * 10000 + shapeType * 100 + posNum
        lineupValue = ComLineupValue(lineupID, shapeType, posNum)
        item.AddUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
        if itemIndex not in syncItemDict:
            syncItemDict[itemIndex] = heroItem
        heroItemDict[itemIndex] = posNum
        
    # 主阵容修改时重整背包
    if lineupID == ShareDefine.Lineup_Main:
        ResetHeroPack(curPlayer)
    else:
        for syncItem in syncItemDict.values():
            syncItem.Sync_Item()
    RefreshLordAttr(curPlayer)
    # 主阵容修改时重整背包,约定所有背包由前端自行排序
    #if lineupID == ShareDefine.Lineup_Main:
    #    ResetHeroPack(curPlayer)
    #else:
    for syncItem in syncItemDict.values():
        syncItem.Sync_Item()
    lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID)
    lineup.UpdLineup(heroItemDict, shapeType)
    return
def ResetHeroPack(curPlayer):
    tick = GameWorld.GetGameWorld().GetTick()
    curPlayer.SetResetItemTick(0)
    ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick)
    return
def ComLineupValue(lineupID, shapeType, posNum): return lineupID * 10000 + shapeType * 100 + posNum
def GetLineupValue(lineupValue):
    lineupID = lineupValue / 10000
    shapeType = lineupValue % 10000 / 100
    posNum = lineupValue % 100
    return lineupID, shapeType, posNum
#def ResetHeroPack(curPlayer):
#    tick = GameWorld.GetGameWorld().GetTick()
#    curPlayer.SetResetItemTick(0)
#    ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick)
#    return
def RefreshLordAttr(curPlayer):
    ## 刷新主公属性
    CalcHeroItemAddAttr(curPlayer)
    CalcHeroAddAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
    return
def CalcHeroItemAddAttr(curPlayer):
    #allAttrListPet = [{} for _ in range(4)]
    return
def RefreshLineupHeroAttr(curPlayer):
    ## 刷新阵容武将属性
def CalcHeroAddAttr(curPlayer):
    ## 计算武将对主公增加的属性
    
    # 计算阵容总战力 = 角色总战力为主阵容战力,需同步计算不同阵容战力
    return
def CaclHeroCardAttr():
    heroBookAttrDict = {}
    playerID = curPlayer.GetID()
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetHeroCount()):
        ipyData = ipyDataMgr.GetHeroByIndex(index)
        heroID = ipyData.GetHeroID()
        if not GetHeroBookInitState(curPlayer, heroID):
            # 图鉴未激活
            continue
        quality = ipyData.GetQuality()
        qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
        if not qualityIpyData:
            continue
        bookInitAddPer = qualityIpyData.GetBookInitAddPer()
        bookStarAddPer = qualityIpyData.GetBookStarAddPer()
        bookBreakLVAddPer = qualityIpyData.GetBookBreakLVAddPer()
        bookStar = GetHeroBookStarLV(curPlayer, heroID)
        bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
        for attrPerID in ChConfig.BaseAttrPerIDList:
            addPer = bookInitAddPer + bookStar * bookStarAddPer + bookBreakLV * bookBreakLVAddPer
            heroBookAttrDict[attrPerID] = heroBookAttrDict.get(attrPerID, 0) + addPer
    GameWorld.DebugLog("武将图鉴属性: %s" % heroBookAttrDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroBook, heroBookAttrDict)
    return
def Sync_HeroInfo(curPlayer, heroIDList=None):
@@ -1166,3 +1453,46 @@
    clientPack.HeroCnt = len(clientPack.HeroInfoList)    
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def Sync_Lineup(curPlayer, lineupID=None):
    if lineupID:
        syncIDList = [lineupID]
    else:
        syncIDList = ShareDefine.LineupList
    lineupList = []
    olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
    for lineupID in syncIDList:
        lineup = olPlayer.GetLineup(lineupID)
        if not lineup:
            continue
        posNumItemIndexDict = {v:k for k, v in lineup.heroItemDict.items()}
        heroItemIndexList = [] # 所在武将背包索引+1列表 [站位1物品索引+1, 站位2, ...],站位无武将时为0
        for posNum in range(1, 1 + ShareDefine.LineupObjMax):
            if posNum in posNumItemIndexDict:
                heroItemIndexList.append(posNumItemIndexDict[posNum] + 1)
            else:
                heroItemIndexList.append(0)
        packLineup = ChPyNetSendPack.tagSCLineup()
        packLineup.LineupID = lineup.lineupID
        packLineup.ShapeType = lineup.shapeType
        packLineup.HeroItemIndexList = heroItemIndexList
        packLineup.HeroCnt = len(packLineup.HeroItemIndexList)
        lineupList.append(packLineup)
    if not lineupList:
        return
    clientPack = ChPyNetSendPack.tagSCLineupInfo()
    clientPack.LineupList = lineupList
    clientPack.LineupCnt = len(clientPack.LineupList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def Sync_PlayerHeroInfo(curPlayer):
    ## 武将公共信息
    clientPack = ChPyNetSendPack.tagSCPlayerHeroInfo()
    clientPack.AwakeRebirthCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return