/// <summary> /// Disposes associated resources and stops the client. Also removes the client from the server's client/entity lists. /// </summary> public void Dispose() { _Player.Server.Logger.Log(Chraft.Logger.LogLevel.Info, "Disposing {0}", _Player.DisplayName); string disconnectMsg = ChatColor.Yellow + _Player.DisplayName + " has left the game."; //Event ClientLeftEventArgs e = new ClientLeftEventArgs(this); _Player.Server.PluginManager.CallEvent(Plugins.Events.Event.PLAYER_LEFT, e); //You cant stop the player from leaving so dont try. disconnectMsg = e.BrodcastMessage; //End Event _Player.Server.Broadcast(disconnectMsg); if(_Player.LoggedIn) Save(); _Player.LoggedIn = false; _Player.Server.RemoveClient(this); _Player.Server.Logger.Log(Chraft.Logger.LogLevel.Info, "Clients online: {0}", _Player.Server.Clients.Count); _Player.Server.RemoveEntity(_Player); foreach (int packedCoords in _Player.LoadedChunks.Keys) { Chunk chunk = _Player.World.GetChunk(UniversalCoords.FromPackedChunk(packedCoords), false, false); if (chunk != null) chunk.RemoveClient(this); } RecvBufferPool.ReleaseBuffer(_RecvBuffer); SendSocketEventPool.Push(_SendSocketEvent); RecvSocketEventPool.Push(_RecvSocketEvent); if (_Socket.Connected) _Socket.Close(); GC.Collect(); }
public virtual void OnPlayerLeft(ClientLeftEventArgs e) { }
/// <summary> /// Disposes associated resources and stops the client. Also removes the client from the server's client/entity lists. /// </summary> public void Dispose() { if (_player != null) { Server.Logger.Log(Chraft.Logger.LogLevel.Info, "Disposing {0}", _player.DisplayName); string disconnectMsg = ChatColor.Yellow + _player.DisplayName + " has left the game."; //Event ClientLeftEventArgs e = new ClientLeftEventArgs(this); Server.PluginManager.CallEvent(Plugins.Events.Event.PlayerLeft, e); //You cant stop the player from leaving so dont try. disconnectMsg = e.BrodcastMessage; //End Event if (_player.LoggedIn) { _player.Server.BroadcastSync(disconnectMsg, this); Save(); } Task.Factory.StartNew(() => { foreach (Chunk chunk in _player.LoadedChunks.Values) { if (chunk != null) chunk.RemoveClient(this); } }); Server.RemoveAuthenticatedClient(this); Server.Logger.Log(Chraft.Logger.LogLevel.Info, "Clients online: {0}", Server.Clients.Count); Server.RemoveEntity(_player, false); Client[] nearbyClients = Server.GetNearbyPlayers(_player.World, UniversalCoords.FromAbsWorld(_player.Position)).ToArray(); foreach (var client in nearbyClients) { if (client != this) { DestroyEntityPacket de = new DestroyEntityPacket {EntityId = _player.EntityId}; de.Write(); byte[] data = de.GetBuffer(); client.Send_Sync(data); } } _player.LoggedIn = false; _player.Ready = false; Running = false; if (_keepAliveTimer != null) { _keepAliveTimer.Dispose(); _keepAliveTimer = null; } } else { Server.Logger.Log(Chraft.Logger.LogLevel.Info, "Disposing {0}", Username); Running = false; Server.RemoveClient(this); Server.Logger.Log(Chraft.Logger.LogLevel.Info, "Clients online: {0}", Server.Clients.Count); Server.FreeConnectionSlot(); } _chunkSendTimer.Dispose(); _chunkSendTimer = null; RecvBufferPool.ReleaseBuffer(_recvBuffer); SendSocketEventPool.Push(_sendSocketEvent); RecvSocketEventPool.Push(_recvSocketEvent); if (_socket.Connected) { try { _socket.Shutdown(SocketShutdown.Both); } catch(SocketException) { // Ignore errors in socket shutdown (e.g. if client crashes there is a no connection error when trying to shutdown) } } _socket.Close(); //GC.Collect(); }
/// <summary> /// Disposes associated resources and stops the client. Also removes the client from the server's client/entity lists. /// </summary> public void Dispose() { string disconnectMsg = ChatColor.Yellow + DisplayName + " has left the game."; StopUpdateChunks(); //Event ClientLeftEventArgs e = new ClientLeftEventArgs(this); Server.PluginManager.CallEvent(Plugins.Events.Event.PLAYER_LEFT, e); //You cant stop the player from leaving so dont try. disconnectMsg = e.BrodcastMessage; //End Event Server.Broadcast(disconnectMsg); Save(); Running = false; LoggedIn = false; PacketHandler.Dispose(); Server.Clients.Remove(this.SessionID); Server.RemoveEntity(this); foreach (PointI c in LoadedChunks.Keys) { Chunk chunk = World[c.X, c.Z, false, false]; if (chunk != null) chunk.RemoveClient(this); } if (Tcp.Connected) Tcp.Close(); GC.Collect(); }
private void OnPlayerLeft(ClientLeftEventArgs e) { foreach (EventListener bl in Plugins) { PlayerListener pl = (PlayerListener)bl.Listener; if (bl.Event == Event.PLAYER_LEFT) pl.OnPlayerLeft(e); } }