hxp
8 天以前 bd9dce2d66b5086712596b8dac6d9116be65bafd
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -42,6 +42,7 @@
    Sync_HeroInfo(curPlayer)
    Sync_PlayerHeroInfo(curPlayer)
    Sync_LineupRecommendInfo(curPlayer)
    Sync_HeroFatesInfo(curPlayer)
    return
def OnPlayerFirstLogin(curPlayer):
@@ -184,6 +185,7 @@
        GameWorld.DebugLog("首次激活武将: heroID=%s" % (heroID), curPlayer.GetPlayerID())
        #首次获得图鉴额外逻辑 ...
        Sync_HeroInfo(curPlayer, [heroID])
        PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 首次获得
        
    return
@@ -225,55 +227,55 @@
    GameWorld.DebugLog("设置武将图鉴激活状态:%s,bookState=%s,updBookState=%s" % (isAct, bookState, updBookState), curPlayer.GetPlayerID())
    return
def GetHeroBookStarLV(curPlayer, heroID):
    ## 武将图鉴星级等级
    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
    return GameWorld.GetValue(bookState, 4, 3)
def SetHeroBookStarLV(curPlayer, heroID, starLV):
    ## 设置武将图鉴星级等级,支持三位数 0~999 级
    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
    updBookState = GameWorld.SetValue(bookState, 4, 3, starLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
    GameWorld.DebugLog("设置武将图鉴星级等级:%s,bookState=%s,updBookState=%s" % (starLV, bookState, updBookState), curPlayer.GetPlayerID())
    return
#def GetHeroBookStarLV(curPlayer, heroID):
#    ## 武将图鉴星级等级
#    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
#    return GameWorld.GetValue(bookState, 4, 3)
#def SetHeroBookStarLV(curPlayer, heroID, starLV):
#    ## 设置武将图鉴星级等级,支持三位数 0~999 级
#    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
#    updBookState = GameWorld.SetValue(bookState, 4, 3, starLV)
#    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
#    GameWorld.DebugLog("设置武将图鉴星级等级:%s,bookState=%s,updBookState=%s" % (starLV, bookState, updBookState), curPlayer.GetPlayerID())
#    return
def GetHeroBookStarLVH(curPlayer, heroID):
    ## 武将图鉴星级历史最高等级
    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
    return GameWorld.GetValue(bookStateH, 4, 3)
def SetHeroBookStarLVH(curPlayer, heroID, starLVH):
    ## 设置武将图鉴星级历史最高等级,支持三位数 0~999 级
    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
    updBookStateH = GameWorld.SetValue(bookStateH, 4, 3, starLVH)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBookH % heroID, updBookStateH)
    GameWorld.DebugLog("设置武将图鉴星级历史最高等级:%s,bookStateH=%s,updBookStateH=%s" % (starLVH, bookStateH, updBookStateH), curPlayer.GetPlayerID())
    Sync_HeroInfo(curPlayer, [heroID])
    return
#def GetHeroBookStarLVH(curPlayer, heroID):
#    ## 武将图鉴星级历史最高等级
#    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
#    return GameWorld.GetValue(bookStateH, 4, 3)
#def SetHeroBookStarLVH(curPlayer, heroID, starLVH):
#    ## 设置武将图鉴星级历史最高等级,支持三位数 0~999 级
#    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
#    updBookStateH = GameWorld.SetValue(bookStateH, 4, 3, starLVH)
#    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBookH % heroID, updBookStateH)
#    GameWorld.DebugLog("设置武将图鉴星级历史最高等级:%s,bookStateH=%s,updBookStateH=%s" % (starLVH, bookStateH, updBookStateH), curPlayer.GetPlayerID())
#    Sync_HeroInfo(curPlayer, [heroID])
#    return
def GetHeroBookBreakLV(curPlayer, heroID):
    ## 武将图鉴突破等级
    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
    return GameWorld.GetValue(bookState, 7, 3)
