From ad158391ff62df48198a5411e5950e578dc3c43c Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 11 四月 2019 14:42:21 +0800 Subject: [PATCH] 6459 【后端】【2.0】缥缈仙域开发单(可进入跨服妖王地图支持分区,增加竞争归属逻辑) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py | 184 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 184 insertions(+), 0 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py index dd9aa79..4b3114f 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py @@ -30,6 +30,12 @@ import PlayerTeam import GameWorld import ChConfig +import CrossRealmPlayer +import CrossRealmMsg +import ShareDefine +import CrossBoss + +import random #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -70,6 +76,184 @@ return dataMapID return mapID +def ClientServerMsg_EnterFB(serverGroupID, msgData): + ## 收到子服请求进入动态分配的跨服副本 + playerID = msgData["PlayerID"] + dataMapID = msgData["DataMapID"] + funcLineID = msgData["FuncLineID"] + + if dataMapID == ChConfig.Def_FBMapID_CrossDemonKing: + zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(dataMapID, serverGroupID) + if not zoneIpyData: + return + zoneID = zoneIpyData.GetZoneID() + bossID = msgData["BossID"] + if not CrossBoss.GetCrossBossIsAliveOrCanReborn(zoneID, bossID): + GameWorld.DebugLog("当前跨服妖王死亡状态,不可进入! serverGroupID=%s,funcLineID=%s,zoneID=%s,bossID=%s" % (serverGroupID, funcLineID, zoneID, bossID)) + return + + mapCopyLineInfo = __GetCrossDynamicLineInfo(dataMapID, funcLineID, zoneID) + if not mapCopyLineInfo: + return + mapID, copyMapID, isOpenNew = mapCopyLineInfo + + # 如果是等待线路启动中的直接返回,等启动好后再通知可进入 + if __AddWaitCrossFBOpenPlayer(mapID, copyMapID, isOpenNew, playerID, serverGroupID): + return + else: + return + + playerIDList = [playerID] + retInfo = [playerIDList, dataMapID, mapID, copyMapID] + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_EnterFBRet, retInfo, [serverGroupID]) + return + +def CrossServerMsg_EnterFBRet(msgData, tick): + ## 收到跨服服务器动态分配的跨服副本进入信息 + + playerIDList, dataMapID, mapID, copyMapID = msgData + + if dataMapID == ChConfig.Def_FBMapID_CrossDemonKing: + mapPosInfo = IpyGameDataPY.GetFuncEvalCfg("CrossDemonKingMap", 2) + else: + return + posX, posY = mapPosInfo + + for playerID in playerIDList: + curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) + if not curPlayer: + continue + CrossRealmPlayer.SendCrossRealmReg(curPlayer, dataMapID, mapID, dataMapID, copyMapID, posX, posY) + + return + +def __GetCrossDynamicLineInfo(dataMapID, funcLineID, zoneID): + ## 获取跨服分区对应动态分配的副本地图虚拟线路信息 + + isOpenNew = False + zoneLineKey = (zoneID, funcLineID) + if dataMapID not in PyGameData.g_crossDynamicLineInfo: + PyGameData.g_crossDynamicLineInfo[dataMapID] = {} + zoneLineDict = PyGameData.g_crossDynamicLineInfo[dataMapID] # 跨服动态线路信息 {dataMapID:{(zoneID, funcLineID):[mapID, copyMapID], ...}, ...} + if zoneLineKey in zoneLineDict: + mapID, copyMapID = zoneLineDict[zoneLineKey] + GameWorld.DebugLog("已存在该分区功能线路ID,不需要重新分配: zoneID=%s,funcLineID=%s,mapID=%s,copyMapID=%s" % (zoneID, funcLineID, mapID, copyMapID)) + return mapID, copyMapID, isOpenNew + + if dataMapID == ChConfig.Def_FBMapID_CrossDemonKing: + mapIDList = IpyGameDataPY.GetFuncEvalCfg("CrossDemonKingMap", 1) + + # 其他地图待扩展 + else: + return + + usedMapCopyList = zoneLineDict.values() # 已经使用中的地图虚拟线路 + openMapID, openCopyMapID = 0, 0 + for mapID in mapIDList: + maxCopyMapCount = PyGameData.g_crossMapCopyMapCountDict.get(mapID, 0) + for copyMapID in xrange(maxCopyMapCount): + if [mapID, copyMapID] not in usedMapCopyList: + openMapID, openCopyMapID = mapID, copyMapID + break + if openMapID: + break + if not openMapID: + GameWorld.ErrLog("没有空余的虚拟线路,无法动态开启跨服副本!dataMapID=%s, funcLineID=%s, zoneID=%s, mapIDList=%s" + % (dataMapID, funcLineID, zoneID, mapIDList)) + return + isOpenNew = True + mapID, copyMapID = openMapID, openCopyMapID + + zoneLineDict[zoneLineKey] = [mapID, copyMapID] + propertyID = zoneID * 1000 + funcLineID + GameWorld.DebugLog("不存在该分区功能线路ID,重新分配: zoneID=%s,funcLineID=%s,mapID=%s,copyMapID=%s,propertyID=%s" + % (zoneID, funcLineID, mapID, copyMapID, propertyID)) + + # 通知地图开启新的地图虚拟分线 + msgInfo = str([copyMapID, propertyID]) + GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, 0, mapID, "OpenFB", msgInfo, len(msgInfo)) + return mapID, copyMapID, isOpenNew + +def __AddWaitCrossFBOpenPlayer(mapID, copyMapID, isOpenNew, playerID, serverGroupID): + ## 添加跨服玩家进入等待动态副本虚拟线路开启队列 + + if mapID not in PyGameData.g_crossDynamicLineOpeningInfo: + PyGameData.g_crossDynamicLineOpeningInfo[mapID] = {} + openingMapCopyIDDict = PyGameData.g_crossDynamicLineOpeningInfo[mapID] # 跨服动态线路正在开启中的线路信息 {mapID:{copyMapID:{playerID:serverGroupID, ...}, ...}, ...} + + if isOpenNew or copyMapID in openingMapCopyIDDict: + if copyMapID not in openingMapCopyIDDict: + openingMapCopyIDDict[copyMapID] = {} + waitingPlayerDict = openingMapCopyIDDict[copyMapID] + waitingPlayerDict[playerID] = serverGroupID + GameWorld.Log("添加玩家进入等待跨服动态副本虚拟线路开启队列: mapID=%s,copyMapID=%s,isOpenNew=%s,playerID=%s,serverGroupID=%s" + % (mapID, copyMapID, isOpenNew, playerID, serverGroupID)) + GameWorld.Log(" PyGameData.g_crossDynamicLineOpeningInfo=%s" % PyGameData.g_crossDynamicLineOpeningInfo) + return True + return False + +def OnCrossDynamicLineOpen(mapID, copyMapID): + ## 动态分配线路的地图虚拟线路启动成功 + + if mapID not in PyGameData.g_crossDynamicLineOpeningInfo: + return + openingCopyMapDict = PyGameData.g_crossDynamicLineOpeningInfo[mapID] + waitingPlayerDict = openingCopyMapDict.pop(copyMapID, {}) + if not waitingPlayerDict: + return + + # 通知子服等待中的玩家可以进入副本 + serverPlayerIDListDict = {} + for playerID, serverGroupID in waitingPlayerDict.items(): + if serverGroupID not in serverPlayerIDListDict: + serverPlayerIDListDict[serverGroupID] = [] + playerIDList = serverPlayerIDListDict[serverGroupID] + playerIDList.append(playerID) + + dataMapID = GetRecordMapID(mapID) + GameWorld.Log("动态分配虚拟线路启动成功,通知子服等待玩家可进入: dataMapID=%s,mapID=%s,copyMapID=%s,serverPlayerIDListDict=%s" + % (dataMapID, mapID, copyMapID, serverPlayerIDListDict)) + for serverGroupID, playerIDList in serverPlayerIDListDict.items(): + retInfo = [playerIDList, dataMapID, mapID, copyMapID] + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_EnterFBRet, retInfo, [serverGroupID]) + + GameWorld.DebugLog(" PyGameData.g_crossDynamicLineInfo=%s" % PyGameData.g_crossDynamicLineInfo) + GameWorld.DebugLog(" PyGameData.g_crossDynamicLineOpeningInfo=%s" % PyGameData.g_crossDynamicLineOpeningInfo) + return + +def OnCrossDynamicLineClose(mapID, copyMapID): + ## 动态分配线路的地图虚拟线路关闭 + + dataMapID = GetRecordMapID(mapID) + GameWorld.Log("动态分配虚拟线路关闭 dataMapID=%s,mapID=%s,copyMapID=%s" % (dataMapID, mapID, copyMapID)) + zoneLineDict = PyGameData.g_crossDynamicLineInfo.get(dataMapID, {}) + for key, mapCopyInfo in zoneLineDict.items(): + if mapCopyInfo[0] == mapID and mapCopyInfo[1] == copyMapID: + zoneLineDict.pop(key) + break + + openingCopyMapDict = PyGameData.g_crossDynamicLineOpeningInfo.get(mapID, {}) + openingCopyMapDict.pop(copyMapID, {}) + + GameWorld.DebugLog(" PyGameData.g_crossDynamicLineInfo=%s" % PyGameData.g_crossDynamicLineInfo) + GameWorld.DebugLog(" PyGameData.g_crossDynamicLineOpeningInfo=%s" % PyGameData.g_crossDynamicLineOpeningInfo) + return + +def OnCrossDynamicMapReset(mapID, copyMapCount): + ## 动态分配线路的地图重置 + + dataMapID = GetRecordMapID(mapID) + GameWorld.Log("动态分配虚拟线路地图重置 dataMapID=%s,mapID=%s,copyMapCount=%s" % (dataMapID, mapID, copyMapCount)) + PyGameData.g_crossMapCopyMapCountDict[mapID] = copyMapCount + + zoneLineDict = PyGameData.g_crossDynamicLineInfo.get(dataMapID, {}) + for key, mapCopyInfo in zoneLineDict.items(): + if mapCopyInfo[0] == mapID: + zoneLineDict.pop(key) + + PyGameData.g_crossDynamicLineOpeningInfo.pop(mapID, None) + return + ## 请求进入副本分线 # @param curPlayer: 请求玩家 # @param queryCallName: 请求回调名 -- Gitblit v1.8.0