public virtual void Disconnect(GameClient client) { bool IsOwner = false; if (this.Owner == client) { IsOwner = true; } this.Leave(client, true); client.Character.Status.Update(null); Parent.Disconnect(client); // Enqueue all disconnect client if (IsInGame || !IsInGame) { var ack2 = new UpdateRoomPlayerCountAck() { Room = this }; var ack3 = new PlayerHasLeftRoomAck() { Token = client.Character?.Token, Character = client.Character, HasOwnerChange = IsOwner, Owner = this.Owner.GetIdentifier() }; // Invoke only when the room is in Room State and not in Game state EventDespatcher.EnqueueRoom(ack3.CreatePacket(), client); this.Parent.Broadcast(ack2.CreatePacket()); // Invoke the despatcher in 10s new Task(() => EventDespatcher.Invoke()).Start(); } }
public static void HandleLeaveRoom(Packet packet) { CmdLeaveRoom cmd = new CmdLeaveRoom(packet); if (packet.Sender.Character?.Token != cmd.Token) { packet.SendBackError(12); return; } Character character = packet.Sender.Character; // User can only leave from room if (character?.Status?.GetState() != typeof(Room)) { packet.SendBackError(11); return; } Room room = character.Status.GetObject <Room>(); // Update Status from Room to Lobby bool hasOwnerChange = room.Leave(packet.Sender); character.Unready(); var ack1 = new LeaveRoomAck() { Lobby = room.Parent }; var ack2 = new UpdateRoomPlayerCountAck() { Room = room }; var ack3 = new PlayerHasLeftRoomAck() { Token = packet.Sender.Character?.Token, Character = character, HasOwnerChange = hasOwnerChange, Owner = room.Owner.GetIdentifier() }; // Tell client if they successfully left room packet.SendBack(ack1.CreatePacket()); room.Broadcast(ack3.CreatePacket()); // Everyone in the lobby should receive note that the player count decreased packet.Sender.Character.Vec3 = new System.Numerics.Vector3(0, 0, 1); // 0.5 sleep then broadcast Thread.Sleep(500); packet.Sender.Character.Status.GetObject <IBroadcaster>().Broadcast(ack2.CreatePacket()); // Everyone in the room should receive note of the player that left. }