From 912c7af646ef3640da22f0cf3e94a6fae02cf6ab Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 02 十二月 2024 18:49:58 +0800
Subject: [PATCH] 5559 [越南][英文][tqxbqy][砍树]优化启动检查配表格式(增加检查指定的字段格式dict、list)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py |  322 ++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 207 insertions(+), 115 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
index e4ca6f2..529b514 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
@@ -17,7 +17,6 @@
 
 import datetime
 import PyGameData
-import CrossRealmPK
 import CrossRealmMsg
 import PlayerControl
 import PyDataManager
@@ -25,6 +24,7 @@
 import CrossRealmPlayer
 import PlayerCompensation
 import PlayerViewCache
+import PlayerFuncTeam
 import CrossBillboard
 import IpyGameDataPY
 import NetPackCommon
@@ -54,6 +54,7 @@
 value2:hmNum            时分场次编号
 value3:playerID        购买的玩家ID
 value4:factionID        所选择的阵营ID
+value5:serverOnly        是否仅本服玩家可加入,0-否,1-是
 
 StrValue3:[callPlayerID,...]    召集来的玩家ID,包含自己
 '''
@@ -71,6 +72,7 @@
         self.zoneID = 0
         self.playerID = 0
         self.factionID = 0
+        self.serverOnly = 0
         self.callPlayerIDList = []
         
         # 子服用,跨服服务器同步数据时负值; 不存库,玩家属性缓存信息,本服玩家取自己服务器最新缓存
@@ -88,7 +90,7 @@
                                              "RealmLV":cacheDict["RealmLV"], "FightPower":cacheDict["FightPower"]}
             
         return {"buyTime":self.buyTime, "hmNum":self.hmNum, "zoneID":self.zoneID, "playerID":self.playerID, "factionID":self.factionID,
-                "callPlayerIDList":self.callPlayerIDList, "callPlayerDict":self.callPlayerDict}
+                "serverOnly":self.serverOnly, "callPlayerIDList":self.callPlayerIDList, "callPlayerDict":self.callPlayerDict}
         
     def SetAttr(self, attrDict):
         for k, v in attrDict.items():
@@ -112,6 +114,7 @@
         hmNum = recData.GetValue2()
         playerID = recData.GetValue3()
         factionID = recData.GetValue4()
+        serverOnly = recData.GetValue5()
         
         strValue3 = recData.GetStrValue3()
             
@@ -121,6 +124,7 @@
         buyRec.hmNum = hmNum
         buyRec.playerID = playerID
         buyRec.factionID = factionID
+        buyRec.serverOnly = serverOnly
         buyRec.callPlayerIDList = eval(strValue3) if strValue3 else []
         
         buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
@@ -152,6 +156,7 @@
                 recData.SetValue2(buyRec.hmNum)
                 recData.SetValue3(buyRec.playerID)
                 recData.SetValue4(buyRec.factionID)
+                recData.SetValue5(buyRec.serverOnly)
                 
                 recData.SetStrValue3(str(buyRec.callPlayerIDList).replace(" ", ""))
                 
@@ -160,9 +165,26 @@
 def GetHMNum(openHour, openMinute): return openHour * 100 + openMinute
 def GetHMByNum(hmNum): return hmNum / 100, hmNum % 100
 
+def GetCrossBattlefieldZoneIpyDataList(serverGroupID=0):
+    ## 获取所有分区配置列表
+    ipyDataList = CrossRealmPlayer.GetCrossZoneIpyDataListByServerGroupID(ChConfig.Def_FBMapID_CrossBattlefield, serverGroupID)
+    if not ipyDataList:
+        return []
+    return ipyDataList
+
+def GetCrossBattlefieldZoneIpyData(serverGroupID):
+    ## 获取服务器所属分区配置
+    return CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(ChConfig.Def_FBMapID_CrossBattlefield, serverGroupID)
+
+def GetCrossBattlefieldZoneID(serverGroupID):
+    ## 获取服务器所属分区ID
+    zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
+    if not zoneIpyData:
+        return 0
+    return zoneIpyData.GetZoneID()
+
 def OnPlayerLogin(curPlayer):
-    serverGroupID = GameWorld.GetServerGroupID()
-    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
+    zoneIpyData = GetCrossBattlefieldZoneIpyData(GameWorld.GetServerGroupID())
     if not zoneIpyData:
         return
     zoneID = zoneIpyData.GetZoneID()
@@ -214,14 +236,20 @@
                 playerID = billboardData.ID
                 cmpValue = billboardData.CmpValue
                 rank = i + 1
-                awardItemList = GameWorld.GetOrderValueByDict(awardDict, rank, False)
+                awardItemList = []
+                rankAwardItemList = GameWorld.GetOrderValueByDict(awardDict, rank, False, [])
+                if rankAwardItemList:
+                    awardItemList.extend(rankAwardItemList)
                 paramList = [rank]
                 if billboardType == ShareDefine.Def_CBT_BattlefieldWJoin and enterWeekMoneyItemID:
-                    moneyBaseCount, multiValue = GameWorld.GetOrderValueByDict(enterWeekMoneyMultiIntDict, rank, False) # 奖励货币倍值
+                    moneyBaseCount, multiValue = GameWorld.GetOrderValueByDict(enterWeekMoneyMultiIntDict, rank, False, [0, 0]) # 奖励货币倍值
                     #基础保底值(不同名次可能不一样) + 名次倍率*次数
                     awardMoneyCount = int(moneyBaseCount + multiValue * cmpValue)
                     awardItemList.append([enterWeekMoneyItemID, awardMoneyCount, 0])
-                PlayerCompensation.SendMailByKey(mailKey, [playerID], awardItemList, paramList, crossMail=True)
+                GameWorld.Log("    billboardType=%s,rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s" 
+                              % (billboardType, rank, playerID, cmpValue, awardItemList))
+                if awardItemList:
+                    PlayerCompensation.SendMailByKey(mailKey, [playerID], awardItemList, paramList, crossMail=True)
                 
             billboardObj.ClearData()
             
@@ -256,15 +284,7 @@
     '''
     
     GameWorld.Log("同步给子服跨服战场数据: syncServerGroupID=%s" % (serverGroupID))
