Release notes
v0.4.0
Two mods in one process
Two generated mods can now run in the same game. Previously the loader
reported both as loaded, both installed their render hooks, and only one ever
drew — silently, with nothing in the log.
- The render hook told another mod's viewport apart from the game window by
theIMGUI_CONTEXTproperty. Dear ImGui stamps that on the game's main
window too, so every mod that installed after the first one refused to adopt
the game's swap chain. It now checks the window class instead. - ImGui registers its
ImGui Platformclass against the game executable, so
two mods contended for one class atom. Generated projects now compile the
Win32 backend throughthird_party/imgui_win32_module_scope.cpp, binding the
class to the mod's own module. Each mod logs which side of that it landed on,
once, at startup. - Toggling detached viewports at runtime tripped an ImGui assert
("Forgot to call UpdatePlatformWindows()"). The frame stamp is now kept
current whether viewports are on or off, including on the DX12
command-submission failure path.
MethodPointer is ~90x cheaper
It ran VirtualQuery plus GetModuleHandleEx per call, and
GetModuleHandleEx walks the loader's module list under the loader lock. The
executable ranges of GameAssembly and UnityPlayer are now measured once from
the section headers; addresses outside them still take the original path.
Over a 119,329-method walk: 5735 ms of work down to 64 ms.
IL2CPP
has_method(type, name, argc)andhas_property(type, name)in generated
projects. Stripping removes UnityEngine members a game never calls, and until
now a wrapper couldn't tell that apart from a call returning a default.Il2CppDebugMethodInfois a real struct instead ofvoid. The debug exports
that can't be used through an opaque handle were dropped.- Hooking a method whose entry point is shared (folded identical bodies) or is
a generic definition's stub now warns. Both install fine and never fire.
Cursor and input under stripping
Cursor control needed all four Cursor accessors and was disabled entirely
when a game assigned Cursor.visible without reading it back. The setters are
now the capability, the getters only say what to restore, and a build with
stripped getters reads the state from Win32 instead. Mouse-click suppression is
its own capability, so a build without Input.GetKeyDown keeps it.
Other
urk-sdk.exedark UI pass.- Highlights finally have usage docs:
Getting Started step 8 builds a
world-space overlay end to end, and handbook §12 opens with the two calls it
comes down to instead of the DirectX pipeline.
Upgrading
Regenerate your project — the render hook, message pump and CMakeLists.txt
update in place, and third_party/imgui_win32_module_scope.cpp is new. The
source list changed, so reconfigure once:
cmake --preset clang-debug
cmake --build --preset clang-debug --parallelShip the new version.dll (or winmm.dll / winhttp.dll) with it; the
MethodPointer speed-up is in the loader.