From 388823edfe6308cba6f76ca6dc4f20022c5cb2be Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 30 六月 2025 19:03:50 +0800
Subject: [PATCH] 10431 【英文】看广告获得限时代金券

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py |  510 +++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 373 insertions(+), 137 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py
index 152d079..baaae80 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py
@@ -26,13 +26,13 @@
 import NetPackCommon
 import PlayerControl
 import PlayerFamily
+import AuctionHouse
 import ShareDefine
 import PyGameData
 import ChConfig
 
 import random
 import copy
-
 
 '''
 1. 仙盟改名
@@ -56,7 +56,7 @@
 FamilyWarState_SecondRoundOver = 23 # 次轮结束
 FamilyWarState_NextWeekGroupRank = 99 # 下周分组定级
 
-''' 对战记录
+''' 对战记录 Def_UniversalGameRecType_FamilyWarBattle
 value1        组级别
 value2        第几轮
 value3        家族ID1
@@ -83,13 +83,14 @@
 def GetBatRecDissolutionID(recData): return [] if not recData.GetStrValue3() else eval(recData.GetStrValue3()) # 解散的家族ID列表 [familyID, ...]
 def SetBatRecDissolutionID(recData, dissFamilyIDList): return recData.SetStrValue3(str(dissFamilyIDList))
 
-''' 王者仙盟
+''' 王者仙盟 Def_UniversalGameRecType_FamilyWarChampion
 value1        家族ID
 value2        盟主ID
 value3        连胜次数
 value4        已分配到的连胜次数
 value5        终结连胜的奖励次数, 只能获得这一次的连胜奖励,有值才显示,分配后设置为0, 优先分配
 strValue1        仙盟名
+strValue2        仙盟徽章
 '''
 def GetFWChampionFamilyID(championRecData): return championRecData.GetValue1()
 def SetFWChampionFamilyID(championRecData, familyID): return championRecData.SetValue1(familyID)
@@ -103,6 +104,19 @@
 def SetFWChampionEndWinCount(championRecData, endWinCount): return championRecData.SetValue5(endWinCount)
 def GetFWChampionFamilyName(championRecData): return championRecData.GetStrValue1()
 def SetFWChampionFamilyName(championRecData, familyName): return championRecData.SetStrValue1(familyName)
+def SetFWChampionFamilyEmblemID(championRecData, emblemID): return championRecData.SetStrValue2(str(emblemID))
+
+''' 参赛人员 Def_UniversalGameRecType_FamilyWarMember
+value1        玩家ID
+value2        仙盟ID
+value3        是否有参与
+'''
+def GetFWMemPlayerID(recData): return recData.GetValue1()
+def SetFWMemPlayerID(recData, playerID): return recData.SetValue1(playerID)
+def GetFWMemFamilyID(recData): return recData.GetValue2()
+def SetFWMemFamilyID(recData, familyID): return recData.SetValue2(familyID)
+def GetFWMemIsJoin(recData): return recData.GetValue3()
+def SetFWMemIsJoin(recData, isJoin): return recData.SetValue3(isJoin)
 #-------------------------------------------------------------------------------
 
 def OnGameServerInitOK():
@@ -116,14 +130,14 @@
     warMemRecList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarMember)
     for i in xrange(warMemRecList.Count()):
         recData = warMemRecList.At(i)
-        warPlayerID = recData.GetValue1()
-        warFamilyID = recData.GetValue2()
+        warPlayerID = GetFWMemPlayerID(recData)
+        warFamilyID = GetFWMemFamilyID(recData)
         if warFamilyID not in PyGameData.g_familyWarFamilyIDList:
             PyGameData.g_familyWarFamilyIDList.append(warFamilyID)
-        PyGameData.g_familyWarMemDict[warPlayerID] = warFamilyID
+        PyGameData.g_familyWarMemDict[warPlayerID] = recData
         
     GameWorld.Log("加载仙盟联赛参赛仙盟ID: %s" % PyGameData.g_familyWarFamilyIDList)
-    GameWorld.Log("加载仙盟联赛参赛仙盟玩家: %s" % PyGameData.g_familyWarMemDict)
+    #GameWorld.Log("加载仙盟联赛参赛仙盟玩家: %s" % PyGameData.g_familyWarMemDict)
     return
 
 def DoFamilyWarReset(isDelRec=True):
@@ -141,6 +155,7 @@
     
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0)
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 0)
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_StartWorldLV, 0)
     if isDelRec:
         GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
         GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_FamilyWarChampion)
@@ -156,7 +171,7 @@
     if playerID not in PyGameData.g_familyWarMemDict:
         PlayerControl.NotifyCode(curPlayer, "PlayerNotInFamilyWarMemList")
         return False
-    warFamilyID = PyGameData.g_familyWarMemDict[playerID]
+    warFamilyID = GetFWMemFamilyID(PyGameData.g_familyWarMemDict[playerID])
     if familyID != warFamilyID:
         PlayerControl.NotifyCode(curPlayer, "PlayerWarFamilyIDIsChange")
         return False
@@ -172,13 +187,17 @@
 
 def OnPlayerLogin(curFamily, curPlayer):
     CheckPlayerJoinFamilyWarInfo(curPlayer)