-    if serverGroupID:
-        ipyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
-        if not ipyData:
-            return
-        crossZoneList = [ipyData]
-    else:
-        crossZoneName = GameWorld.GetCrossZoneName()
-        crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
-        
+    crossZoneList = GetCrossBattlefieldZoneIpyDataList(serverGroupID)
     if not crossZoneList:
         return
     
@@ -310,6 +330,7 @@
 def OnMapServerInitOK():
     # 通知地图服务器状态
     SyncMapServerCrossBattlefieldBuyInfo()
+    SyncMapServerCrossBattlefieldSysCallBuyInfo()
     return
 
 def SyncMapServerCrossBattlefieldBuyInfo():
@@ -324,6 +345,11 @@
                 buyInfo[playerID] = {"callPlayerIDList":buyRec.callPlayerIDList, "factionID":buyRec.factionID}
             syncMapBuyInfo[zoneID][hmNum] = buyInfo
     GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossBattlefieldCallTeamInfo, syncMapBuyInfo)
+    return
+
+def SyncMapServerCrossBattlefieldSysCallBuyInfo():
+    syncMapBuyInfo = PyGameData.g_crossBattlefieldSysCallBuyList
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossBattlefieldSysCallBuyInfo, syncMapBuyInfo)
     return
 
 def OnMinuteProcess():
@@ -416,23 +442,15 @@
         PyGameData.g_crossDynamicLineInfo.pop(ChConfig.Def_FBMapID_CrossBattlefield, None)
         
         PyGameData.g_overPlayerIDList = []
+        PyGameData.g_crossBattlefieldSysCallBuyList = []
         
-        crossZoneName = GameWorld.GetCrossZoneName()
-        crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
-        if not crossZoneList:
-            crossZoneList = []
-            
         hmNum = battlefieldState
         openHour, openMinute = GetHMByNum(hmNum)
         sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1)
-        
+                
+        crossZoneList = GetCrossBattlefieldZoneIpyDataList()
         for zoneIpyData in crossZoneList:
             zoneID = zoneIpyData.GetZoneID()
-            
-            seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
-            if seasonState != 1:
-                GameWorld.Log("    跨服PK赛季未开启中,跨服战场不开启! zoneID=%s" % zoneID)
-                continue
             
             # 系统局确保每个等级段都有一场
             if [openHour, openMinute] in sysOpenHMList:
