1
0
KF2-Dev-Scripts/Engine/Classes/GameEngine.uc
2020-12-13 18:01:13 +03:00

644 lines
22 KiB
Ucode

//=============================================================================
// GameEngine: The game subsystem.
// Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
//=============================================================================
class GameEngine extends Engine
native(GameEngine)
config(Engine)
transient;
// URL structure.
struct transient native URL
{
var string Protocol; // Protocol, i.e. "unreal" or "http".
var string Host; // Optional hostname, i.e. "204.157.115.40" or "unreal.epicgames.com", blank if local.
var int Port; // Optional host port.
var string Map; // Map name, i.e. "SkyCity", default is "Index".
var array<string> Op; // Options.
var string Portal; // Portal to enter through, default is "".
//@HSL_BEGIN_XBOX - BWJ - 11/20/14 - Adding support for secure address (for use in XB1)
var string SecureAddress;
//@HSL_END_XBOX
var int Valid;
structcpptext
{
// Statics.
static FString DefaultProtocol;
static FString DefaultName;
static FString DefaultMap;
static FString DefaultLocalMap;
static FString DefaultLocalOptions;
static FString DefaultTransitionMap; // map used as in-between for seamless travel
static FString DefaultHost;
static FString DefaultPortal;
static FString DefaultMapExt;
static FString DefaultSaveExt;
/** Additional map extension to look for when parsing urls for map loading */
static FString AdditionalMapExt;
static INT DefaultPort;
/** port to listen for new client peer connections */
static INT DefaultPeerPort;
static UBOOL bDefaultsInitialized;
// Constructors.
FURL( const TCHAR* Filename=NULL );
FURL( FURL* Base, const TCHAR* TextURL, ETravelType Type );
static void StaticInit();
static void StaticExit();
/**
* Static: Removes any special URL characters from the specified string
*
* @param Str String to be filtered
*/
static void FilterURLString( FString& Str );
//@HSL_BEGIN_XBOX
/**
* Static: Replaces any special URL characters with encoded versions
*
* @param Str String to be encoded
*/
static void EncodeURLString( FString& Str );
/**
* Static: Replaces any encoded versions of special URL characters with their decoded versions
*
* @param Str String to be decoded
*/
static void DecodeURLString( FString& Str );
//@HSL_END_XBOX
// Functions.
UBOOL IsInternal() const;
UBOOL IsLocalInternal() const;
UBOOL HasOption( const TCHAR* Test ) const;
const TCHAR* GetOption( const TCHAR* Match, const TCHAR* Default ) const;
void LoadURLConfig( const TCHAR* Section, const TCHAR* Filename=NULL );
void SaveURLConfig( const TCHAR* Section, const TCHAR* Item, const TCHAR* Filename=NULL ) const;
void AddOption( const TCHAR* Str );
void RemoveOption( const TCHAR* Key, const TCHAR* Section = NULL, const TCHAR* Filename = NULL);
FString String( UBOOL FullyQualified=0 ) const;
friend FArchive& operator<<( FArchive& Ar, FURL& U );
//@HSL_BEGIN_XBOX - BWJ - 11-20-14- Adding support for secure address (for use in XB1)
UBOOL HasSecureAddress() const;
//@HSL_END_XBOX
// Operators.
UBOOL operator==( const FURL& Other ) const;
}
};
var PendingLevel GPendingLevel;
`if(`__TW_)
var string PendingLevelPlayerControllerClassName;
`else
/** The name of the class to spawn as the temporary pending level player controller */
var config string PendingLevelPlayerControllerClassName;
`endif
/** URL the last time we travelled */
var URL LastURL;
/** last server we connected to (for "reconnect" command) */
var URL LastRemoteURL;
var config array<string> ServerActors;
var string TravelURL;
var byte TravelType;
`if(`__TW_NETWORKING_)
//@HSL_BEGIN - BWJ - 8-10-16 - Saved client URL for takeover (contains client options)
var string ClientOptionsForTakeoverURL;
var string TakeoverURL;
var globalconfig bool bUsedForTakeover;
var bool bAvailableForTakeover;
/** TRUE if this is a private server. Used for console */
var bool bPrivateServer;
`endif
/** set for one tick after completely loading and initializing a new world
* (regardless of whether it's LoadMap() or seamless travel)
*/
var const transient bool bWorldWasLoadedThisTick;
/** check to see if we need to start a movie capture
* (used on the first tick when we want to record a matinee)
*/
var const transient bool bCheckForMovieCapture;
/**
* Triggers a call to PostLoadMap() the next Tick, turns off loading movie if LoadMap() has been called.
*/
var const transient bool bTriggerPostLoadMap;
/**
* TRUE if the loading movie was started during LoadMap().
*/
var const transient bool bStartedLoadMapMovie;
/** The singleton online interface for all game code to use */
var const transient OnlineSubsystem OnlineSubsystem;
//@HSL_BEGIN - BWJ - 4-5-16 - Playfab support
var const transient PlayfabInterface PlayfabInterfaceInst;
//@HSL_END
//@zombie_ps4_begin - Adding a gamepad light system
var const transient GamePadLightbarSubSystem GamePadLightBarSubsystem;
//@zombie_ps4_end
/** The singleton interface that enumerates available DLC */
var const transient DownloadableContentEnumerator DLCEnumerator;
`if(`__TW_)
var string DownloadableContentEnumeratorClassName;
`else
/** The name of the class to use for the DLC enumeration */
var config string DownloadableContentEnumeratorClassName;
`endif
/** The singleton interface that manages the installation and removal of DLC */
var const transient DownloadableContentManager DLCManager;
`if(`__TW_)
var bool bSaveBenchmarkGraphs;
struct native transient BenchmarkSample
{
var float AppTime, RenderThreadTime, GameThreadTime, GPUFrameTime, FrameTime;
};
var array<BenchmarkSample> BenchmarkSamples;
`endif
`if(`__TW_)
var string DownloadableContentManagerClassName;
`else
/** The name of the class to use for the DLC manager */
var config string DownloadableContentManagerClassName;
`endif
/**
* Array of package/ level names that need to be loaded for the pending map change. First level in that array is
* going to be made a fake persistent one by using ULevelStreamingPersistent.
*/
var const array<name> LevelsToLoadForPendingMapChange;
/** Array of already loaded levels. The ordering is arbitrary and depends on what is already loaded and such. */
var const array<level> LoadedLevelsForPendingMapChange;
/** Human readable error string for any failure during a map change request. Empty if there were no failures. */
var const string PendingMapChangeFailureDescription;
/** If TRUE, commit map change the next frame. */
var const bool bShouldCommitPendingMapChange;
/** Maximium delta time the engine uses to populate GDeltaTime. If 0, unbound. */
var config float MaxDeltaTime;
/**
* If true - clear all AnimSet LinkupCaches during map load.
* You need to do this is the set of skeletal meshes that you are playing anims on is not bounded.
*/
var config bool bClearAnimSetLinkupCachesOnLoadMap;
/** If true, and the platform allows it, the game engine will utilize a secondary screen */
var config bool bEnableSecondaryDisplay;
/**
* If true, the game engine will create a secondary viewport on init
* Dependent on bEnabledSecondaryDisplay being enabled.
* If false, and bEnableSecondaryDisplay is true, the secondary screen will just copy the first.
*/
var config bool bEnableSecondaryViewport;
`if(`__TW_)
var string SecondaryViewportClientClassName;
`else
/** String name for any secondary viewport clients created for secondary screens */
var config string SecondaryViewportClientClassName;
`endif
/** Secondary viewport clients inside of secondary windows (not for split screen) */
var init array<ScriptViewportClient> SecondaryViewportClients;
/** Array parallel to SecondaryViewportClients - these are the frames that render the SecondaryViewport clients */
var init array<pointer> SecondaryViewportFrames{FViewportFrame};
//@HSL_MOD_BEGIN - amiller 4/11/2016 - Adding support to ignore specific packages for Using Handshake
/** An Array of config package names to ignore GUID mismatch errors during connection handshake*/
var const config array<string> IgnoredUsesGUIDPackages;
//@HSL_MOD_END
/** level streaming updates that should be applied immediately after committing the map change */
struct native LevelStreamingStatus
{
var name PackageName;
var bool bShouldBeLoaded, bShouldBeVisible;
structcpptext
{
/** Constructors */
FLevelStreamingStatus(FName InPackageName, UBOOL bInShouldBeLoaded, UBOOL bInShouldBeVisible)
: PackageName(InPackageName), bShouldBeLoaded(bInShouldBeLoaded), bShouldBeVisible(bInShouldBeVisible)
{}
FLevelStreamingStatus()
{}
FLevelStreamingStatus(EEventParm)
{
appMemzero(this, sizeof(FLevelStreamingStatus));
}
}
};
var const array<LevelStreamingStatus> PendingLevelStreamingStatusUpdates;
/** Handles to object references; used by the engine to e.g. the prevent objects from being garbage collected. */
var const array<ObjectReferencer> ObjectReferencers;
enum EFullyLoadPackageType
{
/** Load the packages when the map in Tag is loaded */
FULLYLOAD_Map,
/** Load the packages before the game class in Tag is loaded. The Game name MUST be specified in the URL (game=Package.GameName). Useful for loading packages needed to load the game type (a DLC game type, for instance) */
FULLYLOAD_Game_PreLoadClass,
/** Load the packages after the game class in Tag is loaded. Will work no matter how game is specified in UWorld::SetGameInfo. Useful for modifying shipping gametypes by loading more packages (mutators, for instance) */
FULLYLOAD_Game_PostLoadClass,
/** Fully load the package as long as the DLC is loaded */
FULLYLOAD_Always,
/** Load the package for a mutator that is active */
FULLYLOAD_Mutator,
};
/** Struct to help hold information about packages needing to be fully-loaded for DLC, etc */
struct native FullyLoadedPackagesInfo
{
/** When to load these packages */
var EFullyLoadPackageType FullyLoadType;
/** When this map or gametype is loaded, the packages in the following array will be loaded and added to root, then removed from root when map is unloaded */
var string Tag;
/** The list of packages that will be fully loaded when the above Map is loaded */
var array<name> PackagesToLoad;
/** List of objects that were loaded, for faster cleanup */
var array<object> LoadedObjects;
};
/** A list of tag/array pairs that is used at LoadMap time to fully load packages that may be needed for the map/game with DLC, but we can't use DynamicLoadObject to load from the packages */
var array<FullyLoadedPackagesInfo> PackagesToFullyLoad;
//keeps track of whether we launched on partial install ie playgo, etc
var bool bPartialInstallLaunch;
/** Struct to hold a UNetDriver and an assoicated name */
struct native NamedNetDriver
{
/** The name associated with the driver */
var name NetDriverName;
/** A pointer to a UNetDriver */
var const native pointer NetDriver{class UNetDriver};
};
/** A list of named UNetDrivers */
var const transient array<NamedNetDriver> NamedNetDrivers;
/** Temporary Animation Tagging Information: until we integrate Content Tagging
* This is configurable information in Engine
* Tag: Name of Tag
* Contains: Contains text
* Priority is index of array
*/
struct native AnimTag
{
var string Tag; // This is Tag name
var array<string> Contains; // This is contains strings, i.e. _cvr_ or _cover_ for Tag name Cover
};
/**
* Animation tag for stat system: This is temporary until we can add content tag to animation
* Currently it auto tags based on "contains" - Check DefaultEngine.ini for modification
*/
var config array<AnimTag> AnimTags;
//@HSL_BEGIN_XBOX
/** True if trial mode is active */
var const transient bool bTrialActive;
//@HSL_END_XBOX
/**
* Creates a UNetDriver and associates a name with it.
*
* @param NetDriverName The name to associate with the driver.
*
* @return True if the driver was created successfully, false if there was an error.
*/
native final function bool CreateNamedNetDriver(name NetDriverName);
/**
* Destroys a UNetDriver based on its name.
*
* @param NetDriverName The name associated with the driver to destroy.
*/
native final function DestroyNamedNetDriver(name NetDriverName);
/** Returns the global online subsytem pointer. This will be null for PIE */
native static final noexport function OnlineSubsystem GetOnlineSubsystem();
//@HSL_BEGIN - BWJ - 4-5-16 - Playfab support
native static final function PlayfabInterface GetPlayfabInterface();
//@HSL_END
/** Returns the DLC enumerator object pointer. This will be null for PIE */
native static final noexport function DownloadableContentEnumerator GetDLCEnumerator();
/** Returns the DLC manager object pointer. This will be null for PIE */
native static final noexport function DownloadableContentManager GetDLCManager();
/** Returns whether this game engine has any secondary screens attached */
native static final noexport function bool HasSecondaryScreenActive();
`if(`__TW_NETWORKING_)
native function TakeoverServer( string InHostStr, string InUrlStr );
native static function int GetWebAdminPort();
native final function DisableServerTakeover();
`endif
//@HSL_BEGIN_XBOX
/** Encodes special URL characters in a string */
native static final noexport function EncodeURLString(out string Str);
/** Decodes special URL characters in a string */
native static final noexport function DecodeURLString(out string Str);
//@HSL_END_XBOX
//@HSL_BEGIN
/** Retrieves percentage of installation finished for streaming install */
native static final function float GetPercentageOfStreamingInstallComplete();
/** Checks to see if streaming install has finished */
native static final function bool IsGameFullyInstalled();
/** Checks to see if some particular chunks have finished installing */
native static final function bool AreChunksInstalled(const out array<int> ChunksToCheck);
/** Gets the install progress of some particular chunks */
native static final function float GetChunksInstallProgress(const out array<int> ChunksToCheck);
/** Gets the install progress of a particular chunk */
native static final function float GetChunkInstallProgress(int ChunkToCheck);
//@HSL_END
//function to determine whether or not the game was launched on partial install, ie playgo, etc
native static final function bool WasLaunchedOnPartialInstall();
cpptext
{
// Constructors.
UGameEngine();
/**
* Redraws all viewports.
*
* @param bShouldPresent Whether we want this frame to be presented
*/
void RedrawViewports( UBOOL bShouldPresent = TRUE );
/**
* Called to allow overloading by child engines
*/
virtual void LoadMapRedrawViewports(void)
{
RedrawViewports();
}
// UObject interface.
void FinishDestroy();
// UEngine interface.
void Init();
/**
* Called at shutdown, just before the exit purge.
*/
virtual void PreExit();
virtual void Tick( FLOAT DeltaSeconds );
UBOOL Exec( const TCHAR* Cmd, FOutputDevice& Ar=*GLog );
void SetClientTravel( const TCHAR* NextURL, ETravelType TravelType );
virtual FLOAT GetMaxTickRate( FLOAT DeltaTime, UBOOL bAllowFrameRateSmoothing = TRUE );
virtual void SetProgress( EProgressMessageType MessageType, const FString& Title, const FString& Message );
/**
* Handles freezing/unfreezing of rendering
*/
virtual void ProcessToggleFreezeCommand();
/**
* Handles frezing/unfreezing of streaming
*/
virtual void ProcessToggleFreezeStreamingCommand();
// UGameEngine interface.
virtual UBOOL Browse( FURL URL, FString& Error );
virtual UBOOL LoadMap( const FURL& URL, class UPendingLevel* Pending, FString& Error );
virtual void PostLoadMap();
virtual void CancelPending();
`if(`__TW_ONLINESUBSYSTEM_)
virtual void PerformBetweenMapTasks();
`endif
/**
* Spawns all of the registered server actors
*/
virtual void SpawnServerActors(void);
/**
* Construct a UNetDriver object based on an .ini setting
*
* @return The created NetDriver object, or NULL if it fails
*/
virtual class UNetDriver* ConstructNetDriver();
/**
* Returns the online subsystem object. Returns null if GEngine isn't a
* game engine
*/
static UOnlineSubsystem* GetOnlineSubsystem(void);
/**
* Creates the online subsystem that was specified in UEngine's
* OnlineSubsystemClass. This function is virtual so that licensees
* can provide their own version without modifying Epic code.
*/
virtual void InitOnlineSubsystem(void);
/**
* Creates the specified objects for dealing with DLC.
*/
void InitGameSingletonObjects(void);
/**
* @return the DLC enumerator, or null if GEngine isn't a game engine
*/
static UDownloadableContentEnumerator* GetDLCEnumerator(void)
{
UGameEngine* GameEngine = Cast<UGameEngine>(GEngine);
if (GameEngine)
{
return GameEngine->DLCEnumerator;
}
return NULL;
}
/**
* @return the DLC manager, or null if GEngine isn't a game engine
*/
static UDownloadableContentManager* GetDLCManager(void)
{
UGameEngine* GameEngine = Cast<UGameEngine>(GEngine);
if (GameEngine)
{
return GameEngine->DLCManager;
}
return NULL;
}
/**
* @return TRUE, if the GEngine is a game engine and has any secondary screens active
*/
static UBOOL HasSecondaryScreenActive(void)
{
UGameEngine* GameEngine = Cast<UGameEngine>(GEngine);
if (GameEngine)
{
check(GameEngine->SecondaryViewportClients.Num() == GameEngine->SecondaryViewportFrames.Num());
return (GameEngine->SecondaryViewportFrames.Num() > 0 ? TRUE : FALSE);
}
return FALSE;
}
// Async map change/ persistent level transition code.
/**
* Prepares the engine for a map change by pre-loading level packages in the background.
*
* @param LevelNames Array of levels to load in the background; the first level in this
* list is assumed to be the new "persistent" one.
*
* @return TRUE if all packages were in the package file cache and the operation succeeded,
* FALSE otherwise. FALSE as a return value also indicates that the code has given
* up.
*/
UBOOL PrepareMapChange(const TArray<FName>& LevelNames);
/**
* Returns the failure description in case of a failed map change request.
*
* @return Human readable failure description in case of failure, empty string otherwise
*/
FString GetMapChangeFailureDescription();
/**
* Returns whether we are currently preparing for a map change or not.
*
* @return TRUE if we are preparing for a map change, FALSE otherwise
*/
UBOOL IsPreparingMapChange();
/**
* Returns whether the prepared map change is ready for commit having called.
*
* @return TRUE if we're ready to commit the map change, FALSE otherwise
*/
UBOOL IsReadyForMapChange();
/**
* Finalizes the pending map change that was being kicked off by PrepareMapChange.
*
* @return TRUE if successful, FALSE if there were errors (use GetMapChangeFailureDescription
* for error description)
*/
UBOOL CommitMapChange();
/**
* Commit map change if requested and map change is pending. Called every frame.
*/
void ConditionalCommitMapChange();
/**
* Cancels pending map change.
*/
void CancelPendingMapChange();
/**
* Adds a map/package array pair for pacakges to load at LoadMap
*
* @param FullyLoadType When to load the packages (based on map, gametype, etc)
* @param Tag Map/game for which the packages need to be loaded
* @param Packages List of package names to fully load when the map is loaded
* @param bLoadPackagesForCurrentMap If TRUE, the packages for the currently loaded map will be loaded now
*/
void AddPackagesToFullyLoad(EFullyLoadPackageType FullyLoadType, const FString& Tag, const TArray<FName>& Packages, UBOOL bLoadPackagesForCurrentMap);
/**
* Empties the PerMapPackages array, and removes any currently loaded packages from the Root
*/
void CleanupAllPackagesToFullyLoad();
/**
* Loads the PerMapPackages for the given map, and adds them to the RootSet
*
* @param FullyLoadType When to load the packages (based on map, gametype, etc)
* @param Tag Name of the map/game to load packages for
*/
void LoadPackagesFully(EFullyLoadPackageType FullyLoadType, const FString& Tag);
/**
* Removes the PerMapPackages from the RootSet
*
* @param FullyLoadType When to load the packages (based on map, gametype, etc)
* @param Tag Name of the map/game to cleanup packages for
*/
void CleanupPackagesToFullyLoad(EFullyLoadPackageType FullyLoadType, const FString& Tag);
/**
* Finds a UNetDriver based on its name.
*
* @param NetDriverName The name associated with the driver to find.
*
* @return A pointer to the UNetDriver that was found, or NULL if it wasn't found.
*/
UNetDriver* FindNamedNetDriver(FName NetDriverName);
/**
* Creates a new FViewportFrame with a viewport client of class SecondaryViewportClientClassName
*/
void CreateSecondaryViewport(UINT SizeX, UINT SizeY);
/**
* Closes all secondary viewports opened with CreateSecondaryViewport
*/
void CloseSecondaryViewports();
//@HSL_BEGIN_XBOX
/** Encodes special URL characters in a string */
static void EncodeURLString(FString& Str)
{
// Simply forward the call to FURL
FURL::EncodeURLString(Str);
}
/** Decodes special URL characters in a string */
static void DecodeURLString(FString& Str)
{
// Simply forward the call to FURL
FURL::DecodeURLString(Str);
}
//@HSL_END_XBOX
/**
* When enabled, this will save the profile stats to file which can be used for
*/
#if __TW_
void UpdateBenchmarkStats();
void SaveBenchmarkStats();
void SecureConnect(const TCHAR* URL);
#endif
}