/// <summary> /// Handler for disconnections. /// </summary> /// <param name="client">The disconnected client.</param> public static void HandleDisconnection(Models.Entities.Player player) { Collections.PlayerCollection.Remove(player); if (player.Map != null) { if (player.Map.IsDynamic) { player.TeleportToLastMap(); } // Save coordinates and possible other unsaved changes ... player.DbPlayer.Update(); player.Map.RemoveFromMap(player); player.ClearScreen(); player.Map = null; } else if (player.DbPlayer != null) { // Save unsaved changes ... player.DbPlayer.Update(); } if (player.Team != null) { if (player.Team.IsLeader(player)) { var members = player.Team.Delete(); foreach (var member in members) { member.Team = null; if (member.ClientId != player.ClientId) { member.ClientSocket.Send(new Models.Packets.Team.TeamActionPacket { Action = Enums.TeamAction.Dismiss, ClientId = player.ClientId }); } } } player.Team = null; } if (player.Guild != null) { player.GuildMember.Player = null; player.GuildMember = null; player.Guild = null; } if (player.Nobility != null) { player.Nobility.Player = null; player.Nobility = null; } if (player.Battle != null) { player.Battle.HandleDisconnect(player); } if (player.ArenaInfo != null) { player.ArenaInfo.Player = null; player.ArenaInfo = null; } if (player.LoggedIn) { var traceId = player.ClientId.ToString("X2") + ";" + DateTime.UtcNow.ToBinary().ToString("X2"); player.ClientSocket.PacketTrace.Clone() .Select(packet => { return(new Database.Models.DbPacketTrace { PacketId = (int)packet.PacketType, PacketSubObject = packet.SubTypeObject != null ? packet.SubTypeObject.ToString() : string.Empty, OwnerId = player.DbPlayer.Id, TraceId = traceId, Size = packet.PhysicalSize, VirtualSize = (int)packet.VirtualSize, Buffer = (byte[])packet }); }).Create(); (new Database.Models.DbDisconnectTrace { TraceId = traceId, OwnerId = player.DbPlayer.Id, DisconnectReason = player.ClientSocket.LastException != null ? player.ClientSocket.LastException.ToString() : player.ClientSocket.DisconnectReason }).Create(); } Console.WriteLine(Drivers.Messages.SOCKET_DISCONNECT_MESSAGE, player.ClientSocket.IPAddress, player.ClientSocket.DisconnectReason); player.AddActionLog("Disconnect"); player.Free(); }