@@ -452,7 +470,12 @@
                     PlayerFB.OpenCrossDynamicLineBySys(zoneID, ChConfig.Def_FBMapID_CrossBattlefield, funcLineIDList, True)
                 else:
                     GameWorld.Log("    无召集的场次不开分区战场! zoneID=%s" % (zoneID))
-                    
+                 
+    # 关闭
+    if not battlefieldState and beforeState != battlefieldState:
+        # 活动结束清空队伍
+        PlayerFuncTeam.DelTeamByFunc(ChConfig.Def_FBMapID_CrossBattlefield)
+        
     # 同步子服务器
     dataMsg = {"battlefieldState":battlefieldState}
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_BattlefieldState, dataMsg)
@@ -460,26 +483,18 @@
 
 def __DoBattlefieldOpenNotify(openHour, openMinute, notifyOpenMinute):
     ''' 执行跨服战场开启广播
-                    跨服PK赛季未开启状态下,跨服战场同步关闭,故也不广播
                     还要限制开服天开启
     '''
     
-    gameWorld = GameWorld.GetGameWorld()
     sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1)
     if [openHour, openMinute] in sysOpenHMList:
         
-        crossZoneName = GameWorld.GetCrossZoneName()
-        crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
+        crossZoneList = GetCrossBattlefieldZoneIpyDataList()
         if not crossZoneList:
             return
         
         for zoneIpyData in crossZoneList:
             zoneID = zoneIpyData.GetZoneID()
-            
-            seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
-            if seasonState != 1:
-                GameWorld.DebugLog("跨服PK赛季未开启中,跨服战场系统开启广播不处理!")
-                continue
             
             serverGroupIDList = zoneIpyData.GetServerGroupIDList()
             PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenSys", [notifyOpenMinute])
@@ -490,27 +505,15 @@
     
     for zoneID, buyHMInfo in PyGameData.g_crossBattlefieldBuyInfo.items():
         
-        seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
-        if seasonState != 1:
-            GameWorld.DebugLog("跨服PK赛季未开启中,跨服战场玩家开启广播不处理!")
-            continue
-        
         zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(ChConfig.Def_FBMapID_CrossBattlefield, zoneID)
-        if zoneIpyData:
+        if not zoneIpyData:
             continue
         serverGroupIDList = zoneIpyData.GetServerGroupIDList()
         
         if curHMNum not in buyHMInfo:
             continue
         
-        buyPlayerInfo = buyHMInfo[curHMNum]
-        if not buyPlayerInfo:
-            continue
-        
-        matchTickSortList = sorted(buyPlayerInfo.values(), key=operator.attrgetter("buyTime"))
-        buyRec = matchTickSortList[0]
-        
-        PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenPlayer", [buyRec.playerName, notifyOpenMinute])
+        PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenSys", [notifyOpenMinute])
         
     return
 
@@ -519,17 +522,10 @@
     #  @return: None-当前未开放;
     #  @return: isCallBattle, openHour, openMinute  -  当前开放中的时间时分,可进入
     
-    gameWorld = GameWorld.GetGameWorld()
     hmNum = GetCrossBattlefieldState()
     if not hmNum:
         GameWorld.Log("当前时间战场未开启!", playerID)
         PlayerControl.NotifyCodeCross(serverGroupID, playerID, "FBIsNotOpen")
-        return
-    
-    seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
-    if seasonState != 1:
-        GameWorld.Log("赛季未开启!", playerID)
-        PlayerControl.NotifyCodeCross(serverGroupID, playerID, "NotifySeasonOver")
         return
     
     if playerID in PyGameData.g_overPlayerIDList:
@@ -565,8 +561,9 @@
         if passSeconds > closeSeconds:
             GameWorld.DebugLog("迟到了! passSeconds=%s > %s" % (passSeconds, closeSeconds), playerID)
             isBelate = True
+            #去除新队员进入不受时间限制设定
             for _, copyMapObj in PyGameData.g_crossDynamicLineCopyMapInfo.items():
-                if copyMapObj.IsMustCopyMapPlayer(playerID):
+                if copyMapObj.IsMustCopyMapPlayer(playerID, False):
                     isBelate = False
                     GameWorld.DebugLog("已进入的重复进入不限制时间!  playerID=%s" % playerID)
                     break
@@ -639,16 +636,10 @@
     if not GameWorld.IsCrossServer():
         return
     
-    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
+    zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
     if not zoneIpyData:
         return
     zoneID = zoneIpyData.GetZoneID()
