/// <summary> /// Callback to receive the network-session search results from quick-match. /// </summary> void QuickMatchSearchCompleted(object sender, OperationCompletedEventArgs e) { try { AvailableNetworkSessionCollection availableSessions = NetworkSession.EndFind(e.AsyncResult); if ((availableSessions != null) && (availableSessions.Count > 0)) { // join the session try { IAsyncResult asyncResult = NetworkSession.BeginJoin( availableSessions[0], null, null); // create the busy screen NetworkBusyScreen busyScreen = new NetworkBusyScreen( "Joining the session...", asyncResult); busyScreen.OperationCompleted += QuickMatchSessionJoined; ScreenManager.AddScreen(busyScreen); } catch (NetworkException ne) { const string message = "Failed joining the session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to join session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to join a session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to join session: " + gpe.Message); } } else { const string message = "No matches were found."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); } } catch (GamerPrivilegeException gpe) { MessageBoxScreen messageBox = new MessageBoxScreen(gpe.Message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); } }
/// <summary> /// Lets the game respond to player input. Unlike the Update method, /// this will only be called when the gameplay screen is active. /// </summary> public override void HandleInput(InputState input) { if (input == null) { throw new ArgumentNullException("input"); } if (!IsExiting) { if ((world != null) && !world.GameExited) { if (input.PauseGame && !world.GameWon) { // If they pressed pause, bring up the pause menu screen. const string message = "Exit the game?"; MessageBoxScreen messageBox = new MessageBoxScreen(message, false); messageBox.Accepted += ExitMessageBoxAccepted; ScreenManager.AddScreen(messageBox); } if (input.MenuSelect && world.GameWon) { world.GameExited = true; world = null; if (!IsExiting) { ExitScreen(); } networkSession = null; } } } }
/// <summary> /// When the user cancels the main menu, ask if they want to exit the sample. /// </summary> protected override void OnCancel() { const string message = "Exit Net Rumble?"; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += ExitMessageBoxAccepted; ScreenManager.AddScreen(messageBox); }
/// <summary> /// Begins the asynchronous process of joining a game from an invitation. /// </summary> void NetworkSession_InviteAccepted(object sender, InviteAcceptedEventArgs e) { if (Guide.IsTrialMode) { screenManager.invited = e.Gamer; string message = "Need to unlock full version before you can accept this invite."; MessageBoxScreen messageBox = new MessageBoxScreen(message); screenManager.AddScreen(messageBox); System.Console.WriteLine("Cannot accept invite yet because we're in trial mode"); return; } // We will join the game from a method in this screen. MainMenuScreen mainMenu = null; // Keep the background screen and main menu screen but remove all others // to prepare for joining the game we were invited to. foreach (GameScreen screen in screenManager.GetScreens()) { if (screen is BackgroundScreen) { continue; } else if (screen is MainMenuScreen) { mainMenu = screen as MainMenuScreen; } else { // If there's an active network session, we'll need to end it // before attempting to join a new one. MethodInfo method = screen.GetType().GetMethod("EndSession"); if (method != null) { method.Invoke(screen, null); } // Now exit and remove this screen. screen.ExitScreen(); screenManager.RemoveScreen(screen); } } // Now attempt to join the game to which we were invited! if (mainMenu != null) { mainMenu.JoinInvitedGame(); } }
/// <summary> /// Callback to receive the network-session search results. /// </summary> internal void SessionsFound(object sender, OperationCompletedEventArgs e) { try { availableSessions = NetworkSession.EndFind(e.AsyncResult); } catch (NetworkException ne) { const string message = "Failed searching for the session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to search for session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to search for a session. "; MessageBoxScreen messageBox = new MessageBoxScreen(message + gpe.Message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to search for session: " + gpe.Message); } MenuEntries.Clear(); if (availableSessions != null) { foreach (AvailableNetworkSession availableSession in availableSessions) { if (availableSession.CurrentGamerCount < World.MaximumPlayers) { MenuEntries.Add(availableSession.HostGamertag + " (" + availableSession.CurrentGamerCount.ToString() + "/" + World.MaximumPlayers.ToString() + ")"); } if (MenuEntries.Count >= maximumSessions) { break; } } } }
/// <summary> /// Start searching for a session of the given type. /// </summary> /// <param name="sessionType">The type of session to look for.</param> void FindSession(NetworkSessionType sessionType) { // create the new screen SearchResultsScreen searchResultsScreen = new SearchResultsScreen(sessionType); searchResultsScreen.ScreenManager = this.ScreenManager; ScreenManager.AddScreen(searchResultsScreen); // start the search try { IAsyncResult asyncResult = NetworkSession.BeginFind(sessionType, 1, null, null, null); // create the busy screen NetworkBusyScreen busyScreen = new NetworkBusyScreen( "Searching for a session...", asyncResult); busyScreen.OperationCompleted += searchResultsScreen.SessionsFound; ScreenManager.AddScreen(busyScreen); } catch (NetworkException ne) { const string message = "Failed searching for the session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to search for session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to search for a session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to search for session: " + gpe.Message); } }
/// <summary> /// Responds to user menu selections. /// </summary> protected override void OnSelectEntry(int entryIndex) { if ((availableSessions != null) && (entryIndex >= 0) && (entryIndex < availableSessions.Count)) { // start to join try { IAsyncResult asyncResult = NetworkSession.BeginJoin( availableSessions[entryIndex], null, null); // create the busy screen NetworkBusyScreen busyScreen = new NetworkBusyScreen( "Joining the session...", asyncResult); busyScreen.OperationCompleted += LoadLobbyScreen; ScreenManager.AddScreen(busyScreen); } catch (NetworkException ne) { const string message = "Failed joining the session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to join session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to join a session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to join session: " + gpe.Message); } } }
/// <summary> /// Finishes the asynchronous process of joining a game from an invitation, /// joining the lobby of a hosted game if the join was successful. /// </summary> void InvitedSessionJoined(object sender, OperationCompletedEventArgs e) { NetworkSession networkSession = null; try { networkSession = NetworkSession.EndJoinInvited(e.AsyncResult); } catch (NetworkSessionJoinException je) { const string message = "Failed joining the session ("; MessageBoxScreen messageBox = new MessageBoxScreen(message + je.JoinError.ToString() + ")."); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to join session: " + je.Message); } catch (Exception ge) { const string message = "Failed joining the session ("; MessageBoxScreen messageBox = new MessageBoxScreen(message + ge.Message + ")."); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to join session: " + ge.Message); } // Start the lobby if we got the session! // Otherwise the MainMenuScreen will be available. if (networkSession != null) { LobbyScreen lobbyScreen = new LobbyScreen(networkSession); lobbyScreen.ScreenManager = ScreenManager; ScreenManager.AddScreen(lobbyScreen); } }
/// <summary> /// Callback when a session is created. /// </summary> void SessionCreated(object sender, OperationCompletedEventArgs e) { NetworkSession networkSession = null; try { networkSession = NetworkSession.EndCreate(e.AsyncResult); } catch (NetworkException ne) { const string message = "Failed creating the session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to create session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to create a session. "; MessageBoxScreen messageBox = new MessageBoxScreen(message + gpe.Message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to create session: " + gpe.Message); } if (networkSession != null) { networkSession.AllowHostMigration = true; networkSession.AllowJoinInProgress = false; LoadLobbyScreen(networkSession); } }
/// <summary> /// Start creating a session of the given type. /// </summary> /// <param name="sessionType">The type of session to create.</param> void CreateSession(NetworkSessionType sessionType) { // create the session try { IAsyncResult asyncResult = NetworkSession.BeginCreate(sessionType, 1, World.MaximumPlayers, null, null); // create the busy screen NetworkBusyScreen busyScreen = new NetworkBusyScreen( "Creating a session...", asyncResult); busyScreen.OperationCompleted += SessionCreated; ScreenManager.AddScreen(busyScreen); } catch (NetworkException ne) { const string message = "Failed creating the session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to create session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to create a session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to create session: " + gpe.Message); } }
/// <summary> /// Callback to load the lobby screen with the new session. /// </summary> private void LoadLobbyScreen(object sender, OperationCompletedEventArgs e) { NetworkSession networkSession = null; try { networkSession = NetworkSession.EndJoin(e.AsyncResult); } catch (NetworkException ne) { const string message = "Failed joining session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed joining session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to join a session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to join session: " + gpe.Message); } if (networkSession != null) { LobbyScreen lobbyScreen = new LobbyScreen(networkSession); lobbyScreen.ScreenManager = this.ScreenManager; ScreenManager.AddScreen(lobbyScreen); } }
/// <summary> /// Callback when a session is created. /// </summary> void SessionCreated(object sender, OperationCompletedEventArgs e) { NetworkSession networkSession = null; try { networkSession = NetworkSession.EndCreate(e.AsyncResult); } catch (NetworkException ne) { const string message = "Failed creating the session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to create session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to create a session. "; MessageBoxScreen messageBox = new MessageBoxScreen(message+gpe.Message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to create session: " + gpe.Message); } if (networkSession != null) { networkSession.AllowHostMigration = true; networkSession.AllowJoinInProgress = false; LoadLobbyScreen(networkSession); } }
/// <summary> /// Begins the asynchronous process of joining a game from an invitation. /// </summary> void NetworkSession_InviteAccepted(object sender, InviteAcceptedEventArgs e) { if (Guide.IsTrialMode) { screenManager.invited = e.Gamer; string message = "Need to unlock full version before you can accept this invite."; MessageBoxScreen messageBox = new MessageBoxScreen(message); screenManager.AddScreen(messageBox); System.Console.WriteLine("Cannot accept invite yet because we're in trial mode"); return; } // We will join the game from a method in this screen. MainMenuScreen mainMenu = null; // Keep the background screen and main menu screen but remove all others // to prepare for joining the game we were invited to. foreach (GameScreen screen in screenManager.GetScreens()) { if (screen is BackgroundScreen) { continue; } else if (screen is MainMenuScreen) { mainMenu = screen as MainMenuScreen; } else { // If there's an active network session, we'll need to end it // before attempting to join a new one. MethodInfo method = screen.GetType().GetMethod("EndSession"); if (method != null) { method.Invoke(screen, null); } // Now exit and remove this screen. screen.ExitScreen(); screenManager.RemoveScreen(screen); } } // Now attempt to join the game to which we were invited! if (mainMenu != null) mainMenu.JoinInvitedGame(); }
/// <summary> /// Callback to receive the network-session search results from quick-match. /// </summary> void QuickMatchSearchCompleted(object sender, OperationCompletedEventArgs e) { try { AvailableNetworkSessionCollection availableSessions = NetworkSession.EndFind(e.AsyncResult); if ((availableSessions != null) && (availableSessions.Count > 0)) { // join the session try { IAsyncResult asyncResult = NetworkSession.BeginJoin( availableSessions[0], null, null); // create the busy screen NetworkBusyScreen busyScreen = new NetworkBusyScreen( "Joining the session...", asyncResult); busyScreen.OperationCompleted += QuickMatchSessionJoined; ScreenManager.AddScreen(busyScreen); } catch (NetworkException ne) { const string message = "Failed joining the session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine("Failed to join session: " + ne.Message); } catch (GamerPrivilegeException gpe) { const string message = "You do not have permission to join a session."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); System.Console.WriteLine( "Insufficient privilege to join session: " + gpe.Message); } } else { const string message = "No matches were found."; MessageBoxScreen messageBox = new MessageBoxScreen(message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); } } catch (GamerPrivilegeException gpe){ MessageBoxScreen messageBox = new MessageBoxScreen(gpe.Message); messageBox.Accepted += FailedMessageBox; messageBox.Cancelled += FailedMessageBox; ScreenManager.AddScreen(messageBox); } }
/// <summary> /// Lets the game respond to player input. Unlike the Update method, /// this will only be called when the gameplay screen is active. /// </summary> public override void HandleInput(InputState input) { if (input == null) throw new ArgumentNullException("input"); if (!IsExiting) { if ((world != null) && !world.GameExited) { if (input.PauseGame && !world.GameWon) { // If they pressed pause, bring up the pause menu screen. const string message = "Exit the game?"; MessageBoxScreen messageBox = new MessageBoxScreen(message, false); messageBox.Accepted += ExitMessageBoxAccepted; ScreenManager.AddScreen(messageBox); } if (input.MenuSelect && world.GameWon) { world.GameExited = true; world = null; if (!IsExiting) { ExitScreen(); } networkSession = null; } } } }