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; return false;
bool val = _interalStorage[key].Remove(value); bool val = _interalStorage[key].Remove(value);
if (!val) if (!val)
return false; return false;
+48 -27
View File
@@ -52,6 +52,7 @@ namespace Game.Networking
long _LastPingTime; long _LastPingTime;
uint _OverSpeedPings; uint _OverSpeedPings;
object _worldSessionLock = new object();
WorldSession _worldSession; WorldSession _worldSession;
ZLib.z_stream _compressionStream; ZLib.z_stream _compressionStream;
@@ -324,23 +325,26 @@ namespace Game.Networking
HandleEnterEncryptedModeAck(); HandleEnterEncryptedModeAck();
break; break;
default: default:
if (_worldSession == null) lock (_worldSessionLock)
{ {
Log.outError(LogFilter.Network, $"ProcessIncoming: Client not authed opcode = {opcode}"); if (_worldSession == null)
return ReadDataHandlerResult.Error; {
Log.outError(LogFilter.Network, $"ProcessIncoming: Client not authed opcode = {opcode}");
return ReadDataHandlerResult.Error;
}
if (!PacketManager.ContainsHandler(opcode))
{
Log.outError(LogFilter.Network, $"No defined handler for opcode {opcode} sent by {_worldSession.GetPlayerInfo()}");
break;
}
// Our Idle timer will reset on any non PING opcodes on login screen, allowing us to catch people idling.
_worldSession.ResetTimeOutTime(false);
// Copy the packet to the heap before enqueuing
_worldSession.QueuePacket(packet);
} }
if (!PacketManager.ContainsHandler(opcode))
{
Log.outError(LogFilter.Network, $"No defined handler for opcode {opcode} sent by {_worldSession.GetPlayerInfo()}");
break;
}
// Our Idle timer will reset on any non PING opcodes on login screen, allowing us to catch people idling.
_worldSession.ResetTimeOutTime(false);
// Copy the packet to the heap before enqueuing
_worldSession.QueuePacket(packet);
break; break;
} }
@@ -398,7 +402,8 @@ namespace Game.Networking
public void SetWorldSession(WorldSession session) public void SetWorldSession(WorldSession session)
{ {
_worldSession = session; lock (_worldSessionLock)
_worldSession = session;
} }
public uint CompressPacket(byte[] data, ServerOpcodes opcode, out byte[] outData) public uint CompressPacket(byte[] data, ServerOpcodes opcode, out byte[] outData)
@@ -436,6 +441,16 @@ namespace Game.Networking
return true; return true;
} }
public override void OnClose()
{
lock (_worldSessionLock)
{
_worldSession.Dispose();
_worldSession = null;
}
base.OnClose();
}
void HandleSendAuthSession() void HandleSendAuthSession()
{ {
AuthChallenge challenge = new AuthChallenge(); AuthChallenge challenge = new AuthChallenge();
@@ -781,10 +796,13 @@ namespace Game.Networking
uint maxAllowed = WorldConfig.GetUIntValue(WorldCfg.MaxOverspeedPings); uint maxAllowed = WorldConfig.GetUIntValue(WorldCfg.MaxOverspeedPings);
if (maxAllowed != 0 && _OverSpeedPings > maxAllowed) if (maxAllowed != 0 && _OverSpeedPings > maxAllowed)
{ {
if (_worldSession != null && !_worldSession.HasPermission(RBACPermissions.SkipCheckOverspeedPing)) lock (_worldSessionLock)
{ {
Log.outError(LogFilter.Network, "WorldSocket:HandlePing: {0} kicked for over-speed pings (address: {1})", _worldSession.GetPlayerInfo(), GetRemoteIpAddress()); if (_worldSession != null && !_worldSession.HasPermission(RBACPermissions.SkipCheckOverspeedPing))
//return ReadDataHandlerResult.Error; {
Log.outError(LogFilter.Network, "WorldSocket:HandlePing: {0} kicked for over-speed pings (address: {1})", _worldSession.GetPlayerInfo(), GetRemoteIpAddress());
//return ReadDataHandlerResult.Error;
}
} }
} }
} }
@@ -792,15 +810,18 @@ namespace Game.Networking
_OverSpeedPings = 0; _OverSpeedPings = 0;
} }
if (_worldSession != null) lock (_worldSessionLock)
{ {
_worldSession.SetLatency(ping.Latency); if (_worldSession != null)
_worldSession.ResetClientTimeDelay(); {
} _worldSession.SetLatency(ping.Latency);
else _worldSession.ResetClientTimeDelay();
{ }
Log.outError(LogFilter.Network, "WorldSocket:HandlePing: peer sent CMSG_PING, but is not authenticated or got recently kicked, address = {0}", GetRemoteIpAddress()); else
return false; {
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)); SendPacket(new Pong(ping.Serial));
+3
View File
@@ -86,6 +86,9 @@ namespace Game
public void LogoutPlayer(bool save) public void LogoutPlayer(bool save)
{ {
if (m_playerLogout)
return;
// finish pending transfers before starting the logout // finish pending transfers before starting the logout
while (_player && _player.IsBeingTeleportedFar()) while (_player && _player.IsBeingTeleportedFar())
HandleMoveWorldportAck(); HandleMoveWorldportAck();