From 923b21f892b1cb5105611d3acc706a323767a2d0 Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期二, 09 四月 2019 17:34:51 +0800 Subject: [PATCH] 860312 新增跨服副本类型 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py | 123 ++++++++++++++++++++++++++-------------- 1 files changed, 80 insertions(+), 43 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py index 414e290..9b62c48 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py @@ -307,7 +307,8 @@ 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) @@ -366,7 +367,8 @@ 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() @@ -535,18 +537,19 @@ 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() @@ -604,8 +607,9 @@ 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 @@ -667,9 +671,12 @@ 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赛季状态变更 @@ -682,31 +689,47 @@ 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): # 跨服登录处理 @@ -731,19 +754,21 @@ 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() @@ -764,6 +789,8 @@ 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 @@ -818,7 +845,7 @@ # 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 @@ -1048,8 +1075,11 @@ # 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 = [] @@ -1629,7 +1659,12 @@ 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) @@ -1668,6 +1703,8 @@ 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) @@ -1774,7 +1811,7 @@ matchPlayer.MaxProDef = readyPlayerInfo["MaxProDef"] break - PlayerControl.SetCrossRealmState(player, 1) + PlayerControl.SetCrossMapID(player, ChConfig.Def_FBMapID_CrossRealmPK) SetIsCrossPKMatching(player, 0) # 通知匹配成功,可进入跨服 @@ -1817,7 +1854,7 @@ GameWorld.DebugLog(" 房间ID不同, playerID=%s" % (playerID)) continue player.SetDict(ChConfig.Def_PlayerKey_IsLoginToMergeServer, 0) - PlayerControl.SetCrossRealmState(player, 0) + PlayerControl.SetCrossMapID(player, 0) return @@ -1908,7 +1945,7 @@ overInfoData = PyDataManager.GetCrossPKUnNotifyOverInfoManager().GetPlayerUnNotifyOverInfo(playerID) if not overInfoData: return - PlayerControl.SetCrossRealmState(curPlayer, 0) + PlayerControl.SetCrossMapID(curPlayer, 0) PlayerControl.SetVsRoomId(curPlayer, 0) zoneID = overInfoData.ZoneID -- Gitblit v1.8.0