-    
-    gameWorld = GameWorld.GetGameWorld()
-    seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
-    if seasonState != 1:
-        GameWorld.Log("跨服PK赛季未开启中,跨服战场也不能开启,无法购买!")
-        return
     
     playerID = msgData["playerID"] # 角色ID
     playerName = msgData["playerName"] # 玩家名
@@ -661,8 +652,54 @@
     openHour = msgData["openHour"]
     openMinute = msgData["openMinute"]
     faction = msgData["faction"]
+    serverOnly = msgData.get("serverOnly", 0)
+    face = msgData.get("face", 0)
+    facePic = msgData.get("facePic", 0)
     
     hmNum = GetHMNum(openHour, openMinute)
+    
+    # 更新缓存
+    curCache = PlayerViewCache.FindViewCache(playerID, True)
+    if curCache:
+        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
+        cacheDict["Name"] = playerName
+        cacheDict["Job"] = job
+        cacheDict["LV"] = playerLV
+        cacheDict["RealmLV"] = realmLV
+        cacheDict["FightPower"] = fightPower    
+        
+    sysOpenHMList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldOpen", 1)
+    if [openHour, openMinute] in sysOpenHMList:
+        if playerID in PyGameData.g_crossBattlefieldSysCallBuyList:
+            GameWorld.Log("玩家已经购买过该系统场次! zoneID=%s,openHour=%s,openMinute=%s" % (zoneID, openHour, openMinute), playerID)
+            return
+        PyGameData.g_crossBattlefieldSysCallBuyList.append(playerID)
+        
+        buyTime = int(time.time())
+        GameWorld.DebugLog("玩家购买系统召集场次! zoneID=%s,openHour=%s,openMinute=%s" % (zoneID, openHour, openMinute), playerID)
+        
+        # 上榜
+        billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周召集榜上榜至少次数
+        groupValue1, dataID, name1, name2 = zoneID, playerID, playerName, ""
+        type2, value1, value2 = job, realmLV, 0
+        cmpValue = buyOpenCountWeek + 1
+        if cmpValue >= billboardCallCountLimit:
+            CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWCall, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue, value3=face, value4=facePic)            
+        
+        # 通知子服
+        serverGroupIDList = [serverGroupID]
+        msgData.update({"opType":"SysCallBuy", "buyTime":buyTime})
+        sendMsg = {"zoneID":zoneID, "SysCallBuyPlayerID":playerID, "opData":msgData}
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_BattlefieldBuy, sendMsg, serverGroupIDList)
+        
+        SyncMapServerCrossBattlefieldSysCallBuyInfo()
+        
+        buyPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+        if buyPlayer:
+            sendCMD = str(["SysCallBuy", PyGameData.g_crossBattlefieldSysCallBuyList])
+            GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, buyPlayer.GetPlayerID(), buyPlayer.GetRealMapID(), 
+                                                               "CrossBattlefield", sendCMD, len(sendCMD), buyPlayer.GetRouteServerIndex())
+        return
     
     if zoneID not in PyGameData.g_crossBattlefieldBuyInfo:
         PyGameData.g_crossBattlefieldBuyInfo[zoneID] = {}
@@ -694,16 +731,6 @@
     
     # ================ 可以购买,以下执行添加购买场次阵营逻辑  ================
     
-    # 更新缓存
-    curCache = PlayerViewCache.FindViewCache(playerID, True)
-    if curCache:
-        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
-        cacheDict["Name"] = playerName
-        cacheDict["Job"] = job
-        cacheDict["LV"] = playerLV
-        cacheDict["RealmLV"] = realmLV
-        cacheDict["FightPower"] = fightPower        
-    
     # 新增场次购买记录
     buyTime = int(time.time())
     buyRec = CrossBattlefieldBuy()
@@ -713,9 +740,11 @@
     buyRec.playerID = playerID
     buyRec.factionID = faction
     buyRec.callPlayerIDList = [playerID]
+    buyRec.serverOnly = serverOnly
     buyPlayerInfo[playerID] = buyRec
     
-    GameWorld.DebugLog("玩家购买开启召集场次! zoneID=%s,openHour=%s,openMinute=%s" % (zoneID, openHour, openMinute), playerID)
+    GameWorld.DebugLog("玩家购买开启召集场次! zoneID=%s,openHour=%s,openMinute=%s,faction=%s,serverOnly=%s" 
+                       % (zoneID, openHour, openMinute, faction, serverOnly), playerID)
     
     # 上榜
     billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周召集榜上榜至少次数
