void UGameInstance::StartGameInstance() { UEngine* const Engine = GetEngine(); // Create default URL. // @note: if we change how we determine the valid start up map update LaunchEngineLoop's GetStartupMap() FURL DefaultURL; DefaultURL.LoadURLConfig(TEXT("DefaultPlayer"), GGameIni); // Enter initial world. EBrowseReturnVal::Type BrowseRet = EBrowseReturnVal::Failure; FString Error; TCHAR Parm[4096] = TEXT(""); const TCHAR* Tmp = FCommandLine::Get(); #if UE_BUILD_SHIPPING // In shipping don't allow an override Tmp = TEXT(""); #endif // UE_BUILD_SHIPPING const UGameMapsSettings* GameMapsSettings = GetDefault<UGameMapsSettings>(); const FString& DefaultMap = GameMapsSettings->GetGameDefaultMap(); if (!FParse::Token(Tmp, Parm, ARRAY_COUNT(Parm), 0) || Parm[0] == '-') { FCString::Strcpy(Parm, *(DefaultMap + GameMapsSettings->LocalMapOptions)); } FURL URL(&DefaultURL, Parm, TRAVEL_Partial); if (URL.Valid) { BrowseRet = Engine->Browse(*WorldContext, URL, Error); } // If waiting for a network connection, go into the starting level. if (BrowseRet != EBrowseReturnVal::Success && FCString::Stricmp(Parm, *DefaultMap) != 0) { const FText Message = FText::Format(NSLOCTEXT("Engine", "MapNotFound", "The map specified on the commandline '{0}' could not be found. Would you like to load the default map instead?"), FText::FromString(URL.Map)); // the map specified on the command-line couldn't be loaded. ask the user if we should load the default map instead if (FCString::Stricmp(*URL.Map, *DefaultMap) != 0 && FMessageDialog::Open(EAppMsgType::OkCancel, Message) != EAppReturnType::Ok) { // user canceled (maybe a typo while attempting to run a commandlet) FPlatformMisc::RequestExit(false); return; } else { BrowseRet = Engine->Browse(*WorldContext, FURL(&DefaultURL, *(DefaultMap + GameMapsSettings->LocalMapOptions), TRAVEL_Partial), Error); } } // Handle failure. if (BrowseRet != EBrowseReturnVal::Success) { UE_LOG(LogLoad, Fatal, TEXT("%s"), *FString::Printf(TEXT("Failed to enter %s: %s. Please check the log for errors."), Parm, *Error)); } }
void UGameInstance::StartRecordingReplay(const FString& Name, const FString& FriendlyName) { if ( FParse::Param( FCommandLine::Get(),TEXT( "NOREPLAYS" ) ) ) { UE_LOG( LogDemo, Warning, TEXT( "UGameInstance::StartRecordingReplay: Rejected due to -noreplays option" ) ); return; } UWorld* CurrentWorld = GetWorld(); if ( CurrentWorld == nullptr ) { UE_LOG( LogDemo, Warning, TEXT( "UGameInstance::StartRecordingReplay: GetWorld() is null" ) ); return; } FURL DemoURL; FString DemoName = Name; DemoName.ReplaceInline( TEXT( "%m" ), *CurrentWorld->GetMapName() ); // replace the current URL's map with a demo extension DemoURL.Map = DemoName; DemoURL.AddOption( *FString::Printf( TEXT( "DemoFriendlyName=%s" ), *FriendlyName ) ); CurrentWorld->DestroyDemoNetDriver(); const FName NAME_DemoNetDriver( TEXT( "DemoNetDriver" ) ); if ( !GEngine->CreateNamedNetDriver( CurrentWorld, NAME_DemoNetDriver, NAME_DemoNetDriver ) ) { UE_LOG( LogDemo, Warning, TEXT( "RecordReplay: failed to create demo net driver!" ) ); return; } CurrentWorld->DemoNetDriver = Cast< UDemoNetDriver >( GEngine->FindNamedNetDriver( CurrentWorld, NAME_DemoNetDriver ) ); check( CurrentWorld->DemoNetDriver != NULL ); CurrentWorld->DemoNetDriver->SetWorld( CurrentWorld ); FString Error; if ( !CurrentWorld->DemoNetDriver->InitListen( CurrentWorld, DemoURL, false, Error ) ) { UE_LOG( LogDemo, Warning, TEXT( "Demo recording failed: %s" ), *Error ); CurrentWorld->DemoNetDriver = NULL; } else { UE_LOG(LogDemo, Log, TEXT( "Num Network Actors: %i" ), CurrentWorld->NetworkActors.Num() ); } }
void UAmethystGameInstance::StartGameInstance() { #if PLATFORM_PS4 == 0 TCHAR Parm[4096] = TEXT(""); const TCHAR* Cmd = FCommandLine::Get(); // Catch the case where we want to override the map name on startup (used for connecting to other MP instances) if (FParse::Token(Cmd, Parm, ARRAY_COUNT(Parm), 0) && Parm[0] != '-') { // if we're 'overriding' with the default map anyway, don't set a bogus 'playing' state. if (!MainMenuMap.Contains(Parm)) { FURL DefaultURL; DefaultURL.LoadURLConfig(TEXT("DefaultPlayer"), GGameIni); FURL URL(&DefaultURL, Parm, TRAVEL_Partial); if (URL.Valid) { UEngine* const Engine = GetEngine(); FString Error; const EBrowseReturnVal::Type BrowseRet = Engine->Browse(*WorldContext, URL, Error); if (BrowseRet == EBrowseReturnVal::Success) { // Success, we loaded the map, go directly to playing state GotoState(AmethystGameInstanceState::Playing); return; } else if (BrowseRet == EBrowseReturnVal::Pending) { // Assume network connection LoadFrontEndMap(MainMenuMap); ShowLoadingScreen(); GotoState(AmethystGameInstanceState::Playing); return; } } } } #endif GotoInitialState(); }
bool UGameInstance::StartPIEGameInstance(ULocalPlayer* LocalPlayer, bool bInSimulateInEditor, bool bAnyBlueprintErrors, bool bStartInSpectatorMode) { UEditorEngine* const EditorEngine = CastChecked<UEditorEngine>(GetEngine()); ULevelEditorPlaySettings const* PlayInSettings = GetDefault<ULevelEditorPlaySettings>(); const EPlayNetMode PlayNetMode = [&PlayInSettings]{ EPlayNetMode NetMode(PIE_Standalone); return (PlayInSettings->GetPlayNetMode(NetMode) ? NetMode : PIE_Standalone); }(); // for clients, just connect to the server if (PlayNetMode == PIE_Client) { FString Error; FURL BaseURL = WorldContext->LastURL; if (EditorEngine->Browse(*WorldContext, FURL(&BaseURL, TEXT("127.0.0.1"), (ETravelType)TRAVEL_Absolute), Error) == EBrowseReturnVal::Pending) { EditorEngine->TransitionType = TT_WaitingToConnect; } else { FMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT("UnrealEd", "Error_CouldntLaunchPIEClient", "Couldn't Launch PIE Client: {0}"), FText::FromString(Error))); return false; } } else { // we're going to be playing in the current world, get it ready for play UWorld* const PlayWorld = GetWorld(); // make a URL FURL URL; // If the user wants to start in spectator mode, do not use the custom play world for now if (EditorEngine->UserEditedPlayWorldURL.Len() > 0 && !bStartInSpectatorMode) { // If the user edited the play world url. Verify that the map name is the same as the currently loaded map. URL = FURL(NULL, *EditorEngine->UserEditedPlayWorldURL, TRAVEL_Absolute); if (URL.Map != PIEMapName) { // Ensure the URL map name is the same as the generated play world map name. URL.Map = PIEMapName; } } else { // The user did not edit the url, just build one from scratch. URL = FURL(NULL, *EditorEngine->BuildPlayWorldURL(*PIEMapName, bStartInSpectatorMode), TRAVEL_Absolute); } // If a start location is specified, spawn a temporary PlayerStartPIE actor at the start location and use it as the portal. AActor* PlayerStart = NULL; if (EditorEngine->SpawnPlayFromHereStart(PlayWorld, PlayerStart, EditorEngine->PlayWorldLocation, EditorEngine->PlayWorldRotation) == false) { // failed to create "play from here" playerstart FMessageDialog::Open(EAppMsgType::Ok, NSLOCTEXT("UnrealEd", "Error_FailedCreatePlayFromHerePlayerStart", "Failed to create PlayerStart at desired starting location.")); return false; } if (!PlayWorld->SetGameMode(URL)) { // Setting the game mode failed so bail FMessageDialog::Open(EAppMsgType::Ok, NSLOCTEXT("UnrealEd", "Error_FailedCreateEditorPreviewWorld", "Failed to create editor preview world.")); return false; } // Make sure "always loaded" sub-levels are fully loaded PlayWorld->FlushLevelStreaming(EFlushLevelStreamingType::Visibility); UNavigationSystem::InitializeForWorld(PlayWorld, LocalPlayers.Num() > 0 ? FNavigationSystem::PIEMode : FNavigationSystem::SimulationMode); PlayWorld->CreateAISystem(); PlayWorld->InitializeActorsForPlay(URL); // @todo, just use WorldContext.GamePlayer[0]? if (LocalPlayer) { FString Error; if (!LocalPlayer->SpawnPlayActor(URL.ToString(1), Error, PlayWorld)) { FMessageDialog::Open(EAppMsgType::Ok, FText::Format(NSLOCTEXT("UnrealEd", "Error_CouldntSpawnPlayer", "Couldn't spawn player: {0}"), FText::FromString(Error))); return false; } } UGameViewportClient* const GameViewport = GetGameViewportClient(); if (GameViewport != NULL && GameViewport->Viewport != NULL) { // Stream any levels now that need to be loaded before the game starts GEngine->BlockTillLevelStreamingCompleted(PlayWorld); } if (PlayNetMode == PIE_ListenServer) { // start listen server with the built URL PlayWorld->Listen(URL); } PlayWorld->BeginPlay(); } return true; }
void UGameEngine::Init(IEngineLoop* InEngineLoop) { DECLARE_SCOPE_CYCLE_COUNTER(TEXT("UGameEngine Init"), STAT_GameEngineStartup, STATGROUP_LoadTime); // Call base. UEngine::Init(InEngineLoop); #if USE_NETWORK_PROFILER FString NetworkProfilerTag; if( FParse::Value(FCommandLine::Get(), TEXT("NETWORKPROFILER="), NetworkProfilerTag ) ) { GNetworkProfiler.EnableTracking(true); } #endif // Load and apply user game settings GetGameUserSettings()->LoadSettings(); GetGameUserSettings()->ApplySettings(); // Creates the initial world context. For GameEngine, this should be the only WorldContext that ever gets created. FWorldContext &InitialWorldContext = CreateNewWorldContext(EWorldType::Game); // Initialize the viewport client. UGameViewportClient* ViewportClient = NULL; if(GIsClient) { ViewportClient = ConstructObject<UGameViewportClient>(GameViewportClientClass,this); ViewportClient->SetReferenceToWorldContext(InitialWorldContext); GameViewport = ViewportClient; InitialWorldContext.GameViewport = ViewportClient; } bCheckForMovieCapture = true; // Attach the viewport client to a new viewport. if(ViewportClient) { // This must be created before any gameplay code adds widgets bool bWindowAlreadyExists = GameViewportWindow.IsValid(); if (!bWindowAlreadyExists) { GameViewportWindow = CreateGameWindow(); } CreateGameViewport( ViewportClient ); if( !bWindowAlreadyExists ) { SwitchGameWindowToUseGameViewport(); } FString Error; if(!ViewportClient->Init(Error)) { UE_LOG(LogEngine, Fatal,TEXT("%s"),*Error); } } // Create default URL. // @note: if we change how we determine the valid start up map update LaunchEngineLoop's GetStartupMap() FURL DefaultURL; DefaultURL.LoadURLConfig( TEXT("DefaultPlayer"), GGameIni ); // Enter initial world. EBrowseReturnVal::Type BrowseRet = EBrowseReturnVal::Failure; FString Error; TCHAR Parm[4096]=TEXT(""); const TCHAR* Tmp = FCommandLine::Get(); #if UE_BUILD_SHIPPING // In shipping don't allow an override Tmp = TEXT(""); #endif // UE_BUILD_SHIPPING const UGameMapsSettings* GameMapsSettings = GetDefault<UGameMapsSettings>(); const FString& DefaultMap = GameMapsSettings->GetGameDefaultMap(); if (!FParse::Token(Tmp, Parm, ARRAY_COUNT(Parm), 0) || Parm[0] == '-') { FCString::Strcpy(Parm, *(DefaultMap + GameMapsSettings->LocalMapOptions)); } FURL URL( &DefaultURL, Parm, TRAVEL_Partial ); if( URL.Valid ) { BrowseRet = Browse(InitialWorldContext, URL, Error ); } // If waiting for a network connection, go into the starting level. if (BrowseRet != EBrowseReturnVal::Success && FCString::Stricmp(Parm, *DefaultMap) != 0) { const FText Message = FText::Format( NSLOCTEXT("Engine", "MapNotFound", "The map specified on the commandline '{0}' could not be found. Would you like to load the default map instead?"), FText::FromString( URL.Map ) ); // the map specified on the command-line couldn't be loaded. ask the user if we should load the default map instead if ( FCString::Stricmp(*URL.Map, *DefaultMap) != 0 && FMessageDialog::Open( EAppMsgType::OkCancel, Message ) != EAppReturnType::Ok) { // user canceled (maybe a typo while attempting to run a commandlet) FPlatformMisc::RequestExit( false ); return; } else { BrowseRet = Browse(InitialWorldContext, FURL(&DefaultURL, *(DefaultMap + GameMapsSettings->LocalMapOptions), TRAVEL_Partial), Error); } } // Handle failure. if( BrowseRet != EBrowseReturnVal::Success ) { UE_LOG(LogLoad, Fatal, TEXT("%s"), *FString::Printf( TEXT("Failed to enter %s: %s. Please check the log for errors."), Parm, *Error) ); } UE_LOG(LogInit, Display, TEXT("Game Engine Initialized.") ); // for IsInitialized() bIsInitialized = true; }