+    gameWorld = GameWorld.GetGameWorld()
+    state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyWar)
+    if state:
+        Sync_FamilyWarInfo(curPlayer)
     return
 
 def CheckPlayerJoinFamilyWarInfo(curPlayer):
     playerID = curPlayer.GetPlayerID()
     if playerID not in PyGameData.g_familyWarMemDict:
         return
-    joinFamilyID = PyGameData.g_familyWarMemDict[playerID]
+    joinFamilyID = GetFWMemFamilyID(PyGameData.g_familyWarMemDict[playerID])
     if not joinFamilyID or curPlayer.GetFamilyID() == joinFamilyID:
         return
     
@@ -223,10 +242,10 @@
         
     if familyWarRank:
         GameWorld.Log("解散仙盟,触发更新仙盟联赛排名: delFamilyID=%s,familyWarRank=%s" % (familyID, familyWarRank))
-        PlayerFamily.UpdFamilyWarRank()
+        UpdFamilyWarRank()
         
     # 补发未分配的连胜奖励
-    AllotWinRewardBySystem(GetFamilyWarChampionRecData(), True)
+    #AllotWinRewardBySystem(GetFamilyWarChampionRecData(), True)
     return
 
 def OnChangeFamilyLeader(familyID, leaderID):
@@ -294,7 +313,9 @@
     
     # 下周分组定级
     elif stateValue == FamilyWarState_NextWeekGroupRank:
-        DoLogicFamilyWar_NextWeekGroupRank()
+        pass
+        #废弃该阶段逻辑,因为不再支持单次活动周期跨天,所以改为过天时触发检查一下即可
+        #DoLogicFamilyWar_NextWeekGroupRank()
         
     else:
         GameWorld.ErrLog("不存在该仙盟联赛状态!stateValue=%s" % stateValue)
@@ -401,7 +422,9 @@
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 0) # 新一轮开始,重置状态
     PlayerFamily.DoFamilySort() # 首轮分组前需要强制刷新一次仙盟排行
     
-    lastFamilyWarMemDict = copy.deepcopy(PyGameData.g_familyWarMemDict)
+    lastFamilyWarMemDict = {}
+    for warPlayerID, recData in PyGameData.g_familyWarMemDict.items():
+        lastFamilyWarMemDict[warPlayerID] = GetFWMemFamilyID(recData)
     PyGameData.g_familyWarMemDict = {}
     PyGameData.g_familyWarFamilyIDList = []
     universalRecMgr = GameWorld.GetUniversalRecMgr()
@@ -412,28 +435,38 @@
     
     groupID = FamilyWar_MaxGroupID
     groupFamilyList = []
+    warFamilyMemInfo = {}
     #直接取排行榜前X名作为联赛仙盟名单
     familyMgr = GameWorld.GetFamilyManager()
     sortFamilyIDList = PlayerFamily.GetSortFamilyIDList()
     familyCount = len(sortFamilyIDList)
+    joinFamilyLVLimit = IpyGameDataPY.GetFuncCfg("FamilyMatchSet", 1)
+    GameWorld.DebugLog("最低参赛仙盟等级: %s" % joinFamilyLVLimit)
     for i, familyID in enumerate(sortFamilyIDList):
         family = familyMgr.FindFamily(familyID)
         if not family:
             GameWorld.ErrLog("仙盟联赛首轮分组时无法找到该仙盟: i=%s,familyID=%s" % (i, familyID))
             continue
-        groupFamilyList.append(family)
-        
-        # 添加参赛仙盟及成员名单
-        PyGameData.g_familyWarFamilyIDList.append(familyID)
-        for index in xrange(family.GetCount()):
-            curMember = family.GetAt(index)
-            memPlayerID = curMember.GetPlayerID()
-            memPlayer = curMember.GetPlayer()
-            isAddOK = AddFamilyWarMem(memPlayerID, familyID, warMemRecList)
-            lastJoinFamilyID = lastFamilyWarMemDict.get(memPlayerID, 0)
-            # 重新通知玩家参与的仙盟
-            if lastJoinFamilyID and isAddOK and lastJoinFamilyID != familyID and memPlayer:
-                __NotifyPlayerJoinFamilyInfo(memPlayer, familyID)
+        if family.GetLV() < joinFamilyLVLimit:
+            GameWorld.Log("仙盟等级不足,无法参与联赛!familyID=%s,LV=%s,joinFamilyLVLimit=%s" % (familyID, family.GetLV(), joinFamilyLVLimit))
+        else:
+            groupFamilyList.append(family)
+            
+            # 添加参赛仙盟及成员名单
+            PyGameData.g_familyWarFamilyIDList.append(familyID)
+            warMemIDList = []
+            for index in xrange(family.GetCount()):
+                curMember = family.GetAt(index)
+                memPlayerID = curMember.GetPlayerID()
+                memPlayer = curMember.GetPlayer()
+                isAddOK = AddFamilyWarMem(memPlayerID, familyID, warMemRecList)
+                lastJoinFamilyID = lastFamilyWarMemDict.get(memPlayerID, 0)
+                # 重新通知玩家参与的仙盟
+                if lastJoinFamilyID and isAddOK and lastJoinFamilyID != familyID and memPlayer:
+                    __NotifyPlayerJoinFamilyInfo(memPlayer, familyID)
+                if isAddOK:
+                    warMemIDList.append(memPlayerID)
+            warFamilyMemInfo[familyID] = warMemIDList
                 
         # 满一组仙盟数 or 没有仙盟了
         if len(groupFamilyList) == FamilyWar_GroupFamilyCount or i == familyCount - 1:
