protected virtual void ClientDisconnected(object sender, DisconnectEventArgs e) { AresClient user = null; var socket = sender as ISocket; if (socket == null) { return; } lock (pending) pending.RemoveAll((s) => s.Equals(socket)); lock (users.SyncRoot) { int uindex = users.FindIndex(s => s.Socket == sender); if (uindex == -1) { return; } user = (AresClient)users[uindex]; users.RemoveAt(uindex); } if (user.LoggedIn) { history.Add(user); SendPacket((s) => !s.Guid.Equals(user.Guid) && //ghost? s.Vroom == user.Vroom, new Parted(user.Name)); } plugins.OnPart(user, e.UserToken); idpool.Push(user.Id); user.Dispose(); }