ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -229,55 +229,21 @@
    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 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 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_PDict_HeroSkinInfo 星级*10+是否已激活
def GetHeroSkinState(curPlayer, skinID):
    ## 武将时装激活状态
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID) % 10
def SetHeroSkinState(curPlayer, skinID, state):
    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID)
    info = info / 10 * 10 + min(1, state)
    return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkinInfo % skinID, info)
def GetHeroSkinStar(curPlayer, skinID):
    ## 武将时装星级
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID) / 10
def SetHeroSkinStar(curPlayer, skinID, star):
    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID)
    info = star * 10 + info % 10
    return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkinInfo % skinID, info)
def GetHeroItem(curPlayer, itemIndex):
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
@@ -596,6 +562,19 @@
        singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentID, talentID)
        singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentIDLV, lvList[index])
    return
def GetHeroItemStarMax(curPlayer, heroID):
    ## 获取某个武将ID当前最大星级
    starMax = 0
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
    for index in range(curPack.GetCount()):
        heroItem = curPack.GetAt(index)
        if not heroItem or heroItem.IsEmpty():
            continue
        if heroID != heroItem.GetItemTypeID():
            continue
        starMax = max(heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar), starMax)
    return starMax
def GetHeroStarTotal(curPlayer):
    ## 武将总星级
@@ -1007,19 +986,38 @@
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 替换洗炼天赋
    return
#// B2 36 武将换肤 #tagCSHeroWearSkin
#// B2 36 武将皮肤操作 #tagCSHeroSkinOP
#
#struct    tagCSHeroWearSkin
#struct    tagCSHeroSkinOP
#{
#    tagHead        Head;
#    WORD        ItemIndex;    //武将物品所在武将背包位置索引
#    BYTE        SkinIndex;    //皮肤索引
#    DWORD        HeroID;        //武将ID
#    DWORD        SkinID;        //ʱװID
#    BYTE        OPType;        //操作 1-激活;2-佩戴;3-升星
#    WORD        ItemIndex;    //武将物品所在武将背包位置索引,仅佩戴时有效
#};
def OnHeroWearSkin(index, clientData, tick):
def OnHeroSkinOP(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    heroID = clientData.HeroID
    skinID = clientData.SkinID
    opType = clientData.OPType
    itemIndex = clientData.ItemIndex
    skinIndex = clientData.SkinIndex
    DoHeroWearSkin(curPlayer, itemIndex, skinIndex)
    heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
    if not heroIpyData:
        return
    skinIDList = heroIpyData.GetSkinIDList()
    if skinID not in skinIDList:
        GameWorld.DebugLog("不存在该皮肤! heroID=%s,skinID=%s not in %s" % (heroID, skinID, skinIDList))
        return
    skinIndex = skinIDList.index(skinID)
    if opType == 1:
        ActiveHeroSkin(curPlayer, heroID, skinID)
    elif opType == 2:
        DoHeroWearSkin(curPlayer, itemIndex, skinIndex)
    elif opType == 3:
        DoHeroSkinStarUP(curPlayer, heroID, skinID)
    return
def DoHeroWearSkin(curPlayer, itemIndex, skinIndex):
@@ -1035,29 +1033,81 @@
        if skinIndex >= len(skinIDList):
            GameWorld.DebugLog("该武将不存在该皮肤! heroID=%s,skinIndex=%s" % (heroID, skinIndex))
            return
        skinState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkin % heroID)
        if not skinState & pow(2, skinIndex):
            GameWorld.DebugLog("该武将皮肤未解锁! heroID=%s,skinIndex=%s,skinState=%s" % (heroID, skinIndex, skinState))
        skinID = skinIDList[skinIndex]
        if not GetHeroSkinState(curPlayer, skinID):
            GameWorld.DebugLog("该武将皮肤未解锁! heroID=%s,skinIndex=%s" % (heroID, skinIndex))
            return
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 切换皮肤
    return True
def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True):
    skinState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkin % heroID)
    if isActive:
        updState = skinState | pow(2, skinIndex)
        GameWorld.DebugLog("激活武将皮肤: heroID=%s,skinIndex=%s,skinState=%s,updState=%s"
                           % (heroID, skinIndex, skinState, updState), curPlayer.GetPlayerID())
    else:
        updState = GameWorld.SetBitValue(skinState, skinIndex, 0)
        GameWorld.DebugLog("失效武将皮肤: heroID=%s,skinIndex=%s,skinState=%s,updState=%s"
                           % (heroID, skinIndex, skinState, updState), curPlayer.GetPlayerID())
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkin % heroID, updState)
def GMSetHeroSkin(curPlayer, heroID, skinIndex, isActive=1):
    heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
    if not heroIpyData:
        return
    skinIDList = heroIpyData.GetSkinIDList()
    if not skinIDList or len(skinIDList) >= skinIndex:
        return
    skinID = skinIDList[skinIndex]
    __onHeroSkinActive(curPlayer, heroID, skinID, isActive)
    return
