From 1ff3e77b9f3398c3c0c057091b17a11d3040228a Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期二, 19 二月 2019 16:05:21 +0800
Subject: [PATCH] 6253 【主干】【1.6】守卫人皇添加怪物波数日志输出
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py | 226 +++++++++++++++++++++++++++++++++-----------------------
1 files changed, 132 insertions(+), 94 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
index 6a9ef00..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,87 +689,109 @@
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):
+ # 跨服登录处理
+
+ mapID = curPlayer.GetMapID()
+ mapIDList = IpyGameDataPY.GetFuncCfg("CrossRealmPKMatch", 4)
+ if mapID not in mapIDList:
+ return
+
+ GameWorld.Log("玩家登录跨服PK地图, mapID=%s" % mapID, curPlayer.GetPlayerID())
+ if not __CheckCanLoginCrossServerPKMap(curPlayer):
+ CrossRealmPlayer.PlayerExitCrossServer(curPlayer)
+ return
+
+ return
def OnPlayerLogin(curPlayer):
-
# 本服登录处理
- if not GameWorld.IsCrossServer():
- # 本服没有分配赛区不处理
- if not GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID):
- return
- __OnLoginNotifyPKOverInfo(curPlayer)
-
- # 同步所有赛区赛季信息
- zoneSeasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeasonInfo()
- zoneSeasonInfo.ZoneList = []
- ipyDataMgr = IpyGameDataPY.IPY_Data()
- for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
- zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
- 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 = [] if not seasonList else seasonList
- for seasonIpyData in seasonList:
- seasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeason()
- seasonInfo.SeasonID = seasonIpyData.GetSeasonID()
- seasonInfo.StartDate = seasonIpyData.GetStartDate()
- seasonInfo.EndDate = seasonIpyData.GetEndDate()
- seasonInfo.EndTime = seasonIpyData.GetEndTime()
- zoneInfo.SeasonList.append(seasonInfo)
- zoneInfo.SeasonCount = len(zoneInfo.SeasonList)
- zoneSeasonInfo.ZoneList.append(zoneInfo)
- zoneSeasonInfo.ZoneCount = len(zoneSeasonInfo.ZoneList)
- NetPackCommon.SendFakePack(curPlayer, zoneSeasonInfo)
-
- # 同步本服赛季状态
- gameWorld = GameWorld.GetGameWorld()
- seasonStatePack = ChPyNetSendPack.tagGCCrossRealmPKSeasonState()
- seasonStatePack.ZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
- 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)
- NetPackCommon.SendFakePack(curPlayer, seasonStatePack)
-
- # 跨服登录处理
- else:
- mapID = curPlayer.GetMapID()
- mapIDList = IpyGameDataPY.GetFuncCfg("CrossRealmPKMatch", 4)
- if mapID not in mapIDList:
- return
-
- GameWorld.Log("玩家登录跨服PK地图, mapID=%s" % mapID, curPlayer.GetPlayerID())
- if not __CheckCanLoginCrossServerPKMap(curPlayer):
- CrossRealmPlayer.PlayerExitCrossServer(curPlayer)
- return
+
+ # 本服没有分配赛区不处理
+ if not GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID):
+ return
+ __OnLoginNotifyPKOverInfo(curPlayer)
+
+ crossZoneName = GameWorld.GetCrossZoneName()
+ crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
+ if not crossZoneList:
+ return
+ # 同步所有赛区赛季信息
+ zoneSeasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeasonInfo()
+ zoneSeasonInfo.ZoneList = []
+ 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", crossZoneName, zoneID)
+ seasonList = [] if not seasonList else seasonList
+ for seasonIpyData in seasonList:
+ seasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeason()
+ seasonInfo.SeasonID = seasonIpyData.GetSeasonID()
+ seasonInfo.StartDate = seasonIpyData.GetStartDate()
+ seasonInfo.EndDate = seasonIpyData.GetEndDate()
+ seasonInfo.EndTime = seasonIpyData.GetEndTime()
+ zoneInfo.SeasonList.append(seasonInfo)
+ zoneInfo.SeasonCount = len(zoneInfo.SeasonList)
+ zoneSeasonInfo.ZoneList.append(zoneInfo)
+ zoneSeasonInfo.ZoneCount = len(zoneSeasonInfo.ZoneList)
+ NetPackCommon.SendFakePack(curPlayer, zoneSeasonInfo)
+
+ # 同步本服赛季状态
+ gameWorld = GameWorld.GetGameWorld()
+ seasonStatePack = ChPyNetSendPack.tagGCCrossRealmPKSeasonState()
+ seasonStatePack.ZoneID = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID)
+ 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
@@ -816,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
@@ -1046,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 = []
@@ -1627,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)
@@ -1666,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)
@@ -1702,7 +1741,6 @@
def CrossServerMsg_PKMatchResult(vsRoomDict):
## 跨服PK匹配结果
curServerGroupID = GameWorld.GetServerGroupID()
- actionType = ShareDefine.Def_CrossAction_PK
mapPosList = IpyGameDataPY.GetFuncEvalCfg("CrossRealmPKMatch", 5)
GameWorld.DebugLog("=== 收到PK匹配结果处理 === curServerGroupID=%s" % curServerGroupID)
if not mapPosList:
@@ -1727,7 +1765,7 @@
PlayerControl.SetVsRoomId(player, roomID, True)
# 通知地图玩家匹配成功, 上传数据, 准备进入跨服服务器
posX, posY = mapPosList[i] if len(mapPosList) > i else mapPosList[0]
- CrossRealmPlayer.SendCrossRealmReg(player, actionType, mapID, mapID, 0, posX, posY)
+ CrossRealmPlayer.SendCrossRealmReg(player, ChConfig.Def_FBMapID_CrossRealmPK, mapID, mapID, 0, posX, posY)
return
@@ -1773,7 +1811,7 @@
matchPlayer.MaxProDef = readyPlayerInfo["MaxProDef"]
break
- PlayerControl.SetCrossRealmState(player, 1)
+ PlayerControl.SetCrossMapID(player, ChConfig.Def_FBMapID_CrossRealmPK)
SetIsCrossPKMatching(player, 0)
# 通知匹配成功,可进入跨服
@@ -1816,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
@@ -1907,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