From b671f79bdfedf80c773b5bd6bdd6181e17032bf5 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 08 七月 2024 14:04:24 +0800 Subject: [PATCH] 5537 【越南】分区热更新优化需求(增加跨服分区表古神战场,古神去除与跨服PK分区关联;) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py | 269 +++++++++++++++++++++++++++++++++++------------------ 1 files changed, 175 insertions(+), 94 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py index b10f6c7..375371e 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 @@ -54,6 +53,7 @@ value2:hmNum 时分场次编号 value3:playerID 购买的玩家ID value4:factionID 所选择的阵营ID +value5:serverOnly 是否仅本服玩家可加入,0-否,1-是 StrValue3:[callPlayerID,...] 召集来的玩家ID,包含自己 ''' @@ -71,6 +71,7 @@ self.zoneID = 0 self.playerID = 0 self.factionID = 0 + self.serverOnly = 0 self.callPlayerIDList = [] # 子服用,跨服服务器同步数据时负值; 不存库,玩家属性缓存信息,本服玩家取自己服务器最新缓存 @@ -88,7 +89,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 +113,7 @@ hmNum = recData.GetValue2() playerID = recData.GetValue3() factionID = recData.GetValue4() + serverOnly = recData.GetValue5() strValue3 = recData.GetStrValue3() @@ -121,6 +123,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 +155,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 +164,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 +235,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 +283,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 @@ -396,6 +415,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() @@ -414,22 +434,15 @@ # 移除已经存在的副本线路 PyGameData.g_crossDynamicLineInfo.pop(ChConfig.Def_FBMapID_CrossBattlefield, None) - crossZoneName = GameWorld.GetCrossZoneName() - crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True) - if not crossZoneList: - crossZoneList = [] + PyGameData.g_overPlayerIDList = [] 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: @@ -457,26 +470,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]) @@ -487,42 +492,32 @@ 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 -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: + if playerID in PyGameData.g_overPlayerIDList: + # 您已经参加过该场次,无法再进入! + PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossBattlefieldAlreadyJoin") return openHour, openMinute = GetHMByNum(hmNum) @@ -530,12 +525,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 @@ -591,16 +622,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"] # 玩家名 @@ -613,6 +638,7 @@ openHour = msgData["openHour"] openMinute = msgData["openMinute"] faction = msgData["faction"] + serverOnly = msgData.get("serverOnly", 0) hmNum = GetHMNum(openHour, openMinute) @@ -665,9 +691,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) # 周召集榜上榜至少次数 @@ -701,7 +729,7 @@ tagPlayerID = msgData["tagPlayerID"] playerID = msgData["playerID"] - zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) + zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() @@ -750,7 +778,7 @@ tagPlayerID = msgData["tagPlayerID"] playerID = msgData["playerID"] - zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID) + zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID) if not zoneIpyData: return zoneID = zoneIpyData.GetZoneID() @@ -775,6 +803,36 @@ serverGroupIDList = zoneIpyData.GetServerGroupIDList() msgData.update({"opType":"CallKick"}) + 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 @@ -804,6 +862,8 @@ factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt \ = playerInfo + PyGameData.g_overPlayerIDList.append(playerID) + paramList = [rank] if faction == winnerFaction: winnerPlayerIDList.append(playerID) @@ -817,7 +877,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, "" @@ -854,8 +915,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 [] # 通知子服更新参与玩家数据 @@ -887,18 +947,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): @@ -908,16 +963,15 @@ 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(): if PlayerControl.GetDBPlayerAccIDByID(playerID): msgInfo = ["BattlefieldOver", [overTime] + playerData] - CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo) + CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo, True) return @@ -928,10 +982,9 @@ 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 not syncBuyHMInfo: @@ -974,6 +1027,9 @@ elif opType == "CallKick": pass + elif opType == "CallChange": + pass + return def SyncCrossBattlefieldBuyInfo(curPlayer, zoneID, hmNum=None): @@ -996,6 +1052,7 @@ buyPlayerPack = ChPyNetSendPack.tagGCCrossBattlefieldBuyPlayer() buyPlayerPack.BuyPlayerID = buyPlayerID buyPlayerPack.Faction = buyRec.factionID + buyPlayerPack.ServerOnly = buyRec.serverOnly buyPlayerPack.FactionPlayerList = [] for callPlayerID in buyRec.callPlayerIDList: @@ -1063,11 +1120,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) @@ -1079,6 +1134,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 # 请求查询跨服服务器 @@ -1122,11 +1182,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) @@ -1145,3 +1203,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