@@ -445,11 +478,18 @@
                 # 下一组
                 groupID -= 1
                 groupFamilyList = []
-                
+    
+    worldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)            
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_StartWorldLV, worldLV) # 设置分组时的世界等级
+    
     GameWorld.Log("    PyGameData.g_familyWarFamilyIDList: %s" % PyGameData.g_familyWarFamilyIDList)
-    GameWorld.Log("    PyGameData.g_familyWarMemDict: %s" % PyGameData.g_familyWarMemDict)
+    GameWorld.Log("    warFamilyMemInfo: %s" % warFamilyMemInfo)
+    GameWorld.Log("    通用记录对战家族数: %s" % warBatRecList.Count())
+    GameWorld.Log("    通用记录参与玩家数: %s" % warMemRecList.Count())
+    GameWorld.Log("    当前世界等级: %s" % worldLV)
     GameWorld.Log("    仙盟联赛首轮比赛分组确认完毕!")
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, FamilyWarRound_First) # 设置已处理过的轮次
+    Sync_FamilyWarInfo()
     return
 
 def AddFamilyWarMem(playerID, familyID, warMemRecList=None):
@@ -459,18 +499,38 @@
         return
     if playerID in PyGameData.g_familyWarMemDict:
         GameWorld.DebugLog("本周已经添加过该成员所属参赛仙盟,不重复添加!playerID=%s,familyID=%s,warFamilyID=%s" 
-                           % (playerID, familyID, PyGameData.g_familyWarMemDict[playerID]))
+                           % (playerID, familyID, GetFWMemFamilyID(PyGameData.g_familyWarMemDict[playerID])))
         return
     if not warMemRecList:
         warMemRecList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarMember)
     if not warMemRecList:
         return
     recData = warMemRecList.AddRec()
-    recData.SetValue1(playerID)
-    recData.SetValue2(familyID)
-    PyGameData.g_familyWarMemDict[playerID] = familyID # 设置玩家对应的仙盟ID,本周联赛只能在该仙盟时才能进入战场
+    SetFWMemPlayerID(recData, playerID)
+    SetFWMemFamilyID(recData, familyID)
+    PyGameData.g_familyWarMemDict[playerID] = recData # 设置玩家对应的仙盟ID,本周联赛只能在该仙盟时才能进入战场
     GameWorld.DebugLog("    添加仙盟联赛战斗人员: playerID=%s,familyID=%s" % (playerID, familyID))
     return True
+
+def OnPlayerChangeMap(curPlayer):
+    ## 玩家进入仙盟联赛地图
+    if curPlayer.GetMapID() != ChConfig.Def_FBMapID_FamilyWar:
+        return
+    playerID = curPlayer.GetPlayerID()
+    familyID = curPlayer.GetFamilyID()
+    if playerID not in PyGameData.g_familyWarMemDict:
+        return
+    recData = PyGameData.g_familyWarMemDict[playerID]
+    if GetFWMemIsJoin(recData):
+        GameWorld.DebugLog("已经进入过仙盟联赛战场! ", playerID)
+        return
+    warFamilyID = GetFWMemFamilyID(recData)
+    if familyID != warFamilyID:
+        GameWorld.DebugLog("进入战场时参赛仙盟ID不一致! familyID=%s,warFamilyID=%s" % (familyID, warFamilyID), playerID)
+        return
+    SetFWMemIsJoin(recData, 1)
+    GameWorld.Log("玩家进入仙盟联赛战场: familyID=%s" % (familyID), playerID)
+    return
 
 def __DoFristRoundRandBattle(warBatRecList, groupID, groupFamilyList):
     ## 执行首轮联赛分组仙盟随机匹配比赛, 两两随机
@@ -720,6 +780,10 @@
         
     return
 
