From dc0b92c1e2fe9f3d24c183b325dad54d088735c1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 10 七月 2025 17:01:24 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_ServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py |  345 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 295 insertions(+), 50 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
index 7540395..efac7e6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/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
@@ -110,12 +110,75 @@
     heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
     if not heroIpyData:
         return
-    heroIndex = heroIpyData.GetHeroIndex()
-    heroActState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_HeroActState, heroIndex)
-    if not heroActState:
-        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HeroActState, heroIndex, 1)
-        GameWorld.DebugLog("首次激活武将: heroID=%s,heroIndex=%s" % (heroID, heroIndex), curPlayer.GetPlayerID())
+    
+    if not GetHeroActivite(curPlayer, heroID):
+        SetHeroActivite(curPlayer, heroID, 1)
+        GameWorld.DebugLog("首次激活武将: heroID=%s" % (heroID), curPlayer.GetPlayerID())
+        #首次获得图鉴额外逻辑 ...
         Sync_HeroInfo(curPlayer, [heroID])
+        
+    return
+
+def GetHeroActivite(curPlayer, heroID):
+    ## 武将状态
+    # @return: 0-未激活;1-武将已获得,可激活;2-图鉴已激活
+    actState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) % 10
+    return actState
+
+def SetHeroActivite(curPlayer, heroID, isAct=1):
+    ## 设置武将已获得,可激活状态
+    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
+    actState = bookState % 10
+    if isAct:
+        if actState:
+            return
+        actState = 1
+    else:
+        actState = 0
+    updBookState = GameWorld.SetValue(bookState, 1, 1, actState)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
+    GameWorld.DebugLog("设置武将激活状态:%s,bookState=%s,updBookState=%s" % (isAct, bookState, updBookState), curPlayer.GetPlayerID())
+    return
+
+def GetHeroBookInitState(curPlayer, heroID):
+    ## 武将图鉴激活状态
+    initState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) % 10
+    return initState > 1
+def SetHeroBookInitState(curPlayer, heroID, isAct=1):
+    ## 设置武将图鉴激活状态
+    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
+    actState = bookState % 10
+    if isAct:
+        actState = 2
+    else:
+        actState = 1 if actState else 0
+    updBookState = GameWorld.SetValue(bookState, 1, 1, actState)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
+    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 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 GetHeroItem(curPlayer, itemIndex):
@@ -128,6 +191,21 @@
     if heroItem.GetType() != ChConfig.Def_ItemType_Hero:
         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
 #
@@ -176,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):
@@ -217,6 +296,9 @@
                        % (itemIndex, heroID, useItemIndex, useHeroID), playerID)
     if heroID != useHeroID:
         GameWorld.DebugLog("武将材料非本体,无法升星!", playerID)
+        return
+    if useItem.GetIsLocked():
+        GameWorld.DebugLog("材料卡锁定中,无法升星! useItemIndex=%s,heroID=%s" % (useItemIndex, heroID), playerID)
         return
     washIDCnt = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentWashID)
     if washIDCnt:
@@ -287,8 +369,9 @@
         __DoHeroStarTalentUp(item, addStar)
     heroItem.Sync_Item()
     
-    # 刷属性,之后扩展
-    
+    # 刷属性
+    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+        RefreshLordAttr(curPlayer)
     return
 
 def __DoHeroStarTalentUp(singleItem, addLV):
@@ -430,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):
@@ -489,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):
@@ -622,8 +707,9 @@
     
     heroItem.Sync_Item()
     
-    # 刷属性,之后扩展
-    
+    # 刷属性
+    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
+        RefreshLordAttr(curPlayer)
     return
 
 #// B2 35 武将洗炼 #tagCSHeroWash
@@ -759,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
@@ -782,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)
@@ -794,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):
@@ -809,26 +898,143 @@
                            % (heroID, skinIndex, skinState, updState), curPlayer.GetPlayerID())
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkin % heroID, updState)
     Sync_HeroInfo(curPlayer, [heroID])
+    
+    RefreshLordAttr(curPlayer)
     return
 
-#// B4 12 战斗阵型保存 #tagCSHeroBattlePosSave
+#// B2 37 武将图鉴激活升级 #tagCSHeroBookUP
 #
