From e893a6cab624a161ae6c09dd48dfd1f1e97d929b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 26 十月 2018 15:01:08 +0800
Subject: [PATCH] 3964 【后端】防范登录下线流程错误
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 25 ++++++++----
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 31 +++++++++++----
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 14 +++++-
3 files changed, 50 insertions(+), 20 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
index a92f212..ec1801a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -68,6 +68,7 @@
import GMT_CTG
import PyGameData
import GMShell
+import IPY_PlayerDefine
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -77,7 +78,15 @@
# @return None
# @remarks 登陆顺序, PlayerLogin->PlayerLoadMapState(PlayerLoginLoadMapOK), 此处未设置初始化状态
def PlayerLogin(index, tick):
- GameWorld.GetPsycoFunc(__Func_PlayerLogin)(index, tick)
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ try:
+ __Func_PlayerLogin(curPlayer, tick)
+ except:
+ curPlayer.Kick(IPY_PlayerDefine.disWaitForPlayerLoinError)
+ import traceback
+ GameWorld.ErrLog("玩家上线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
+ if GameWorld.GetGameWorld().GetDebugLevel():
+ raise Exception("玩家上线逻辑错误~~~~\r\n%s" % traceback.format_exc())
return
#---------------------------------------------------------------------
@@ -86,10 +95,8 @@
# @param tick 当前时间
# @return None
# @remarks 登陆顺序, PlayerLogin->PlayerLoadMapState(PlayerLoginLoadMapOK), 此处未设置初始化状态
-def __Func_PlayerLogin(index, tick):
+def __Func_PlayerLogin(curPlayer, tick):
- #玩家登录初始化
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#玩家在线时间初始化
InitPlayerOnLineTime(curPlayer, tick)
#玩家响应信息初始化
@@ -483,7 +490,16 @@
# @return None
# @remarks 函数详细说明.
def PlayerDisconnect(index, tick):
- GameWorld.GetPsycoFunc(__Func_PlayerDisconnect)(index, tick)
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ try:
+ __Func_PlayerDisconnect(curPlayer, tick)
+ except:
+ import traceback
+ GameWorld.ErrLog("玩家下线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
+ if GameWorld.GetGameWorld().GetDebugLevel():
+ raise Exception("玩家下线逻辑错误~~~~\r\n%s" % traceback.format_exc())
+ #调用底层下线
+ curPlayer.DoDisconnect()
return
## 玩家下线(封包参数)
@@ -491,8 +507,7 @@
# @param tick 当前时间
# @return None
# @remarks 函数详细说明.
-def __Func_PlayerDisconnect(index, tick):
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+def __Func_PlayerDisconnect(curPlayer, tick):
#跨服匹配PK
#GameWorldMergePK.OnLeaveServer(curPlayer)
@@ -510,8 +525,6 @@
#MergePlayer.OnPlayerLeaveGotoMergeServer(curPlayer, tick)
#------------镖车逻辑
#TruckPlayerDisconnectProcess(curPlayer, tick)
- #调用底层下线
- curPlayer.DoDisconnect()
return
## 设置玩家离线时间
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index d80d601..9533992 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -925,14 +925,23 @@
#这里只做初始化逻辑
#在玩家切换场景的时候, 不会调用到这里
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- InitLoginPlayer(curPlayer, tick)
- DoPlayerLogin(curPlayer, tick)
+ try:
+ InitLoginPlayer(curPlayer, tick)
+ DoPlayerLogin(curPlayer, tick)
+
+ #锁住玩家, 等到读取地图成功, 再解锁
+ curPlayer.SetCanMove(False)
+
+ #登陆发图形验证码
+ PlayerAutoCheckOnline.PlayerLoginCaptcha(curPlayer, tick)
+ except:
+ curPlayer.Kick(IPY_GameWorld.disWaitForPlayerLoinError)
+ import traceback
+ GameWorld.ErrLog("玩家上线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
+ if GameWorld.GetGameWorld().GetDebugLevel():
+ raise Exception("玩家上线逻辑错误~~~~\r\n%s" % traceback.format_exc())
+ return
- #锁住玩家, 等到读取地图成功, 再解锁
- curPlayer.SetCanMove(False)
-
- #登陆发图形验证码
- PlayerAutoCheckOnline.PlayerLoginCaptcha(curPlayer, tick)
#---------------------------------------------------------------------
##C++封包触发, 玩家切换地图的时候, 在本地图登录
@@ -2420,7 +2429,7 @@
import traceback
GameWorld.ErrLog("玩家下线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
if GameWorld.GetGameWorld().GetDebugLevel():
- raise Exception("玩家下线~~~~~\r\n%s" % traceback.format_exc())
+ raise Exception("玩家下线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
#调用底层使玩家下线
curPlayer.DoDisconnect(tick)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 6ecda8d..d479a12 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -426,9 +426,17 @@
# @remarks 函数详细说明.
def GameServer_InitOK(index, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- #通知BServer自己OK了
- curPlayer.SendToBServerServerInitOK()
- ChPlayer.OnAllServerInitOK(curPlayer, tick)
+ try:
+ #通知BServer自己OK了
+ curPlayer.SendToBServerServerInitOK()
+ ChPlayer.OnAllServerInitOK(curPlayer, tick)
+ except:
+ curPlayer.Kick(IPY_GameWorld.disWaitForPlayerLoinError)
+ import traceback
+ GameWorld.ErrLog("玩家上线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
+ if GameWorld.GetGameWorld().GetDebugLevel():
+ raise Exception("玩家上线逻辑错误~~~~\r\n%s" % traceback.format_exc())
+ return
#--------------------------------------------------------
def PlayerOnDay(curPlayer):
--
Gitblit v1.8.0