void CHalfLife2::OnSourceModAllInitialized_Post() { InitLogicalEntData(); InitCommandLine(); #if SOURCE_ENGINE == SE_CSGO m_CSGOBadList.init(); m_CSGOBadList.add("m_iItemDefinitionIndex"); m_CSGOBadList.add("m_iEntityLevel"); m_CSGOBadList.add("m_iItemIDHigh"); m_CSGOBadList.add("m_iItemIDLow"); m_CSGOBadList.add("m_iAccountID"); m_CSGOBadList.add("m_iEntityQuality"); m_CSGOBadList.add("m_bInitialized"); m_CSGOBadList.add("m_szCustomName"); m_CSGOBadList.add("m_iAttributeDefinitionIndex"); m_CSGOBadList.add("m_iRawValue32"); m_CSGOBadList.add("m_iRawInitialValue32"); m_CSGOBadList.add("m_nRefundableCurrency"); m_CSGOBadList.add("m_bSetBonus"); m_CSGOBadList.add("m_OriginalOwnerXuidLow"); m_CSGOBadList.add("m_OriginalOwnerXuidHigh"); m_CSGOBadList.add("m_nFallbackPaintKit"); m_CSGOBadList.add("m_nFallbackSeed"); m_CSGOBadList.add("m_flFallbackWear"); m_CSGOBadList.add("m_nFallbackStatTrak"); m_CSGOBadList.add("m_iCompetitiveRanking"); m_CSGOBadList.add("m_nActiveCoinRank"); m_CSGOBadList.add("m_nMusicID"); #endif }
CommandLineParser::CommandLineParser(int argc, const char* argv[]) { m_bNoConfig = false; m_szConfigFilename = NULL; m_bErrors = false; m_bPrintVersion = false; m_bPrintUsage = false; m_iEditQueueAction = 0; m_pEditQueueIDList = NULL; m_iEditQueueIDCount = 0; m_iEditQueueOffset = 0; m_szEditQueueText = NULL; m_szArgFilename = NULL; m_szLastArg = NULL; m_szAddCategory = NULL; m_iAddPriority = 0; m_szAddNZBFilename = NULL; m_bAddPaused = false; m_bServerMode = false; m_bDaemonMode = false; m_bRemoteClientMode = false; m_bPrintOptions = false; m_bAddTop = false; m_szAddDupeKey = NULL; m_iAddDupeScore = 0; m_iAddDupeMode = 0; m_iLogLines = 0; m_iWriteLogKind = 0; m_bTestBacktrace = false; m_bWebGet = false; m_szWebGetFilename = NULL; m_EMatchMode = mmID; m_bPauseDownload = false; InitCommandLine(argc, argv); if (argc == 1) { m_bPrintUsage = true; return; } if (!m_bPrintOptions && !m_bPrintUsage && !m_bPrintVersion) { InitFileArg(argc, argv); } }
int LightmassMain(int argc, ANSICHAR* argv[]) { GStartupTime = FPlatformTime::Seconds(); // Create lightmass log file GLog->AddOutputDevice( FLightmassLog::Get() ); // Initialize FCommandLine InitCommandLine(argc, argv); #if USE_LOCAL_SWARM_INTERFACE FString CommandLine = FCommandLine::Get(); if (!FParse::Param(*CommandLine, TEXT("-Messaging"))) { CommandLine += TEXT(" -Messaging"); } GEngineLoop.PreInit(*CommandLine); // Tell the module manager is may now process newly-loaded UObjects when new C++ modules are loaded FModuleManager::Get().StartProcessingNewlyLoadedObjects(); FModuleManager::LoadModuleChecked<IMessagingModule>("Messaging"); FModuleManager::Get().LoadModule(TEXT("Settings")); IPluginManager::Get().LoadModulesForEnabledPlugins(ELoadingPhase::PreDefault); #endif UE_LOG(LogLightmass, Display, TEXT("Lightmass %s started on: %s. Command-line: %s"), FPlatformMisc::GetUBTPlatform(), FPlatformProcess::ComputerName(), FCommandLine::Get() ); // parse commandline options bool bRunUnitTest = false; bool bDumpTextures = false; FGuid SceneGuid(0x0123, 0x4567, 0x89AB, 0xCDEF); // default scene guid if none specified int32 NumThreads = FPlatformMisc::NumberOfCoresIncludingHyperthreads(); // default to the number of processors bool bCompareFiles = false; FString File1; FString File2; float ErrorThreshold = 0.000001f; // default error tolerance to allow in lighting comparisons // Override 'NumThreads' with the environment variable, if it's set. { TCHAR* SwarmMaxCoresVariable = new TCHAR[32768]; FPlatformMisc::GetEnvironmentVariable( TEXT("Swarm_MaxCores"), SwarmMaxCoresVariable, 32768 ); int32 SwarmMaxCores = FCString::Atoi( SwarmMaxCoresVariable ); if ( SwarmMaxCores >= 1 && SwarmMaxCores < 128 ) { NumThreads = SwarmMaxCores; } delete [] SwarmMaxCoresVariable; } for (int32 ArgIndex = 1; ArgIndex < argc; ArgIndex++) { if ((FCStringAnsi::Stricmp(argv[ArgIndex], " -help") == 0) || (FCStringAnsi::Stricmp(argv[ArgIndex], " -?") == 0)) { UE_LOG(LogLightmass, Display, TEXT("Usage:\n UnrealLightmass\n\t[SceneGuid]\n\t[-debug]\n\t[-unittest]\n\t[-dumptex]\n\t[-numthreads N]\n\t[-compare Dir1 Dir2 [-error N]]")); UE_LOG(LogLightmass, Display, TEXT("")); UE_LOG(LogLightmass, Display, TEXT(" SceneGuid : Guid of a scene file. 0x0000012300004567000089AB0000CDEF is the default")); UE_LOG(LogLightmass, Display, TEXT(" -debug : Processes all mappings in the scene, instead of getting tasks from Swarm Coordinator")); UE_LOG(LogLightmass, Display, TEXT(" -unittest : Runs a series of validations, then quits")); UE_LOG(LogLightmass, Display, TEXT(" -dumptex : Outputs .bmp files to the current directory of 2D lightmap/shadowmap results")); UE_LOG(LogLightmass, Display, TEXT(" -compare : Compares the binary dumps created by UnrealEd to compare Unreal vs LM lighting runs")); UE_LOG(LogLightmass, Display, TEXT(" -error : Controls the threshold that an error is counted when comparing with -compare")); return 0; } else if (FCStringAnsi::Stricmp(argv[ArgIndex], " -unittest") == 0) { bRunUnitTest = true; } else if (FCStringAnsi::Stricmp(argv[ArgIndex], " -dumptex") == 0) { bDumpTextures = true; } else if (FCStringAnsi::Stricmp(argv[ArgIndex], " -debug") == 0) { GDebugMode = true; } else if (FCStringAnsi::Stricmp(argv[ArgIndex], " -stats") == 0) { GReportDetailedStats = true; } else if (FCStringAnsi::Stricmp(argv[ArgIndex], " -numthreads") == 0) { // use the next parameter as the number of threads (it must exist, or we fail) NumThreads = 0; if (ArgIndex < argc - 1) { NumThreads = FCString::Atoi(*FString(argv[++ArgIndex])); } // validate it if (NumThreads == 0) { UE_LOG(LogLightmass, Display, TEXT("The number of threads was not specified properly, use \"-numthreads N\"")); return 1; } } else if (FCStringAnsi::Stricmp(argv[ArgIndex], " -compare") == 0) { bCompareFiles = true; if (ArgIndex >= argc - 2) { UE_LOG(LogLightmass, Display, TEXT("-compare requires two directories to compare (-compare Dir1 Dir2)")); return 1; } // cache the files to compare File1 = *FString(argv[++ArgIndex]); File2 = *FString(argv[++ArgIndex]); } else if (FCStringAnsi::Stricmp(argv[ArgIndex], " -error") == 0) { // use the next parameter as the number of threads (it must exist, or we fail) if (ArgIndex >= argc - 1) { UE_LOG(LogLightmass, Display, TEXT("-error requires an error value following (-error N)")); return 1; } ErrorThreshold = FCString::Atof(*FString(argv[++ArgIndex])); } // look for just a Guid on the commandline else if (FCStringAnsi::Strlen(argv[ArgIndex]) == 32) { // break up the string into 4 components FString Arg(argv[ArgIndex]); // we use _tcstoul to import base 16 #if PLATFORM_USES_MICROSOFT_LIBC_FUNCTIONS SceneGuid.A = _tcstoul(*Arg.Mid(0, 8), NULL, 16); SceneGuid.B = _tcstoul(*Arg.Mid(8, 8), NULL, 16); SceneGuid.C = _tcstoul(*Arg.Mid(16, 8), NULL, 16); SceneGuid.D = _tcstoul(*Arg.Mid(24, 8), NULL, 16); #else SceneGuid.A = wcstoul(*Arg.Mid(0, 8), NULL, 16); SceneGuid.B = wcstoul(*Arg.Mid(8, 8), NULL, 16); SceneGuid.C = wcstoul(*Arg.Mid(16, 8), NULL, 16); SceneGuid.D = wcstoul(*Arg.Mid(24, 8), NULL, 16); #endif } else if (FCStringAnsi::Stricmp(argv[ArgIndex], " -trisperleaf") == 0) { // use the next parameter as the maximum number of triangles per leaf for the kdop tree (it must exist, or we fail) if (ArgIndex >= argc - 1) { UE_LOG(LogLightmass, Display, TEXT("-error requires an error value following (-trisperleaf N)")); return 1; } GKDOPMaxTrisPerLeaf = FCString::Atoi(*FString(argv[++ArgIndex])); } } // if we want to run the unit test, do that, then nothing else if (bRunUnitTest) { // this is an ongoing compiler/runtime test for all templates and whatnot TestLightmass(); return 0; } if (bCompareFiles) { CompareLightingResults(*File1, *File2, ErrorThreshold); return 0; } // Start the static lighting processing UE_LOG(LogLightmass, Display, TEXT("Processing scene GUID: %08X%08X%08X%08X with %d threads"), SceneGuid.A, SceneGuid.B, SceneGuid.C, SceneGuid.D, NumThreads ); BuildStaticLighting(SceneGuid, NumThreads, bDumpTextures); #if USE_LOCAL_SWARM_INTERFACE FEngineLoop::AppPreExit(); FModuleManager::Get().UnloadModulesAtShutdown(); FTaskGraphInterface::Shutdown(); FEngineLoop::AppExit(); #endif return 0; }
/* * doInitializeEditor - do just that */ static void doInitializeEditor( int argc, char *argv[] ) { int i, arg, cnt, ocnt, startcnt = 0; srcline sline; int k, j; char tmp[FILENAME_MAX], c[1]; char buff[MAX_STR], file[MAX_STR], **list; char cmd[MAX_STR * 2]; char *parm; char *startup[MAX_STARTUP]; char *startup_parms[MAX_STARTUP]; vi_rc rc; vi_rc rc1; /* * Make sure WATCOM is setup and if it is not, make a best guess. */ watcom_setup_env(); /* * If EDPATH is not set, use system default %WATCOM%\EDDAT. */ if( getenv( "EDPATH" ) == NULL ) { char *watcom; watcom = getenv( "WATCOM" ); if( watcom != NULL ) { char edpath[FILENAME_MAX]; sprintf( edpath, "%s%c%s", watcom, FILE_SEP, "eddat" ); if( setenv( "EDPATH", edpath, 0 ) != 0 ) { /* * Bail out silently on error, as we will get error message later on. */ } } } /* * misc. set up */ MaxMemFree = MemSize(); StaticStart(); FTSInit(); BoundDataInit(); EditFlags.Starting = true; InitCommandLine(); ChkExtendedKbd(); SSInitBeforeConfig(); GetCWD1( &HomeDirectory ); GetCWD1( &CurrentDirectory ); SetCWD( HomeDirectory ); if( cfgFN == NULL ){ cfgFN = DupString( CFG_NAME ); } checkFlags( &argc, argv, startup, startup_parms, &startcnt ); ScreenInit(); SetWindowSizes(); EditFlags.ClockActive = false; SetInterrupts(); #ifdef __WIN__ InitClrPick(); InitFtPick(); SubclassGenericInit(); CursorOp( COP_INIT ); #else InitColors(); #endif InitSavebufs(); InitKeyMaps(); /* * initial configuration */ EditVars.Majick = MemStrDup( "()~@" ); EditVars.FileEndString = MemStrDup( "[END_OF_FILE]" ); MatchInit(); SetGadgetString( NULL ); WorkLine = MemAlloc( sizeof( line ) + EditVars.MaxLine + 2 ); WorkLine->len = -1; sline = 0; if( cfgFN[0] != 0 ) { c[0] = 0; rc = Source( cfgFN, c, &sline ); if( rc == ERR_FILE_NOT_FOUND ) { #ifdef __WIN__ CloseStartupDialog(); MessageBox( (HWND)NULLHANDLE, "Could not locate configuration information; please make sure your EDPATH environment variable is set correctly", EditorName, MB_OK ); ExitEditor( -1 ); #else rc = ERR_NO_ERR; #endif } } else { rc = ERR_NO_ERR; } if( wantNoReadEntireFile ) { EditFlags.ReadEntireFile = false; } VerifyTmpDir(); while( LostFileCheck() ); HookScriptCheck(); if( EditFlags.Quiet ) { EditFlags.Spinning = false; EditFlags.Clock = false; } ExtendedMemoryInit(); /* * more misc. setup */ if( EditVars.WordDefn == NULL ) { EditVars.WordDefn = DupString( &WordDefnDefault[6] ); InitWordSearch( EditVars.WordDefn ); } if( EditVars.WordAltDefn == NULL ) { EditVars.WordAltDefn = DupString( WordDefnDefault ); } if( EditVars.TagFileName == NULL ) { EditVars.TagFileName = DupString( "tags" ); } DotBuffer = MemAlloc( (maxdotbuffer + 2) * sizeof( vi_key ) ); AltDotBuffer = MemAlloc( (maxdotbuffer + 2) * sizeof( vi_key ) ); DotCmd = MemAlloc( (maxdotbuffer + 2) * sizeof( vi_key ) ); SwapBlockInit( EditVars.MaxSwapBlocks ); ReadBuffer = MemAlloc( MAX_IO_BUFFER + 6 ); WriteBuffer = MemAlloc( MAX_IO_BUFFER + 6 ); FindHistInit( EditVars.FindHist.max ); FilterHistInit( EditVars.FilterHist.max ); CLHistInit( EditVars.CLHist.max ); LastFilesHistInit( EditVars.LastFilesHist.max ); GetClockStart(); GetSpinStart(); SelRgnInit(); SSInitAfterConfig(); #if defined( VI_RCS ) ViRCSInit(); #endif /* * create windows */ StartWindows(); InitMouse(); rc1 = NewMessageWindow(); if( rc1 != ERR_NO_ERR ) { FatalError( rc1 ); } DoVersion(); rc1 = InitMenu(); if( rc1 != ERR_NO_ERR ) { FatalError( rc1 ); } EditFlags.SpinningOurWheels = true; EditFlags.ClockActive = true; EditFlags.DisplayHold = true; rc1 = NewStatusWindow(); if( rc1 != ERR_NO_ERR ) { FatalError( rc1 ); } EditFlags.DisplayHold = false; MaxMemFreeAfterInit = MemSize(); /* * look for a tag: if there is one, set it up as the file to start */ EditFlags.WatchForBreak = true; if( cTag != NULL && !EditFlags.NoInitialFileLoad ) { #if defined( __NT__ ) && !defined( __WIN__ ) { if( !EditFlags.Quiet ) { SetConsoleActiveScreenBuffer( OutputHandle ); } } #endif rc1 = LocateTag( cTag, file, buff ); cFN = file; if( rc1 != ERR_NO_ERR ) { if( rc1 == ERR_TAG_NOT_FOUND ) { Error( GetErrorMsg( rc1 ), cTag ); ExitEditor( 0 ); } FatalError( rc1 ); } } /* * start specified file(s) */ cmd[0] = 'e'; cmd[1] = 0; arg = argc - 1; k = 1; while( !EditFlags.NoInitialFileLoad ) { if( cFN == nullFN && !EditFlags.UseNoName ) { break; } #ifdef __NT__ { int k2; int arg2; char path[_MAX_PATH]; int found; int fd; size_t len; size_t len1; char *p; /* * check for the existence of a file name containing spaces, and open it if * there is one */ len = _MAX_PATH - 1; found = 0; p = path; arg2 = arg; for( k2 = k; argv[k2] != NULL; ) { len1 = strlen( argv[k2] ); if( len1 > len ) break; memcpy( p, argv[k2], len1 ); p += len1; *p = '\0'; len -= len1; --arg2; ++k2; fd = open( path, O_RDONLY ); if( fd != -1 ) { close( fd ); k = k2; arg = arg2; found = 1; break; } *p++ = ' '; } if( found ) { #ifndef __UNIX__ len1 = strlen( path ); if( path[len1 - 1] == '.' ) path[len1 - 1] = '\0'; #endif rc1 = NewFile( path, false ); if( rc1 != ERR_NO_ERR ) { FatalError( rc1 ); } cFN = argv[k]; if( arg < 1 ) { break; } continue; } } #endif strcat( cmd, SingleBlank ); strcat( cmd, cFN ); ocnt = cnt = ExpandFileNames( cFN, &list ); if( cnt == 0 ) { cnt = 1; } else { cFN = list[0]; } for( j = 0; j < cnt; j++ ) { rc1 = NewFile( cFN, false ); if( rc1 != ERR_NO_ERR && rc1 != NEW_FILE ) { FatalError( rc1 ); } if( EditFlags.BreakPressed ) { break; } if( cnt > 0 && j < cnt - 1 ) { cFN = list[j + 1]; } } if( ocnt > 0 ) { MemFreeList( ocnt, list ); } if( EditFlags.BreakPressed ) { ClearBreak(); break; } k++; arg--; if( cTag != NULL || arg < 1 ) { break; } cFN = argv[k]; } if( EditFlags.StdIOMode ) { rc1 = NewFile( "stdio", false ); if( rc1 != ERR_NO_ERR ) { FatalError( rc1 ); } } EditFlags.WatchForBreak = false; EditFlags.Starting = false; /* * if there was a tag, do the appropriate search */ if( cTag != NULL && !EditFlags.NoInitialFileLoad ) { if( buff[0] != '/' ) { i = atoi( buff ); rc1 = GoToLineNoRelCurs( i ); } else { rc1 = FindTag( buff ); } if( rc1 > 0 ) { Error( GetErrorMsg( rc1 ) ); } } /* * try to run startup file */ if( EditFlags.RecoverLostFiles ) { startcnt = 0; } for( i = 0; i < startcnt; i++ ) { GetFromEnv( startup[i], tmp ); ReplaceString( &cfgFN, tmp ); if( cfgFN[0] != 0 ) { if( startup_parms[i] != NULL ) { parm = startup_parms[i]; } else { c[0] = 0; parm = c; } #if defined( __NT__ ) && !defined( __WIN__ ) { if( !EditFlags.Quiet ) { SetConsoleActiveScreenBuffer( OutputHandle ); } } #endif sline = 0; rc = Source( cfgFN, parm, &sline ); } } if( rc > ERR_NO_ERR ) { Error( "%s on line %u of \"%s\"", GetErrorMsg( rc ), sline, cfgFN ); } if( argc == 1 ) { LoadHistory( NULL ); } else { LoadHistory( cmd ); } if( EditVars.GrepDefault == NULL ) { EditVars.GrepDefault = DupString( "*.(c|h)" ); } if( goCmd[0] != 0 ) { KeyAddString( goCmd ); } if( keysToPush != NULL ) { KeyAddString( keysToPush ); } #ifdef __WIN__ if( lineToGoTo != 0 ) { SetCurrentLine( lineToGoTo ); NewCursor( CurrentWindow, EditVars.NormalCursorType ); } #endif AutoSaveInit(); HalfPageLines = WindowAuxInfo( CurrentWindow, WIND_INFO_TEXT_LINES ) / 2 - 1; #if defined( _M_X64 ) VarAddGlobalStr( "OSX64", "1" ); #elif defined( _M_IX86 ) && !defined( _M_I86 ) VarAddGlobalStr( "OS386", "1" ); #endif if( EditVars.StatusString == NULL ) { EditVars.StatusString = DupString( "L:$6L$nC:$6C" ); } UpdateStatusWindow(); #ifdef __WIN__ if( CurrentInfo == NULL ) { // no file loaded - screen is disconcertenly empty - reassure DisplayFileStatus(); } #endif NewCursor( CurrentWindow, EditVars.NormalCursorType ); #if defined( __NT__ ) && !defined( __WIN__ ) { SetConsoleActiveScreenBuffer( OutputHandle ); } #endif } /* doInitializeEditor */
void CHalfLife2::OnSourceModAllInitialized_Post() { InitLogicalEntData(); InitCommandLine(); }
//Main function called from the android entry point int32 AndroidMain(struct android_app* state) { FPlatformMisc::LowLevelOutputDebugString(L"Entered AndroidMain()"); // Force the first call to GetJavaEnv() to happen on the game thread, allowing subsequent calls to occur on any thread FAndroidApplication::GetJavaEnv(); // adjust the file descriptor limits to allow as many open files as possible rlimit cur_fd_limit; { int result = getrlimit(RLIMIT_NOFILE, & cur_fd_limit); //FPlatformMisc::LowLevelOutputDebugStringf(TEXT("(%d) Current fd limits: soft = %lld, hard = %lld"), result, cur_fd_limit.rlim_cur, cur_fd_limit.rlim_max); } { rlimit new_limit = cur_fd_limit; new_limit.rlim_cur = cur_fd_limit.rlim_max; new_limit.rlim_max = cur_fd_limit.rlim_max; int result = setrlimit(RLIMIT_NOFILE, &new_limit); //FPlatformMisc::LowLevelOutputDebugStringf(TEXT("(%d) Setting fd limits: soft = %lld, hard = %lld"), result, new_limit.rlim_cur, new_limit.rlim_max); } { int result = getrlimit(RLIMIT_NOFILE, & cur_fd_limit); //FPlatformMisc::LowLevelOutputDebugStringf(TEXT("(%d) Current fd limits: soft = %lld, hard = %lld"), result, cur_fd_limit.rlim_cur, cur_fd_limit.rlim_max); } // setup joystick support // r19 is the first NDK to include AMotionEvenet_getAxisValue in the headers // However, it has existed in the so since Honeycomb, query for the symbol // to determine whether to try controller support { void* Lib = dlopen("libandroid.so",0); if (Lib != NULL) { GetAxes = (GetAxesType)dlsym(Lib, "AMotionEvent_getAxisValue"); } if (GetAxes != NULL) { FPlatformMisc::LowLevelOutputDebugStringf(TEXT("Controller interface supported\n")); } else { FPlatformMisc::LowLevelOutputDebugStringf(TEXT("Controller interface UNsupported\n")); } } // setup key filtering static const uint32 MAX_KEY_MAPPINGS(256); uint16 KeyCodes[MAX_KEY_MAPPINGS]; uint32 NumKeyCodes = FPlatformMisc::GetKeyMap(KeyCodes, nullptr, MAX_KEY_MAPPINGS); for (int i = 0; i < NumKeyCodes; ++i) { MappedKeyCodes.Add(KeyCodes[i]); } const int IgnoredGamepadKeyCodeCount = sizeof(IgnoredGamepadKeyCodesList)/sizeof(uint16); for (int i = 0; i < IgnoredGamepadKeyCodeCount; ++i) { IgnoredGamepadKeyCodes.Add(IgnoredGamepadKeyCodesList[i]); } const int ValidGamepadKeyCodeCount = sizeof(ValidGamepadKeyCodesList)/sizeof(uint16); for (int i = 0; i < ValidGamepadKeyCodeCount; ++i) { ValidGamepadKeyCodes.Add(ValidGamepadKeyCodesList[i]); } // wait for java activity onCreate to finish while (!GResumeMainInit) { FPlatformProcess::Sleep(0.01f); FPlatformMisc::MemoryBarrier(); } // read the command line file InitCommandLine(); FPlatformMisc::LowLevelOutputDebugStringf(TEXT("Final commandline: %s\n"), FCommandLine::Get()); EventHandlerEvent = FPlatformProcess::GetSynchEventFromPool(false); FPlatformMisc::LowLevelOutputDebugString(L"Created sync event"); FAppEventManager::GetInstance()->SetEventHandlerEvent(EventHandlerEvent); // ready for onCreate to complete GEventHandlerInitialized = true; // Initialize file system access (i.e. mount OBBs, etc.). // We need to do this really early for Android so that files in the // OBBs and APK are found. IPlatformFile::GetPlatformPhysical().Initialize(nullptr, FCommandLine::Get()); #if 0 for (int32 i = 0; i < 10; i++) { sleep(1); FPlatformMisc::LowLevelOutputDebugStringf(TEXT("[Patch %d]"), i); } FPlatformMisc::LowLevelOutputDebugStringf(TEXT("[Patch] : Dont Patch \n")); #endif // initialize the engine GEngineLoop.PreInit(0, NULL, FCommandLine::Get()); // initialize HMDs InitHMDs(); UE_LOG(LogAndroid, Display, TEXT("Passed PreInit()")); GLog->SetCurrentThreadAsMasterThread(); GEngineLoop.Init(); UE_LOG(LogAndroid, Log, TEXT("Passed GEngineLoop.Init()")); // tick until done while (!GIsRequestingExit) { FAppEventManager::GetInstance()->Tick(); if(!FAppEventManager::GetInstance()->IsGamePaused()) { GEngineLoop.Tick(); float timeToSleep = 0.05f; //in seconds sleep(timeToSleep); } #if !UE_BUILD_SHIPPING // show console window on next game tick if (GShowConsoleWindowNextTick) { GShowConsoleWindowNextTick = false; AndroidThunkCpp_ShowConsoleWindow(); } #endif } UE_LOG(LogAndroid, Log, TEXT("Exiting")); // exit out! GEngineLoop.Exit(); return 0; }