From a1ea5474ffd2b081668f9a0cef8d069aa78db85d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 12 十二月 2025 20:53:42 +0800
Subject: [PATCH] 389 流向记录(战斗服务器不记录流向)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py |  503 ++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 350 insertions(+), 153 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 0b32d31..907551c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -20,6 +20,7 @@
 import IpyGameDataPY
 import IPY_GameWorld
 import ItemControler
+import PlayerSuccess
 import ChPyNetSendPack
 import PlayerActivity
 import NetPackCommon
@@ -41,6 +42,7 @@
     Sync_HeroInfo(curPlayer)
     Sync_PlayerHeroInfo(curPlayer)
     Sync_LineupRecommendInfo(curPlayer)
+    Sync_HeroFatesInfo(curPlayer)
     return
 
 def OnPlayerFirstLogin(curPlayer):
@@ -183,6 +185,7 @@
         GameWorld.DebugLog("首次激活武将: heroID=%s" % (heroID), curPlayer.GetPlayerID())
         #首次获得图鉴额外逻辑 ...
         Sync_HeroInfo(curPlayer, [heroID])
+        PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 首次获得
         
     return
 
@@ -224,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)
@@ -300,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
@@ -321,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
@@ -351,10 +358,11 @@
     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)
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroLVUP, 1)
     return
 
 def GetHeroLVMax(heroItem):
@@ -364,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
 #
@@ -434,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):
@@ -466,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()
@@ -475,16 +483,14 @@
         __DoHeroStarTalentUp(item, addStar)
         PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroStarUP, addStar)
         PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroStarUP, addStar)
+        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroStarUP, addStar)
         
     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):
@@ -627,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
@@ -716,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):
@@ -854,7 +858,7 @@
     if isSync:
         heroItem.Sync_Item()
     
-    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
+    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 选择天赋
     return
 
 #// B2 35 武将洗炼 #tagCSHeroWash
@@ -988,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
@@ -1021,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):
@@ -1037,7 +1041,7 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkin % heroID, updState)
     Sync_HeroInfo(curPlayer, [heroID])
     
-    RefreshLordAttr(curPlayer)
+    #RefreshLordAttr(curPlayer)
     return
 
 #// B2 37 武将图鉴激活升级 #tagCSHeroBookUP
@@ -1055,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
@@ -1103,46 +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
 #
@@ -1230,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):
@@ -1300,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():
@@ -1320,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
@@ -1440,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
@@ -1482,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)
@@ -1491,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):
     ## 刷新主公属性
@@ -1501,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):
@@ -1558,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:
@@ -1642,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

--
Gitblit v1.8.0