Root cause: hook.fastcall used "r" constraints + explicit MOV to set
ECX/EDX. LLVM can allocate "r" inputs to clobbered registers, causing
cross-assignment (ecx_in→EDX, edx_in→ECX) or function address stomping
when func lands in ECX/EDX. Debug works by luck (trivial regalloc);
Release optimizes aggressively and hits the conflicts.
Fix: explicit "{ecx}", "{edx}", "{eax}" register constraints in zhook
fastcall — compiler places values directly, no MOV needed, no ambiguity.
Also fix 9 inline asm blocks across main.zig, interact.zig,
screenshot.zig, markers.zig missing ECX/EDX clobbers after CALL
instructions. Without clobbers the optimizer assumes registers retain
input values after the call — stale reuse in release builds.
Other changes in this commit:
- Rename markers→worldmarkers (build flag, DLL, Lua table)
- Rename assetfix→looseassets
- lua.zig: add .never_tail to pushcclosure, pcall, openlib, pushnumber
- Move internal marker functions into WorldMarkers Lua table via openlib
- Remove unused GetCurrentAreaId function
- Fix cleanup_file_handle_hook.original() → .callOriginal()
4.1 KiB
WeirdUtils
This package provides many pre-built DLLs for enhancing the vanilla WoW gameplay experience, aimed in particular at ease of use and accessibility but also bug fixes.
You may get all features by installing weirdutils.dll, or choose any selection of features via individual DLLs.
On Turtle WoW, place your chosen DLLs next to your WoW.exe and add them to your dlls.txt. For other versions you will need some sort of DLL loader.
Features
World Markers
Place up to 5 animated colored markers at any position in the world, useful for raid positioning, pull planning, or route marking. Requires party/raid leader or raid assist.
/worldmarker 1through/worldmarker 5(or/wm 1) -- place a marker where your cursor is pointing/worldmarker 1 target-- place a marker on a unit (player, target, mouseover, etc.)/clearworldmarker(or/cwm) -- remove all markers/clearworldmarker 2-- remove a specific marker
Keybindings for placing each marker and clearing all markers are available in the Key Bindings menu.
Markers automatically sync with group members who also have WeirdUtils installed. When a leader/assist places or clears a marker, all group members see it. Markers persist across zone transitions and respawn when you return to the area.
Lua API for addon developers:
WorldMarker(index)-- place marker at cursor terrain position (returns 1 on success, nil if no permission)WorldMarker(index, "unit")-- place marker at a unit's positionWorldMarker(index, x, y, z)-- place marker at world coordinatesClearWorldMarker(index)/ClearWorldMarker()-- remove one or all markers (returns 1 on success, nil if no permission)CanSetWorldMarkers()-- returns 1 if the local player is party/raid leader or raid assist, nil otherwise
DLL: worldmarkers.dll
Outlines
Renders glowing colored outlines around units, improving visibility in crowded encounters.
/outlinesor/ol-- toggle outlines on or off
A keybinding is available in the Key Bindings menu.
DLL: outline.dll
Interact
Smart interaction helpers for faster farming and dungeon runs:
- Interact Nearest -- right-clicks the closest interactable NPC or object within 5 yards
- Loot All Corpses -- bulk loots all nearby corpses in sequence
Best used via keybindings (available in the Key Bindings menu) or macros:
/run InteractNearest(1)
/run LootAllCorpses()
DLL: interact.dll
PNG Screenshots
Saves screenshots as compressed PNG files instead of the default uncompressed TGA format. Runs on a background thread with no frame drops.
/screenshot 0through/screenshot 9-- set compression level (0 = fast, 9 = smallest, default 6)
Compression level 6 provides the best balance of quality and file size. Enabled automatically on install.
DLL: screenshot.dll
Crash Fix
Prevents a class of crashes caused by stale UI frame anchor pointers. No configuration needed, install and forget.
DLL: framecrash.dll
Transmog Fix
Eliminates FPS drops caused by rapid equipment visual updates when transmogged items lose durability. No configuration needed, install and forget.
DLL: transmogfix.dll
Custom Assets
Enables loading loose game asset files (models, textures, etc.) from the Data/ directory without repacking MPQ archives. Place files in Data/ mirroring the game's internal paths (e.g. Data/Character/Troll/Female/TrollFemale.m2) and they will be used instead of the MPQ version.
At startup, recursively scans Data/ and indexes all non-MPQ files into an O(1) hash set, so loose file lookups are as fast as MPQ lookups.
Also allows multi-character patch archive names (e.g. patch-12.mpq, patch-jimbo.mpq). Patch archives are sorted case-insensitively by filename — last in the sort gets highest priority, and all patches override the base archives.
No configuration needed, install and forget.
DLL: looseassets.dll
SuperWoW Heal Text Fix
Fixes duplicate floating heal numbers caused by SuperWoW 1.5. Only relevant if you use SuperWoW. No configuration needed, install and forget.
DLL: healtextfix.dll