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