def SetHeroBookBreakLV(curPlayer, heroID, breakLV):
    ## 设置武将图鉴突破等级,支持三位数 0~999 级
    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
    updBookState = GameWorld.SetValue(bookState, 7, 3, breakLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
    GameWorld.DebugLog("设置武将图鉴突破等级:%s,bookState=%s,updBookState=%s" % (breakLV, bookState, updBookState), curPlayer.GetPlayerID())
    return
#def GetHeroBookBreakLV(curPlayer, heroID):
#    ## 武将图鉴突破等级
#    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
#    return GameWorld.GetValue(bookState, 7, 3)
#def SetHeroBookBreakLV(curPlayer, heroID, breakLV):
#    ## 设置武将图鉴突破等级,支持三位数 0~999 级
#    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
#    updBookState = GameWorld.SetValue(bookState, 7, 3, breakLV)
#    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
#    GameWorld.DebugLog("设置武将图鉴突破等级:%s,bookState=%s,updBookState=%s" % (breakLV, bookState, updBookState), curPlayer.GetPlayerID())
#    return
def GetHeroBookBreakLVH(curPlayer, heroID):
    ## 武将图鉴突破历史最高等级
    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
    return GameWorld.GetValue(bookStateH, 7, 3)
def SetHeroBookBreakLVH(curPlayer, heroID, breakLVH):
    ## 设置武将图鉴突破历史最高等级,支持三位数 0~999 级
    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
    updBookStateH = GameWorld.SetValue(bookStateH, 7, 3, breakLVH)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBookH % heroID, updBookStateH)
    GameWorld.DebugLog("设置武将图鉴突破历史最高等级:%s,bookStateH=%s,updBookStateH=%s" % (breakLVH, bookStateH, updBookStateH), curPlayer.GetPlayerID())
    Sync_HeroInfo(curPlayer, [heroID])
    return
#def GetHeroBookBreakLVH(curPlayer, heroID):
#    ## 武将图鉴突破历史最高等级
#    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
#    return GameWorld.GetValue(bookStateH, 7, 3)
#def SetHeroBookBreakLVH(curPlayer, heroID, breakLVH):
#    ## 设置武将图鉴突破历史最高等级,支持三位数 0~999 级
#    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
#    updBookStateH = GameWorld.SetValue(bookStateH, 7, 3, breakLVH)
#    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBookH % heroID, updBookStateH)
#    GameWorld.DebugLog("设置武将图鉴突破历史最高等级:%s,bookStateH=%s,updBookStateH=%s" % (breakLVH, bookStateH, updBookStateH), curPlayer.GetPlayerID())
#    Sync_HeroInfo(curPlayer, [heroID])
#    return
def GetHeroItem(curPlayer, itemIndex):
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
@@ -301,6 +303,14 @@
        return posNum
    return 0
def InMainLineup(heroItem):
    ## 是否在主阵容中
    for lpIndex in range(heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
        lineupValue = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
        if GetLineupValue(lineupValue)[0] == ShareDefine.Lineup_Main:
            return True
    return False
#// B2 30 武将升级 #tagCSHeroLVUP
#
#struct    tagCSHeroLVUP
@@ -322,12 +332,8 @@
    quality = heroIpyData.GetQuality()
    breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
    heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV)
    LVMax = GetHeroLVMax(heroItem)
    GameWorld.DebugLog("请求武将升级: itemIndex=%s,heroID=%s,heroLV=%s,quality=%s,breakLV=%s,LVMax=%s"
                       % (itemIndex, heroID, heroLV, quality, breakLV, LVMax), playerID)
    if heroLV >= LVMax:
        GameWorld.DebugLog("该武将已满级!LVMax=%s" % (LVMax), playerID)
        return
    GameWorld.DebugLog("请求武将升级: itemIndex=%s,heroID=%s,heroLV=%s,quality=%s,breakLV=%s"
                       % (itemIndex, heroID, heroLV, quality, breakLV), playerID)
    qualityLVIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, heroLV)
    if not qualityLVIpyData:
        return
@@ -352,7 +358,7 @@
    GameWorld.DebugLog("武将升级: itemIndex=%s,heroID=%s,updHeroLV=%s" % (itemIndex, heroID, updHeroLV), playerID)
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV)
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 升级
    
    PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroLVUP, 1)
    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroLVUP)
@@ -366,12 +372,10 @@
    if not heroIpyData:
        return 0
    quality = heroIpyData.GetQuality()
    breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
    qualityBreakIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV)
    if not qualityBreakIpyData:
    lvIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("HeroQualityLV", {"Quality":quality}, True)
    if not lvIpyDataList:
        return 0
    LVMax = qualityBreakIpyData.GetLVMax()
    return LVMax
    return len(lvIpyDataList)
