From 0ff8e21c92b39adfdf062b40c4e0147213bba70a Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 26 十一月 2018 23:18:29 +0800
Subject: [PATCH] 4923 【后端】【1.3】神兵技能

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py |   79 +++++++++++++++++++++++++++++++--------
 1 files changed, 63 insertions(+), 16 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py
index 152d079..794ca6f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py
@@ -223,7 +223,7 @@
         
     if familyWarRank:
         GameWorld.Log("解散仙盟,触发更新仙盟联赛排名: delFamilyID=%s,familyWarRank=%s" % (familyID, familyWarRank))
-        PlayerFamily.UpdFamilyWarRank()
+        UpdFamilyWarRank()
         
     # 补发未分配的连胜奖励
     AllotWinRewardBySystem(GetFamilyWarChampionRecData(), True)
@@ -294,7 +294,9 @@
     
     # 下周分组定级
     elif stateValue == FamilyWarState_NextWeekGroupRank:
-        DoLogicFamilyWar_NextWeekGroupRank()
+        pass
+        #废弃该阶段逻辑,因为不再支持单次活动周期跨天,所以改为过天时触发检查一下即可
+        #DoLogicFamilyWar_NextWeekGroupRank()
         
     else:
         GameWorld.ErrLog("不存在该仙盟联赛状态!stateValue=%s" % stateValue)
@@ -416,24 +418,29 @@
     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)
+            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)
                 
         # 满一组仙盟数 or 没有仙盟了
         if len(groupFamilyList) == FamilyWar_GroupFamilyCount or i == familyCount - 1:
@@ -448,6 +455,8 @@
                 
     GameWorld.Log("    PyGameData.g_familyWarFamilyIDList: %s" % PyGameData.g_familyWarFamilyIDList)
     GameWorld.Log("    PyGameData.g_familyWarMemDict: %s" % PyGameData.g_familyWarMemDict)
+    GameWorld.Log("    通用记录对战家族数: %s" % warBatRecList.Count())
+    GameWorld.Log("    通用记录参与玩家数: %s" % warMemRecList.Count())
     GameWorld.Log("    仙盟联赛首轮比赛分组确认完毕!")
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, FamilyWarRound_First) # 设置已处理过的轮次
     return
@@ -720,6 +729,10 @@
         
     return
 
+def DoOnDay():
+    DoLogicFamilyWar_NextWeekGroupRank()
+    return
+
 def DoLogicFamilyWar_NextWeekGroupRank():
     ''' 下周分组定级
         最低级别组: 不设置联赛级别, 下周最低级别组名单由其他无联赛级别仙盟总战力排行得到
@@ -728,7 +741,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 +794,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)
@@ -857,6 +902,8 @@
     
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0) # 重置对战轮次
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 1) # 设置已经处理过总结算
+    
+    UpdFamilyWarRank() # 改为比赛结束后默认更新联赛排名
     return
 
 def UpdFamilyWarChampion(championFamilyID):

--
Gitblit v1.8.0