| | |
| | | matchState = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
|
| | | if not matchState and not PyGameData.g_crossPKRoomDict:
|
| | | GameWorld.Log("匹配已结束,且当前没有PK中的房间了!主动广播子服最新榜单! ")
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKZone", zoneID)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
|
| | | if zoneIpyData:
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | | SyncPKSyncBillboardToClientServer(zoneID, seasonID, serverGroupIDList)
|
| | |
| | | serverTime = GameWorld.GetServerTime()
|
| | | curSeasonID = 0
|
| | | seasonState = 0
|
| | | seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", zoneID)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
|
| | | seasonList = [] if not seasonList else seasonList
|
| | | for seasonIpyData in seasonList:
|
| | | startDateStr = seasonIpyData.GetStartDate()
|
| | |
| | |
|
| | | zoneSeasonTimeDict = {}
|
| | | serverTime = GameWorld.GetServerTime()
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return zoneSeasonTimeDict
|
| | | |
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
|
| | | # 规定每个赛区的赛季时间需按顺序配置
|
| | | seasonIpyDataList = []
|
| | | for sIndex in xrange(ipyDataMgr.GetCrossRealmPKSeasonCount()):
|
| | | seasonIpyData = ipyDataMgr.GetCrossRealmPKSeasonByIndex(sIndex)
|
| | | if zoneID == seasonIpyData.GetZoneID():
|
| | | seasonIpyDataList.append(seasonIpyData)
|
| | | |
| | | seasonIpyDataList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
|
| | | if not seasonIpyDataList:
|
| | | continue
|
| | | |
| | | for i, seasonIpyData in enumerate(seasonIpyDataList):
|
| | | seasonID = seasonIpyData.GetSeasonID()
|
| | | startDateStr = seasonIpyData.GetStartDate()
|
| | |
| | |
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | serverTime = GameWorld.GetServerTime()
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | for zoneID, seasonTimeInfo in zoneSeasonTimeDict.items():
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKZone", zoneID)
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
|
| | | if not zoneIpyData:
|
| | | continue
|
| | |
|
| | |
| | | PyGameData.g_crossPKRoomDict = {}
|
| | | GameWorld.Log("跨服PK匹配状态开启,重置相关匹配数据!")
|
| | |
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return
|
| | | |
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
|
| | | # 广播当前赛区的所有子服跨服PK赛季状态变更
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def ClientServerMsg_ServerInitOK(serverGroupID, tick):
|
| | | ## 子服启动成功
|
| | | GameWorld.Log("子服启动成功,同步给子服对应的赛季信息: serverGroupID=%s" % (serverGroupID))
|
| | | zoneID = GetCrossPKServerGroupZoneID(serverGroupID)
|
| | | if not zoneID:
|
| | | GameWorld.Log(" 该子服没有分配赛区,不同步!")
|
| | | def Sync_CrossPKInitDataToClientServer(tick, serverGroupID=0):
|
| | | ''' 同步跨服PK活动数据到子服务器
|
| | | @param serverGroupID: 为0时同步所有子服
|
| | | '''
|
| | | |
| | | GameWorld.Log("同步给子服对应的赛季信息: syncServerGroupID=%s" % (serverGroupID))
|
| | | if serverGroupID:
|
| | | ipyData = GetCrossPKServerGroupZone(serverGroupID)
|
| | | if not ipyData:
|
| | | return
|
| | | crossZoneList = [ipyData]
|
| | | else:
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
|
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | matchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
|
| | | seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState}
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, [serverGroupID])
|
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
|
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | matchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
|
| | | seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState}
|
| | | serverGroupIDList = [serverGroupID] if serverGroupID else zoneIpyData.GetServerGroupIDList()
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, serverGroupIDList)
|
| | | |
| | | return
|
| | |
|
| | | def GetCrossPKServerGroupZoneID(serverGroupID):
|
| | | def GetCrossPKServerGroupZone(serverGroupID):
|
| | | ## 获取服务器组ID对应的跨服PK所属赛区,返回0代表该服务器没有分配赛区
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return
|
| | | |
| | | for zoneIpyData in crossZoneList:
|
| | | for groupInfo in zoneIpyData.GetServerGroupIDList():
|
| | | if (isinstance(groupInfo, int) and serverGroupID == groupInfo) \
|
| | | or (isinstance(groupInfo, tuple) and len(groupInfo) == 2 and groupInfo[0] <= serverGroupID <= groupInfo[1]):
|
| | | return zoneIpyData.GetZoneID()
|
| | | return 0
|
| | | return zoneIpyData
|
| | | return
|
| | |
|
| | | def OnPlayerLoginCrossServer(curPlayer):
|
| | | # 跨服登录处理
|
| | |
| | | return
|
| | | __OnLoginNotifyPKOverInfo(curPlayer)
|
| | |
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return
|
| | | # 同步所有赛区赛季信息
|
| | | zoneSeasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeasonInfo()
|
| | | zoneSeasonInfo.ZoneList = []
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | zoneInfo = ChPyNetSendPack.tagGCCrossRealmPKZone()
|
| | | zoneInfo.ZoneID = zoneID
|
| | | zoneInfo.ZoneName = zoneIpyData.GetZoneName().decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
|
| | | zoneInfo.ZoneNameLen = len(zoneInfo.ZoneName)
|
| | | zoneInfo.SeasonList = []
|
| | | seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", zoneID)
|
| | | seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
|
| | | seasonList = [] if not seasonList else seasonList
|
| | | for seasonIpyData in seasonList:
|
| | | seasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeason()
|
| | |
| | | seasonStatePack.SeasonID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID)
|
| | | seasonStatePack.SeasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
|
| | | seasonStatePack.MatchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
|
| | | seasonStatePack.CrossZoneName = GameWorld.GetCrossZoneName()
|
| | | seasonStatePack.CrossZoneNameLen = len(seasonStatePack.CrossZoneName)
|
| | | NetPackCommon.SendFakePack(curPlayer, seasonStatePack)
|
| | |
|
| | | return
|
| | |
| | | # return
|
| | |
|
| | | vsRoomID = curPlayer.GetVsRoomId()
|
| | | if vsRoomID and PlayerControl.GetCrossRealmState(curPlayer) == 1:
|
| | | if vsRoomID and PlayerControl.GetCrossMapID(curPlayer) == ChConfig.Def_FBMapID_CrossRealmPK:
|
| | | GameWorld.DebugLog("玩家跨服PK状态,不能取消匹配!vsRoomID=%s" % vsRoomID, curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | |
| | | # ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | # if maxDanLV == None:
|
| | | # maxDanLV = ipyDataMgr.GetCrossRealmPKDanCount() - 1
|
| | | # for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | # zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | # crossZoneName = GameWorld.GetCrossZoneName()
|
| | | # crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | # if not crossZoneList:
|
| | | # return
|
| | | # for zoneIpyData in crossZoneList:
|
| | | # pkZoneID = zoneIpyData.GetZoneID()
|
| | | #
|
| | | # addPlayerList = []
|
| | |
| | | GameWorld.Log(" zoneID=%s,seasonID=%s,seasonState=%s,matchState=%s" % (zoneID, seasonID, seasonState, matchState))
|
| | | if not zoneID:
|
| | | return
|
| | | |
| | | if not seasonID:
|
| | | dbSeasonID = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID)
|
| | | if dbSeasonID:
|
| | | GameWorld.ErrLog(" 已经有分配赛季ID的暂定不能被置为0! dbSeasonID=%s" % dbSeasonID)
|
| | | return
|
| | | |
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | curSeasonState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKSeasonState)
|
| | |
|
| | |
| | | seasonStatePack.SeasonID = seasonID
|
| | | seasonStatePack.SeasonState = seasonState
|
| | | seasonStatePack.MatchState = matchState
|
| | | seasonStatePack.CrossZoneName = GameWorld.GetCrossZoneName()
|
| | | seasonStatePack.CrossZoneNameLen = len(seasonStatePack.CrossZoneName)
|
| | | playerManager = GameWorld.GetPlayerManager()
|
| | | for i in xrange(playerManager.GetPlayerCount()):
|
| | | curPlayer = playerManager.GetPlayerByIndex(i)
|
| | |
| | | matchPlayer.MaxProDef = readyPlayerInfo["MaxProDef"]
|
| | | break
|
| | |
|
| | | PlayerControl.SetCrossRealmState(player, 1)
|
| | | PlayerControl.SetCrossMapID(player, ChConfig.Def_FBMapID_CrossRealmPK)
|
| | | SetIsCrossPKMatching(player, 0)
|
| | |
|
| | | # 通知匹配成功,可进入跨服
|
| | |
| | | GameWorld.DebugLog(" 房间ID不同, playerID=%s" % (playerID))
|
| | | continue
|
| | | player.SetDict(ChConfig.Def_PlayerKey_IsLoginToMergeServer, 0)
|
| | | PlayerControl.SetCrossRealmState(player, 0)
|
| | | PlayerControl.SetCrossMapID(player, 0)
|
| | |
|
| | | return
|
| | |
|
| | |
| | | overInfoData = PyDataManager.GetCrossPKUnNotifyOverInfoManager().GetPlayerUnNotifyOverInfo(playerID)
|
| | | if not overInfoData:
|
| | | return
|
| | | PlayerControl.SetCrossRealmState(curPlayer, 0)
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | PlayerControl.SetVsRoomId(curPlayer, 0)
|
| | |
|
| | | zoneID = overInfoData.ZoneID
|