1
0
KF2-Dev-Scripts/KFGame/Classes/KFGfxMenu_StartGame.uc
2020-12-13 18:09:05 +03:00

1926 lines
54 KiB
Ucode

//=============================================================================
// 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<string> 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<string> 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<string> 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<string> 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<KFGFxSpecialeventObjectivesContainer> 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<LobbyFilter> 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"
}