#// B2 31 武将升星 #tagCSHeroStarUP
#
@@ -436,6 +440,8 @@
                       % (itemIndex, heroID, star, useStar, addStar, updStar), playerID)
    ItemCommon.DelItem(curPlayer, useItem, useItem.GetCount(), False, "HeroStarUP")
    DoHeroUpdStar(curPlayer, heroItem, updStar)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 升星
    return
def GetHeroStarMax(heroItem):
@@ -468,7 +474,7 @@
def DoHeroUpdStar(curPlayer, heroItem, updStar, isSync=True):
    ## 执行武将星级更新
    heroID = heroItem.GetItemTypeID()
    #heroID = heroItem.GetItemTypeID()
    curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
    addStar = updStar - curStar
    item = heroItem.GetItem()
@@ -481,13 +487,10 @@
        
    if isSync:
        heroItem.Sync_Item()
    itemIndex = heroItem.GetItemPlaceIndex()
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    starLVH = GetHeroBookStarLVH(curPlayer, heroID)
    if updStar > starLVH:
        SetHeroBookStarLVH(curPlayer, heroID, updStar)
    #starLVH = GetHeroBookStarLVH(curPlayer, heroID)
    #if updStar > starLVH:
    #    SetHeroBookStarLVH(curPlayer, heroID, updStar)
    return
def __DoHeroStarTalentUp(singleItem, addLV):
@@ -630,43 +633,41 @@
    ipyData = IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV)
    if not ipyData:
        return
    LVMax = ipyData.GetLVMax()
    if heroLV < LVMax:
        GameWorld.DebugLog("未满级,无法突破: heroLV=%s < %s" % (heroLV, LVMax), playerID)
    UPLVNeed = ipyData.GetUPLVNeed()
    if heroLV < UPLVNeed:
        GameWorld.DebugLog("武将等级不足,无法突破: heroLV=%s < %s" % (heroLV, UPLVNeed), playerID)
        return
    nextBreakLV = breakLV + 1
    if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, nextBreakLV):
        GameWorld.DebugLog("突破等级已满级: quality=%s,breakLV=%s" % (quality, breakLV), playerID)
        return
    costItemInfo = ipyData.GetUPCostItem()
    if not costItemInfo:
        return
    costItemID, costItemCount = costItemInfo
    if not costItemID or not costItemCount:
    costItemList = ipyData.GetUPCostItemList()
    if not costItemList:
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, itemPack, costItemCount)
    if not hasEnough:
        GameWorld.DebugLog("材料不足,武将无法突破! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount))
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(costItemList, itemPack)
    if lackItemDict:
        GameWorld.DebugLog("材料不足,武将无法突破! quality=%s,breakLV=%s,lackItemDict=%s" % (quality, breakLV, lackItemDict), playerID)
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroBreak")
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "HeroBreak")
    GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID)
    SetHeroBreakLV(curPlayer, heroItem, nextBreakLV)
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 突破
    return
def SetHeroBreakLV(curPlayer, heroItem, breakLV, isSync=True):
    ## 设置武将突破等级
    heroID = heroItem.GetItemTypeID()
    #heroID = heroItem.GetItemTypeID()
    item = heroItem.GetItem()
    item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, breakLV)
    if isSync:
        heroItem.Sync_Item()
        
    breakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
    if breakLV > breakLVH:
        SetHeroBookBreakLVH(curPlayer, heroID, breakLV)
    #breakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
    #if breakLV > breakLVH:
    #    SetHeroBookBreakLVH(curPlayer, heroID, breakLV)
    return
#// B2 33 武将觉醒 #tagCSHeroAwake
@@ -719,7 +720,7 @@
    GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextAwakeLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
    SetHeroAwakeLV(heroItem, nextAwakeLV)
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 觉醒
    return
def SetHeroAwakeLV(heroItem, awakeLV, isSync=True):
@@ -857,7 +858,7 @@
    if isSync:
        heroItem.Sync_Item()
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 选择天赋
    return
#// B2 35 武将洗炼 #tagCSHeroWash
@@ -991,7 +992,7 @@
    heroItem.Sync_Item()
    GameWorld.DebugLog("武将洗炼替换! itemIndex=%s,heroID=%s,washIDList=%s" % (itemIndex, heroID, washIDList))
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 替换洗炼天赋
    return
#// B2 36 武将换肤 #tagCSHeroWearSkin
@@ -1024,7 +1025,7 @@
            return
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 切换皮肤
    return
