public void Join(Player joiningPlayer, string password = "") { Logger.Log(this, "Player {0} joined room {1}", joiningPlayer.Data.Name, RoomData.ID); // Prevent join if password is incorrect if (joiningPlayer.Data.ID != Owner.Data.ID && password != RoomData.Password) { Logger.Log(this, "Player {0} provided incorrect password {1}. (Is {2})", joiningPlayer.Data.Name, password, RoomData.Password); joiningPlayer.SendRoomJoinNotice(RoomNotice.InvalidPassword); return; } // Prevent join if room is full if (Players.Count == Settings.Values.Server.MaxPlayers) { Logger.Log(this, "Player {0} attempt to join the room {1} but that room is full", joiningPlayer.Data.Name, RoomData.ID); joiningPlayer.SendRoomJoinNotice(RoomNotice.RoomFull); return; } // Prevent join if game has started if (RoomData.GameStarted) { Logger.Log(this, "Player {0} attempt to join the room {1} but the game has already started", joiningPlayer.Data.Name, RoomData.ID); joiningPlayer.SendRoomJoinNotice(RoomNotice.GameAlreadyStarted); return; } if (Players.Contains(joiningPlayer)) { // TODO: Handle player rejoining room after disconnection? Logger.Log(this, "Already contains player {0}", joiningPlayer.Data.Name); joiningPlayer.SendRoomJoinNotice(RoomNotice.AlreadyInRoom); } else { joiningPlayer.SendRoomJoinNotice(RoomNotice.None); // Assign colour var color = RoomIdPool.GetValue(); joiningPlayer.AssignRoomId(color); Players.Add(joiningPlayer); RoomData.Players.Add(joiningPlayer.Data); // Add callbacks joiningPlayer.OnConnectionClosed += OnPlayerConnectionClosed; joiningPlayer.OnAwayStatusChanged += OnPlayerAwayStatusChanged; // Send message to joining player EchoActionToAll(joiningPlayer.Data, PlayerAction.Joined); SendUpdateToAll(); } }