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