def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True):
@@ -1040,7 +1041,7 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkin % heroID, updState)
    Sync_HeroInfo(curPlayer, [heroID])
    
    RefreshLordAttr(curPlayer)
    #RefreshLordAttr(curPlayer)
    return
#// B2 37 武将图鉴激活升级 #tagCSHeroBookUP
@@ -1058,9 +1059,9 @@
    bookType = clientData.BookType
    
    if bookType == 1:
        __doHeroBookStarLVUP(curPlayer, heroID)
        pass #__doHeroBookStarLVUP(curPlayer, heroID)
    elif bookType == 2:
        __doHeroBookBreakLVUP(curPlayer, heroID)
        pass #__doHeroBookBreakLVUP(curPlayer, heroID)
    else:
        __doHeroBookAct(curPlayer, heroID)
    return
@@ -1106,48 +1107,48 @@
                    
    Sync_HeroInfo(curPlayer, [heroID])
    
    RefreshLordAttr(curPlayer)
    #RefreshLordAttr(curPlayer) 图鉴属性去除了
    
    bookCnt = GetHeroBookActCnt(curPlayer)
    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_HeroBook)
    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroBook, bookCnt)
    return
def __doHeroBookStarLVUP(curPlayer, heroID):
    ## 图鉴星级升级
    playerID = curPlayer.GetPlayerID()
    if not GetHeroBookInitState(curPlayer, heroID):
        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
        return
    bookStar = GetHeroBookStarLV(curPlayer, heroID)
    bookStarH = GetHeroBookStarLVH(curPlayer, heroID)
    if bookStar >= bookStarH:
        GameWorld.DebugLog("该武将图鉴星级已达当前英雄最高星级! heroID=%s,bookStar=%s >= %s" % (heroID, bookStar, bookStarH), playerID)
        return
    GameWorld.DebugLog("武将图鉴星级升级! heroID=%s,bookStar=%s,bookStarH=%s" % (heroID, bookStar, bookStarH), playerID)
    SetHeroBookStarLV(curPlayer, heroID, bookStar + 1)
    Sync_HeroInfo(curPlayer, [heroID])
    RefreshLordAttr(curPlayer)
    return
#def __doHeroBookStarLVUP(curPlayer, heroID):
#    ## 图鉴星级升级,废弃
#    playerID = curPlayer.GetPlayerID()
#    if not GetHeroBookInitState(curPlayer, heroID):
#        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
#        return
#    bookStar = GetHeroBookStarLV(curPlayer, heroID)
#    bookStarH = GetHeroBookStarLVH(curPlayer, heroID)
#    if bookStar >= bookStarH:
#        GameWorld.DebugLog("该武将图鉴星级已达当前英雄最高星级! heroID=%s,bookStar=%s >= %s" % (heroID, bookStar, bookStarH), playerID)
#        return
#    GameWorld.DebugLog("武将图鉴星级升级! heroID=%s,bookStar=%s,bookStarH=%s" % (heroID, bookStar, bookStarH), playerID)
#    SetHeroBookStarLV(curPlayer, heroID, bookStar + 1)
#    Sync_HeroInfo(curPlayer, [heroID])
#
#    RefreshLordAttr(curPlayer)
#    return
def __doHeroBookBreakLVUP(curPlayer, heroID):
    ## 图鉴突破升级
    playerID = curPlayer.GetPlayerID()
    if not GetHeroBookInitState(curPlayer, heroID):
        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
        return
    bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
    bookBreakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
    if bookBreakLV >= bookBreakLVH:
        GameWorld.DebugLog("该武将图鉴突破等级已达当前英雄最高突破等级! heroID=%s,bookBreakLV=%s >= %s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
        return
    GameWorld.DebugLog("武将图鉴突破升级! heroID=%s,bookBreakLV=%s,bookBreakLVH=%s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
    SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1)
    Sync_HeroInfo(curPlayer, [heroID])
    RefreshLordAttr(curPlayer)
    return
#def __doHeroBookBreakLVUP(curPlayer, heroID):
#    ## 图鉴突破升级,废弃
#    playerID = curPlayer.GetPlayerID()
#    if not GetHeroBookInitState(curPlayer, heroID):
#        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
#        return
#    bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
#    bookBreakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
#    if bookBreakLV >= bookBreakLVH:
#        GameWorld.DebugLog("该武将图鉴突破等级已达当前英雄最高突破等级! heroID=%s,bookBreakLV=%s >= %s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
#        return
#    GameWorld.DebugLog("武将图鉴突破升级! heroID=%s,bookBreakLV=%s,bookBreakLVH=%s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
#    SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1)
#    Sync_HeroInfo(curPlayer, [heroID])
#
#    RefreshLordAttr(curPlayer)
#    return
#// B2 38 武将锁定 #tagCSHeroLock
#
@@ -1235,7 +1236,7 @@
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroAwakeRebirthCnt, rebirthCnt + 1)
        Sync_PlayerHeroInfo(curPlayer)
        
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 重生
    return