@@ -723,7 +752,7 @@
     type2, value1, value2 = job, realmLV, 0
     cmpValue = buyOpenCountWeek + 1
     if cmpValue >= billboardCallCountLimit:
-        CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWCall, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue)
+        CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWCall, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue, value3=face, value4=facePic)
         
     for otherBuyPlayerID, otherRec in buyPlayerInfo.items():
         if otherBuyPlayerID == playerID:
@@ -749,7 +778,7 @@
     tagPlayerID = msgData["tagPlayerID"]
     playerID = msgData["playerID"]
     
-    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
+    zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
     if not zoneIpyData:
         return
     zoneID = zoneIpyData.GetZoneID()
@@ -798,7 +827,7 @@
     tagPlayerID = msgData["tagPlayerID"]
     playerID = msgData["playerID"]
     
-    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
+    zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
     if not zoneIpyData:
         return
     zoneID = zoneIpyData.GetZoneID()
@@ -826,6 +855,36 @@
     Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList, msgData)
     return
 
+def ClientServerMsg_BattlefieldCallChange(serverGroupID, msgData):
+    
+    openHour = msgData["openHour"]
+    openMinute = msgData["openMinute"]
+    serverOnly = msgData["serverOnly"]
+    playerID = msgData["playerID"]
+    
+    zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
+    if not zoneIpyData:
+        return
+    zoneID = zoneIpyData.GetZoneID()
+    
+    hmNum = GetHMNum(openHour, openMinute)
+    buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
+    if playerID not in buyPlayerInfo:
+        GameWorld.ErrLog("跨服战场不存在该玩家的召集队伍! hmNum=%s,playerID=%s" % (hmNum, playerID), playerID)
+        return
+    buyRec = buyPlayerInfo[playerID]
+    buyRec.serverOnly = 1 if serverOnly else 0
+    
+    GameWorld.DebugLog("玩家召集队伍修改! zoneID=%s,openHour=%s,openMinute=%s,serverOnly=%s" 
+                       % (zoneID, openHour, openMinute, serverOnly), playerID)
+    
+    #SyncMapServerCrossBattlefieldBuyInfo()
+    
+    serverGroupIDList = zoneIpyData.GetServerGroupIDList()
+    msgData.update({"opType":"CallChange"})
+    Send_CrossServerMsg_BattlefieldBuy(zoneID, serverGroupIDList, msgData)
+    return
+
 def MapServer_CrossBattlefieldOver(msgList):
     ## 跨服战场地图结算
     overTime = int(time.time())
@@ -846,8 +905,8 @@
     syncPlayerDataInfo = {}
     winnerPlayerIDList, loserPlayerIDList = [], []
     for playerInfo in battlePlayerList:
-        playerID, job, realmLV, name, \
-            isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, \
+        playerID, job, face, facePic, realmLV, name, \
+            isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, teamID, \
             isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \
             factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt \
                 = playerInfo
@@ -867,7 +926,8 @@
             GameWorld.Log("    失败阵营玩家: faction=%s,rank=%s,playerID=%s" % (faction, rank, playerID), fbPropertyID)
             
         # 排名奖励邮件
-        PlayerCompensation.SendMailByKey(orderAwardMailKey, [playerID], orderAwardItemList, paramList, crossMail=True)
+        if orderAwardItemList:
+            PlayerCompensation.SendMailByKey(orderAwardMailKey, [playerID], orderAwardItemList, paramList, crossMail=True)
         
         # 更新周参与榜单
         groupValue1, dataID, name1, name2 = zoneID, playerID, name, ""
@@ -875,19 +935,19 @@
         enterCountWeek += 1
         cmpValue = enterCountWeek
         if cmpValue >= billboardEnterCountLimit:
-            CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWJoin, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue)
+            CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWJoin, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue, value3=face, value4=facePic)
             
         # 更新周高分榜单
         if score > highScoreToday:
             highScoreWeekTotal += (score - highScoreToday)
             highScoreToday = score
             cmpValue = highScoreWeekTotal
-            CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWScore, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue)
+            CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWScore, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue, value3=face, value4=facePic)
             
