private void buttonConnect_Click(object sender, EventArgs e) { if (player == null) { if (textBoxPlayerName.Text.Trim() != "") { if (gameRoom != null) { string playerName = textBoxPlayerName.Text.Trim(); // Register (if not already) gameRoom.RegisterPlayer(playerName, "password"); // Enter the game room player = gameRoom.Enter(playerName, "password"); if (player != null) { buttonConnect.Text = "Disconnect"; textBoxPlayerName.Enabled = false; groupBoxGameRoomControls.Enabled = true; player.AddListener(this); UpdateConnectedPlayersList(); } else { MessageBox.Show("Login failed!", "Login Error (username)!", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); } } else { MessageBox.Show("Login failed (no game room connection)!", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); } } else { MessageBox.Show("Login failed (no username specified)!", "Login Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); } } else { if (gameRoom != null) { gameRoom.Leave(player); gameRoom.RemoveListener(this); player.RemoveListener(this); player = null; } buttonConnect.Text = "Connect"; textBoxPlayerName.Enabled = true; groupBoxGameRoomControls.Enabled = false; } }
/// <summary> /// Exit the game room by player /// </summary> /// <param name="_player">Backgammon player who wants to leave the game room</param> public void Leave(NetworkBackgammonPlayer _player) { if (connectedPlayers.Contains(_player)) { // The disconnected player should no longer be listening... RemoveListener(_player); // Stop listening to this player _player.RemoveListener(this); // Check if player is associated with a game room and remove if necessary NetworkBackgammonGameSession _playerGameSession = GetGameSession(_player); if (_playerGameSession != null) { // Disconnect the player from the game session _player.RemoveListener(_playerGameSession); // Disconnect the game session from the player _playerGameSession.RemoveListener(_player); // Get the opposing player NetworkBackgammonPlayer opposingPlayer = _playerGameSession.GetOpponent(_player); if (opposingPlayer != null) { // Disconnect the player from the game session opposingPlayer.RemoveListener(_playerGameSession); // Disconnect the game session from the player _playerGameSession.RemoveListener(opposingPlayer); } // Halt the game sesssion _playerGameSession.Stop(); } // Remove player from connected player list connectedPlayers.Remove(_player); // Broadcast the player disconnected event to all registered listeners Broadcast(new NetworkBackgammonGameRoomEvent(NetworkBackgammonGameRoomEvent.GameRoomEventType.PlayerDisconnected)); } }
/// <summary> /// Stops the game session state machine (thread) /// </summary> public void Stop() { if (threadStateMachine != null) { bStateMachineKeepRunning = false; // Wake-up state machine to allow for proper shutdown // (without forcing an abort) semStateMachine.Release(); if (!threadStateMachine.Join(10000)) { threadStateMachine.Abort(); } threadStateMachine = null; } eventQueue.Clear(); // Terminate game for players Broadcast(new NetworkBackgammonGameSessionEvent(NetworkBackgammonGameSessionEvent.GameSessionEventType.Terminated)); if (player1 != null) { // Game Session stops listening for events from Player 1 player1.RemoveListener(this); // Player 1 stops listening for events from Game Session RemoveListener(player1); } if (player2 != null) { // Game Session stops listening for events form Player 2 player2.RemoveListener(this); // Player 2 stops listening for events from Game Session RemoveListener(player2); } player1 = null; player2 = null; }
public bool OnDisconnect(ref string returnMessage) { bool bRetVal = false; if (player != null) { if (gameRoom != null) { gameRoom.Leave(player); gameRoom.RemoveListener(this); player.RemoveListener(this); player = null; bRetVal = true; } else { if (returnMessage != null) { returnMessage += "\nNo game room available to disconnect from!"; } } } else { if (returnMessage != null) { returnMessage += "\nPlayer is not connected!"; } bRetVal = false; } return(bRetVal); }