def __calcHeroLVReturnitem(quality, heroLV, returnItemDict, ratio):
@@ -1305,6 +1306,7 @@
    ratio = IpyGameDataPY.GetFuncCfg("HeroRebirth", 5)
    dismissItemList = []
    returnItemDict = {}
    olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
    for itemIndex in itemIndexList:
        if itemIndex < 0 or itemIndex >= curPack.GetCount():
@@ -1325,6 +1327,10 @@
            GameWorld.DebugLog("上阵中的武将无法遣散! itemIndex=%s,lineupValueList=%s" % (itemIndex, lineupValueList))
            continue
        heroID = heroItem.GetItemTypeID()
        _, effItemIndex, _ = olPlayer.GetHeroEffectiveCard(heroID)
        if itemIndex == effItemIndex:
            GameWorld.DebugLog("生效中的卡牌无法遣散! itemIndex=%s,heroID=%s,effItemIndex=%s" % (itemIndex, heroID, effItemIndex))
            continue
        heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
        if not heroIpyData:
            continue
@@ -1445,8 +1451,13 @@
    for syncItem in syncItemDict.values():
        syncItem.Sync_Item()
        
    lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID, False)
    olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
    lineup = olPlayer.GetLineup(lineupID, False)
    lineup.UpdLineup(heroItemDict, shapeType)
    # 主阵容调整,重载生效的卡牌
    if lineupID == ShareDefine.Lineup_Main:
        PlayerOnline.reloadEffHeroCard(curPlayer, olPlayer)
    return
def ComLineupValue(lineupID, shapeType, posNum): return lineupID * 10000 + shapeType * 100 + posNum
@@ -1487,7 +1498,7 @@
    if not awardMoneyInfo or len(awardMoneyInfo) != 2:
        return
    moneyType, moneyValue = awardMoneyInfo
    if GetHeroActivite(curPlayer, heroID) != 1:
    if not GetHeroActivite(curPlayer, heroID):
        GameWorld.DebugLog("武将未获得过,不可激活阵容推荐! heroID=%s" % (heroID))
        return
    awardState |= pow(2, index)
@@ -1496,6 +1507,164 @@
    PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "LineupRecommend", notifyAward=True)
    Sync_LineupRecommendInfo(curPlayer, [recommendID])
    return
def GetHeroFatesState(curPlayer, fatesID): # 宿缘ID状态: 0-未激活;1-已激活
    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroFatesInfo % fatesID)
    return info % 10
def SetHeroFatesState(curPlayer, fatesID, state):
    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroFatesInfo % fatesID)
    info = info / 10 * 10 + min(state, 9)
    info = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroFatesInfo % fatesID, info)
    return info
def GetHeroFatesLV(curPlayer, fatesID): # 宿缘ID等级
    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroFatesInfo % fatesID)
    return info / 10
def SetHeroFatesLV(curPlayer, fatesID, lv):
    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroFatesInfo % fatesID)
    info = lv * 10 + info % 10
    info = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroFatesInfo % fatesID, info)
    return info
