From e80c7791aaccb10fc70c9e40abe61dccc75fa305 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 07 五月 2019 20:57:39 +0800 Subject: [PATCH] 6459 【后端】【2.0】缥缈仙域开发单(优化跨服掉线重上后目标线路已关闭时跨服标记重置逻辑) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py | 5 +++-- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py | 2 ++ ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py | 21 ++++++++++++++++----- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_SetPlayerAttr.py | 2 +- ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 4 ++++ ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py | 9 +++++++++ 6 files changed, 35 insertions(+), 8 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py index 9b62c48..b15218c 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py @@ -1911,6 +1911,8 @@ sendMapOverInfo = [roomID, zoneID, seasonID, timeStr, overType, winnerID, roundWinnerIDList, pkScore, danLV, cWinCount, addScore, tagPlayerID, tagPlayerName, notifyState] player = GameWorld.GetPlayerManager().FindPlayerByID(playerID) + if not player: + CrossRealmPlayer.DoOfflinePlayerExitCrossServer(playerID) if not player or PlayerControl.GetIsTJG(player): GameWorld.DebugLog(" 玩家不在线 或脱机中,先缓存,玩家上线后再同步,playerID=%s" % (playerID)) overInfoData = PyGameDataStruct.tagDBCrossPKUnNotifyOverInfo() diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py index abd0868..578cae2 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py @@ -635,6 +635,10 @@ elif packType == IPY_GameServer.CDBPlayerRefresh_VIPLv: curPlayer.SetVIPLv(packValue); # __RefreshTeamState(curPlayer) + + elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr5: + PlayerControl.SetCrossMapID(curPlayer, packValue, False) + elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr9: PlayerControl.SetVIPExpireTime(curPlayer, packValue) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py index 9cbeaaa..f700782 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py @@ -28,6 +28,8 @@ import NetPackCommon import IpyGameDataPY import PyGameData +import PlayerDBOper + # 获取玩家跨服服务器上的名字 #=============================================================================== # def GetCrossPlayerName(curPlayer): @@ -181,10 +183,17 @@ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: GameWorld.Log(" 退出跨服时本服玩家不在线!", playerID) + DoOfflinePlayerExitCrossServer(playerID) return PlayerControl.SetCrossMapID(curPlayer, 0) return +def DoOfflinePlayerExitCrossServer(playerID): + ## 处理离线玩家退出跨服服务器更新DB数据逻辑 + + PlayerDBOper.UpdateDBOper(PlayerDBOper.Table_DBPlayer, {"PlayerID":playerID}, {"ExAttr5":0}) + return + def SendCrossRealmReg(curPlayer, registerMap, mapID=0, dataMapID=0, copyMapID=0, posX=0, posY=0, lineID=0): # 发送跨服账号注册上传数据 diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py index b0efe21..d43cfd5 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py @@ -285,9 +285,10 @@ ## 跨服状态所在地图ID: 0-非跨服状态,非0-跨服状态对应的地图ID def GetCrossMapID(curPlayer): return curPlayer.GetExAttr5() -def SetCrossMapID(curPlayer, value): +def SetCrossMapID(curPlayer, value, isNotifyMapServer=True): curPlayer.SetExAttr5(value) - SetMapServerPlayerAttrValue(curPlayer, "SetExAttr5", value) + if isNotifyMapServer: + SetMapServerPlayerAttrValue(curPlayer, "SetExAttr5", value) return def SetMapServerPlayerAttrValue(curPlayer, attrName, value, exData=[]): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py index f3e6c51..a3defea 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py @@ -33,12 +33,9 @@ import IPY_PlayerDefine import CrossRealmPlayer import CrossRealmMsg -import ChPyNetSendPack -import NetPackCommon import ShareDefine import CrossBoss -import random #--------------------------------------------------------------------- ## 跨服地图动态分配的功能线路,如果有人数上限的,则同分区同地图玩法的可能同时存在多个相同功能线路的数据 @@ -64,6 +61,7 @@ self.openState = IPY_PlayerDefine.fbosClosed self.fbPlayerDict = {} # 副本中的玩家信息 {playerID:serverGroupID, ...} self.waitPlayerDict = {} # 等待进入的玩家信息 {playerID:[serverGroupID, tick], ...} + self.offlinePlayerDict = {} # 掉线的玩家信息,非主动退出的 {playerID:serverGroupID, ...} return def OnRequestEnterCrossCopyMap(self, playerID, serverGroupID, tick, copyMapPlayerMax): @@ -360,6 +358,11 @@ funcLineID = copyMapObj.funcLineID playerCountInfo = [playerCount] SyncClientServerCrossFBFuncLinePlayerCount(zoneID, mapID, funcLineID, playerCountInfo) + + #如果虚拟分线关闭时,有掉线的玩家,则通知子服重置这些玩家的跨服状态 + for playerID, serverGroupID in copyMapObj.offlinePlayerDict.items(): + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ExitCrossServer, playerID, [serverGroupID]) + return def OnCrossDynamicMapReset(msgList): @@ -395,12 +398,14 @@ playerID = curPlayer.GetPlayerID() serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer) copyMapObj.waitPlayerDict.pop(playerID, None) + copyMapObj.offlinePlayerDict.pop(playerID, None) copyMapObj.fbPlayerDict[playerID] = serverGroupID #GameWorld.DebugLog("玩家登录动态分配的跨服地图: GetMapID=%s,GetRealMapID=%s,GetFBID()=%s,serverGroupID=%s" # % (curPlayer.GetMapID(), mapID, copyMapID, serverGroupID), playerID) #GameWorld.DebugLog(" 副本中的玩家ID: %s" % copyMapObj.fbPlayerDict) #GameWorld.DebugLog(" 等待中的玩家ID: %s" % copyMapObj.waitPlayerDict) + #GameWorld.DebugLog(" 离线中的玩家ID: %s" % copyMapObj.offlinePlayerDict) playerCount = len(copyMapObj.fbPlayerDict) # 等待进入的暂时不算 zoneID = copyMapObj.zoneID @@ -436,10 +441,16 @@ copyMapObj.waitPlayerDict.pop(playerID, None) copyMapObj.fbPlayerDict.pop(playerID, None) - #GameWorld.DebugLog("玩家退出动态分配的跨服地图: GetMapID=%s,GetRealMapID=%s,GetFBID()=%s" - # % (curPlayer.GetMapID(), mapID, copyMapID), playerID) + crossMapID = PlayerControl.GetCrossMapID(curPlayer) + # 不是主动退出的 + if crossMapID: + copyMapObj.offlinePlayerDict[playerID] = PlayerControl.GetPlayerServerGroupID(curPlayer) + + #GameWorld.DebugLog("玩家退出动态分配的跨服地图: GetMapID=%s,GetRealMapID=%s,GetFBID()=%s,crossMapID=%s" + # % (curPlayer.GetMapID(), mapID, copyMapID, crossMapID), playerID) #GameWorld.DebugLog(" 副本中的玩家ID: %s" % copyMapObj.fbPlayerDict) #GameWorld.DebugLog(" 等待中的玩家ID: %s" % copyMapObj.waitPlayerDict) + #GameWorld.DebugLog(" 离线中的玩家ID: %s" % copyMapObj.offlinePlayerDict) return def CrossServerMsg_FBPlayerCount(msgData): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_SetPlayerAttr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_SetPlayerAttr.py index 67f8bbf..b4781be 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_SetPlayerAttr.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_SetPlayerAttr.py @@ -36,7 +36,7 @@ attrName, value = setInfo[:2] if hasattr(curPlayer, attrName): # 要在更新值之前处理 - if attrName == "SetExAttr5": + if attrName == "SetExAttr5" and not GameWorld.IsCrossServer(): if value: CrossRealmPlayer.DoEnterCrossRealm(curPlayer) elif PlayerControl.GetCrossMapID(curPlayer): -- Gitblit v1.8.0