Exemplo n.º 1
0
        /// <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();
        }
Exemplo n.º 2
0
 public virtual void OnPlayerLeft(ClientLeftEventArgs e)
 {
 }
Exemplo n.º 3
0
        /// <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();
        }
Exemplo n.º 4
0
        /// <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();
        }
Exemplo n.º 5
0
 private void OnPlayerLeft(ClientLeftEventArgs e)
 {
     foreach (EventListener bl in Plugins)
     {
         PlayerListener pl = (PlayerListener)bl.Listener;
         if (bl.Event == Event.PLAYER_LEFT)
             pl.OnPlayerLeft(e);
     }
 }