#// B2 41 武将宿缘 #tagCSHeroFates
#
#struct    tagCSHeroFates
#{
#    tagHead         Head;
#    BYTE        FatesID;        // 宿缘ID
#    BYTE        OPType;        // 0-激活领奖;1-升级
#    BYTE        IndexCnt;
#    WORD        ItemIndexList[IndexCnt];    // 升级时消耗的材料卡在武将背包索引列表,升级时才发
#};
def OnHeroFates(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    fatesID = clientData.FatesID
    opType = clientData.OPType
    itemIndexList = clientData.ItemIndexList
    if opType == 1:
        __onHeroFatesLVUP(curPlayer, fatesID, itemIndexList)
    else:
        __onHeroFatesActivite(curPlayer, fatesID)
    return
def __onHeroFatesActivite(curPlayer, fatesID):
    ## 宿缘激活
    if GetHeroFatesState(curPlayer, fatesID):
        GameWorld.DebugLog("宿缘组合已经激活了! fatesID=%s" % fatesID)
        return
    ipyData = IpyGameDataPY.GetIpyGameData("HeroFates", fatesID)
    if not ipyData:
        return
    heroIDList = ipyData.GetHeroIDList()
    for heroID in heroIDList:
        if not GetHeroActivite(curPlayer, heroID):
            GameWorld.DebugLog("有武将未获得过,不可激活宿缘! fatesID=%s,heroID=%s,heroIDList=%s" % (fatesID, heroID, heroIDList))
            return
    GameWorld.DebugLog("激活宿缘! fatesID=%s,heroIDList=%s" % (fatesID, heroIDList))
    SetHeroFatesState(curPlayer, fatesID, 1)
    itemList = ipyData.GetAwardItemList()
    ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["HeroFates", False, {}])
    Sync_HeroFatesInfo(curPlayer, [fatesID])
    return
def __onHeroFatesLVUP(curPlayer, fatesID, useIndexList):
    if not GetHeroFatesState(curPlayer, fatesID):
        GameWorld.DebugLog("宿缘组合未激活! fatesID=%s" % fatesID)
        return
    ipyData = IpyGameDataPY.GetIpyGameData("HeroFates", fatesID)
    if not ipyData:
        return
    fatesQuality = ipyData.GetFatesQuality()
    heroIDList = ipyData.GetHeroIDList()
    fatesNextLV = GetHeroFatesLV(curPlayer, fatesID) + 1
    GameWorld.DebugLog("宿缘升级: fatesID=%s,fatesQuality=%s,fatesNextLV=%s,heroIDList=%s,useIndexList=%s" % (fatesID, fatesQuality, fatesNextLV, heroIDList, useIndexList))
    qualityLVIpyData = IpyGameDataPY.GetIpyGameData("HeroFatesQualityLV", fatesQuality, fatesNextLV)
    if not qualityLVIpyData:
        return
    needStarTotal = qualityLVIpyData.GetNeedStarTotal()
    needHeroCnt = qualityLVIpyData.GetNeedHeroCnt()
    costItemList = []
    heroStarDict = {}
    olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
    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 index in useIndexList:
            if __checkHeroFatesLVUPItem(olPlayer, fatesQuality, index, heroItem, heroID):
                costItemList.append(heroItem)
        if heroID not in heroIDList:
            continue
        if heroID not in heroStarDict:
            heroStarDict[heroID] = 0
        star = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
        if star <= heroStarDict[heroID]:
            continue
        heroStarDict[heroID] = star
    nowStarTotal = sum(heroStarDict.values())
    if nowStarTotal < needStarTotal:
        GameWorld.DebugLog("    当前总星级不足: nowStarTotal=%s < %s, heroStarDict=%s" % (nowStarTotal, needStarTotal, heroStarDict))
        return
    GameWorld.DebugLog("    当前总星级: nowStarTotal=%s,needStarTotal=%s,heroStarDict=%s" % (nowStarTotal, needStarTotal, heroStarDict))
    if len(costItemList) < needHeroCnt:
        GameWorld.DebugLog("    可用材料卡不足: %s < %s" % (len(costItemList), needHeroCnt))
        return
    GameWorld.DebugLog("    宿缘升级! needHeroCnt=%s" % needHeroCnt)
    for heroItem in costItemList[:needHeroCnt]:
        ItemCommon.DelItem(curPlayer, heroItem, heroItem.GetCount(), False, "HeroFatesLVUP")
    SetHeroFatesLV(curPlayer, fatesID, fatesNextLV)
    Sync_HeroFatesInfo(curPlayer, [fatesID])
    RefreshLordAttr(curPlayer) # 宿缘
    return
