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. }
public static void HandleJoinRoom(Packet packet) { CmdJoinRoom cmd = new CmdJoinRoom(packet); if (packet.Sender.Character?.Token != cmd.Token) { packet.SendBackError(12); return; } Character character = packet.Sender.Character; // User can only join room from lobby if (character?.Status?.GetState() != typeof(Lobby)) { packet.SendBackError(11); return; } Lobby userLobby = character.Status.GetObject <Lobby>(); Room joinedRoom; // Unable to find the room in RoomManager if (!userLobby.RoomManager.Get(cmd.RoomId, out joinedRoom)) { packet.SendBackError(15); return; } if (joinedRoom.IsInGame) { packet.SendBackError(16); return; } // Room is full (max 4) if (joinedRoom.IsFull()) { packet.SendBackError(17); return; } // Room is locked and client entered wrong password if (cmd.IsLocked && cmd.Password != joinedRoom.Password) { packet.SendBackError(18); return; } // Room is not locked or successfully entered password // Update status to that room. joinedRoom.Join(packet.Sender); var ack1 = new JoinRoomAck() { Room = joinedRoom }; var ack2 = new UpdateRoomPlayerCountAck() { Room = joinedRoom }; var ack3 = new NewPlayerInRoomAck() { Token = packet.Sender.Character.Token, Character = character }; // Give client room details when they join packet.SendBack(ack1.CreatePacket()); // Everyone in the lobby should receive note that the player count increased userLobby.Broadcast(ack2.CreatePacket()); // Everyone in the room should receive note of the new player except for the player itself sicne ack1 is given to them joinedRoom.Broadcast(ack3.CreatePacket(), packet.Sender); }