| | |
| | |
|
| | | import datetime
|
| | | import PyGameData
|
| | | import CrossRealmPK
|
| | | import CrossRealmMsg
|
| | | import PlayerControl
|
| | | import PyDataManager
|
| | |
| | | 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()
|
| | |
| | | '''
|
| | |
|
| | | 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
|
| | |
|
| | |
| | | PyGameData.g_crossDynamicLineInfo.pop(ChConfig.Def_FBMapID_CrossBattlefield, None)
|
| | |
|
| | | PyGameData.g_overPlayerIDList = []
|
| | | |
| | | 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:
|
| | |
| | |
|
| | | 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])
|
| | |
| | | curHMNum = GetHMNum(openHour, openMinute)
|
| | |
|
| | | 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 not zoneIpyData:
|
| | |
| | | # @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:
|
| | |
| | | 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"] # 玩家名
|
| | |
| | | tagPlayerID = msgData["tagPlayerID"]
|
| | | playerID = msgData["playerID"]
|
| | |
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
| | | tagPlayerID = msgData["tagPlayerID"]
|
| | | playerID = msgData["playerID"]
|
| | |
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
| | | serverOnly = msgData["serverOnly"]
|
| | | playerID = msgData["playerID"]
|
| | |
|
| | | zoneIpyData = CrossRealmPK.GetCrossPKServerGroupZone(serverGroupID)
|
| | | zoneIpyData = GetCrossBattlefieldZoneIpyData(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
| | | 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 []
|
| | |
|
| | | # 通知子服更新参与玩家数据
|
| | |
| | |
|
| | | 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):
|
| | |
| | | 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():
|
| | |
| | | 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:
|
| | |
| | | % (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)
|
| | |
| | | % (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)
|