github UE4SS-RE/RE-UE4SS experimental2
UE4SS Experimental Release Archive 2

pre-release3 hours ago

Important: 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 a .jmap dumper: dumps the full UObject reflection graph (classes, structs, enums, functions, property types, class default object property values and approximate vtable layouts) to the JSON-based .jmap format by trumank (https://github.com/trumank/jmap). Available via the GUI Dumpers tab, the DumpJMAP() Lua function and CTRL + Numpad 5.

Added the option to include Blueprint-generated classes, structs and enums in .usmap and .jmap dumps (enabled by default). Toggle via the checkbox in the GUI Dumpers tab or the optional boolean parameter of DumpUSMAP() / DumpJMAP().

SDK generator: the UE4SS backend is now compiled in, so the generator is usable without any files on disk. Previously the "Generate BP SDK" button stayed disabled unless a backend description was found in <working_dir>/UE4SS_SDK_Backends, which local builds never received. A backend file of the same name still overrides the built-in one.

SDK generator: property types that cannot be expressed in C++ are now emitted as correctly sized and aligned opaque stand-ins in UE4SS_SDK/PlaceholderTypes.hpp instead of aborting the dump. Previously a single unrecognised property type (a Verse property, or a property class defined by the game) threw partway through generation and produced no files at all. Classes are no longer commented out wholesale when a member's type is unsupported.

Added an SDK generator that produces memory-accurate C++ headers for reflected classes, structs and enums, intended to be dropped into a UE4SS C++ mod (add_subdirectory(UE4SS_SDK)). Types that UE4SS already provides are referenced from the Unreal module rather than redefined, so a generated SDK composes with an existing mod instead of colliding with it. Leading, inter-member and trailing padding, static arrays, bitfields, computed alignment and base-class trailing-padding reuse are all handled. Generated SDKs can be verified against a build at compile time via UE4SS_SDK/LayoutAsserts.hpp or at runtime via UE4SS_SDK/RuntimeSDKTest.hpp.

Added support for UE Version 5.8

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 support for UE Versions 4.7 through 4.10 - (UE4SS #1390)

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_Find as the second parameter

BREAKING: FSoftObjectPath no longer exposes the AssetPathName and SubPathString member variables. The struct layout now adapts at runtime to the running engine (5.1+ replaced the FName with an FTopLevelAssetPath), which fixes silent memory corruption when accessing soft object paths on 5.1+ games. C++ mods must migrate:

  • path.AssetPathName -> path.GetAssetPathName() (on 5.1+ this returns the combined /Package/Path.Asset name; use path.GetAssetPath() for the package/asset name pair)
  • path.SubPathString -> path.GetSubPathString() (non-const overload available for assignment)
  • Lua mods are unaffected; the Lua API is unchanged

BREAKING: FSoftObjectPtr (and its TPersistentObjectPtr<FSoftObjectPath> base) no longer exposes the ObjectID and TagAtLastTest member variables. Soft object and class pointers now resolve their layout at runtime, accounting for UE 5.3 removing TagAtLastTest. C++ mods must migrate:

  • ptr.ObjectID -> ptr.GetUniqueID() (const and non-const reference overloads)
  • ptr.TagAtLastTest -> ptr.GetTagAtLastTest() for reads, ptr.SetTagAtLastTest(value) for writes; engines without the field return zero and ignore writes
  • Use FSoftObjectPtr::StaticSize(), TSoftObjectPtr<T>::StaticSize() or TSoftClassPtr<T>::StaticSize() when calculating strides through engine memory
  • Rebuild affected C++ mods against the updated headers; see the upgrade guide
  • The Lua API is unchanged

BREAKING: FText no longer exposes the Data, SharedRefCollector, Flags and Unk member variables. The layout adapts at runtime (5.4 changed TSharedRef to TRefCountPtr, shrinking FText from 0x18 to 0x10), and copies/destruction now use the engine's own FTextProperty value operations, so FText copies are properly reference counted in every engine version. C++ mods must migrate:

  • text.Data -> text.GetTextData()
  • text.Flags -> text.GetFlags()
  • Constructing, copying, assigning and ToString()/ToFString() are unchanged
  • Lua mods are unaffected
  • 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)

Added custom game configuration for The Talos Principle 2 (UE4SS #1458)

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 option EnableAutoReloadingLuaMods in the General section of UE4SS-settings.ini UE4SS #1004

Added line in the docs to add FText::FromString(FString&) as an alternative to FText::FText(FString&) for UE5 games - (UE4SS #1078)

Added FUObjectItem, FUObjectArray, and TUObjectArray to MemberVariableLayout.ini (UE4SS #????)

  • This means we can now support games with a customized GUObjectArray.
  • There are now also sizes, padding, and type name comments to help understand.
  • We've also added a special UEP_TotalSize entry to every section.
  • It's currently only crucial for FUObjectItem, but in the future, we may use this entry for more types.

Fixed the ingame console (Tilde, or F10 key) not working for some games - (UE4SS #1252)

Fixed random crashes (use-after-free) caused by the string intern pool storing dangling pointers to caller-owned strings, most commonly Lua GC'd strings from UObject member access (UE4SS #1271)

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)

Static Mesh Dumper

Fixed Static Mesh Dumper crashing on material interfaces in UE 5.6 and above due to FStaticMaterial layout changes. - Okaetsu

Lua API

Added __eq metamethod for UObjectBase, allowing comparing UObject instances by underlying pointer (objA == objB) from Lua rather than userdata reference equality.

Added support for setting FWeakObjectProperty values (Operation::Set), allowing assignment of UObject, FWeakObjectPtr, or nil from Lua.

Added support for FUtf8String and FAnsiString Unreal string types with string manipulation API (UE4SS #1015)

  • Refactored FString implementation to use unified TLuaStringBase template for code reuse and consistency

Added global functions for mod management (UE4SS #1105)

  • RestartCurrentMod() - Restart the currently running mod
  • UninstallCurrentMod() - Uninstall the currently running mod
  • RestartMod(ModName) - Restart another mod by name
  • UninstallMod(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 handle
    • ExecuteInGameThreadWithDelay(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 handle
    • ExecuteInGameThreadAfterFrames(frames, callback) - Frame-based delay (requires EngineTick)
    • LoopInGameThreadAfterFrames(frames, callback) - Frame-based repeating timer
    • MakeActionHandle() - Generate unique handle for use with delay functions
  • Timer control functions:
    • CancelDelayedAction(handle) - Cancel a pending action
    • PauseDelayedAction(handle) - Pause a timer
    • UnpauseDelayedAction(handle) - Resume a paused timer
    • ResetDelayedActionTimer(handle) - Restart with original delay
    • SetDelayedActionTimer(handle, newDelayMs) - Change delay and restart
    • ClearAllDelayedActions() - Cancel all actions for current mod
  • Query functions:
    • IsValidDelayedActionHandle(handle) - Check if handle exists
    • IsDelayedActionActive(handle) - Check if timer is running
    • IsDelayedActionPaused(handle) - Check if timer is paused
    • GetDelayedActionRate(handle) - Get configured delay
    • GetDelayedActionTimeRemaining(handle) - Get remaining time
    • GetDelayedActionTimeElapsed(handle) - Get elapsed time
  • New global variables: EngineTickAvailable, ProcessEventAvailable
  • New enum: EGameThreadMethod with ProcessEvent and EngineTick values
  • ExecuteInGameThread now accepts optional second parameter for execution method
  • Per-mod action ownership ensures mods can only control their own timers
  • Deprecates: ExecuteAsync and LoopAsync (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, and UDataTable: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) and DataTable: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 #DataTable operator

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 IterateGameDirectories to properly handle UTF-8 paths and Unicode characters
  • Fixed CreateLogicModsDirectory to properly create directories with Unicode paths and handle parent directory creation
  • Fixed global Lua print function 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

Added ModRef.OnUnload lua function, registers a callback to be called when the mod is unloaded via hot reload or any other means (UE4SS #1394)

Added println global lua function, just like print, except adds a new line character automatically (UE4SS #1451)

Types.lua PR #650

  • Added NAME_None definition
  • Added EFindName enum definition
  • Added FName function overloads with FindType parameter
  • Added TMap definitions

Types.lua PR #820

  • Added UStruct definition
  • Added UClass definition

UEHelpers

  • Added function GetPlayer which 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,GetPersistentLevel and GetWorldSettings PR #650

  • Added functions to get static objects: GetKismetStringLibrary, GetKismetTextLibrary PR #650

  • Added function GetActorFromHitResult which extracts the hit actor from a FHitResult struct based on UE's version PR #650

  • Added FName utility functions PR #650:

    • FindFName: wrapper for FName(Name, EFindName.FNAME_Find)
    • AddFName: wrapper for FName(Name, EFindName.FNAME_Add)
  • Added Lua Server Annotations to all UEHelpers functions PR #650

  • Added functions GetAllPlayerStates and GetAllPlayers PR #688

  • Added annotation for function FText to Types.lua. (UE4SS #788)

  • Removed cache for GetPlayerController and GetWorld PR #1047

C++ API

Added support for using mod name as the main dll name for C++ mods. (UE4SS #1313) - Okaetsu

Added UDataTable class to C++ API. (UE4SS #997)

  • Full DataTable row access with FindRow<T>(), GetAllRows<T>(), and ForEachRow<T>()
  • Row manipulation with AddRow(), RemoveRow(), and EmptyTable()
  • 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_event has 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_IMGUI macro 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, unlike OpenFor::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 access

Added 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

Added RC::await_debugger in Helpers/Debug.hpp. (UE4SS #1314)

Added registration functions for C++ mod events. (UE4SS #1431)

  • These are analogous to the virtual functions that can be overridden from CppUserModBase.
  • They are intended to replace the virtual functions for ABI reasons, but the virtual functions will also be maintained for now.
  • No new virtual functions will be added to CppUserModBase, and no existing virtual functions will be removed.

Added directory getter functions (Unreal 1990823, Unreal aed71f1, Unreal 96376b8)

  • UObjectGlobals::GetGameExeDirectory
  • UObjectGlobals::GetProjectContentDirectory
  • UObjectGlobals::GetGameName
  • UObjectGlobals::RootDir

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)

Made the scan for FName::ToString optional. (UE4SS #1175 - UEPseudo 169)

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)

The NotifyOnNewObject function now works even if the supplied class hasn't yet been loaded. (UE4SS #1134)

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 IsValid for validation

  • Reworked UEHelpers.GetPlayerController to 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.GetWorld function to use UWorld cache (UWorld usually never changes)

  • Change UEHelpers.GetWorldContextObject function annotation to return UObject. (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 access violation crash on engine shutdown by terminating event loops when UnrealInitializer::StaticStorage::bIsInitialized is false.
This was fixed by introducing a new atomic bool: UnrealInitializer::IsInitialized()
The old variable will stay for ABI/API reasons.

Fixed proxy injection incorrectly running UE4SS initialization inside the loader lock when the main thread was the first thread snapshot entry.

Fixed a crash in FUObjectArray::AllocateSerialNumber when assigning an object without a serial number to an FWeakObjectPtr on UE 5.3+ (reported on UE 5.4.3). Soft pointer copies now use the runtime ObjectID offset, including in Kismet object/class reference conversions and Lua soft-property access. (UE4SS #1433)

Fixed a deadlock when a Lua RegisterHook or NotifyOnNewObject callback calls RestartCurrentMod (or anything else that queues work for the event loop) while the event loop is uninstalling a mod. Queued events now run outside the event queue lock. (UE4SS #1445)

Fixed the GUI freezing while mods are being reinstalled with the Lua Debugger tab open. (UE4SS #1445)
The tab now shows a short note for those frames instead of waiting, and still shows the pause controls when Lua is paused at a breakpoint.

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

Fixed crash after zero-constructing elements that are not zero-constructible. (UE4SS 5c8583b1)

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

Fix non-ascii characters in outputted .cpp files (UE4SS #1378)

Lua API

Fixed crash in script hook dispatcher when Stack.Node() returns nullptr on synthetic or native thunk frames.

Fixed FString use after free (UE4SS #425) - localcc

Fixed IterateGameDirectories crashing when the game root contains a deeply nested directory tree, common once a mod manager unpacks downloads into it. The traversal never grew the Lua stack and wrote past the end of it. It now also stops at a depth of 64, skips unreadable directories, and won't follow a link back into a directory it is already inside. (UE4SS #1092)

Fixed __files leaving holes in its array when a directory was skipped, making #files and table.insert unreliable.

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

Fixed crash when calling certain functions that take callbacks. (UE4SS #1299)

Fixed the GetWorld function of UObject and AActor crashing if the object was nullptr. (UE4SS 002bca18)

Fixed the RegisterCustomProperty sometimes not working because of an unknown property size. (UE4SS cb897cc7)

Fixed a memory leak when calling a UFunction with an 'Out' parameter from Lua: every call left a registry reference to the 'Out' table behind, so the table and everything in it were never garbage collected. (UE4SS #1446)

Fixed a crash when calling UFunctions with params taking >512 bytes. (UE4SS #1462)

Fixed IterateGameDirectories not working on some games with special directory structures. (UE4SS bbeecc8)

Fixed CallFunction in UObject not working. (UE4SS 20abc5b7)

Fixed a freeze or crash when a Lua mod is restarted or uninstalled while the game thread is running one of its actions from ExecuteInGameThread, ExecuteInGameThreadWithDelay, LoopInGameThreadWithDelay or a similar function. (UE4SS #1445)
The game thread moves a batch of actions out of the queue before it runs them, so uninstall could not see that batch and closed the mod's Lua state under it.
Uninstall now waits for a running batch first.

Fixed a freeze when a Lua mod is restarted or uninstalled while another thread is running Lua. (UE4SS #1445)
Closing a mod's Lua state deleted the lock that every Lua state in the process shares while still holding it.
That is undefined behavior; the observed result was a thread waiting on that lock forever. Closing a state now releases the lock instead.

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)

EventViewerMod

Fixed the mod failing on LE421 builds due to plsf being added in 4.22 (UE4SS #1426) - Willow

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

; The default method for converting FName to string.
; Valid values (case-insensitive): Scan, Conv_NameToString
; Default: Scan
DefaultFNameToStringMethod = Scan

; Whether to automatically reload mods when a change is detected.
; The reload triggers when any file is edited or a new file is added to the 'Scripts' directory.
; Default: 0
EnableAutoReloadingLuaMods = 0

[EngineVersionOverride]
; True if the game is built as Debug, Development, or Test.
; Default: false
DebugBuild =

; Auto detects pointer hashing in the object hash tables.
; Override: Auto, HashCombine, Murmur32, or Murmur64.
; Default: Auto
PointerHash =

[ObjectDumper]
; Whether to display the offset from the main executable for functions instead of the function pointer
; Default: 0
UseModuleOffsets = 0

[Debug]
RenderMode = ExternalThread

; The key that will toggle the GUI on/off if GuiConsoleEnabled is set to 1.
; The CTRL key is always required.
; Valid values (case-insensitive): Anything from Mods/Keybinds/Scripts/main.lua
; Default: O
ToggleGuiKey = O

[Hooks]
HookLoadMap = 1
HookAActorTick = 1
HookEngineTick = 1
HookGameViewportClientTick = 1
HookUObjectProcessEvent = 1
HookProcessConsoleExec = 1
HookUStructLink = 1

Removed

[Debug]
LiveViewObjectsPerGroup = 32768

[ExperimentalFeatures]
GUIUFunctionCaller

Don't miss a new RE-UE4SS release

NewReleases is sending notifications on new releases.