def __checkHeroFatesLVUPItem(olPlayer, fatesQuality, itemIndex, heroItem, heroID):
    ## 检查宿缘材料卡可否使用
    heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
    if not heroIpyData:
        return
    quality = heroIpyData.GetQuality()
    if quality != fatesQuality:
        GameWorld.DebugLog("    与宿缘品质不同的卡无法使用: itemIndex=%s,heroID=%s,quality=%s != %s" % (itemIndex, heroID, quality, fatesQuality))
        return
    #未生效、未上阵、未锁定、未进行过升级、突破、升星、觉醒
    heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV)
    breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
    starLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
    awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV)
    if heroLV > 1 or breakLV or starLV or awakeLV:
        GameWorld.DebugLog("    升级突破升星觉醒过的武将无法使用! itemIndex=%s,heroLV=%s,breakLV=%s,starLV=%s,awakeLV=%s" % (itemIndex, heroLV, breakLV, starLV, awakeLV))
        return
    if heroItem.GetIsLocked():
        GameWorld.DebugLog("    锁定的武将无法使用! itemIndex=%s" % (itemIndex))
        return
    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))
        return
    heroID = heroItem.GetItemTypeID()
    _, effItemIndex, _ = olPlayer.GetHeroEffectiveCard(heroID)
    if itemIndex == effItemIndex:
        GameWorld.DebugLog("    生效中的卡牌无法使用! itemIndex=%s,heroID=%s,effItemIndex=%s" % (itemIndex, heroID, effItemIndex))
        return
    return True
def RefreshLordAttr(curPlayer):
    ## 刷新主公属性
@@ -1506,33 +1675,28 @@
def CalcHeroAddAttr(curPlayer):
    ## 计算武将对主公增加的属性
    
    heroBookAttrDict = {}
    fatesAttrDict = {}
    playerID = curPlayer.GetID()
    
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetHeroCount()):
        ipyData = ipyDataMgr.GetHeroByIndex(index)
        heroID = ipyData.GetHeroID()
        if not ipyData.GetPlayerCanUse():
    for index in range(ipyDataMgr.GetHeroFatesCount()):
        ipyData = ipyDataMgr.GetHeroFatesByIndex(index)
        fatesID = ipyData.GetFatesID()
        if not GetHeroFatesState(curPlayer, fatesID):
            continue
        if not GetHeroBookInitState(curPlayer, heroID):
            # 图鉴未激活
        fatesLV = GetHeroFatesLV(curPlayer, fatesID)
        if fatesLV <= 0:
            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
        attrIDList = ipyData.GetAttrIDList()
        lvAttrValueList = ipyData.GetLVAttrValueList()
        for i in range(min(len(attrIDList), len(lvAttrValueList))):
            attrID = attrIDList[i]
            attrValuePerLV = lvAttrValueList[i]
            attrValue = attrValuePerLV * fatesLV
            fatesAttrDict[attrID] = fatesAttrDict.get(attrID, 0) + attrValue
            
    GameWorld.DebugLog("武将图鉴属性: %s" % heroBookAttrDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroBook, heroBookAttrDict)
    GameWorld.DebugLog("宿缘属性: %s" % fatesAttrDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroFates, fatesAttrDict)
    return
def Sync_HeroInfo(curPlayer, heroIDList=None):
@@ -1563,10 +1727,10 @@
        hero.HeroID = heroID
        hero.SkinState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkin % heroID)
        hero.BookInitState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) % 10
        hero.BookStarLV = GetHeroBookStarLV(curPlayer, heroID)
        hero.BookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
        hero.BookStarLVH = GetHeroBookStarLVH(curPlayer, heroID)
        hero.BookBreakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
        #hero.BookStarLV = GetHeroBookStarLV(curPlayer, heroID)
        #hero.BookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
        #hero.BookStarLVH = GetHeroBookStarLVH(curPlayer, heroID)
        #hero.BookBreakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
        syncInfoList.append(hero)
        
    if not syncInfoList:
@@ -1647,3 +1811,31 @@
    clientPack.Count = len(clientPack.RecommendList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def Sync_HeroFatesInfo(curPlayer, syncIDList=None):
    fatesList = []
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetHeroFatesCount()):
        ipyData = ipyDataMgr.GetHeroFatesByIndex(index)
        fatesID = ipyData.GetFatesID()
        state = GetHeroFatesState(curPlayer, fatesID)
        if syncIDList != None:
            if fatesID not in syncIDList:
                continue
        elif not state:
            continue
        fates = ChPyNetSendPack.tagSCHeroFates()
        fates.FatesID = fatesID
        fates.State = state
        fates.FatesLV = GetHeroFatesLV(curPlayer, fatesID)
        fatesList.append(fates)
    if not fatesList:
        return
    clientPack = ChPyNetSendPack.tagSCHeroFatesInfo()
    clientPack.FatesList = fatesList
    clientPack.Count = len(clientPack.FatesList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return