-        GameWorld.Log("    战场阵营玩家: faction=%s,isWinner=%s,rank=%s,playerID=%s,score=%s,highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,isCallOpen=%s,isCalled=%s" 
-                      % (faction, isWinner, rank, playerID, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallOpen, isCalled), fbPropertyID)
+        GameWorld.Log("    战场阵营玩家: faction=%s,isWinner=%s,rank=%s,playerID=%s,score=%s,highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,teamID=%s,isCallOpen=%s,isCalled=%s" 
+                      % (faction, isWinner, rank, playerID, score, highScoreToday, highScoreWeekTotal, enterCountWeek, teamID, isCallOpen, isCalled), fbPropertyID)
         
-        syncPlayerDataInfo[playerID] = [isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek,
+        syncPlayerDataInfo[playerID] = [isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, teamID,
                                         isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, 
                                         factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt]
         
@@ -904,8 +964,7 @@
         for superItemPlayerID in superItemPlayerIDList:
             PlayerCompensation.SendMailByKey("CrossBattlefieldSuperAward", [superItemPlayerID], [superItemInfo], crossMail=True)
         
-    crossZoneName = GameWorld.GetCrossZoneName()
-    zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
+    zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(ChConfig.Def_FBMapID_CrossBattlefield, zoneID)
     serverGroupIDList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else []
     
     # 通知子服更新参与玩家数据
@@ -937,18 +996,13 @@
     
     gameWorld = GameWorld.GetGameWorld()
     
-    seasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
     beforeState = GetCrossBattlefieldState()
-    beforeState = beforeState if (beforeState and seasonState == 1) else 0
     
-    realBattlefieldState = battlefieldState if (battlefieldState and seasonState == 1) else 0
-    
-    GameWorld.DebugLog("收到跨服服务器同步的战场状态: battlefieldState=%s,seasonState=%s,beforeState=%s,realBattlefieldState=%s" 
-                       % (battlefieldState, seasonState, beforeState, realBattlefieldState))
+    GameWorld.DebugLog("收到跨服服务器同步的战场状态: battlefieldState=%s,beforeState=%s" % (battlefieldState, beforeState))
     
     key = ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield
-    gameWorld.SetDict(key, realBattlefieldState)
-    GameWorld.SendMapServerMsgEx(key, realBattlefieldState)
+    gameWorld.SetDict(key, battlefieldState)
+    GameWorld.SendMapServerMsgEx(key, battlefieldState)
     return
 
 def CrossServerMsg_BattlefieldOver(msgData):
@@ -958,10 +1012,9 @@
     overTime = msgData["overTime"]
     syncPlayerDataInfo = msgData["syncPlayerDataInfo"]
     
-    gameWorld = GameWorld.GetGameWorld()
-    pkZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
-    if zoneID != pkZoneID:
-        GameWorld.ErrLog("非本服所属分区的跨服战场购买信息! pkZoneID(%s) != zoneID(%s) %s" % (pkZoneID, zoneID, str(msgData)))
+    curZoneID = GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
+    if zoneID != curZoneID:
+        GameWorld.ErrLog("非本服所属分区的跨服战场购买信息! curZoneID(%s) != zoneID(%s) %s" % (curZoneID, zoneID, str(msgData)))
         return
     
     for playerID, playerData in syncPlayerDataInfo.items():
@@ -975,15 +1028,26 @@
     GameWorld.DebugLog("收到跨服服务器同步的战场购买信息: %s" % msgData)
     
     zoneID = msgData["zoneID"]
-    syncBuyHMInfo = msgData["syncBuyHMInfo"]
     opData = msgData.get("opData", {})
     
-    gameWorld = GameWorld.GetGameWorld()
-    pkZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
-    if zoneID != pkZoneID:
-        GameWorld.ErrLog("非本服所属分区的跨服战场购买信息! pkZoneID(%s) != zoneID(%s) %s" % (pkZoneID, zoneID, str(msgData)))
+    curZoneID = GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
+    if zoneID != curZoneID:
+        GameWorld.ErrLog("非本服所属分区的跨服战场购买信息! curZoneID(%s) != zoneID(%s) %s" % (curZoneID, zoneID, str(msgData)))
         return
     
+    if "SysCallBuyPlayerID" in msgData:
+        playerID = msgData["SysCallBuyPlayerID"]
+        if PlayerControl.GetDBPlayerAccIDByID(playerID):
+            openHour = opData["openHour"]
+            openMinute = opData["openMinute"]
+            faction = opData["faction"]
+            buyTime = opData["buyTime"]
+            todayBuyOpenCount = opData["todayBuyOpenCount"]
+            msgInfo = ["BattlefieldBuy", [openHour, openMinute, faction, todayBuyOpenCount, buyTime]]
+            CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo)
+        return
+    
+    syncBuyHMInfo = msgData["syncBuyHMInfo"]
     if not syncBuyHMInfo:
         PyGameData.g_crossBattlefieldBuyInfo.pop(zoneID, None)
         
