/* Escape the Backrooms Autosplitter for Update 5 by Reokin Based on uhara by ru-mii (https://github.com/ru-mii/uhara) Big thanks to Nikoheart and ru-mii for help! Version history: ==Version 3.0== Game versions: 5.0+ By Reokin ==Version 2.0== Game versions: 1.21-4.5 Fully reworked by theframeburglar ==Version 1.4== Game versions: 4.0-4.5 Variables for 4.0+ found by Reokin Thanks to theframeburglar for teaching me how to do it! ==Version 1.3== Game versions: 3.0-3.13 ==Version 1.2== Game versions: 3.0-3.11 ==Version 1.1== Game versions: 3.0-3.10 By Permamiss & HeXaGoN 3.0 - 3.9 variables updated to work with newer versions by theframeburglar ==Version 1.0== Game versions: 3.0-3.9 By Permamiss & HeXaGoN isLoading1, wasLoading1 variables found by HeXaGoN isLoading2, wasLoading2, multiplayer variables found by Permamiss Shoutouts to Xero for consulting, and to Shad0w & for being our Fancy messenger! ==Version 0.1== Game versions: 2.3, 2.9 By Xero */ state("Backrooms-Win64-Shipping") {} startup { Assembly.Load(File.ReadAllBytes("Components/uhara9")).CreateInstance("Main"); vars.Uhara.AlertLoadless(); //vars.Uhara.EnableDebug(); vars.HasStarted = false; vars.HasExited = false; } init { // IntPtr gWorld = vars.Uhara.ScanRel(3, "48 8B 1D ?? ?? ?? ?? 48 85 DB 74 ?? 41 B0 01"); vars.Events = vars.Uhara.CreateTool("UnrealEngine", "Events"); vars.Resolver.Watch("LoadingStart", vars.Events.FunctionFlag("WB_LoadingScreen_C", "WB_LoadingScreen_C", "PreConstruct")); vars.Resolver.Watch("LoadingFinish", vars.Events.FunctionFlag("MP_PlayerController_C", "MP_PlayerController_C", "ClientGotoState")); vars.Resolver.Watch("LoadingEnding", vars.Events.FunctionFlag("", "", "ExecuteUbergraph_BP_ExitZone_GameEnding")); vars.Resolver.Watch("RestartLevel", vars.Events.FunctionFlag("WB_Button_RestartGame_C", "WB_Button_RestartGame_C", "BndEvt__WB_Button_Close_Button_K2Node_ComponentBoundEvent_0_OnButtonClickedEvent__DelegateSignature")); vars.Resolver.Watch("IsInHubGM", vars.Events.FunctionParentPtr("BP_MyGameInstance_C", "BP_MyGameInstance_C", "CheckAchievementQueue"), 0x350); vars.Resolver.Watch("Death", vars.Events.FunctionFlag("GameEnd_UI_2_C", "GameEnd_UI_2_C", "PreConstruct")); vars.Resolver.Watch("ContinueButton", vars.Events.FunctionFlag("UI_Menu_Evaluation_C", "UI_Menu_Evaluation_C", "BndEvt__UI_Menu_Evaluation_UI_Menu_Button_K2Node_ComponentBoundEvent_1_OnClick__DelegateSignature")); vars.Resolver.Watch("MainMenu", vars.Events.FunctionFlag("CheatManager", "CheatManager", "ReceiveInitCheatManager")); // vars.Resolver.Watch("GWorldName", gWorld, 0x18); vars.WasEnding = false; vars.LoadingState = true; } start { if (!vars.LoadingState && !vars.HasStarted) { vars.HasStarted = true; return true; } } update { vars.Uhara.Update(); // var world = vars.Events.FNameToString(current.GWorldName); // if (!string.IsNullOrEmpty(world) && world != "None") current.World = world; if ((old.LoadingStart != current.LoadingStart) || (old.RestartLevel != current.RestartLevel) || (old.MainMenu != current.MainMenu) || (old.LoadingEnding != current.LoadingEnding)) vars.LoadingState = true; if (old.MainMenu != current.MainMenu) vars.HasExited = true; if ((old.LoadingFinish != current.LoadingFinish) && vars.LoadingState) { vars.LoadingState = false; vars.HasExited = false; vars.WasEnding = false; } } split { if ((old.LoadingStart != current.LoadingStart) && !vars.HasExited) { if (vars.WasEnding) { vars.WasEnding = false; return false; } return true; } if (old.LoadingEnding != current.LoadingEnding) { vars.WasEnding = true; return true; } } reset { if ((current.IsInHubGM == 1) && ((((old.RestartLevel != current.RestartLevel) || (old.Death != current.Death)) && (old.LoadingStart != current.LoadingStart)) || (old.ContinueButton != current.ContinueButton))) return true; } isLoading { return vars.LoadingState; } onReset { vars.HasStarted = false; vars.HasExited = false; vars.WasEnding = false; vars.LoadingState = true; } exit { vars.HasExited = true; vars.WasEnding = false; vars.LoadingState = true; timer.IsGameTimePaused = true; }