+def DoOnDay():
+    DoLogicFamilyWar_NextWeekGroupRank()
+    return
+
 def DoLogicFamilyWar_NextWeekGroupRank():
     ''' 下周分组定级
         最低级别组: 不设置联赛级别, 下周最低级别组名单由其他无联赛级别仙盟总战力排行得到
@@ -728,7 +792,35 @@
     # 这里补触发一次,防止总结算的时候服务器异常没有成功结算
     #     或 次轮没有比赛导致没有结算(次轮的仙盟都解散了才可能出现,一般不可能出现,可不考虑,如果真出现了,会在周六凌晨结算)
     __DoLogicFamilyWarAllOver()
-    PlayerFamily.UpdFamilyWarRank()
+    #UpdFamilyWarRank()
+    return
+
+def UpdFamilyWarRank():
+    '''更新仙盟联赛排名
+    注意:该逻辑在仙盟联赛周期中不可执行,仅在下周分组定级状态下可更新,由程序控制,在活动结束后结算调用
+    仙盟联赛新一周期开始时、仙盟解散时 会触发该逻辑
+    '''
+    #gameWorld = GameWorld.GetGameWorld()
+    #state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyWar)
+    #if state != GameWorldFamilyWar.FamilyWarState_NextWeekGroupRank:
+    #    GameWorld.DebugLog("非下周分组定级阶段不可更新仙盟联赛排名!")
+    #    return
+    
+    GameWorld.Log("=== 更新仙盟联赛排名 ===")
+    
+    familyMgr = GameWorld.GetFamilyManager()
+    sortFamilyIDList = PlayerFamily.GetSortFamilyIDList()
+    for rank, familyID in enumerate(sortFamilyIDList, 1):
+        family = familyMgr.FindFamily(familyID)
+        if not family:
+            continue
+        curRank = PlayerFamily.GetFamilyWarRank(family)
+        if not curRank:
+            break
+        if curRank != rank:
+            PlayerFamily.SetFamilyWarRank(family, rank)
+            GameWorld.Log("    更新仙盟联赛仙盟排名: familyID=%s,curRank=%s,updRank=%s" % (family.GetID(), curRank, rank))
+            
     return
 
 def __DoLogicFamilyWarAllOver():
@@ -753,6 +845,10 @@
     warBatRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarBattle)
     if not warBatRecList.Count():
         GameWorld.Log("没有仙盟联赛比赛记录,不需要结算!")
+        curRoundNum = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round)
+        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0) # 重置对战轮次
+        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 1) # 设置已经处理过总结算
+        GameWorld.Log("重置轮次信息,设置已结算!curRoundNum=%s" % curRoundNum)
         return
     for i in xrange(warBatRecList.Count()):
         recData = warBatRecList.At(i)
@@ -814,8 +910,9 @@
         GameWorld.Log("除0后仙盟ID: %s" % familyWarIDRankList)
     
     # 5. 截取到倒数第二组,最后一组下周由战力决定
-    familyWarIDRankList = familyWarIDRankList[:(FamilyWar_MaxFamilyCount - FamilyWar_GroupFamilyCount)]
+    updFamilyIDRankList = familyWarIDRankList[:(FamilyWar_MaxFamilyCount - FamilyWar_GroupFamilyCount)]
     GameWorld.Log("最终的排名仙盟ID: %s" % familyWarIDRankList)
+    GameWorld.Log("更新的排名仙盟ID: %s" % updFamilyIDRankList)
     GameWorld.Log("    解散的仙盟ID: %s" % allDissFamilyIDList)
     # 注意: familyWarIDRankList 这个列表里的仙盟ID可能是已经解散的,但是在当前情况下还需要占用该联赛组的名额,直到下周分组定级才被顶掉
     
@@ -832,13 +929,13 @@
         if not lastRank:
             break
         updFamilyIDList.append(familyID)
-        updRank = 0 if familyID not in familyWarIDRankList else (familyWarIDRankList.index(familyID) + 1)
+        updRank = 0 if familyID not in updFamilyIDRankList else (updFamilyIDRankList.index(familyID) + 1)
         if updRank != lastRank:
             PlayerFamily.SetFamilyWarRank(family, updRank)
         GameWorld.Log("更新仙盟评级: familyID=%s,lastRank=%s,updRank=%s" % (familyID, lastRank, updRank))
         
     # 再更新本周新晋的联赛排名
-    for updRank, familyID in enumerate(familyWarIDRankList, 1):
+    for updRank, familyID in enumerate(updFamilyIDRankList, 1):
         if familyID in updFamilyIDList:
             continue
         family = familyMgr.FindFamily(familyID)
@@ -854,9 +951,12 @@
     
     if familyWarIDRankList:
         UpdFamilyWarChampion(familyWarIDRankList[0])
+        GiveFamilyWinRankAuctionReward(familyWarIDRankList)
     
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0) # 重置对战轮次
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 1) # 设置已经处理过总结算
+    
+    UpdFamilyWarRank() # 改为比赛结束后默认更新联赛排名
     return
 
 def UpdFamilyWarChampion(championFamilyID):
@@ -868,13 +968,15 @@
     GameWorld.Log("上周冠军仙盟ID: %s" % lastChampionFamilyID)
     GameWorld.Log("本周冠军仙盟ID: %s" % championFamilyID)
     winCount = GetFWChampionWinCount(championRecData)
+    rewardWinCount = winCount + 1
+    GiveFamilyWinCountAuctionReward(championFamilyID, rewardWinCount)
     if lastChampionFamilyID == championFamilyID:
         winCount += 1
         SetFWChampionWinCount(championRecData, winCount)
         GameWorld.Log("    更新连胜: %s" % winCount)
-        AllotWinRewardBySystem(championRecData, False)
+        #AllotWinRewardBySystem(championRecData, False)
     else:
-        AllotWinRewardBySystem(championRecData, True)
+        #AllotWinRewardBySystem(championRecData, True)
         SetFWChampionFamilyID(championRecData, championFamilyID)
         SetFWChampionWinCount(championRecData, 1)
         SetFWChampionWinRewardAllot(championRecData, 0)
@@ -890,6 +992,7 @@
             championFamilyName = family.GetName()
             SetFWChampionLeaderID(championRecData, family.GetLeaderID())
             SetFWChampionFamilyName(championRecData, championFamilyName)
+            SetFWChampionFamilyEmblemID(championRecData, PlayerFamily.GetFamilyEmblemID(family))
         else:
             GameWorld.Log("    冠军仙盟不存在或已经解散了!")
             
@@ -908,6 +1011,128 @@
         PlayerControl.WorldNotify(0, "FamilyMatchSecondSessionEnd", [championFamilyName])
     return
 
+def GiveFamilyWinCountAuctionReward(familyID, rewardWinCount):
+    ## 给仙盟连胜仙盟拍品奖励
+    
+    winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数
+    winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数
+    
+    rewardIndex = -1
+    
+    if rewardWinCount == winRewardStartCount:
+        rewardIndex = 0
+    elif rewardWinCount > winRewardStartCount:
+        winCountValue = rewardWinCount - winRewardStartCount
+        if winCountValue % winRewardSpaceCount == 0:
+            rewardIndex = winCountValue / winRewardSpaceCount
+            
+    if rewardIndex == -1:
+        GameWorld.Log("不需要发放连胜仙盟拍品奖励: familyID=%s,rewardWinCount=%s" % (familyID, rewardWinCount))
+        return
+    
+    winRewardLoopList = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 4) # 连胜仙盟拍品循环奖励[[[拍品ID,个数], ...], ...]
+    loopIndex = rewardIndex % len(winRewardLoopList)
+    familyAuctionItemList = winRewardLoopList[loopIndex]
+    family = GameWorld.GetFamilyManager().FindFamily(familyID)
+    if not family:
+        return
+    
+    familyAllPlayerIDList = []
+    familyPlayerIDList = []
+    for i in xrange(family.GetCount()):
+        member = family.GetAt(i)
+        memPlayerID = member.GetPlayerID()
+        if memPlayerID not in PyGameData.g_familyWarMemDict:
+            continue
+        familyAllPlayerIDList.append(memPlayerID)
+        recData = PyGameData.g_familyWarMemDict[memPlayerID]
+        if GetFWMemFamilyID(recData) != familyID:
+            continue
+        if not GetFWMemIsJoin(recData):
+            continue
+        familyPlayerIDList.append(memPlayerID)
+    if not familyPlayerIDList:
+        familyPlayerIDList = familyAllPlayerIDList
+        GameWorld.Log("连胜没有人参赛,收益算仙盟所有人的!familyID=%s,familyAllPlayerIDList=%s" % (familyID, familyAllPlayerIDList))
+        
+    familyAuctionItemDict = {} # {仙盟ID:[[享受收益的成员ID, ...], [[拍品ID,个数], [拍品ID,个数,是否拍品], ...]], ...}
+    familyAuctionItemDict[familyID] = [familyPlayerIDList, familyAuctionItemList]
+    GameWorld.Log("发放连胜仙盟拍品奖励: familyID=%s,rewardWinCount=%s,rewardIndex=%s,loopIndex=%s" 
+                  % (familyID, rewardWinCount, rewardIndex, loopIndex))
+    GameWorld.Log("    familyPlayerIDList=%s" % familyPlayerIDList)
+    GameWorld.Log("    familyAuctionItemList=%s" % familyAuctionItemList)
+    AuctionHouse.DoAddFamilyAuctionItem(ChConfig.Def_FBMapID_FamilyWar, familyAuctionItemDict)
+    return
+
+def GiveFamilyWinRankAuctionReward(familyWarIDRankList):
+    ## 给仙盟排名仙盟拍品奖励
+        
+    warWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_StartWorldLV)
+    rewardWorldLV = 0
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in xrange(ipyDataMgr.GetFamilyWarRankAwardCount()):
+        ipyData = ipyDataMgr.GetFamilyWarRankAwardByIndex(index)
+        cfgWorldLV = ipyData.GetWarWorldLV()
+        if warWorldLV <= cfgWorldLV:
+            rewardWorldLV = cfgWorldLV
+            break
+        elif warWorldLV > cfgWorldLV:
+            rewardWorldLV = cfgWorldLV
+    GameWorld.Log("发放排名仙盟拍品奖励: warWorldLV=%s, rewardWorldLV=%s, familyWarIDRankList=%s" % (warWorldLV, rewardWorldLV, familyWarIDRankList))
+    
+    rewardIpyDataList = IpyGameDataPY.GetIpyGameDataList("FamilyWarRankAward", rewardWorldLV)
+    if not rewardIpyDataList:
+        GameWorld.ErrLog("找不到仙盟排名对应世界等级奖励!")
+        return
+    
+    cfgRankKey = 1
+    cfgRankAuctionItemDict = {}
+    for ipyData in rewardIpyDataList:
+        warRank = ipyData.GetWarRank()
+        auctionItemList = ipyData.GetRankAuctionItem()
+        for rank in range(cfgRankKey, warRank + 1):
+            cfgRankAuctionItemDict[rank] = auctionItemList
+        cfgRankKey = warRank + 1
+        
+    GameWorld.Log("对应世界等级奖励: rewardWorldLV=%s, %s" % (rewardWorldLV, cfgRankAuctionItemDict))
+        
+    familyAuctionItemDict = {} # {仙盟ID:[[享受收益的成员ID, ...], [[拍品ID,个数], [拍品ID,个数,是否拍品], ...]], ...}
+    for rank, familyID in enumerate(familyWarIDRankList, 1):
+        if rank not in cfgRankAuctionItemDict:            
+            GameWorld.Log("    rank=%s,familyID=%s,该名次没有找到奖励!" % (rank, familyID))
+            continue
+        
+        family = GameWorld.GetFamilyManager().FindFamily(familyID)
+        if not family:
+            GameWorld.Log("    rank=%s,familyID=%s,仙盟不存在!" % (rank, familyID))
+            continue
+        
+        familyAllPlayerIDList = []
+        familyPlayerIDList = []
+        for i in xrange(family.GetCount()):
+            member = family.GetAt(i)
+            memPlayerID = member.GetPlayerID()
+            if memPlayerID not in PyGameData.g_familyWarMemDict:
+                continue
+            familyAllPlayerIDList.append(memPlayerID)
+            recData = PyGameData.g_familyWarMemDict[memPlayerID]
+            if GetFWMemFamilyID(recData) != familyID:
+                continue
+            if not GetFWMemIsJoin(recData):
+                continue
+            familyPlayerIDList.append(memPlayerID)
+        if not familyPlayerIDList:
+            familyPlayerIDList = familyAllPlayerIDList
+            GameWorld.Log("    排名没有人参赛,收益算仙盟所有人的!familyID=%s,familyAllPlayerIDList=%s" % (familyID, familyAllPlayerIDList))
+            
+        familyAuctionItemList = cfgRankAuctionItemDict[rank]
+        familyAuctionItemDict[familyID] = [familyPlayerIDList, familyAuctionItemList]
+        GameWorld.Log("    rank=%s,familyID=%s,familyPlayerIDList=%s,familyAuctionItemList=%s" 
+                      % (rank, familyID, familyPlayerIDList, familyAuctionItemList))
+        
+    AuctionHouse.DoAddFamilyAuctionItem(ChConfig.Def_FBMapID_FamilyWar, familyAuctionItemDict)
+    return
+
 def GetFamilyWarChampionRecData():
     universalRecMgr = GameWorld.GetUniversalRecMgr()
     championRecList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyWarChampion)
@@ -917,55 +1142,57 @@
 
 def AllotWinRewardBySystem(championRecData, isAll):
     ## 系统自动分配仙盟未分配的连胜奖励
-    
-    familyID = GetFWChampionFamilyID(championRecData)
-    leaderID = GetFWChampionLeaderID(championRecData)
-    winCount = GetFWChampionWinCount(championRecData) # 当前连胜次数
-    lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # 上次已分配的连胜奖励次数
-    endWinCount = GetFWChampionEndWinCount(championRecData) # 终结对手的连胜次数
-    
-    winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # 连胜奖励
-    winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数
-    winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数
-    if not winRewardItemList or not winRewardStartCount or not winRewardSpaceCount:
-        return
-    
-    updAllotWinCount = 0 # 更新的已分配到的连胜次数
-    startRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # 下次连胜奖励次数
-    sysAllotWinCountList = range(startRewardWinCount, winCount + 1, winRewardSpaceCount)
-    isAllotEndWinCount = (endWinCount and (isAll or sysAllotWinCountList))
-    
-    if not isAll and sysAllotWinCountList:
-        sysAllotWinCountList = sysAllotWinCountList[:-1] # 保留一个可手动分配, 其余自动分配
-    if sysAllotWinCountList:
-        updAllotWinCount = sysAllotWinCountList[-1]
-        
-    sysAllotCount = len(sysAllotWinCountList) # 系统自动发放的奖励次数
-    if isAllotEndWinCount:
-        sysAllotCount += 1
-        
-    if sysAllotCount <= 0:
-        #GameWorld.Log("无需自动分配奖励!上次奖励连胜次数=%s,当前连胜数=%s,终结连胜=%s,isAll=%s,sysAllotWinCountList=%s" 
-        #              % (lastAllotWinCount, winCount, endWinCount, isAll, sysAllotWinCountList))
-        return
-    
-    if sysAllotCount > 1:
-        winRewardItemList = copy.deepcopy(winRewardItemList)
-        for itemInfo in winRewardItemList:
-            itemInfo[1] *= sysAllotCount
-    GameWorld.Log("系统自动分配连胜奖励给盟主!上次奖励连胜次数=%s,当前连胜数=%s,终结连胜=%s,分配次数=%s,物品=%s,isAll=%s,familyID=%s,leaderID=%s" 
-                  % (lastAllotWinCount, winCount, endWinCount, sysAllotCount, winRewardItemList, isAll, familyID, leaderID))
-    if sysAllotWinCountList:
-        GameWorld.Log("    sysAllotWinCountList=%s" % sysAllotWinCountList)
-    if endWinCount:
-        GameWorld.Log("    重置已分配终结对手连胜次数奖励!")
-        SetFWChampionEndWinCount(championRecData, 0)
-    if updAllotWinCount:
-        GameWorld.Log("    更新已分配到的连胜次数: %s" % updAllotWinCount)
-        SetFWChampionWinRewardAllot(championRecData, updAllotWinCount)
-    PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail2", [leaderID], winRewardItemList)
-    GameWorld.Log("    -----------------------")
+    ## 单号 7195 2019-06-10 去除分配奖励,连胜改为拍品奖励
     return
+    
+#    familyID = GetFWChampionFamilyID(championRecData)
+#    leaderID = GetFWChampionLeaderID(championRecData)
+#    winCount = GetFWChampionWinCount(championRecData) # 当前连胜次数
+#    lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # 上次已分配的连胜奖励次数
+#    endWinCount = GetFWChampionEndWinCount(championRecData) # 终结对手的连胜次数
+#    
+#    winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # 连胜奖励
+#    winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数
+#    winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数
+#    if not winRewardItemList or not winRewardStartCount or not winRewardSpaceCount:
+#        return
+#    
+#    updAllotWinCount = 0 # 更新的已分配到的连胜次数
+#    startRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # 下次连胜奖励次数
+#    sysAllotWinCountList = range(startRewardWinCount, winCount + 1, winRewardSpaceCount)
+#    isAllotEndWinCount = (endWinCount and (isAll or sysAllotWinCountList))
+#    
+#    if not isAll and sysAllotWinCountList:
+#        sysAllotWinCountList = sysAllotWinCountList[:-1] # 保留一个可手动分配, 其余自动分配
+#    if sysAllotWinCountList:
+#        updAllotWinCount = sysAllotWinCountList[-1]
+#        
+#    sysAllotCount = len(sysAllotWinCountList) # 系统自动发放的奖励次数
+#    if isAllotEndWinCount:
+#        sysAllotCount += 1
+#        
+#    if sysAllotCount <= 0:
+#        #GameWorld.Log("无需自动分配奖励!上次奖励连胜次数=%s,当前连胜数=%s,终结连胜=%s,isAll=%s,sysAllotWinCountList=%s" 
+#        #              % (lastAllotWinCount, winCount, endWinCount, isAll, sysAllotWinCountList))
+#        return
+#    
+#    if sysAllotCount > 1:
+#        winRewardItemList = copy.deepcopy(winRewardItemList)
+#        for itemInfo in winRewardItemList:
+#            itemInfo[1] *= sysAllotCount
+#    GameWorld.Log("系统自动分配连胜奖励给盟主!上次奖励连胜次数=%s,当前连胜数=%s,终结连胜=%s,分配次数=%s,物品=%s,isAll=%s,familyID=%s,leaderID=%s" 
+#                  % (lastAllotWinCount, winCount, endWinCount, sysAllotCount, winRewardItemList, isAll, familyID, leaderID))
+#    if sysAllotWinCountList:
+#        GameWorld.Log("    sysAllotWinCountList=%s" % sysAllotWinCountList)
+#    if endWinCount:
+#        GameWorld.Log("    重置已分配终结对手连胜次数奖励!")
+#        SetFWChampionEndWinCount(championRecData, 0)
+#    if updAllotWinCount:
+#        GameWorld.Log("    更新已分配到的连胜次数: %s" % updAllotWinCount)
+#        SetFWChampionWinRewardAllot(championRecData, updAllotWinCount)
+#    PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail2", [leaderID], winRewardItemList)
+#    GameWorld.Log("    -----------------------")
+#    return
 
 #// A4 10 仙盟联赛连胜奖励分配 #tagCGFamilyWarWinRewardAllot
 #
@@ -975,58 +1202,60 @@
 #    DWORD        MemPlayerID;    //分配给的仙盟成员玩家ID
 #};
 def OnFamilyWarWinRewardAllot(index, clientData, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    memPlayerID = clientData.MemPlayerID
-    playerID = curPlayer.GetPlayerID()
-    curFamily = curPlayer.GetFamily()
-    if curFamily == None:
-        return
-    curMember = curFamily.FindMember(playerID)
-    if curMember == None:
-        return
-    if curMember.GetFamilyLV() != IPY_GameServer.fmlLeader:
-        GameWorld.Log("不是盟主,不能分配连胜奖励!", playerID)
-        return
-    
-    familyID = curFamily.GetID()
-    curTagMember = curFamily.FindMember(memPlayerID)
-    if curTagMember == None:
-        GameWorld.Log("仙盟没有该成员,无法分配连胜奖励!familyID=%s,memPlayerID=%s" % (familyID, memPlayerID), playerID)
-        return
-    
-    championRecData = GetFamilyWarChampionRecData()
-    championFamilyID = GetFWChampionFamilyID(championRecData)
-    if familyID != championFamilyID:
-        GameWorld.Log("非王者仙盟,无法分配连胜奖励!championFamilyID=%s,familyID=%s" % (championFamilyID, familyID), playerID)
-        return
-    
-    endWinCount = GetFWChampionEndWinCount(championRecData) # 终结对手的连胜次数
-    if endWinCount:
-        SetFWChampionEndWinCount(championRecData, 0)
-        GameWorld.Log("分配终结仙盟连胜奖励!familyID=%s,endWinCount=%s" % (familyID, endWinCount), playerID)
-        
-    else:
-        winCount = GetFWChampionWinCount(championRecData) # 当前连胜次数
-        lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # 上次已分配的连胜奖励次数
-        
-        winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数
-        winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数
-        nextRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # 下次连胜奖励次数
-        if winCount < nextRewardWinCount:
-            GameWorld.Log("连胜次数不足,无法分配连胜奖励!已分配连胜奖励次数=%s,下次连胜奖励次数(%s) > 当前连胜次数(%s)" 
-                          % (lastAllotWinCount, nextRewardWinCount, winCount), playerID)
-            return
-        SetFWChampionWinRewardAllot(championRecData, nextRewardWinCount)
-        GameWorld.Log("分配仙盟连胜奖励!familyID=%s,分配连胜数=%s" % (familyID, nextRewardWinCount), playerID)
-        
-    winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # 连胜奖励
-    PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail1", [memPlayerID], winRewardItemList)
-    PlayerUniversalGameRec.SendUniversalGameRecSingle(curPlayer, championRecData) # 同步给该玩家
-    
-    # <color=#44e863FF>%s0</color>仙盟盟主将连胜奖励<color=#44e863FF><Word info=item id=%s1/></color>分配给<color=#44e863FF>%s2</color>,神兵降世
-    notifyItemID = winRewardItemList[0][0]
-    PlayerControl.WorldNotify(0, "FamilyMatchLianWinReward", [curFamily.GetName(), notifyItemID, curTagMember.GetName()])
+    # 单号 7195 2019-06-10 去除分配奖励,连胜改为拍品奖励
     return
+#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+#    memPlayerID = clientData.MemPlayerID
+#    playerID = curPlayer.GetPlayerID()
+#    curFamily = curPlayer.GetFamily()
+#    if curFamily == None:
+#        return
+#    curMember = curFamily.FindMember(playerID)
+#    if curMember == None:
+#        return
+#    if curMember.GetFamilyLV() != IPY_GameServer.fmlLeader:
+#        GameWorld.Log("不是盟主,不能分配连胜奖励!", playerID)
+#        return
+#    
+#    familyID = curFamily.GetID()
+#    curTagMember = curFamily.FindMember(memPlayerID)
+#    if curTagMember == None:
+#        GameWorld.Log("仙盟没有该成员,无法分配连胜奖励!familyID=%s,memPlayerID=%s" % (familyID, memPlayerID), playerID)
+#        return
+#    
+#    championRecData = GetFamilyWarChampionRecData()
+#    championFamilyID = GetFWChampionFamilyID(championRecData)
+#    if familyID != championFamilyID:
+#        GameWorld.Log("非王者仙盟,无法分配连胜奖励!championFamilyID=%s,familyID=%s" % (championFamilyID, familyID), playerID)
+#        return
+#    
+#    endWinCount = GetFWChampionEndWinCount(championRecData) # 终结对手的连胜次数
+#    if endWinCount:
+#        SetFWChampionEndWinCount(championRecData, 0)
+#        GameWorld.Log("分配终结仙盟连胜奖励!familyID=%s,endWinCount=%s" % (familyID, endWinCount), playerID)
+#        
+#    else:
+#        winCount = GetFWChampionWinCount(championRecData) # 当前连胜次数
+#        lastAllotWinCount = GetFWChampionWinRewardAllot(championRecData) # 上次已分配的连胜奖励次数
+#        
+#        winRewardStartCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 2) # 起始连胜奖励次数
+#        winRewardSpaceCount = IpyGameDataPY.GetFuncCfg("FamilyMatchLianWinReward", 3) # 连胜奖励间隔次数
+#        nextRewardWinCount = winRewardStartCount if not lastAllotWinCount else (lastAllotWinCount + winRewardSpaceCount) # 下次连胜奖励次数
+#        if winCount < nextRewardWinCount:
+#            GameWorld.Log("连胜次数不足,无法分配连胜奖励!已分配连胜奖励次数=%s,下次连胜奖励次数(%s) > 当前连胜次数(%s)" 
+#                          % (lastAllotWinCount, nextRewardWinCount, winCount), playerID)
+#            return
+#        SetFWChampionWinRewardAllot(championRecData, nextRewardWinCount)
+#        GameWorld.Log("分配仙盟连胜奖励!familyID=%s,分配连胜数=%s" % (familyID, nextRewardWinCount), playerID)
+#        
+#    winRewardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchLianWinReward", 1) # 连胜奖励
+#    PlayerCompensation.SendMailByKey("FamilyMatchWinAllotMail1", [memPlayerID], winRewardItemList)
+#    PlayerUniversalGameRec.SendUniversalGameRecSingle(curPlayer, championRecData) # 同步给该玩家
+#    
+#    # <color=#44e863FF>%s0</color>仙盟盟主将连胜奖励<color=#44e863FF><Word info=item id=%s1/></color>分配给<color=#44e863FF>%s2</color>,神兵降世
+#    notifyItemID = winRewardItemList[0][0]
+#    PlayerControl.WorldNotify(0, "FamilyMatchLianWinReward", [curFamily.GetName(), notifyItemID, curTagMember.GetName()])
+#    return
 
 def MapServer_FamilyWarOver(msgList):
     ## 地图仙盟战结束
@@ -1068,4 +1297,11 @@
         
     return
 
+def Sync_FamilyWarInfo(curPlayer=None):
+    warInfo = ChPyNetSendPack.tagGCFamilyWarInfo()
+    warInfo.WorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_StartWorldLV)
+    NetPackCommon.SendPackByPlayer(warInfo, curPlayer)
+    return
+    
+    
 

--
Gitblit v1.8.0