@@ -1024,6 +1088,9 @@
     elif opType == "CallKick":
         pass
     
+    elif opType == "CallChange":
+        pass
+    
     return
 
 def SyncCrossBattlefieldBuyInfo(curPlayer, zoneID, hmNum=None):
@@ -1046,6 +1113,7 @@
             buyPlayerPack = ChPyNetSendPack.tagGCCrossBattlefieldBuyPlayer()
             buyPlayerPack.BuyPlayerID = buyPlayerID
             buyPlayerPack.Faction = buyRec.factionID
+            buyPlayerPack.ServerOnly = buyRec.serverOnly
             buyPlayerPack.FactionPlayerList = []
             
             for callPlayerID in buyRec.callPlayerIDList:
@@ -1113,11 +1181,9 @@
                       % (openHour, openMinute, crossServerDateTime, endBuyDateTime), playerID)
         return
     
-    serverGroupID = GameWorld.GetServerGroupID()
-    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
-    if not zoneIpyData:
+    zoneID = GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
+    if not zoneID:
         return
-    zoneID = zoneIpyData.GetZoneID()
     
     hmNum = GetHMNum(openHour, openMinute)
     buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
@@ -1129,6 +1195,11 @@
     callTeamMemMax = IpyGameDataPY.GetFuncCfg("CrossBattlefieldCall", 1)
     if len(buyRec.callPlayerIDList) >= callTeamMemMax:
         GameWorld.DebugLog("召集人数已满! hmNum=%s,buyPlayerID=%s,callPlayerIDList=%s" % (hmNum, buyPlayerID, buyRec.callPlayerIDList), playerID)
+        return
+    
+    if buyRec.serverOnly and not PlayerControl.GetDBPlayerAccIDByID(buyPlayerID):
+        PlayerControl.NotifyCode(curPlayer, "CrossBattlefieldCallServerOnly")
+        #GameWorld.DebugLog("非本服玩家,无法加入其购买的召集队伍! hmNum=%s,buyPlayerID=%s,serverOnly=%s" % (hmNum, buyPlayerID, buyRec.serverOnly), playerID)
         return
     
     # 请求查询跨服服务器
@@ -1172,11 +1243,9 @@
                       % (openHour, openMinute, crossServerDateTime, endBuyDateTime), playerID)
         return
     
-    serverGroupID = GameWorld.GetServerGroupID()
-    zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
-    if not zoneIpyData:
+    zoneID = GetCrossBattlefieldZoneID(GameWorld.GetServerGroupID())
+    if not zoneID:
         return
-    zoneID = zoneIpyData.GetZoneID()
     
     hmNum = GetHMNum(openHour, openMinute)
     buyPlayerInfo = GetBuyPlayerInfo(zoneID, hmNum)
@@ -1195,3 +1264,26 @@
     CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BattlefieldCallKick, dataMsg)
     return
 
+#// C0 09 跨服战场召集场次修改 #tagCGCrossBattlefieldCallChange
+#
+#struct    tagCGCrossBattlefieldCallChange
+#{
+#    tagHead        Head;
+#    BYTE    Hour;        //战场开启时
+#    BYTE    Minute;        //战场开启分
+#    BYTE    ServerOnly;    //是否仅本服玩家可加入,0-否,1-是
+#};
+def OnCrossBattlefieldCallChange(index, clientData, tick):
+    if GameWorld.IsCrossServer():
+        return
+    
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    openHour = clientData.Hour
+    openMinute = clientData.Minute
+    serverOnly = clientData.ServerOnly
+    
+    # 请求查询跨服服务器
+    dataMsg = {"openHour":openHour, "openMinute":openMinute, "serverOnly":serverOnly, "playerID":playerID}
+    CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BattlefieldCallChange, dataMsg)
+    return

--
Gitblit v1.8.0