UE4SS Experimental Release Archive
Pre-releaseImportant: The default installation layout has changed. All UE4SS files (including UE4SS.dll, settings, and mods) now reside in a ue4ss subfolder next to your game executable. Only the proxy DLL (dwmapi.dll) remains in the game's Win64 directory. This keeps your game folder cleaner and makes it easier to manage UE4SS installations. Existing installations in the old location will continue to work for backwards compatibility if the UE4SS dll is replaced directly.
New
General
Added CMake build system alongside Xmake - (UE4SS #1067)
- CMake >= 3.22 is now supported as the default build system
- Documentation updated to reference CMake build instructions
- xmake may be deprecated in the future. Meanwhile, we cannot guarantee ABI compatability
Added support for UE Version 5.7
Added support for UE Version 5.6 - (UE4SS #977)
Added support for UE Version 5.5 - (UE4SS #708)
Added support for UE Version 5.4 - (UE4SS #503)
Added basic support for Development/Debug/Test built Unreal Engine games (UE4SS #607)
- To use this functionality, set DebugBuild to true in UE4SS-Settings.ini
Added command line option to disable RE-UE4SS loading via proxy DLL. Use --disable-ue4ss to launch game without UE4SS while keeping the proxy DLL installed. (UE4SS #1069)
Added command line option to specify custom UE4SS.dll path via proxy DLL. Use --ue4ss-path <path> to load UE4SS.dll from a custom location, supporting both absolute and relative paths. This allows developers to easily test different UE4SS builds without modifying files. (UE4SS #1074)
Added environment variable UE4SS_MODS_PATHS. This is a colon separated list of additional directories to load Lua and C++ mods from. (UE4SS #1069)
Added new build definition "LessEqual421". Using this definition for games on UE<=4.21 is not mandatory for UE4SS to function, but will ensure the correct alignment is used in containers.
BREAKING: - This also changes the default FName alignment from 8 to 4.
- To use this functionality, enter LessEqual421 in the section of the XMake configuration command.
BREAKING: Changed default EFindName parameter for FName constructors from FNAME_Find to FNAME_Add.
- FName constructors will now create new name table entries by default if the name doesn't exist, rather than returning NAME_None
- To maintain the old behavior, explicitly pass
FNAME_Findas the second parameter - This affects all string-based FName constructors
Added optional scans for GUObjectHashTables, GNatives and ConsoleManagerSingleton; made FText an optional scan; externed the found GNatives for use by mods(UE4SS #744)
- GUObjectHashTables and ConsoleManagerSingleton are currently unused and a WIP.
UE Platform support, which allows for much easier internal implementation of new Unreal classes (UEPseudo #80) - narknon, localcc
Added new installation method by allowing overriding of the location of the UE4SS.dll, documentation. - (UE4SS #506) - Buckminsterfullerene
Add Github alerts pre-processor support to the documentation system (UE4SS #611) - Buckminsterfullerene
Added custom game configurations for Abiotic Factor (UE4SS #709)
Added custom game configurations for Psychonauts 2 (UE4SS #731)
Added custom game configurations for Lies of P (UE4SS #787)
Added custom game configurations for Project Silverfish (UE4SS #1066)
Added custom game configurations for Whiskerwood (UE4SS #1079)
Added custom game configurations for StarRupture (UE4SS #1150)
The GUI can now be rendered in the game thread if RenderMode in UE4SS-settings.ini is set to
EngineTick or GameViewportClientTick (UE4SS #768, UE4SS #794).
Added override Lua files for ProcessLocalScriptFunction and ProcessInternal UE4SS #823 - M3C3I
Added override Lua files for CallFunctionByNameWithArguments UE4SS #848 - M3C3I
Add error messages in places where only error codes were previously logged (e.g. load a C++ mod) UE4SS #902
Added [f: <address_or_module_offset> section to UE4SS_ObjectDump.txt UE4SS #866
Added line in the docs to add FText::FromString(FString&) as an alternative to FText::FText(FString&) for UE5 games - (UE4SS #1078)
Live View
Added search filter: IncludeClassNames. (UE4SS #472) - Buckminsterfullerene
Added search filter: Match Memory Address. (UE4SS #882) - vitrvvivs
Added ability to call UFunctions directly from the GUI. (UE4SS #851)
Added highlights for properties matching the Has property and Has property of type filters (UE4SS #1089)
Added a Dump as JSON button for individual objects, located next to the Find functions button (UE4SS #1112)
Lua Debugger
Added new Lua Debugger GUI tab with debugging tools for Lua mod development (UE4SS #1099)
- Breakpoint management with hit counts
- Step debugging (Step Into, Step Over, Step Out, Continue)
- Call stack viewer with clickable frames
- Locals and upvalues inspection
- Global variables browser with search and tree navigation
- REPL console with command history
- Script editor
- Loaded modules viewer
- Mods management tab to view, enable/disable, and create Lua mods
Added individual mod restart/uninstall/start functionality to Lua Debugger (UE4SS #1105)
- Restart and Uninstall buttons for running mods in the Mods tab
- Start button for non-running mods without requiring a full hot reload
- Restart/Start button in Script Editor tab for quick mod iteration
- New file creation dialog with optional auto-require in main.lua
UHT Dumper
Added support for generating FUtf8String and FAnsiString properties in UHT-compatible headers (UE4SS #1015)
Lua API
Added support for FUtf8String and FAnsiString Unreal string types with string manipulation API (UE4SS #1015)
- Refactored FString implementation to use unified
TLuaStringBasetemplate for code reuse and consistency
Added global functions for mod management (UE4SS #1105)
RestartCurrentMod()- Restart the currently running modUninstallCurrentMod()- Uninstall the currently running modRestartMod(ModName)- Restart another mod by nameUninstallMod(ModName)- Uninstall another mod by name
Added comprehensive Delayed Action System for game-thread timer management (UE4SS #1128)
- New execution functions:
ExecuteInGameThreadWithDelay(delayMs, callback)- Execute after delay, returns handleExecuteInGameThreadWithDelay(handle, delayMs, callback)- UE Delay-style (only executes if handle not active)RetriggerableExecuteInGameThreadWithDelay(handle, delayMs, callback)- Resets timer if called again (debouncing)LoopInGameThreadWithDelay(delayMs, callback)- Repeating timer with handleExecuteInGameThreadAfterFrames(frames, callback)- Frame-based delay (requires EngineTick)LoopInGameThreadAfterFrames(frames, callback)- Frame-based repeating timerMakeActionHandle()- Generate unique handle for use with delay functions
- Timer control functions:
CancelDelayedAction(handle)- Cancel a pending actionPauseDelayedAction(handle)- Pause a timerUnpauseDelayedAction(handle)- Resume a paused timerResetDelayedActionTimer(handle)- Restart with original delaySetDelayedActionTimer(handle, newDelayMs)- Change delay and restartClearAllDelayedActions()- Cancel all actions for current mod
- Query functions:
IsValidDelayedActionHandle(handle)- Check if handle existsIsDelayedActionActive(handle)- Check if timer is runningIsDelayedActionPaused(handle)- Check if timer is pausedGetDelayedActionRate(handle)- Get configured delayGetDelayedActionTimeRemaining(handle)- Get remaining timeGetDelayedActionTimeElapsed(handle)- Get elapsed time
- New global variables:
EngineTickAvailable,ProcessEventAvailable - New enum:
EGameThreadMethodwithProcessEventandEngineTickvalues ExecuteInGameThreadnow accepts optional second parameter for execution method- Per-mod action ownership ensures mods can only control their own timers
- Deprecates:
ExecuteAsyncandLoopAsync(still work but lack control features)
Updated Lua version to 5.4.7 (UE4SS #887)
- This is necessary to compile with Clang.
ForEach loops now support early termination by returning true from callbacks (UE4SS #1058)
- Applies to
TArray:ForEach,TMap:ForEach,TSet:ForEach, andUDataTable:ForEachRow - Fully backward compatible - existing callbacks without return values continue to work
Added UDataTable support to Lua API. (UE4SS #997)
- Find rows by name with
DataTable:FindRow(RowName) - Get all rows with
DataTable:GetAllRows() - Iterate rows with
DataTable:ForEachRow(Callback) - Add/remove rows dynamically with
DataTable:AddRow(RowName, RowData)andDataTable:RemoveRow(RowName) - Access row names with
DataTable:GetRowNames() - Get the entire row map with
DataTable:GetRowMap() - Clear all rows with
DataTable:EmptyTable() - Get row count with
#DataTableoperator
Enhanced TArray support to enable round-trip functionality (UE4SS #992)
- TArray userdata can now be passed as function parameters
- Improved handling of empty arrays and nil values
- Fixed proper element copying when passing arrays between Lua and C++
Added TSet implementation. UE4SS #883
Added TMap implementation. UE4SS #755
Enhanced TMap support to enable round-trip functionality UE4SS #933
- TMap userdata can now be passed as function parameters
- Improved handling of empty maps and nil values
- Fixed proper key-value pair copying when passing maps between Lua and C++
- Added proper rehashing to ensure map integrity after copying
Added Lua delegate property support with Add/Remove/Clear/GetBindings/Broadcast methods. See DelegateProperty, MulticastDelegateProperty, and MulticastSparseDelegateProperty. #1073
Added global function CreateInvalidObject, which returns an invalid UObject. (UE4SS #652)
Added GenerateLuaTypes function. (UE4SS #664)
Added global Dumpers functions to Types.lua. (UE4SS #664)
Added global functions RegisterEndPlayPreHook and
RegisterEndPlayPostHook. (UE4SS #769)
Errors can now be caught using pcall and xpcall. (UE4SS #833)
Added custom module searcher with UTF-8 path support for Lua require() (UE4SS #884)
- Added support for case-insensitive Scripts/scripts directory detection
- Improved error messages showing all attempted paths when module loading fails
- Fixed
IterateGameDirectoriesto properly handle UTF-8 paths and Unicode characters - Fixed
CreateLogicModsDirectoryto properly create directories with Unicode paths and handle parent directory creation - Fixed global Lua
printfunction to properly handle UTF-8 string conversion
Added support for UScriptStruct when using RegisterCustomProprety (UE4SS #1036)
Added support for handling structs as userdata (Fixed StructData as userdata is not yet implemented). (UE4SS #1169) - Corporalwill123
Types.lua PR #650
- Added
NAME_Nonedefinition - Added
EFindNameenum definition - Added
FNamefunction overloads with FindType parameter - Added
TMapdefinitions
Types.lua PR #820
- Added
UStructdefinition - Added
UClassdefinition
UEHelpers
-
Added function
GetPlayerwhich is just a fast way to get player controlled Pawn (the majority of the time it will be the player character) PR #650 -
Added functions:
GetEngine,GetGameInstance,GetGameViewportClient,GetGameModeBase,GetGameStateBase,GetPersistentLevelandGetWorldSettingsPR #650 -
Added functions to get static objects:
GetKismetStringLibrary,GetKismetTextLibraryPR #650 -
Added function
GetActorFromHitResultwhich extracts the hit actor from aFHitResultstruct based on UE's version PR #650 -
Added FName utility functions PR #650:
FindFName: wrapper forFName(Name, EFindName.FNAME_Find)AddFName: wrapper forFName(Name, EFindName.FNAME_Add)
-
Added Lua Server Annotations to all UEHelpers functions PR #650
-
Added functions
GetAllPlayerStatesandGetAllPlayersPR #688 -
Added annotation for function
FTextto Types.lua. (UE4SS #788) -
Removed cache for
GetPlayerControllerandGetWorldPR #1047
C++ API
Added UDataTable class to C++ API. (UE4SS #997)
- Full DataTable row access with
FindRow<T>(),GetAllRows<T>(), andForEachRow<T>() - Row manipulation with
AddRow(),RemoveRow(), andEmptyTable() - Direct implementations that work across all UE versions without relying on virtual functions
Key binds created with UE4SSProgram::register_keydown_event end up being duplicated upon mod hot-reload.
- To fix this,
CppUserModBase::register_keydown_eventhas been introduced. - It's used exactly the same way except without the
UE4SSProgram::part. (UE4SS #446)
Added on_ui_init(), it fires when the UI is initialized.
- It's intended to use the
UE4SS_ENABLE_IMGUImacro in this function. - Failing to do so will cause a crash when you try to render something with imgui.
BREAKING: Changed FTransform constructor to be identical to unreal.
Added OpenFor::ReadWrite, to be used when calling File::open.
- This can be used when calling
FileHandle::memory_map, unlikeOpenFor::Writing. (UE4SS #507)
Added hook for UGameViewportClient::Tick. (UE4SS #767)
Added hook for AActor::EndPlay. (UE4SS #769)
Added function 'UE4SSProgram::delete_mod'. (UE4SS #843)
Added function 'UE4SSProgram::get_all_input_events'. (UE4SS #843)
Enhanced TObjectPtr<> implementation to function as a proper smart pointer. (UE4SS-RE/RE-UE4SS #850, Re-UE4SS/UEPseudo #125)
BREAKING: The TObjectPtr<> class now uses a proper pointer implementation rather than direct struct member access. Code that directly accessed UnderlyingObjectPointer will need to be updated:
// Old way
TObjectPtr<UClass> ClassPtr;
UClass* RawPtr = ClassPtr.UnderlyingObjectPointer;
// New way
TObjectPtr<UClass> ClassPtr;
UClass* RawPtr = ClassPtr; // implicit conversion
// or
UClass* RawPtr = ClassPtr.Get(); // explicit accessAdded improved string and path conversion utilities with proper UTF-8 support (UE4SS #913)
- Rewrote
to_charT_string_path()to properly handle UTF-8 and UTF-16 encodings - Added
ensure_str_as<CharT>()for explicit target character type conversion - Added
to_utf8_string()for convenient UTF-8 string conversion - Added
normalize_path_for_lua()to convert paths to UTF-8 with forward slashes for Lua compatibility - Added
utf8_to_wpath()to convert UTF-8 paths to Windows wide strings - BREAKING:
to_charT_string_path()now returns UTF-8 encoded strings for char type instead of locale-dependent encoding
BPModLoader
Experimental
Changes
General
Updated ImGui from v1.89 to v1.92.1 for improved functionality and Clang compatability
Updated ImGuiTextEdit to support newest ImGui API
Updated fmt library to 11.2.0
Changed the default location of the UE4SS release assets to be in game executable directory/ue4ss/. This change is backwards compatible with the old location. (UE4SS #506) - Buckminsterfullerene
Updated PatternSleuth submodule (UE4SS #638)
The bUseUObjectArrayCache option in UE4SS-settings.ini is now set to false by default in the non-zDev release (UE4SS #747)
The GuiConsoleEnabled option in UE4SS-settings.ini is now set to 0 by default in the non-zDev
release (UE4SS #779)
Removed some development mods, README.md & Changelog.md from non-zDev release, added LICENCE file to both release types (UE4SS #830)
The execution of the game is now paused durin the first AOB scan, and then resumed to complete potential further scans and initialization. (UE4SS #985)
Removed the FText constructor AOB, replaced it with more consistent non-AOB method of constructing FText instances (UE4SS #1139)
Live View
Fixed the majority of the lag (UE4SS #512)
Added support for watching ArrayProperty and StructProperty (UE4SS #419)
The search filter ExcludeClassName can now be found in the IncludeClassNames dropdown list. (UE4SS #472) - Buckminsterfullerene
The following search filters now allow multiple values, with each value separated by a comma: IncludeClassNames, ExcludeClassNames, HasProperty, HasPropertyType. (UE4SS #472) - Buckminsterfullerene
Large structs that cause FPS problems no longer render, but you can still click on the struct to render each individual property of the struct. (UE4SS #1080)
Large performance increase when Apply filters when not searching is enabled (UE4SS #1090)
UHT Dumper
Lua API
print now behaves like vanilla Lua (can now accept zero, one, or multiple arguments of any type) (UE4SS #423) - Lyrth
The callback of NotifyOnNewObject can now optionally return true to unregister itself (UE4SS #432) - Lyrth
RegisterConsoleCommandHandler, RegisterConsoleCommandGlobalHandler, RegisterProcessConsoleExecPreHook and RegisterProcessConsoleExecPostHook now support enclosing parameters in double quotes ("). This allows spaces within the quotes to be ignored, treating the enclosed string as a single parameter. (UE4SS #653, UE4SS #669)
BREAKING: RegisterProcessConsoleExecPreHook, RegisterProcessConsoleExecPostHook callback parameter CommandParts now includes the command name at the start of the array (lua array index 1). (UE4SS #669)
Improved performance of script hooks created with RegisterHook, and
RegisterCustomEvent. (UE4SS #801)
BREAKING: AActor:GetWorld() and AActor:GetLevel() functions are now returning an invalid UObject instead of nil. (UE4SS #810)
Types with get or Get functions now have both variants. (UE4SS #877)
Improved error messages when improperly indexing into LocalUnrealParam, and RemoteUnrealParam without first calling Get. (UE4SS #1154)
UEHelpers UE4SS #650
-
Increased version to 3
-
Reworked all UEHelpers functions to ensure that they always return an object which can be checked with the function
IsValidfor validation -
Reworked
UEHelpers.GetPlayerControllerto return first valid player controller (It will now return a player controller even if it doesn't control a pawn at the time) -
Reworked
UEHelpers.GetWorldfunction to use UWorld cache (UWorld usually never changes) -
Change
UEHelpers.GetWorldContextObjectfunction annotation to returnUObject. (Any UObject with a GetWorld() function is a valid WorldContext) -
Removed duplicate function
UEHelpers.GetKismetMathLibrary
C++ API
BPModLoader
BPModLoader now supports loading mods from subdirectories within the LogicMods folder (UE4SS #412) - Ethan Green
ConsoleEnablerMod
Added additional console key ~ (Tilde) (UE4SS #687)
The console keys F10 and ~ are now added by the mod in addition to the existing keys instead of replacing them (UE4SS #687)
Repo & Build Process
Switch to xmake from cmake which makes building much more streamlined (UE4SS #377, UEPseudo #81) - localcc
Fixes
General
Fixed BPModLoaderMod not working in games made in UE 5.2+ - (UE4SS #503)
Fixed adding elements to TArray in Lua incorrectly resizing and zeroing out previous values (UE4SS #436) - dnchattan
Fixed some debug GUI layout alignments, especially with different GUI font scaling settings (UE4SS #429) - Lyrth
Fixed PalServer not accepting connections from players (UE4SS #453)
Fixed a crash that would occur randomly due to accidental execution of Live View search code (UE4SS #475)
Fixed freeze related to the error "Tried to execute UFunction::FuncPtr hook but there was no function map entry" (UE4SS #468)
Fixed ModsFolderPath in UE4SS-settings.ini not working (UE4SS #609)
Fixed attempt to index a nil value (global 'NewController') error in SplitScreenMod (UE4SS #729)
Fixed the GUI not closing properly with CTRL + O when OpenGL is enabled in
UE4SS-settings.ini. (UE4SS #780)
Fixed PalServer crashing when debug console is enabled in UE4SS-settings.ini (UE4SS #1160) - Okaetsu
Fixed PalServer console having broken text when running under Proton/Wine (UE4SS #1160) - Okaetsu
Live View
Fixed the "Write to file" checkbox not working for functions in the Watches tab (UE4SS #419)
Reduced the likelihood of a crash happening on shutdown when at least one watch is enabled (UE4SS #419)
Fixed constantly searching even if the search field is empty, and even if not on the tab (UE4SS #475)
Fixed crash caused by using invalid iterator. (UE4SS #771)
Fixed opened object getting clipped too early (UE4SS #814) -
Corporalwill123
Made StructProperty and ArrayProperty Expandable, making contained properties directly viewable (UE4SS #943) -
Corporalwill123
Fixed crash on warning in dumpers and generators (UE4SS #976)
Fixed crash on expanding arrays (UE4SS #1082)
Fixed broken filters: Include CDOs & CDOs only (UE4SS #1089)
Fixed the Include inheritance filter taking precedence over other filters, causing them to not apply (UE4SS #1089)
Fixed the Refresh search button sometimes not working correctly (UE4SS #1089)
Fixed filters incorrectly being applied when not searching (UE4SS #1089)
UHT Dumper
Fix SetupAttachment implementations randomly changing order (UE4SS #606) - Buckminsterfullerene
Lua API
Fixed FString use after free (UE4SS #425) - localcc
Fixed the "IterateGameDirectories" global function throwing "bad conversion" errors (UE4SS #398)
Fixed FText not working as a parameter (in RegisterHook, etc.) (UE4SS #422) - localcc
Fixed crash when calling UFunctions that take one or more 'out' params of type TArray. (UE4SS #477)
Fixed FindObject not accepting UClass as a valid outer parameter. (UE4SS #732) - GhostyPool
Fixed RegisterProcessConsoleExecPostHook. (UE4SS #631)
Fixed FindFirstOf return type annotation in Types.lua to signal that the return value will never be nil. (UE4SS #652)
Fixed non-const TArray outparams being skipped in UFunction property pushers. (UE4SS #754)
Fixed RegisterLoadMapPreHook not working at all. (UE4SS #776)
Fixed Key::NUM_ZERO being incorrectly mapped to
Key::NUM_NINE. (UE4SS #762)
Fixed table-in-table when used as a function param (i.e. FTransform) generating a Lua
error. (UE4SS #775)
Fixed script hooks corrupting the return value of the original
function. (UE4SS #800)
Fixed race condition when using RegisterCustomEvent or
UnregisterCustomEvent. (UE4SS #805)
Fixed frequent StrProperty can only be set to a string or FString
error. (UE4SS #819)
Fixed problems that caused issues for language servers. (UE4SS #821
Fixed errors being logged twice. (UE4SS #833)
Fixed RegisterHook and UnregisterHook not working properly with functions that have spaces in their
names. (UE4SS #827
Fixed an error with Object properties causing stack corruption. (UE4SS #939
Fixed UEHelpers sometimes causing a runtime error. (UE4SS #987
Fixed callbacks only working for the first registrant of several hooks. (UE4SS #1143
Fixed callbacks being executed in the wrong thread. (UE4SS #1170
Fixed UFunction and UClass properly inheriting from UStruct in Lua. (UE4SS #1158) - Corporalwill123
C++ API
Fixed a crash caused by a race condition enabled by C++ mods using UE4SS_ENABLE_IMGUI in their constructor (UE4SS #481)
Fixed the std::span returned by FileHandle::memory_map being improperly sized. (UE4SS #507)
Fixed 'File::Handle' unable to be moved if used in conjunction with memory_map. (UE4SS #544)
Fixed Key::NUM_ZERO being incorrectly mapped to Key::NUM_NINE. (UE4SS #716)
BPModLoader
Fixed "bad conversion" errors (UE4SS #398)
Fixed calling PostBeginPlay multiple times for each ModActor (UE4SS #447) - Okaetsu
Fixed displaying 'PostBeginPlay not valid' when VerboseLogging is set to false (UE4SS #447) - Okaetsu
Fixes mods not loading when UE4SS initializes too late (UE4SS #454) - localcc
Fixed LoadMod function issue that variables would go out-of-scope in the ExecuteInGameThread callback. Instead, LoadMods is now always called in a game thread. (UE4SS #752)
Settings
Added
[Overrides]
; Additional mods directories to load mods from
; Use + prefix to add a directory, - prefix to remove
; Can be relative to working directory or absolute paths
; Example:
; +ModsFolderPaths = ../SharedMods
; +ModsFolderPaths = C:/MyMods
; -ModsFolderPaths = ../SharedMods
; Default: none
; Path to a specific mods.txt file to use as the controlling mod list.
; If set, ONLY this mods.txt will be parsed instead of mods.txt from all mod directories.
; Can be relative to working directory or an absolute path.
; Example: ControllingModsTxt = ../MyMods/mods.txt
; Default: Empty (parse mods.txt from all mod directories)
ControllingModsTxt =
[General]
; The key that will trigger a reload of all mods.
; The CTRL key is always required.
; Valid values (case-insensitive): Anything from Mods/Keybinds/Scripts/main.lua
; Default: R
HotReloadKey = R
[EngineVersionOverride]
; True if the game is built as Debug, Development, or Test.
; Default: false
DebugBuild =
[ObjectDumper]
; Whether to display the offset from the main executable for functions instead of the function pointer
; Default: 0
UseModuleOffsets = 0
[Debug]
RenderMode = ExternalThread
[Hooks]
HookLoadMap = 1
HookAActorTick = 1
HookEngineTick = 1
HookGameViewportClientTick = 1
HookUObjectProcessEvent = 1
HookProcessConsoleExec = 1
HookUStructLink = 1Removed
[Debug]
LiveViewObjectsPerGroup = 32768
[ExperimentalFeatures]
GUIUFunctionCaller