From ecd59046f9ca7df5e112d1d0f17ebaf60aa7ac9a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 23 二月 2023 16:10:39 +0800
Subject: [PATCH] 1111 【后端】【bt9】【bt8】【主干】修复暴击概率抗性210刷属性没通知前端bug;

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py |  160 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 140 insertions(+), 20 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
index b10f6c7..262c804 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
@@ -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(" ", ""))
                 
@@ -214,14 +219,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()
             
@@ -396,6 +407,7 @@
             
         if openDateTime <= curDateTime < closeDateTime:
             battlefieldState = openHour * 100 + openMinute
+            PyGameData.g_openDateTime = openDateTime
             
     stateKey = ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield
     gameWorld = GameWorld.GetGameWorld()
@@ -413,6 +425,8 @@
     if battlefieldState and beforeState != battlefieldState:
         # 移除已经存在的副本线路
         PyGameData.g_crossDynamicLineInfo.pop(ChConfig.Def_FBMapID_CrossBattlefield, None)
+        
+        PyGameData.g_overPlayerIDList = []
         
         crossZoneName = GameWorld.GetCrossZoneName()
         crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
@@ -493,36 +507,38 @@
             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
 
-def GetCrossBattlefieldOpenTime(zoneID):
+def GetCrossBattlefieldOpenTime(serverGroupID, zoneID, playerID):
     ## 获取跨服战场副本当前是否开放的时间点
     #  @return: None-当前未开放;
-    #  @return: hour, minute  -  当前开放中的时间时分,可进入
+    #  @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:
+        # 您已经参加过该场次,无法再进入!
+        PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossBattlefieldAlreadyJoin")
         return
     
     openHour, openMinute = GetHMByNum(hmNum)
@@ -530,12 +546,48 @@
     isCallBattle = [openHour, openMinute] not in sysOpenHMList
     if isCallBattle:
         if zoneID not in PyGameData.g_crossBattlefieldBuyInfo:
-            GameWorld.DebugLog("该分区没有使用召集令! zoneID=%s" % zoneID)
+            GameWorld.Log("该分区没有使用召集令! zoneID=%s" % zoneID, playerID)
+            PlayerControl.NotifyCodeCross(serverGroupID, playerID, "FBIsNotOpen")
             return
         buyHMInfo = PyGameData.g_crossBattlefieldBuyInfo[zoneID]
         if hmNum not in buyHMInfo:
-            GameWorld.DebugLog("该时段还未使用召集令! zoneID=%s,hmNum=%s" % (zoneID, hmNum))
+            GameWorld.Log("该时段还未使用召集令! zoneID=%s,hmNum=%s" % (zoneID, hmNum), playerID)
+            PlayerControl.NotifyCodeCross(serverGroupID, playerID, "FBIsNotOpen")
             return
+        
+        # 召集场只有一条线,如果有人结算则代表已经结束了
+        if PyGameData.g_overPlayerIDList:
+            # 该召集场次已结算,无法进入!
+            PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossBattlefieldCallOver")
+            return
+        
+    if PyGameData.g_openDateTime:
+        serverTime = GameWorld.GetServerTime()
+        passSeconds = (serverTime - PyGameData.g_openDateTime).seconds
+        closeEnterMinutes = IpyGameDataPY.GetFuncCfg("CrossBattlefieldOpen", 5) # 开启X分钟后不可进入,不包含已进入玩家及召集队伍中的玩家
+        closeSeconds = closeEnterMinutes * 60
+        if passSeconds > closeSeconds:
+            GameWorld.DebugLog("迟到了! passSeconds=%s > %s" % (passSeconds, closeSeconds), playerID)
+            isBelate = True
+            for _, copyMapObj in PyGameData.g_crossDynamicLineCopyMapInfo.items():
+                if copyMapObj.IsMustCopyMapPlayer(playerID):
+                    isBelate = False
+                    GameWorld.DebugLog("已进入的重复进入不限制时间!  playerID=%s" % playerID)
+                    break
+                
+            if isCallBattle:
+                buyPlayerInfo = buyHMInfo[hmNum]
+                for buyRec in buyPlayerInfo.values():
+                    if playerID in buyRec.callPlayerIDList:
+                        isBelate = False
+                        GameWorld.DebugLog("召集令成员不受人时间限制!  playerID=%s" % playerID)
+                        break
+                    
+            if isBelate:
+                PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossBattlefieldBelate", [closeEnterMinutes])
+                return
+        #else:
+        #    GameWorld.DebugLog("没有迟到!passSeconds=%s <= %s" % (passSeconds, closeSeconds), playerID)
         
     return isCallBattle, openHour, openMinute
 
@@ -613,6 +665,7 @@
     openHour = msgData["openHour"]
     openMinute = msgData["openMinute"]
     faction = msgData["faction"]
+    serverOnly = msgData.get("serverOnly", 0)
     
     hmNum = GetHMNum(openHour, openMinute)
     
@@ -665,9 +718,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) # 周召集榜上榜至少次数
@@ -778,6 +833,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 = CrossRealmPK.GetCrossPKServerGroupZone(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())
@@ -804,6 +889,8 @@
             factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt \
                 = playerInfo
             
+        PyGameData.g_overPlayerIDList.append(playerID)
+        
         paramList = [rank]
         if faction == winnerFaction:
             winnerPlayerIDList.append(playerID)
@@ -817,7 +904,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, ""
@@ -917,7 +1005,7 @@
     for playerID, playerData in syncPlayerDataInfo.items():
         if PlayerControl.GetDBPlayerAccIDByID(playerID):
             msgInfo = ["BattlefieldOver", [overTime] + playerData]
-            CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo)
+            CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo, True)
             
     return
 
@@ -974,6 +1062,9 @@
     elif opType == "CallKick":
         pass
     
+    elif opType == "CallChange":
+        pass
+    
     return
 
 def SyncCrossBattlefieldBuyInfo(curPlayer, zoneID, hmNum=None):
@@ -996,6 +1087,7 @@
             buyPlayerPack = ChPyNetSendPack.tagGCCrossBattlefieldBuyPlayer()
             buyPlayerPack.BuyPlayerID = buyPlayerID
             buyPlayerPack.Faction = buyRec.factionID
+            buyPlayerPack.ServerOnly = buyRec.serverOnly
             buyPlayerPack.FactionPlayerList = []
             
             for callPlayerID in buyRec.callPlayerIDList:
@@ -1081,6 +1173,11 @@
         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
+    
     # 请求查询跨服服务器
     dataMsg = {"openHour":openHour, "openMinute":openMinute, "buyPlayerID":buyPlayerID, "tagPlayerID":tagPlayerID, "playerID":playerID}
     CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BattlefieldCallJoin, dataMsg)
@@ -1145,3 +1242,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