Core/Maps: Fixes player not being removed from map/server when they close the client without using logout/exitgame

This commit is contained in:
hondacrx
2021-02-11 10:32:09 -05:00
parent f254e9417c
commit 0fd5044a71
3 changed files with 51 additions and 28 deletions
-1
View File
@@ -87,7 +87,6 @@ namespace System.Collections.Generic
return false;
bool val = _interalStorage[key].Remove(value);
if (!val)
return false;
+21
View File
@@ -52,6 +52,7 @@ namespace Game.Networking
long _LastPingTime;
uint _OverSpeedPings;
object _worldSessionLock = new object();
WorldSession _worldSession;
ZLib.z_stream _compressionStream;
@@ -324,6 +325,8 @@ namespace Game.Networking
HandleEnterEncryptedModeAck();
break;
default:
lock (_worldSessionLock)
{
if (_worldSession == null)
{
Log.outError(LogFilter.Network, $"ProcessIncoming: Client not authed opcode = {opcode}");
@@ -341,6 +344,7 @@ namespace Game.Networking
// Copy the packet to the heap before enqueuing
_worldSession.QueuePacket(packet);
}
break;
}
@@ -398,6 +402,7 @@ namespace Game.Networking
public void SetWorldSession(WorldSession session)
{
lock (_worldSessionLock)
_worldSession = session;
}
@@ -436,6 +441,16 @@ namespace Game.Networking
return true;
}
public override void OnClose()
{
lock (_worldSessionLock)
{
_worldSession.Dispose();
_worldSession = null;
}
base.OnClose();
}
void HandleSendAuthSession()
{
AuthChallenge challenge = new AuthChallenge();
@@ -780,6 +795,8 @@ namespace Game.Networking
uint maxAllowed = WorldConfig.GetUIntValue(WorldCfg.MaxOverspeedPings);
if (maxAllowed != 0 && _OverSpeedPings > maxAllowed)
{
lock (_worldSessionLock)
{
if (_worldSession != null && !_worldSession.HasPermission(RBACPermissions.SkipCheckOverspeedPing))
{
@@ -788,10 +805,13 @@ namespace Game.Networking
}
}
}
}
else
_OverSpeedPings = 0;
}
lock (_worldSessionLock)
{
if (_worldSession != null)
{
_worldSession.SetLatency(ping.Latency);
@@ -802,6 +822,7 @@ namespace Game.Networking
Log.outError(LogFilter.Network, "WorldSocket:HandlePing: peer sent CMSG_PING, but is not authenticated or got recently kicked, address = {0}", GetRemoteIpAddress());
return false;
}
}
SendPacket(new Pong(ping.Serial));
return true;
+3
View File
@@ -86,6 +86,9 @@ namespace Game
public void LogoutPlayer(bool save)
{
if (m_playerLogout)
return;
// finish pending transfers before starting the logout
while (_player && _player.IsBeingTeleportedFar())
HandleMoveWorldportAck();