//============================================================================= // KFGFxMenu_StartGame //============================================================================= // Class Description //============================================================================= // Killing Floor 2 // Copyright (C) 2015 Tripwire Interactive LLC // - Author 4/23/2014 //============================================================================= class KFGFxMenu_StartGame extends KFGFxObject_Menu dependson(TWOnlineLobby) config(UI) native(UI); `include(KFProfileSettings.uci) var string WhatsNewPS; var string WhatsNewMS; var string WhatsNewSteam; var bool bIsLeader; var bool bIsInParty; var bool bSearchingForGame; var bool bLeaderInServerBrowser, bLeaderWasInServerBrowser; var bool bPendingLeaveMenu; var transient bool AttemptingJoin; var transient bool bAttemptingServerCreate; var transient int CurrentSearchIndex; var const string ModeKey, DifficultyKey, MapKey, WhitelistedKey, InProgressKey, PermissionsKey, ServerTypeKey; var const string GameLengthKey; var KFGFxStartGameContainer_FindGame FindGameContainer; var KFGFxStartGameContainer_Options OptionsComponent; var KFGFxStartContainer_InGameOverview OverviewContainer; var KFGFxStartContainer_ServerBrowserOverview ServerBrowserOverviewContainer; var KFGFxStartContainer_NewsImageHolder NewsImageHolderContainer; var KFGFxMissionObjectivesContainer MissionObjectiveContainer; //@HSL_BEGIN - JRO - 4/28/2016 - Disable certain features for PlayGo var GFxObject CreateGameButton; var GFxObject MatchMakingButton; var GFxObject ServerBrowserButton; //@HSL_END var bool bHarrassedPlayerAboutSharedContent; var localized string FindGameString; var localized string HostOptionsString; var localized string OverviewString; var localized string MatchmakingString; var localized string CreateMatchString; var localized string ServerBrowserString; var localized string NewsPageString; var localized string GameModeTitle; var localized string DifficultyTitle; var localized string LengthTitle; var localized string MapTitle; var localized string MutatorTitle; var localized string PermissionsTitle; var localized string ServerTypeString; var localized string WhiteListedTitle; var localized string InfoTitle; var localized string InProgressString; var localized string LeaveMenuString; var localized string CouldNotFindGameTitleString; //Do not use these directly! Use the GetCouldNotFindGameDescription() function //to pick between them based on platform var private localized string CouldNotFindGameDescriptionStringPC; var private localized string CouldNotFindGameDescriptionStringOrbis; //Match Making var localized array WhiteListedStrings; /** Name of the search datastore, for finding a server to take over. */ var protected transient const name SearchDSName; /** Reference to the search datastore, for finding a server to take over. */ var transient KFDataStore_OnlineGameSearch SearchDataStore; /** Cached game interface pointer, for finding a server to take over. */ var transient OnlineGameInterface GameInterface; var array MapStringList; var config bool AttemptServerTakeovers; var transient string MapTakeoverURL; var transient string PendingResolvedAddress; var string CurrentPartyLeaderName; var transient bool bPauseTryingServers; /** How long to collect servers before sorting them and starting to try to connect */ var config float InitialSearchPause; /** How many results to quit after (passed to OnlineSubsystem) */ var config int MaxResultsToTry; /** How long to wait for a server to respond to "open" before giving up on it. */ var config int ServerConnectTimeout; var config int ServerTakeoverTimeout; /** Whether to log information about searching for games */ var config bool bLogSearchInfo; var config array StockMaps; var transient bool SearchFinished; /** When taking over a server, holds the password set or auto-generated for the server being taken over, for privacy */ var transient string LobbyOwnerPassword; var config string TestLobbyOwnerPassword; /** Keeps the current map of the server you are trying to connect to, which might be useful if you're doing a server takeover but have the map "filter" set to "Any" */ var transient string CurrentConnectMap; /** If we didn't boot up installing, we don't really need to do installation checks */ var transient bool bIsPlayGoRun; native static function GetMapList( out array MapList, optional int OverrideGameModeIndex = INDEX_NONE, optional bool bStockMapsOnly ); cpptext { UBOOL DoesGamemodeSupportMap(INT GameModeIndex, const FString& MapName); } function InitializeMenu( KFGFxMoviePlayer_Manager InManager ) { local DataStoreClient DSClient; super.InitializeMenu(InManager); SetSeasonalEventClass(); //based of seasonal event ID // Initializations so we can search for a dedicated server to take over DSClient = class'UIInteraction'.static.GetDataStoreClient(); if ( DSClient != None ) { SearchDataStore = KFDataStore_OnlineGameSearch(DSClient.FindDataStore(SearchDSName)); } if(class'GameEngine'.static.GetOnlineSubsystem() != none) { GameInterface = class'GameEngine'.static.GetOnlineSubsystem().GameInterface; //@HSL_BEGIN - JRO - 4/28/2016 - Show a message when we're still installing bIsPlayGoRun = !class'GameEngine'.static.IsGameFullyInstalled(); if( bIsPlayGoRun ) { Manager.DelayedOpenPopup(ENotification,EDPPID_Misc, Localize("Notifications", "PlayGoBusyTitle", "KFGameConsole"), Localize("Notifications", "PlayGoBusyMessage", "KFGameConsole"), class'KFCommon_LocalizedStrings'.default.OKString); } } setVivoxWordmarkVisibility(); } //@SABER_EGS_BEGIN show vivox wordmark function setVivoxWordmarkVisibility() { if (isPC() && isMultiplayerGame()) { GetObject("wordmarkVivox").setVisible(true); } else { GetObject("wordmarkVivox").setVisible(false); } } function bool isPC() { return !class'WorldInfo'.static.IsConsoleBuild(); } function bool IsMultiplayerGame() { return GetPC().WorldInfo.NetMode != NM_Standalone; } //@SABER_EGS_END function SetSeasonalEventClass() { local GFXWidgetBinding MyWidgetBinding; MyWidgetBinding.WidgetName ='specialEventContainerMC'; MyWidgetBinding.WidgetClass=GetSpecialEventClass(class'KFGameEngine'.static.GetSeasonalEventId()); SubWidgetBindings[8]=MyWidgetBinding; } static function class GetSpecialEventClass(int SpecialEventID) { switch (SpecialEventID) { case SEI_Spring: return class'KFGFxSpecialEventObjectivesContainer_Spring2020'; case SEI_Summer: return class'KFGFxSpecialEventObjectivesContainer_Summer2020'; case SEI_Fall: return class'KFGFxSpecialEventObjectivesContainer_Fall2020'; case SEI_Winter: return class'KFGFXSpecialEventObjectivesContainer_Xmas2020'; } return class'KFGFxSpecialEventObjectivesContainer'; } /** Ties the GFxClikWidget variables to the .swf components and handles events */ event bool WidgetInitialized(name WidgetName, name WidgetPath, GFxObject Widget) { switch(WidgetName) { case('newsPage'): if (NewsImageHolderContainer == none) { NewsImageHolderContainer = KFGFxStartContainer_NewsImageHolder(Widget); NewsImageHolderContainer.Initialize(self); } break; //mission objectives UI case ('missionObjectivesContainerMC'): if(MissionObjectiveContainer == none) { MissionObjectiveContainer = KFGFxMissionObjectivesContainer(Widget); MissionObjectiveContainer.Initialize( self ); } break; case ('dailyContainerMC'): if(MissionObjectiveContainer.ExpandedObjectiveContainer.DailyObjectiveContainer == none) { MissionObjectiveContainer.ExpandedObjectiveContainer.DailyObjectiveContainer = KFGFxDailyObjectivesContainer(Widget); MissionObjectiveContainer.ExpandedObjectiveContainer.DailyObjectiveContainer.Initialize( self ); } break; case ('expandedMissionObjectivesMC'): if(MissionObjectiveContainer.ExpandedObjectiveContainer == none) //this is not the normal way we do this. This is a special case { MissionObjectiveContainer.ExpandedObjectiveContainer = KFGFxExpandedObjectivesContainer(Widget); MissionObjectiveContainer.ExpandedObjectiveContainer.Initialize( self ); } break; case ('collapsedMissionObjectivesMC'): if(MissionObjectiveContainer.CollapsedObjectiveContainer == none) { MissionObjectiveContainer.CollapsedObjectiveContainer = KFGFxCollapsedObjectivesContainer(Widget); MissionObjectiveContainer.CollapsedObjectiveContainer.Initialize( self ); } break; case ('specialEventContainerMC'): if(MissionObjectiveContainer.ExpandedObjectiveContainer.SpecialEventsContainer == none) { MissionObjectiveContainer.ExpandedObjectiveContainer.SpecialEventsContainer = KFGFxSpecialEventObjectivesContainer(Widget); MissionObjectiveContainer.ExpandedObjectiveContainer.SpecialEventsContainer.Initialize( self ); } break; case ('weeklyContainerMC'): if(MissionObjectiveContainer.ExpandedObjectiveContainer.WeeklyEventContainer == none) { MissionObjectiveContainer.ExpandedObjectiveContainer.WeeklyEventContainer = KFGFxWeeklyObjectivesContainer(Widget); MissionObjectiveContainer.ExpandedObjectiveContainer.WeeklyEventContainer.Initialize( self ); } break; //end mission objectives UI case ('findGameContainer'): if ( FindGameContainer == none ) { FindGameContainer = KFGFxStartGameContainer_FindGame( Widget ); FindGameContainer.Initialize( self ); } break; case ('gameOptionsContainer'): if ( OptionsComponent == none ) { OptionsComponent = KFGFxStartGameContainer_Options( Widget ); OptionsComponent.Initialize( self ); } break; case ('overviewContainer'): if ( OverviewContainer == none ) { OverviewContainer = KFGFxStartContainer_InGameOverview( Widget ); OverviewContainer.Initialize( self ); SetOverview(true); } break; case ('serverBrowserOverviewContainer'): if ( ServerBrowserOverviewContainer == none ) { ServerBrowserOverviewContainer = KFGFxStartContainer_ServerBrowserOverview( Widget ); ServerBrowserOverviewContainer.Initialize( self ); } break; //@HSL_BEGIN - JRO - 4/28/2016 - Disable certain features for PlayGo case ('matchMakingButton'): MatchMakingButton = Widget; if(class'WorldInfo'.static.IsConsoleBuild()) { CheckGameFullyInstalled(); } break; case ('createGameButton'): CreateGameButton = Widget; if (class'WorldInfo'.static.IsConsoleBuild()) { CheckGameFullyInstalled(); } break; case ('serverBrowserButton'): ServerBrowserButton = Widget; if(class'WorldInfo'.static.IsConsoleBuild()) { CheckGameFullyInstalled(); } break; //@HSL_END } return true; } function string GetCouldNotFindGameDescription() { if (class'WorldInfo'.static.IsConsoleBuild()) { return CouldNotFindGameDescriptionStringOrbis; } else { return CouldNotFindGameDescriptionStringPC; } } //@HSL_BEGIN - JRO - 4/28/2016 - Disable certain features for PlayGo function CheckGameFullyInstalled() { if(bIsPlayGoRun) { if( class'GameEngine'.static.IsGameFullyInstalled() ) { if (MatchMakingButton != none) { MatchMakingButton.SetBool("enabled", true); } if(CreateGameButton != none) { CreateGameButton.SetBool("enabled", true); } if (ServerBrowserButton != none) { ServerBrowserButton.SetBool("enabled", true); } InitializeMenu(Manager); ReloadSounds(); } else { if (MatchMakingButton != none) { MatchMakingButton.SetBool("enabled", false); } if (CreateGameButton != none) { CreateGameButton.SetBool("enabled", false); } if (ServerBrowserButton != none) { ServerBrowserButton.SetBool("enabled", false); } `TimerHelper.SetTimer(1.0f, false, nameof(CheckGameFullyInstalled), self); } } } native function ReloadSounds(); //@HSL_END // OVERVIEW, OVERVIEW_SERVER_BROWSER function SetOverview(optional bool bInitialize) { local UniqueNetId AdminId, MyUID, ZeroId; local bool bCurrentlyLeader; local bool bCurrentlyInParty; if (OverviewContainer != none) { OverviewContainer.UpdateOverviewInGame(); } if(OnlineLobby != none) { MyUID = OnlineLobby.GetMyId(); OnlineLobby.GetLobbyAdmin(OnlineLobby.GetCurrentLobbyId(), AdminId); bCurrentlyLeader = (MyUID == AdminId && MyUID != ZeroId); bCurrentlyInParty = OnlineLobby.IsInLobby(); } // Update what our start game looks like if any important options have changed if ( bIsLeader != bCurrentlyLeader || bCurrentlyInParty != bIsInParty || bInitialize || bLeaderInServerBrowser != bLeaderWasInServerBrowser ) { bIsLeader = bCurrentlyLeader; bIsInParty = bCurrentlyInParty; bLeaderWasInServerBrowser = bLeaderInServerBrowser; if (class'WorldInfo'.static.IsMenuLevel()) { if (bIsInParty) { if(bIsLeader) { if(Manager.CurrentMenuIndex == UI_ServerBrowserMenu) { ShowOverview(false, bIsLeader, class'WorldInfo'.static.IsMenuLevel(), false); Manager.OpenMenu(UI_ServerBrowserMenu); } else { ShowOverview(false, bIsLeader, class'WorldInfo'.static.IsMenuLevel(), false); //OpenMultiplayerMenu(); } } else { ShowOverview(!bIsLeader, bIsLeader, class'WorldInfo'.static.IsMenuLevel(), bLeaderInServerBrowser); } } } else { ShowOverview(true, bIsLeader, false, false); } } } //Send the player back to the start menu and open the shared content object if there is content to share and we are not in standalone function OnPlayerReadiedUp() { local PlayerController PC; PC = GetPC(); if(bHarrassedPlayerAboutSharedContent) { return; } if(OverviewContainer != none && OverviewContainer.bContentShared && PC.WorldInfo.NetMode != NM_Standalone ) { if(Manager.CurrentMenuIndex != UI_Start) { Manager.OpenMenu(UI_Start); } // Consoles don't show this screen. HSL_BB if ( !PC.WorldInfo.IsConsoleBuild() ) { OverviewContainer.ActionScriptVoid("showSharedContentList"); } } bHarrassedPlayerAboutSharedContent = true; } function OneSecondLoop() { SetOverview(); if(Manager.CurrentMenuIndex != UI_IIS) { UpdateMenu(); } if(OverviewContainer != none && Manager.CurrentMenu == self) { OverviewContainer.UpdateSharedContent(); } if (FindGameContainer != none) { FindGameContainer.CheckNewsState(); } } //============================================================== // Get Functions //============================================================== function byte GetStartMenuState() { return GetInt("menuState"); } //get the map's image path from the dataProvider and set it in flash. function string GetMapSource(string MapName) { local KFMapSummary MapData; MapData = class'KFUIDataStore_GameResource'.static.GetMapSummaryFromMapName(MapName); if ( MapData != none ) { //`log(MapData.ScreenshotPathName); return "img://" $MapData.ScreenshotPathName; } else { // Failed to find map image, use the default instead MapData = class'KFUIDataStore_GameResource'.static.GetMapSummaryFromMapName("KF-Default"); if ( MapData != none ) { return "img://" $MapData.ScreenshotPathName; } } } //============================================================== // Component Functions //============================================================== //When the leader of the lobby is either changed or assigned. function HandleSteamLobbyLeaderTakeOver(UniqueNetId AdminId) { local bool bClientIsLeader; bClientIsLeader = GetPC().PlayerReplicationInfo.UniqueId == AdminId; switch (GetStartMenuState()) { case EServerBrowserOverview: if(bClientIsLeader) { Manager.OpenMenu(UI_ServerBrowserMenu); return; } default: if (bClientIsLeader) { Manager.SetStartMenuState(EStartHome); SetInt("externalMenuState", EStartHome); //Manager.OpenMenu(UI_Start); return; } } if(!bClientIsLeader) { SendToOverviewOnChange(); } } function SendToOverviewOnChange() { Manager.SetStartMenuState(EOverview); Manager.OpenMenu(UI_Start); SetOverview(true); } // Make sure our menu information is up to date function UpdateMenu() { local UniqueNetId AdminId; local UniqueNetId LoggedInPlayer; if ( class'WorldInfo'.static.IsMenuLevel() && OnlineLobby != none && OnlineLobby.IsInLobby() ) { OnlineLobby.GetLobbyAdmin( OnlineLobby.GetCurrentLobbyId(), AdminId ); LoggedInPlayer = OnlineLobby.GetMyId(); if ( LoggedInPlayer == AdminId ) { // We are the party leader SendLeaderOptions(); } else { // We are a party member ReceiveLeaderOptions(); CurrentPartyLeaderName = OnlineLobby.GetFriendNickname(AdminId); if(CurrentPartyLeaderName != "") { ServerBrowserOverviewContainer.SetDescriptionString(CurrentPartyLeaderName); } } } } // As the leader of the party, make sure the members have the latest information function SendLeaderOptions() { if (OptionsComponent != none) { SetLobbyData(GameLengthKey, String(OptionsComponent.GetLengthIndex())); SetLobbyData(DifficultyKey, String(OptionsComponent.GetDifficultyIndex())); SetLobbyData(MapKey, OptionsComponent.GetMapName()); SetLobbyData(ModeKey, String(Manager.GetModeIndex())); SetLobbyData(PermissionsKey, String(OptionsComponent.GetPrivacyIndex())); } } // As a member of party, check to see if your options are different than the party leaders function ReceiveLeaderOptions() { local string OptionString; local string DisplayMapName, MapSource; local int OptionIndex; OptionIndex = Int(OnlineLobby.GetLobbyData(0, ModeKey)); OverviewContainer.UpdateGameMode(class'KFCommon_LocalizedStrings'.static.GetGameModeString(OptionIndex)); OptionIndex = Int(OnlineLobby.GetLobbyData(0, GameLengthKey)); OverviewContainer.UpdateLength(class'KFCommon_LocalizedStrings'.static.GetLengthString(OptionIndex)); OptionIndex = Int(OnlineLobby.GetLobbyData(0, ServerTypeKey)); OverviewContainer.UpdateServerType(class'KFCommon_LocalizedStrings'.static.GetServerTypeString(OptionIndex)); OptionIndex = Int(OnlineLobby.GetLobbyData(0, DifficultyKey)); OverviewContainer.UpdateDifficulty(class'KFCommon_LocalizedStrings'.static.GetDifficultyString(OptionIndex)); OptionString = OnlineLobby.GetLobbyData(0, MapKey); DisplayMapName = class'KFCommon_LocalizedStrings'.static.GetFriendlyMapName(OptionString); MapSource = GetMapSource(OptionString); OverviewContainer.UpdateMap( DisplayMapName, MapSource ); OptionIndex = Int(OnlineLobby.GetLobbyData(0, PermissionsKey)); OverviewContainer.UpdatePrivacy(class'KFCommon_LocalizedStrings'.static.GetPermissionString(OptionIndex)); } function ApproveMatchMakingLeave() { if(OptionsComponent != none) { bPendingLeaveMenu = false; if( OnlineLobby != none && OnlineLobby.IsInLobby()) { OnlineLobby.QuitLobby(); } CancelGameSearch(); SetInt("externalMenuState", EStartHome); UpdateStartMenuState(); } } function GoToServerBrowser() { Manager.OpenMenu(UI_ServerBrowserMenu); } function CancelLeaveMenu() { GetPC().SetTimer(0.5f, false, nameof(ClearLeaveMenuFlag), self); } function ClearLeaveMenuFlag() { bPendingLeaveMenu = false; } function UpdateStartMenuState() { local byte CurrentMenuState; if( Manager != none ) { CurrentMenuState = GetStartMenuState(); Manager.SetStartMenuState(EStartMenuState(CurrentMenuState)); Switch(EStartMenuState(CurrentMenuState)) { case ECreateGame: OptionsComponent.bShowLengthNoPref = false; OptionsComponent.InitializeGameOptions(); break; case EMatchmaking: OptionsComponent.bShowLengthNoPref = true; OptionsComponent.InitializeGameOptions(); //set match privacy to public for find match OptionsComponent.PrivacyChanged(0); break; case ESoloGame: OptionsComponent.bShowLengthNoPref = false; OptionsComponent.InitializeGameOptions(); break; } } } function ProceedToTutorial() { if (OnlineLobby != none && OnlineLobby.IsInLobby()) { if (OnlineLobby != none && OnlineLobby.IsInLobby()) { OnlineLobby.QuitLobby(); } } CancelGameSearch(); ConsoleCommand("open KF-EvacuationPoint?game=KFGameContent.KFGameInfo_Tutorial"); } function ProceedToSoloMenu() { if (OnlineLobby != none && OnlineLobby.IsInLobby()) { if (OnlineLobby != none && OnlineLobby.IsInLobby()) { OnlineLobby.QuitLobby(); } } //set create party button invisible. Manager.SoloGameMenuOpened(); CancelGameSearch(); SetInt("externalMenuState", ESoloGame); } function PostPartyDisbandTutorial() { if (OnlineLobby != none && OnlineLobby.IsInLobby()) { if (OnlineLobby != none && OnlineLobby.IsInLobby()) { OnlineLobby.QuitLobby(); } } CancelGameSearch(); Manager.DelayedOpenPopup(EConfirmation, EDPPID_Misc, class'KFCommon_LocalizedStrings'.default.ProceedToTutorialString, class'KFCommon_LocalizedStrings'.default.ProceedToTutorialDescriptionString, class'KFCommon_LocalizedStrings'.default.ConfirmString, class'KFCommon_LocalizedStrings'.default.CancelString, ProceedToTutorial); } //============================================================== // ActionScript Callbacks //============================================================== function Callback_OnWhatsNewClicked(int Index, string URL) { local OnlineSubsystem OnlineSub; local int i; OnlineSub = Class'GameEngine'.static.GetOnlineSubsystem(); if(OnlineSub != none) { if(Class'WorldInfo'.Static.IsConsoleBuild()) { if (Class'WorldInfo'.Static.IsConsoleBuild(CONSOLE_Orbis) && !OnlineSub.IsGameOwned()) { Manager.OnBuyGamePressed(); return; } // If this is attached to a PSN product ID, we need to look up the signed offer Id if( FindGameContainer.PS4ActiveWhatsNewItems[Index].PSNProductId != "" ) { for( i = 0; i < OnlineSub.ItemPropertiesList.Length; i++ ) { if( OnlineSub.ItemPropertiesList[i].ProductId == FindGameContainer.PS4ActiveWhatsNewItems[Index].PSNProductId ) { if( OnlineSub.ItemPropertiesList[i].SignedOfferId != "" ) { if( class'WorldInfo'.static.IsConsoleBuild( CONSOLE_Orbis ) ) { OnlineSub.OpenMarketPlaceSearch( OnlineSub.ItemPropertiesList[i] ); } else { OnlineSub.PlayerInterfaceEx.ShowProductDetailsUI( GetLP().ControllerId, OnlineSub.ItemPropertiesList[i].ProductId ); } } else { `warn("No PSN signed offer ID for item with product ID"@FindGameContainer.PS4ActiveWhatsNewItems[Index].PSNProductId); } break; } } } else if( FindGameContainer.PS4ActiveWhatsNewItems[Index].RedirectURL != "" ) { OnlineSub.OpenURL( FindGameContainer.PS4ActiveWhatsNewItems[Index].RedirectURL); } } else { OnlineSub.OpenURL(URL); } } } function Callback_NewsButtonPressed() { local OnlineSubsystem OnlineSub; OnlineSub = Class'GameEngine'.static.GetOnlineSubsystem(); if (OnlineSub == none) { return; } if(class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Orbis)) { OnlineSub.OpenURL(default.WhatsNewPS); } else if (class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Durango)) { OnlineSub.OpenURL(default.WhatsNewMS); } else { OnlineSub.OpenURL(default.WhatsNewSteam); } } function Callback_SoloButtonPressed() { if (OnlineLobby != none && OnlineLobby.IsInLobby()) { Manager.DelayedOpenPopup(EConfirmation, EDPPID_Misc, Class'KFCommon_LocalizedStrings'.default.StartOfflineGameString, Class'KFCommon_LocalizedStrings'.default.StartOfflineGameDescriptionString, Class'KFCommon_LocalizedStrings'.default.DisbandPartyString, Class'KFCommon_LocalizedStrings'.default.CancelString, ProceedToSoloMenu); //middle button } else { ProceedToSoloMenu(); } } function Callback_StartTutorial() { local OnlineSubsystem OnlineSub; OnlineSub = Class'GameEngine'.static.GetOnlineSubsystem(); CancelGameSearch(); if (!OnlineSub.IsGameOwned() && class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Orbis)) { if (OnlineSub.CanCheckFreeTrialState() && !OnlineSub.IsFreeTrialPeriodActive()) { Manager.HandleFreeTrialError(FTN_BuyGame); return; } if(!OnlineSub.CanCheckFreeTrialState()) { Manager.HandleFreeTrialError(FTN_NetworkCheckFailed); return; } } if (OnlineLobby != none && OnlineLobby.IsInLobby()) { Manager.DelayedOpenPopup(EConfirmation, EDPPID_Misc, Class'KFCommon_LocalizedStrings'.default.StartOfflineGameString, Class'KFCommon_LocalizedStrings'.default.StartOfflineGameDescriptionString, Class'KFCommon_LocalizedStrings'.default.DisbandPartyString, Class'KFCommon_LocalizedStrings'.default.CancelString, PostPartyDisbandTutorial); //middle button } else { //make pop up Manager.DelayedOpenPopup(EConfirmation, EDPPID_Misc, class'KFCommon_LocalizedStrings'.default.ProceedToTutorialString, class'KFCommon_LocalizedStrings'.default.ProceedToTutorialDescriptionString, class'KFCommon_LocalizedStrings'.default.ConfirmString, class'KFCommon_LocalizedStrings'.default.CancelString, ProceedToTutorial); } } function Callback_OnWebLinkClicked(string WebSiteLink) { local OnlineSubsystem OnlineSub; OnlineSub = Class'GameEngine'.static.GetOnlineSubsystem(); if(OnlineSub != none) { OnlineSub.OpenURL(WebSiteLink); } } //Request to close the match making menu function Callback_CancelSearch() { if( OptionsComponent != none ) { CancelGameSearch(); GetPC().WorldInfo.CancelPendingMapChange(); KFGameEngine(Class'Engine'.static.GetEngine()).CancelPendingLevel(); } } //Callback function Callback_OptionListOpened(string ListName, int OptionIndex) { local string MessageString; if (OptionsComponent.bIsSoloGame && ListName == "modeList") { OptionIndex = OptionIndex >= 2 ? OptionIndex + 1 : OptionIndex; } if(ListName == "mapList" || GetPC().WorldInfo.IsConsoleBuild() && ListName == "regionList") { return; } if(OptionIndex == INDEX_NONE) { return; } MessageString = Localize("StartMenuHelperText", ListName$OptionIndex, "KFGame"); if(OptionsComponent != none) { OptionsComponent.SetHelpText(MessageString); } } function Callback_InGamePermissionChange( int Index ) { if( OnlineLobby != none ) { if( OnlineLobby.SetVisibility( Index ) && OptionsComponent != none ) { OptionsComponent.PrivacyChanged( Index ); } } } function Callback_OpenMatchMaking() { if(class'WorldInfo'.static.IsConsoleBuild()) { KFPlayerController(GetPC()).StartLogin( ProceedToMatchMaking, true ); } else { ProceedToMatchMaking(); } } function Callback_OpenCreateGame() { if (class'WorldInfo'.static.IsConsoleBuild()) { KFPlayerController(GetPC()).StartLogin(ProceedToCreateGame, true); } else { ProceedToCreateGame(); } } // Call this to allow the player to go to the matchmaking screen on console. function ProceedToMatchMaking() { SetInt("externalMenuState", EMatchmaking); } function ProceedToCreateGame() { SetInt("externalMenuState", ECreateGame); } function Callback_OpenServerBrowser() { if(class'WorldInfo'.static.IsConsoleBuild()) { // BWJ - Disabled for console // CanUseMultiplayerFeatures(OnCanPlayOnlineCheckComplete); } else { Manager.OpenMenu(UI_ServerBrowserMenu); } } function OnCanPlayOnlineCheckComplete(byte LocalUserNum, EFeaturePrivilege Privilege, EFeaturePrivilegeLevel PrivilegeLevel, bool bDiffersFromHint) { // If it's not FP_OnlinePlay, we caught another async check that we don't care about... if(Privilege == FP_OnlinePlay) { Class'GameEngine'.static.GetOnlineSubsystem().PlayerInterface.ClearPrivilegeLevelCheckedDelegate(OnCanPlayOnlineCheckComplete); Manager.UnloadCurrentPopup(); if(PrivilegeLevel == FPL_Enabled) { Manager.OpenMenu(UI_ServerBrowserMenu); } else { Class'GameEngine'.static.GetOnlineSubsystem().PlayerInterfaceEx.UpsellPremiumOnlineService(); } } } //@HSL_END function Callback_StartMenuRequestReinit() { if( OptionsComponent != none ) { OptionsComponent.bShowLengthNoPref = GetStartMenuState() == EMatchmaking; OptionsComponent.InitializeGameOptions(); OptionsComponent.SetOptions(true); } } function Callback_StartMenuChange() { UpdateStartMenuState(); } function Callback_Mode( int Index ) { OptionsComponent.ModeChanged( Index ); } function Callback_Length( int Index ) { OptionsComponent.LengthChanged( Index ); } function Callback_Difficulty( int Index ) { OptionsComponent.DifficultyChanged( Index ); } function Callback_Privacy( int Index ) { OptionsComponent.PrivacyChanged( Index ); } function Callback_MapSelection( string MapKeyString ) { local string MapName; local int MapIndex; MapIndex = MapStringList.Find(MapKeyString); if(MapIndex == INDEX_NONE) { MapName = ""; } else { MapName = MapKeyString; } OptionsComponent.MapChanged( MapName ); } function Callback_Region(int RegionIndex) { OptionsComponent.SetRegionIndex(RegionIndex); } function SetLobbyData( string KeyName, string ValueData ) { OnlineLobby.SetLobbyData( KeyName, ValueData ); } function string MakeMapURL(KFGFxStartGameContainer_Options InOptionsComponent) { local string MapName; local int LengthIndex, ModeIndex; // this is ugly, but effectively makes sure that the player isn't solo with versus selected // or other error cases such as when the game isn't fully installed ModeIndex = InOptionsComponent.GetNormalizedGameModeIndex(Manager.GetModeIndex(true)); LengthIndex = InOptionsComponent.GetLengthIndex(); MapName = InOptionsComponent.GetMapName(); if (MapName == "" || MapStringList.Find(MapName) == INDEX_NONE) { if (CurrentConnectMap != "" && MapStringList.Find(CurrentConnectMap) != INDEX_NONE) { MapName = CurrentConnectMap; } else if( class'WorldInfo'.static.IsConsoleBuild() ) { // Pick a random map is game is fully installed if( class'GameEngine'.static.IsGameFullyInstalled() ) { MapName = MapStringList[rand(MapStringList.Length)]; } // evacuation point is the only map available if still installing else { MapName = "KF-EvacuationPoint"; } } else { // Biotics Lab doesn't support objective mode yet, so that needs a different default if (ModeIndex == EGameMode_Objective) { MapName = "KF-SteamFortress"; } else { MapName = "KF-BioticsLab"; } } } return MapName$"?Game="$class'KFGameInfo'.static.GetGameModeClassFromNum( ModeIndex ) $"?Difficulty="$class'KFGameDifficultyInfo'.static.GetDifficultyValue( InOptionsComponent.GetDifficultyIndex() ) $"?GameLength="$LengthIndex; } native function bool GetSearchComplete(KFOnlineGameSearch GameSearch); native function TryNextServer(); native function HandleSearchOver(); event OpenNotFoundPopup() { local KFPlayerController KFPC; KFPC = KFPlayerController(GetPC()); `log("KFGFxMenu_StartGame.OpenNotFoundPopup: No servers found, giving up."); KFPC.MyGFxManager.DelayedOpenPopup(ENotification, EDPPID_Misc, CouldNotFindGameTitleString, GetCouldNotFindGameDescription(), class'KFCommon_LocalizedStrings'.default.OKString); } event int GetLobbySize() { local ActiveLobbyInfo LobbyInfo; if ( OnlineLobby == none || !OnlineLobby.GetCurrentLobby(LobbyInfo) ) { return 0; } else { return LobbyInfo.Members.length; } } function OnFindGameServerComplete(bool bWasSuccessful) { if (bWasSuccessful && !bPauseTryingServers) { // If doing takeover, randomize the list to reduce risk of clients trying to take over the same server. Order is irrelevant for console when (no ping) if( bAttemptingServerCreate && (class'WorldInfo'.static.IsConsoleBuild() || class'WorldInfo'.static.IsEosBuild()) ) { RandomizeSearchResults(SearchDataStore.GetActiveGameSearch()); } // Regular join, sort normally else if( class'WorldInfo'.static.IsConsoleBuild() || class'WorldInfo'.static.IsEosBuild() ) { // Sort all entries for console SortServers(SearchDataStore.GetActiveGameSearch()); } else { SortLastEntry(SearchDataStore.GetActiveGameSearch()); } } TryNextServer(); } native function bool SpaceAvailable(const OnlineGameSettings Settings); native function bool MapGood(const OnlineGameSettings Settings, optional out string CurrentMap); native function SortLastEntry(OnlineGameSearch Search); native function SortServers(OnlineGameSearch Search); native function RandomizeSearchResults(OnlineGameSearch Search); function string BuildJoinFiltersRequestURL() { local string FiltersURL; local int GameMode, GameDifficulty; GameMode = Manager.GetModeIndex(); GameDifficulty = OptionsComponent.GetDifficulty(); if( GameMode >= 0 ) { FiltersURL $= "?Game="$class'KFGameInfo'.static.GetGameModeClassFromNum(GameMode); } if( GameDifficulty >= 0) { FiltersURL $= "?Difficulty="$GameDifficulty; } if( OptionsComponent.bLengthFilterSet ) { FiltersURL $= "?GameLength="$OptionsComponent.LengthFilter; } return FiltersURL; } function string BuildTakeoverURL(optional out string Password) { local string TakeoverURL; TakeoverURL = MakeMapURL(OptionsComponent); if (len(Password) > 0) { TakeoverURL $= "?gamepassword=" $ Password $ "?password=" $ Password; } // For console builds, if we're creating a private server, ensure private=1 is part of the takeover. TakeoverURL $= "?Private="$OptionsComponent.GetPrivacyIndex(); if( class'WorldInfo'.static.IsConsoleBuild() && OptionsComponent.GetPrivacyIndex() == ESPr_PasswordProtected) { TakeoverURL $= "?bJoinViaInvite"; } return TakeoverURL $ OnlineLobby.GetLobbyURLString(); } private native function SecureTakeover(const out string Address, const string TakeoverURL); function OnJoinGameComplete(name SessionName, bool bSuccessful) { if(GameInterface != none) { GameInterface.ClearJoinOnlineGameCompleteDelegate(OnJoinGameComplete); } if (!bSuccessful) { AttemptingJoin = false; `log("KFGFxMenu_StartGame.OnJoinGameComplete: join online game failed completion for server index"@CurrentSearchIndex, bLogSearchInfo); TryNextServer(); return; } if (GameInterface.GetResolvedConnectString(SessionName, PendingResolvedAddress)) { `log("KFGFxMenu_StartGame.OnJoinGameComplete: OnJoinGameComplete called for server index"@CurrentSearchIndex, bLogSearchInfo); KFGameEngine(Class'Engine'.static.GetEngine()).OnHandshakeComplete = OnHandshakeComplete; SetServerConnectGiveUpTimer(OptionsComponent.GetMakeNewServer()); if (OptionsComponent.GetMakeNewServer()) { `log("KFGFxMenu_StartGame.OnJoinGameComplete: servertakeover"@PendingResolvedAddress@BuildTakeoverURL(LobbyOwnerPassword), bLogSearchInfo); SecureTakeover(PendingResolvedAddress, BuildTakeoverURL(LobbyOwnerPassword)); } else { GetPC().ConsoleCommand("open"@PendingResolvedAddress$BuildJoinFiltersRequestURL()$OnlineLobby.GetLobbyURLString()); } } else { AttemptingJoin = false; `log("KFGFxMenu_StartGame.OnJoinGameComplete: unable to resolve server address, bLogSearchInfo"); TryNextServer(); } } function ConnectToPlayfabServer(string ServerIp) { local string OpenCommand; local bool bInParty; // First we need to know if we're joining or taking over OpenCommand = bAttemptingServerCreate ? "servertakeover" : "open"; OpenCommand @= ServerIp; bInParty = OnlineLobby != None && OnlineLobby.IsInLobby() && OnlineLobby.IsLobbyOwner(); if( bInParty ) { PendingResolvedAddress = ServerIp; } if( bAttemptingServerCreate ) { if ( class'WorldInfo'.static.IsEOSBuild() ) { OpenCommand @= BuildTakeoverURL(LobbyOwnerPassword); } else { OpenCommand @= BuildTakeoverURL(); } } else if( bInParty ) { OpenCommand $= OnlineLobby.GetLobbyURLString(); } // Regular join if( !bAttemptingServerCreate ) { OpenCommand $= BuildJoinFiltersRequestURL(); } KFGameEngine(Class'Engine'.static.GetEngine()).OnHandshakeComplete = OnHandshakeComplete; // Give a longer timeout for servers that need to spin up //@SABER_EGS_BEGIN fix connecting timeout via takeOver //if (class'WorldInfo'.static.IsEosBuild()) //{ // SetServerConnectGiveUpTimer(bAttemptingServerCreate); //} //else //{ `TimerHelper.SetTimer( bAttemptingServerCreate ? 8 : ServerConnectTimeout, false, nameof(ServerConnectGiveUp), self); //} //@SABER_EGS_END // Attach playfab ID OpenCommand $= "?PlayfabPlayerId="$class'GameEngine'.static.GetPlayfabInterface().CachedPlayfabId; `log("Going to connect with URL:"@OpenCommand); ConsoleCommand( OpenCommand ); } event SetServerConnectGiveUpTimer(bool ServerTakover) { `TimerHelper.SetTimer(ServerTakover ? ServerTakeoverTimeout : ServerConnectTimeout, false, nameof(ServerConnectGiveUp), self); } event AddJoinGameCompleteDelegate(OnlineGameSearch LatestGameSearch) { if( (class'WorldInfo'.static.IsConsoleBuild() && !class'WorldInfo'.static.IsE3Build()) || class'WorldInfo'.static.IsEOSBuild() ) { if( LatestGameSearch.Results[CurrentSearchIndex].GameSettings.JoinString == "" ) { AttemptingJoin = false; TryNextServer(); } else { ConnectToPlayfabServer(LatestGameSearch.Results[CurrentSearchIndex].GameSettings.JoinString); } } else { GameInterface.AddJoinOnlineGameCompleteDelegate(OnJoinGameComplete); GameInterface.JoinOnlineGame(0, 'Game', LatestGameSearch.Results[CurrentSearchIndex]); } } function ServerConnectGiveUp() { `log("KFGFxMenu_StartGame.ServerConnectGiveUp: ServerConnectGiveUp", bLogSearchInfo); KFGameEngine(Class'KFGameEngine'.static.GetEngine()).KillPendingServerConnection(); } function OnOpen() { if( Manager != none ) { Manager.SetStartMenuState(EStartMenuState(GetStartMenuState())); } if(MissionObjectiveContainer != none) { MissionObjectiveContainer.Refresh(true); } } function OnServerTakeoverResponseRecieved() { `log(GetFuncName()); if( class'WorldInfo'.static.IsEosBuild() ) { `TimerHelper.ClearTimer(nameof(ServerConnectGiveUp), self); } } function bool OnHandshakeComplete(bool bSuccess, string Description, out int SuppressPasswordRetry) { `log("KFGFxMenu_StartGame.OnHandShakeComplete", bLogSearchInfo); AttemptingJoin = false; KFGameEngine(Class'Engine'.static.GetEngine()).OnHandshakeComplete = None; `TimerHelper.ClearTimer(nameof(ServerConnectGiveUp), self); if (bSuccess) { `log("KFGFxMenu_StartGame.OnHandShakeComplete: LobbyJoinServer" @ PendingResolvedAddress, bLogSearchInfo); if( class'WorldInfo'.static.IsConsoleBuild() ) { if(OnlineLobby != None && OnlineLobby.IsInLobby() && OnlineLobby.IsLobbyOwner()) { OnlineLobby.LobbyJoinServer(PendingResolvedAddress); } } else { if (Len(LobbyOwnerPassword) > 0) { OnlineLobby.SetServerPassword(LobbyOwnerPassword); } OnlineLobby.LobbyJoinServer(PendingResolvedAddress); } PendingResolvedAddress = ""; } else { `log("KFGFxMenu_StartGame.OnHandShakeComplete: TryNextServer", bLogSearchInfo); //@HSL_BEGIN - JRO - Console doesn't make a session until after connect, don't need to clean it up on failure. Also, Party is a session and that needs to *not* be destroyed! if( !class'WorldInfo'.static.IsConsoleBuild() ) { GameInterface.DestroyOnlineGame('Game'); } //@HSL_END PendingResolvedAddress = ""; TryNextServer(); } return true; } event OnClose() { if(OverviewContainer != none) { OverviewContainer.ActionScriptVoid("hideSharedContentList"); } KFGameEngine(Class'Engine'.static.GetEngine()).OnHandshakeComplete = None; if(GameInterface != none) { GameInterface.ClearFindOnlineGamesCompleteDelegate(OnFindGameServerComplete); GameInterface.ClearJoinOnlineGameCompleteDelegate(OnJoinGameComplete); } Manager.CachedProfile.Save( GetLP().ControllerId ); if( (class'WorldInfo'.static.IsConsoleBuild() || class'WorldInfo'.static.IsEOSBuild()) && !class'WorldInfo'.static.IsE3Build() ) { class'GameEngine'.static.GetPlayfabInterface().ClearFindOnlineGamesCompleteDelegate( OnFindGameServerComplete ); } } function AddLobbyFilter(out array Filters, bool bIsSet, string Key, coerce String Val, bool bNumeric) { local LobbyFilter filter; if ( bIsSet ) { filter.Key = Key; filter.Value = Val; filter.Operator = OGSCT_Equals; filter.bNumeric = bNumeric; Filters.AddItem(filter); } } /********************************************************************************/ // Match Making /********************************************************************************/ function BuildServerFilters(OnlineGameInterface GameInterfaceSteam, KFGFxStartGameContainer_Options Options, OnlineGameSearch Search) { local int GameMode; local int GameDifficulty; local int GameLength; local string GameTagFilters; local ActiveLobbyInfo LobbyInfo; Search.ClearServerFilters(); // TODO: Eventually will want to support this. For now using PLAYFAB_BUILD_VERSION define if( class'WorldInfo'.static.IsConsoleBuild() ) { Search.AddGametagFilter(GameTagFilters, 'Region', class'GameEngine'.static.GetPlayfabInterface().CurrRegionName); } // Consoles MUST set region else { Search.AddServerFilter("version_match", string(class'KFGameEngine'.static.GetKFGameVersion())); } if (OptionsComponent.GetMakeNewServer() || bAttemptingServerCreate ) { Search.AddGametagFilter( GameTagFilters, 'bAvailableForTakeover', "1"); Search.AddGametagFilter( GameTagFilters, 'bRequiresPassword', "0"); } else { if( OnlineLobby != none && OnlineLobby.GetCurrentLobby(LobbyInfo) && LobbyInfo.Members.length >= 6) { Search.AddServerFilter( "noplayers", ""); } else { Search.AddServerFilter("notfull", ""); } GameMode = Manager.GetModeIndex(); if( GameMode >= 0 ) { Search.AddGametagFilter( GameTagFilters, 'Mode', string(GameMode) ); } //For modes that don't use filtered difficulty, don't even attempt to send this (Ex: Weekly) if (ShouldUseDifficultyFilter(GameMode)) { GameDifficulty = OptionsComponent.GetDifficulty(); if (GameDifficulty >= 0) { Search.AddGametagFilter(GameTagFilters, 'Difficulty', string(GameDifficulty)); } } //For modes that don't use filtered length, don't even attempt to send this (Ex: Weekly) if (ShouldUseLengthFilter(GameMode)) { GameLength = OptionsComponent.GetGameLength(); if (GameLength >= 0) { Search.AddGametagFilter(GameTagFilters, 'NumWaves', string(GameLength)); } } Search.TestAddBoolGametagFilter(GameTagFilters, true, 'bRequiresPassword', 0); Search.TestAddBoolGametagFilter(GameTagFilters, false, 'bInProgress', 0); if (!class'WorldInfo'.static.IsConsoleBuild()) { // aka server type "stock" Search.TestAddBoolGametagFilter(GameTagFilters, true, 'bCustom', 0); Search.TestAddBoolGametagFilter(GameTagFilters, true, 'bUsesStats', 1); } } if (Len(GameTagFilters) > 0) { Search.AddServerFilter( "gametagsand", GameTagFilters); } if (Search.MasterServerSearchKeys.length > 1) { Search.AddServerFilter( "and", string(Search.MasterServerSearchKeys.length), 0); } } function bool ShouldUseDifficultyFilter(int GameModeIndex) { switch (GameModeIndex) { //Weekly case 1: return false; } return true; } function bool ShouldUseLengthFilter(int GameModeIndex) { switch (GameModeIndex) { //Weekly case 1: //Endless case 3: // Objective Mode case 4: return false; } return true; } function Callback_StartGame() { if (OnlineLobby != none && OnlineLobby.IsInLobby()) { Manager.DelayedOpenPopup(EConfirmation, EDPPID_Misc, Class'KFCommon_LocalizedStrings'.default.StartOfflineGameString, Class'KFCommon_LocalizedStrings'.default.StartOfflineGameDescriptionString, Class'KFCommon_LocalizedStrings'.default.DisbandPartyString, Class'KFCommon_LocalizedStrings'.default.CancelString, Callback_StartOfflineGame); //middle button } else { Callback_StartOfflineGame(); } } function Callback_StartOfflineGame() { local OnlineSubsystem OnlineSub; OnlineSub = Class'GameEngine'.static.GetOnlineSubsystem(); if (OnlineLobby != none && OnlineLobby.IsInLobby()) { OnlineLobby.QuitLobby(); } if (!OnlineSub.IsGameOwned() && class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Orbis)) { if (OnlineSub.CanCheckFreeTrialState() && !OnlineSub.IsFreeTrialPeriodActive()) { Manager.HandleFreeTrialError(FTN_BuyGame); return; } if (!OnlineSub.CanCheckFreeTrialState()) { Manager.HandleFreeTrialError(FTN_NetworkCheckFailed); return; } } ConsoleCommand("open" @ MakeMapURL(OptionsComponent)); } event StartOnlineGame() { OptionsComponent.UpdateFilters(); /* if (OptionsComponent.GetServerTypeListen()) { //`log("******open" @ MakeMapURL(OptionsComponent)$"?listen?steamsockets"); ConsoleCommand("open" @ MakeMapURL(OptionsComponent)$"?listen?steamsockets"); OnlineLobby.LobbyJoinGame(); return; } */ GameInterface.SetMatchmakingTypeMode(SMT_Internet); CurrentSearchIndex = 0; // If this is supposed to be a private game, it has to be a takeover if( class'WorldInfo'.static.IsConsoleBuild() && OptionsComponent.GetPrivacyIndex() == 1 ) { bAttemptingServerCreate = true; } BuildServerFilters(GameInterface, OptionsComponent, SearchDataStore.GetCurrentGameSearch()); SearchDataStore.GetCurrentGameSearch().MaxSearchResults = MaxResultsToTry; if( (class'WorldInfo'.static.IsConsoleBuild() && !class'WorldInfo'.static.IsE3Build()) || class'WorldInfo'.static.IsEOSBuild() ) { AttemptingJoin = false; class'GameEngine'.static.GetPlayfabInterface().AddFindOnlineGamesCompleteDelegate( OnFindGameServerComplete ); } else { // Add a delegate for when the search completes. We will use this callback to do any post searching work. GameInterface.AddFindOnlineGamesCompleteDelegate(OnFindGameServerComplete); } if (class'WorldInfo'.static.IsEOSBuild()) { SearchFinished = false; } // Start a search if ( !SearchDataStore.SubmitGameSearch(class'UIInteraction'.static.GetPlayerControllerId(0), false) ) { GameInterface.ClearFindOnlineGamesCompleteDelegate(OnFindGameServerComplete); if( (class'WorldInfo'.static.IsConsoleBuild() && !class'WorldInfo'.static.IsE3Build()) || class'WorldInfo'.static.IsEOSBuild() ) { // BWJ - Not clearing this delegate because sometimes you can run into instances where the search fails because one is already in progress. // We do not want to clear the delegate when this happens. Players can end up in an "infinite search" because they never get the callback. // class'GameEngine'.static.GetPlayfabInterface().ClearFindOnlineGamesCompleteDelegate( OnFindGameServerComplete ); } } else { bPauseTryingServers = true; `TimerHelper.SetTimer(InitialSearchPause, false, nameof(UnpauseTryingServers), self); bSearchingForGame = true; OptionsComponent.SetSearching(bSearchingForGame); } } function ShowServerTakeoverPasswordPrompt() { Manager.DelayedOpenPopup(EInputPrompt, EDPPID_Misc,class'KFCommon_LocalizedStrings'.default.SetTakeoverServerPasswordTitle, "" , class'KFCommon_LocalizedStrings'.default.ConfirmString, class'KFCommon_LocalizedStrings'.default.CancelString, OnSetTakoverServerPassword); } function OnSetTakoverServerPassword() { local string Password; Password = KFGFxPopup_InputPrompt(Manager.CurrentPopup).PlayerInputString; LobbyOwnerPassword = Password; StartOnlineGame(); } native function string GenerateRandomPassword(); function Callback_StartOnlineGame() { local OnlineSubsystem OnlineSub; OnlineSub = Class'GameEngine'.static.GetOnlineSubsystem(); if (!OnlineSub.IsGameOwned() && class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Orbis)) { if (OnlineSub.CanCheckFreeTrialState() && !OnlineSub.IsFreeTrialPeriodActive()) { Manager.HandleFreeTrialError(FTN_BuyGame); return; } if (!OnlineSub.CanCheckFreeTrialState()) { Manager.HandleFreeTrialError(FTN_NetworkCheckFailed); return; } } if ( class'KFGameEngine'.static.IsFreeConsolePlayOver() ) { Manager.DelayedOpenPopup(EConfirmation, EDPPID_Misc, "", class'KFCommon_LocalizedStrings'.default.FreeConsolePlayOverString, class'KFCommon_LocalizedStrings'.default.BuyGameString, class'KFCommon_LocalizedStrings'.default.OKString, OnBuyGamePressed); return; } bAttemptingServerCreate = false; StartOnlineGame(); } function Callback_CreateOnlineGame() { local OnlineSubsystem OnlineSub; CancelGameSearch(); OnlineSub = Class'GameEngine'.static.GetOnlineSubsystem(); if (!OnlineSub.IsGameOwned() && class'WorldInfo'.static.IsConsoleBuild(CONSOLE_Orbis)) { if (OnlineSub.CanCheckFreeTrialState() && !OnlineSub.IsFreeTrialPeriodActive()) { Manager.HandleFreeTrialError(FTN_BuyGame); return; } if (!OnlineSub.CanCheckFreeTrialState()) { Manager.HandleFreeTrialError(FTN_NetworkCheckFailed); return; } } if (class'KFGameEngine'.static.IsFreeConsolePlayOver()) { Manager.DelayedOpenPopup(EConfirmation, EDPPID_Misc, "", class'KFCommon_LocalizedStrings'.default.FreeConsolePlayOverString, class'KFCommon_LocalizedStrings'.default.BuyGameString, class'KFCommon_LocalizedStrings'.default.OKString, OnBuyGamePressed); return; } LobbyOwnerPassword = ""; bAttemptingServerCreate = true; if (OptionsComponent.GetPrivacyIndex() == ESPr_PasswordProtected && !class'WorldInfo'.static.IsConsoleBuild()) { ShowServerTakeoverPasswordPrompt(); return; } else { StartOnlineGame(); } } /** Called when player selects buy game from the end of demo popup */ function OnBuyGamePressed() { local OnlineSubsystem OnlineSub; if( class'WorldInfo'.static.IsConsoleBuild( CONSOLE_Orbis ) ) { OnlineSub = Class'GameEngine'.static.GetOnlineSubsystem(); OnlineSub.OpenGameStorePage(); } } function UnpauseTryingServers() { bPauseTryingServers = false; if( bAttemptingServerCreate ) { RandomizeSearchResults(SearchDataStore.GetActiveGameSearch()); } else { SortServers(SearchDataStore.GetActiveGameSearch()); } TryNextServer(); } event CancelGameSearch() { local KFOnlineGameSearch ActiveGameSearch; ActiveGameSearch = KFOnlineGameSearch(SearchDataStore.GetActiveGameSearch()); if(ActiveGameSearch != none) { if( (class'WorldInfo'.static.IsConsoleBuild() || class'WorldInfo'.static.IsEOSBuild()) && !class'WorldInfo'.static.IsE3Build() ) { class'GameEngine'.static.GetPlayfabInterface().CancelGameSearch(); OnCancelSearchComplete(true); } else { GameInterface.AddCancelFindOnlineGamesCompleteDelegate(OnCancelSearchComplete); GameInterface.CancelFindOnlineGames(); } } else { OnCancelSearchComplete(false); } OptionsComponent.SetHelpText(""); } function OnCancelSearchComplete(bool bWasSuccessful) { bSearchingForGame = false; OptionsComponent.SetSearching(bSearchingForGame); Manager.SetSearchingForMatch(bSearchingForGame); } event int GetGameModeIndex() { local KFGameReplicationInfo KFGRI; KFGRI = KFGameReplicationInfo(class'WorldInfo'.static.GetWorldInfo().GRI); if(Manager != none) { return Manager.GetModeIndex(); } else if (KFGRI != none) { return class'KFGameInfo'.static.GetGameModeIndexFromName(string(KFGRI.GameClass.name)); } return 0; } /********************************************************************************/ // End Match Making /********************************************************************************/ function ShowOverview( bool bShowOverview, bool bLeader, bool bInMainMenu, bool bhostInServerBrowser) { if (bShowOverview) { if (bInMainMenu) { if (!bLeader) { if (bhostInServerBrowser) { SetInt("externalMenuState", EServerBrowserOverview); } else { SetInt("externalMenuState", EOverview); } } } else { SetInt("externalMenuState", EOverview); } } } function OnPartyLeave() { SetInt("externalMenuState", EStartHome); } defaultproperties { ModeKey="ModeKey" DifficultyKey="DifficultyKey" MapKey="MapKey" GameLengthKey="GameLengthKey" WhitelistedKey="WhitelistedKey" ServerTypeKey="ServerTypeKey" InProgressKey="InProgress" PermissionsKey="PermissionsKey" SearchDSName=KFGameSearch CurrentSearchIndex=0 bIsLeader = false bIsInParty = false SubWidgetBindings.Add((WidgetName="findGameContainer",WidgetClass=class'KFGFxStartGameContainer_FindGame')) SubWidgetBindings.Add((WidgetName="serverBrowserOverviewContainer",WidgetClass=class'KFGFxStartContainer_ServerBrowserOverview')) SubWidgetBindings.Add((WidgetName="gameOptionsContainer",WidgetClass=class'KFGFxStartGameContainer_Options')) SubWidgetBindings.Add((WidgetName="overviewContainer",WidgetClass=class'KFGFxStartContainer_InGameOverview')) SubWidgetBindings.Add((WidgetName="dailyContainerMC",WidgetClass=class'KFGFxDailyObjectivesContainer')) SubWidgetBindings.Add((WidgetName="weeklyContainerMC",WidgetClass=class'KFGFxWeeklyObjectivesContainer')) SubWidgetBindings.Add((WidgetName="missionObjectivesContainerMC",WidgetClass=class'KFGFxMissionObjectivesContainer')) SubWidgetBindings.Add((WidgetName="collapsedMissionObjectivesMC",WidgetClass=class'KFGFxCollapsedObjectivesContainer')) SubWidgetBindings.Add((WidgetName="specialEventContainerMC",WidgetClass=class'KFGFxSpecialeventObjectivesContainer')) SubWidgetBindings.Add((WidgetName="expandedMissionObjectivesMC",WidgetClass=class'KFGFxExpandedObjectivesContainer')) SubWidgetBindings.Add((WidgetName ="newsPage",WidgetClass=class'KFGFxStartContainer_NewsImageHolder')) WhatsNewPS="http://www.killingfloor2.com/psnews" WhatsNewMS="http://www.killingfloor2.com/xboxnews" WhatsNewSteam="http://www.killingfloor2.com/pcnews" }