-#struct    tagCSHeroBattlePos
+#struct    tagCSHeroBookUP
+#{
+#    tagHead        Head;
+#    DWORD        HeroID;        //武将ID
+#    WORD        ItemIndex;    //关联武将物品所在武将背包索引,激活时可不用发
+#    BYTE        BookType;    //图鉴激活类型: 0-初始激活;1-星级升级;2-突破等级升级
+#};
+def OnHeroBookUP(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    heroID = clientData.HeroID
+    itemIndex = clientData.ItemIndex
+    bookType = clientData.BookType
+    
+    if bookType == 1:
+        __doHeroBookStarLVUP(curPlayer, heroID, itemIndex)
+    elif bookType == 2:
+        __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex)
+    else:
+        __doHeroBookAct(curPlayer, heroID)
+    return
+
+def __doHeroBookAct(curPlayer, heroID):
+    ## 图鉴激活
+    playerID = curPlayer.GetPlayerID()
+    if GetHeroBookInitState(curPlayer, heroID):
+        GameWorld.DebugLog("该武将图鉴已激活! heroID=%s" % heroID, playerID)
+        return
+    GameWorld.DebugLog("武将图鉴激活! heroID=%s" % heroID, playerID)
+    heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
+    if not heroIpyData:
+        return
+    quality = heroIpyData.GetQuality()
+    qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
+    if not qualityIpyData:
+        return
+    if GetHeroActivite(curPlayer, heroID) != 1:
+        GameWorld.DebugLog("武将未获得过,不可激活图鉴! heroID=%s" % (heroID), playerID)
+        return
+    SetHeroBookInitState(curPlayer, heroID, 1)
+    
+    awardMoneyInfo = qualityIpyData.GetBookActAwardMoney()
+    if awardMoneyInfo and len(awardMoneyInfo) == 2:
+        moneyType, moneyValue = awardMoneyInfo
+        if moneyType and moneyValue:
+            PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "HeroBookAct")
+                    
+    Sync_HeroInfo(curPlayer, [heroID])
+    
+    RefreshLordAttr(curPlayer)
+    return
+
+def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex):
+    ## 图鉴星级升级
+    playerID = curPlayer.GetPlayerID()
+    heroItem = GetHeroItem(curPlayer, itemIndex)
+    if not heroItem:
+        return
+    if heroItem.GetItemTypeID() != heroID:
+        GameWorld.DebugLog("非该武将图鉴关联物品! heroID=%s,itemID=%s" % (heroID, heroItem.GetItemTypeID()), playerID)
+        return
+    heroStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
+    bookStar = GetHeroBookStarLV(curPlayer, heroID)
+    if bookStar >= heroStar:
+        GameWorld.DebugLog("该武将图鉴星级已达当前英雄星级! heroID=%s,bookStar=%s,heroStar=%s" % (heroID, bookStar, heroStar), playerID)
+        return
+    GameWorld.DebugLog("武将图鉴星级升级! heroID=%s,bookStar=%s,heroStar=%s" % (heroID, bookStar, heroStar), playerID)
+    SetHeroBookStarLV(curPlayer, heroID, bookStar + 1)
+    Sync_HeroInfo(curPlayer, [heroID])
+    
+    RefreshLordAttr(curPlayer)
+    return
+
+def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex):
+    ## 图鉴突破升级
+    playerID = curPlayer.GetPlayerID()
+    heroItem = GetHeroItem(curPlayer, itemIndex)
+    if not heroItem:
+        return
+    if heroItem.GetItemTypeID() != heroID:
+        GameWorld.DebugLog("非该武将图鉴关联物品! heroID=%s,itemID=%s" % (heroID, heroItem.GetItemTypeID()), playerID)
+        return
+    heroBreakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
+    bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
+    if bookBreakLV >= heroBreakLV:
+        GameWorld.DebugLog("该武将图鉴突破等级已达当前英雄突破等级! heroID=%s,bookBreakLV=%s,heroBreakLV=%s" % (heroID, bookBreakLV, heroBreakLV), playerID)
+        return
+    GameWorld.DebugLog("武将图鉴突破升级! heroID=%s,bookBreakLV=%s,heroBreakLV=%s" % (heroID, bookBreakLV, heroBreakLV), playerID)
+    SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1)
+    Sync_HeroInfo(curPlayer, [heroID])
+    
+    RefreshLordAttr(curPlayer)
+    return
+
+#// B2 38 武将锁定 #tagCSHeroLock
+#
+#struct    tagCSHeroLock
+#{
+#    tagHead        Head;
+#    WORD        ItemIndex;    //武将物品所在武将背包位置索引
+#    BYTE        IsLock;        //0-解锁;1-锁定
+#};
+def OnHeroLock(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    itemIndex = clientData.ItemIndex
+    isLock = clientData.IsLock
+    heroItem = GetHeroItem(curPlayer, itemIndex)
+    if not heroItem:
+        return
+    heroItem.SetIsLocked(1 if isLock else 0)
+    return
+
+#// B4 12 战斗阵容保存 #tagCSHeroLineupSave
+#
+#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 = {}
@@ -837,45 +1043,66 @@
         posNum = posInfo.PosNum
         itemIndex = posInfo.ItemIndex
         if itemIndex in indexList:
-            # 单英雄只能一个位置,一个位置只能对应唯一英雄单位
+            # 单武将只能一个位置,一个位置只能对应唯一武将单位
             continue
         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):
@@ -884,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
@@ -902,15 +1147,15 @@
         heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
         if not heroIpyData:
             continue
-        heroIndex = heroIpyData.GetHeroIndex()
-        heroActState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_HeroActState, heroIndex)
-        if not heroActState and heroIDList == None:
+        if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID):
             continue
         
         hero = ChPyNetSendPack.tagSCHero()
         hero.HeroID = heroID
-        hero.IsActive = heroActState
         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)
         syncInfoList.append(hero)
         
     if not syncInfoList:

--
Gitblit v1.8.0