def ActiveHeroSkin(curPlayer, heroID, skinID):
    skinIpyData = IpyGameDataPY.GetIpyGameData("HeroSkinAttr", skinID)
    if not skinIpyData:
        return
    if GetHeroSkinState(curPlayer, skinID):
        GameWorld.DebugLog("该武将皮肤已经激活了: heroID=%s,skinID=%s" % (heroID, skinID))
        return
    needItemID = skinIpyData.GetNeedItemID()
    needItemCnt = 1
    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, needItemID, needItemCnt)
    lackCnt = needItemCnt - bindCnt - unBindCnt
    if lackCnt > 0:
        GameWorld.DebugLog("激活武将时装物品不足! heroID=%s,needItemID=%s,needItemCnt=%s,lackCnt=%s" % (heroID, needItemID, needItemCnt, lackCnt))
        return
    ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, needItemCnt, "HeroSkin")
    GameWorld.DebugLog("激活武将皮肤: heroID=%s,skinID=%s" % (heroID, skinID), curPlayer.GetPlayerID())
    __onHeroSkinActive(curPlayer, heroID, skinID, 1)
    return
def __onHeroSkinActive(curPlayer, heroID, skinID, isActive):
    SetHeroSkinState(curPlayer, skinID, isActive)
    Sync_HeroInfo(curPlayer, [heroID])
    RefreshLordAttr(curPlayer) # 时装激活 - 全体属性
    return
def DoHeroSkinStarUP(curPlayer, heroID, skinID):
    playerID = curPlayer.GetPlayerID()
    if not GetHeroSkinState(curPlayer, skinID):
        GameWorld.DebugLog("该武将时装未激活! heroID=%s,skinID=%s" % (heroID, skinID), playerID)
        return
    skinIpyData = IpyGameDataPY.GetIpyGameData("HeroSkinAttr", skinID)
    if not skinIpyData:
        return
    starMax = skinIpyData.GetStarMax()
    curStar = GetHeroSkinStar(curPlayer, skinID)
    if curStar >= starMax:
        GameWorld.DebugLog("武将时装星级已满! heroID=%s,skinID=%s,curStar=%s >= %s" % (heroID, skinID, curStar, starMax), playerID)
        return
    needItemID = skinIpyData.GetNeedItemID()
    needItemCnt = 1
    if not needItemID or not needItemCnt:
        return
    
    #RefreshLordAttr(curPlayer)
    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, needItemID, needItemCnt)
    lackCnt = needItemCnt - bindCnt - unBindCnt
    if lackCnt > 0:
        GameWorld.DebugLog("武将时装升星物品不足! heroID=%s,skinID=%s,needItemID=%s,needItemCnt=%s,lackCnt=%s" % (heroID, skinID, needItemID, needItemCnt, lackCnt))
        return
    ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, needItemCnt, "Hero")
    nextStar = curStar + 1
    GameWorld.DebugLog("武将时装升星! heroID=%s,skinID=%s,nextStar=%s" % (heroID, skinID, nextStar), playerID)
    SetHeroSkinStar(curPlayer, skinID, nextStar)
    Sync_HeroInfo(curPlayer, [heroID])
    RefreshLordAttr(curPlayer) # 时装升星 - 全体属性
    return
#// B2 37 武将图鉴激活升级 #tagCSHeroBookUP
@@ -1123,48 +1173,10 @@
                    
    Sync_HeroInfo(curPlayer, [heroID])
    
    #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 __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
#
@@ -1713,10 +1725,33 @@
def CalcHeroAddAttr(curPlayer):
    ## 计算武将对主公增加的属性
    
    skinAttrDict = {}
    fatesAttrDict = {}
    playerID = curPlayer.GetID()
    
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    # 武将时装
    for index in range(ipyDataMgr.GetHeroSkinAttrCount()):
        ipyData = ipyDataMgr.GetHeroSkinAttrByIndex(index)
        skinID = ipyData.GetSkinID()
        if not GetHeroSkinState(curPlayer, skinID):
            continue
        skinStar = GetHeroSkinStar(curPlayer, skinID)
        attrIDList = ipyData.GetRoleAttrIDList()
        attrValueList = ipyData.GetRoleAttrValueList()
        perStarAddList = ipyData.GetRoleAttrPerStarAddList()
        for i in range(min(len(attrIDList), len(attrValueList))):
            attrID = attrIDList[i]
            attrValuePerStar = perStarAddList[i] if len(perStarAddList) > i else 0
            attrValue = attrValueList[i] + attrValuePerStar * skinStar
            skinAttrDict[attrID] = skinAttrDict.get(attrID, 0) + attrValue
    GameWorld.DebugLog("时装属性: %s" % skinAttrDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroSkin, skinAttrDict)
    # 宿缘
    for index in range(ipyDataMgr.GetHeroFatesCount()):
        ipyData = ipyDataMgr.GetHeroFatesByIndex(index)
        fatesID = ipyData.GetFatesID()
@@ -1757,18 +1792,21 @@
        heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
        if not heroIpyData:
            continue
        if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) \
            and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID):
        if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID):
            continue
        skinIDList = heroIpyData.GetSkinIDList()
        
        hero = ChPyNetSendPack.tagSCHero()
        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.SkinList = []
        for skinID in skinIDList[1:]: # 第1个默认激活的不同步
            skin = ChPyNetSendPack.tagSCHeroSkin()
            skin.SkinID = skinID
            skin.State = GetHeroSkinState(curPlayer, skinID)
            skin.Star = GetHeroSkinStar(curPlayer, skinID)
            hero.SkinList.append(skin)
        hero.SkinCnt = len(hero.SkinList)
        syncInfoList.append(hero)
        
    if not syncInfoList: