Compare commits

..

7 Commits

Author SHA1 Message Date
MarcelineVQ 1b19fde999 Update README for v0.6.0 2026-03-24 19:06:39 -07:00
MarcelineVQ 83d97ab1db Update clickthrough description for PvP filtering 2026-03-09 23:21:49 -07:00
MarcelineVQ c62eb2c560 Update README for v0.5.0 2026-03-09 22:40:00 -07:00
MarcelineVQ a283ffe2b6 Rename pngscreenshot to pngscreenshots 2026-03-08 19:36:44 -07:00
MarcelineVQ 4af5180c4d Add weirdutils_api.h to repo 2026-03-08 17:53:18 -07:00
MarcelineVQ 2d4bb10c6e Update README for v0.4.0 2026-03-08 15:53:34 -07:00
MarcelineVQ 7a7b564c51 Update README for v0.3.0 2026-03-06 13:42:37 -08:00
2 changed files with 246 additions and 2 deletions
+169 -2
View File
@@ -1,6 +1,6 @@
# 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.
This package provides many pre-built DLLs for enhancing the vanilla 1.12 client 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.
@@ -9,6 +9,19 @@ On Turtle WoW, place your chosen DLLs next to your `WoW.exe` and add them to you
## Features
### PNG Screenshots
Saves screenshots as compressed PNG files instead of the default uncompressed TGA format. Runs on a background thread with no frame drops.
Controlled via the `screenshotQuality` CVar (saved to config.wtf):
- `/script SetCVar("screenshotQuality", "6")` -- set compression level (1 = fast, 9 = smallest, default 6)
- `/script SetCVar("screenshotQuality", "0")` -- disable PNG, use original TGA format
**DLL:** `pngscreenshots.dll`
---
### Transmog Fix
Eliminates FPS drops caused by rapid equipment visual updates when transmogged items lose durability. No configuration needed, install and forget.
@@ -23,7 +36,7 @@ Enables loading loose game asset files (models, textures, etc.) from the `Data/`
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.
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.
@@ -31,6 +44,38 @@ No configuration needed, install and forget.
---
### Utility Minimap Trackings
Adds TBC/WotLK-style minimap tracking icons for NPC types, game objects, and quest givers.
Replaces the native tracking dropdown with a combined menu showing both spell tracking and NPC category tracking.
Can be disabled from the normal AddOn menu. Preferences saved per-character.
- Click the minimap tracking icon to open the dropdown
- Check/uncheck NPC categories to toggle their minimap icons
- Spell tracking (Hunter tracking, Find Herbs, etc.) remains available alongside NPC tracking
- "Hide in Cities" toggle suppresses NPC icons in capital cities
Tracks various npc types and useful objects like Oranges and Brainwasher and Mailbox.
**DLL:** `minimapicons.dll`
---
### Clickthrough
Makes interactable objects and NPCs clickable through players and units that are blocking them. When you click a player or unit that's standing on top of a vendor, mailbox, or other interactable target, the click passes through to the target behind them.
- Players blocking interactable NPCs (vendors, trainers, flight masters, bankers, quest givers, etc.) or game objects become transparent to clicks
- Players blocking lootable corpses become transparent to clicks
- Units (pets, NPCs) blocking interactable game objects become transparent to clicks
- Disabled inside battlegrounds to prevent targeting objectives through enemy players
No configuration needed, install and forget.
**DLL:** `clickthrough.dll`
---
### Log Sessions
Organizes the combat, raw combat, and chat logs into per-character directories with timestamped filenames:
@@ -63,6 +108,39 @@ Fixes duplicate floating heal numbers caused by SuperWoW 1.5. Only relevant if y
---
### Big Cursor
Upscales the hardware cursor for improved visibility without losing sharpness. Supports fractional scales from 1.0 (off) to 4.0.
- `/script SetCursorScale(1.2)` -- set cursor scale (default 1.2x)
- `/script SetCursorScale(1)` -- disable (use original 32x32 cursor)
This value is saved to the `cursorScale` CVar in tenths: `/script SetCVar("cursorScale", "15")` for 1.5x.
Lua API for addon developers:
- `SetCursorScale(n)` -- set scale factor (1.04.0), takes effect on next cursor change
- `GetCursorScale()` -- returns current scale factor
**DLL:** `bigcursor.dll`
---
### Performance
Engine-level optimizations that reduce CPU time on math, rendering helpers, file lookups, and data decompression. No visual difference, no configuration needed. Included in `weirdutils.dll`.
- **SIMD Math** - replaces 20+ internal math functions with SSE/AVX equivalents covering skeletal animation, particle rendering, frustum culling, collision detection, text glyph caching, and float-to-integer conversion
- **Data Decompression** - swaps the game's 2004-era zlib with a modern library (2.2x faster). Loading screen times reduced by at least 13%
- **MPQ File Cache** - caches archive file lookups so repeat file opens skip the archive chain walk. Saving 50-160ms every 15 seconds during heavy gameplay
- **Timer Calibration** - recalibrates the OS performance counter for accurate animation timing. Ported from [VanillaFixes](https://github.com/hannesmann/vanillafixes)
Most noticeable in cities, raids, and during zone transitions.
**DLL:** `weirdperformance.dll`
---
## Why No Source Code?
This project is distributed as pre-built DLLs only. The source code is not and will not be made publicly available.
@@ -70,3 +148,92 @@ This project is distributed as pre-built DLLs only. The source code is not and w
These DLLs work by hooking deeply into the game client's internals: memory layout, function addresses, rendering pipeline, input handling, and more.
While every feature here is built for legitimate quality-of-life use, the underlying techniques touch on too many core mechanisms that are trivially abusable.
Publishing the source would be handing a candy store to bad actors: the same hooks and patterns used to render a raid marker or fix a crash can be repurposed for cheats, exploits, and in particular automation with minimal effort.
---
## Developer Notes
### Runtime Module Control API
WeirdUtils exports three functions for querying and disabling modules at runtime in case other devs find their dll's in conflict.
#### Exported Functions
| Function | Signature | Description |
|---|---|---|
| `WeirdUtils_IsModuleActive` | `int __cdecl (const char *name)` | Returns 1 if the module is compiled in and currently hooked, 0 otherwise |
| `WeirdUtils_DisableModule` | `int __cdecl (const char *name)` | Unhooks the named module. Returns 1 if found, 0 otherwise |
| `WeirdUtils_DisableAll` | `int __cdecl (void)` | Unhooks all modules. Returns count of modules disabled |
Module names are case-insensitive and match the released dll names:
`customassets`, `logsessions`, `transmogfix`, `minimapicons`, `healtextfix`, `bigcursor`, `pngscreenshots`, `clickthrough`, `weirdperformance`
There is no re-enable API.
#### C/C++ Header
A header-only `include/weirdutils_api.h` is provided that handles DLL discovery and runtime resolution automatically. No .lib file needed:
```c
#include "weirdutils_api.h"
// Returns 0 if WeirdUtils isn't loaded - safe to call unconditionally
if (WeirdUtils_IsModuleActive("transmogfix"))
WeirdUtils_DisableModule("transmogfix");
```
The header tries all known DLL names (`weirdutils.dll`, `minimapicons.dll`, etc.) via `GetModuleHandleA`, so it works regardless of which DLL variant is loaded.
#### Raw GetProcAddress
If you prefer not to use the header:
```c
HMODULE hMod = GetModuleHandleA("weirdutils.dll");
if (hMod) {
typedef int (__cdecl *IsActiveFn)(const char *);
IsActiveFn isActive = (IsActiveFn)GetProcAddress(hMod, "WeirdUtils_IsModuleActive");
if (isActive && isActive("transmogfix")) {
typedef int (__cdecl *DisableFn)(const char *);
DisableFn disable = (DisableFn)GetProcAddress(hMod, "WeirdUtils_DisableModule");
if (disable) disable("transmogfix");
}
}
```
### Version Query API
WeirdUtils registers a Lua global table and query function for addon developers to detect which modules are loaded and their versions. Available from the login screen onward.
#### `GetWeirdUtilsVersion()`
Returns the `WeirdUtils` table containing all enabled modules and their version strings:
```lua
local modules = GetWeirdUtilsVersion()
for name, version in pairs(modules) do
print(name .. " v" .. version)
end
```
#### `GetWeirdUtilsVersion("modulename")`
Returns the version string for a specific module, or `nil` if not loaded:
```lua
if GetWeirdUtilsVersion("minimapicons") then
-- Minimap Icons is available
end
local ver = GetWeirdUtilsVersion("weirdperformance") -- "1.0" or nil
```
The `WeirdUtils` table is additive - if multiple independent DLLs are loaded (e.g. `minimapicons.dll` and `clickthrough.dll` separately), each adds its own modules to the shared table.
---
### Module Mutexes
Each module also holds a named mutex while active: `Local\WeirdUtils_<name>_<PID>` (e.g. `Local\WeirdUtils_transmogfix_12345`). The exception is transmogfix, which uses `Local\TransmogCoalesceHook_<PID>` for legacy reasons.
If you see the mutex, the module is loaded - and can use the Runtime Module Control API to disable it. If you don't see it, the module isn't active and you're free to hook those functions yourself.
+77
View File
@@ -0,0 +1,77 @@
/*
* weirdutils_api.h - Runtime Module Control API for WeirdUtils
*
* Header-only, no .lib needed. Include this file and call the inline
* wrappers; they resolve the DLL exports at runtime via GetModuleHandleA
* and GetProcAddress. Returns 0 / no-ops if WeirdUtils is not loaded.
*
* Usage:
* #include "weirdutils_api.h"
*
* if (WeirdUtils_IsModuleActive("transmogfix"))
* WeirdUtils_DisableModule("transmogfix");
*/
#ifndef WEIRDUTILS_API_H
#define WEIRDUTILS_API_H
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ---- Function pointer typedefs ---- */
typedef int (__cdecl *WeirdUtils_IsModuleActiveFn)(const char *name);
typedef int (__cdecl *WeirdUtils_DisableModuleFn)(const char *name);
typedef int (__cdecl *WeirdUtils_DisableAllFn)(void);
/* ---- DLL auto-discovery ---- */
static const char *const WeirdUtils__DllNames[] = {
"weirdutils.dll",
"pngscreenshots.dll",
"transmogfix.dll",
"customassets.dll",
"logsessions.dll",
"healtextfix.dll",
"bigcursor.dll",
"minimapicons.dll",
NULL
};
static FARPROC WeirdUtils__Resolve(const char *func_name) {
int i;
for (i = 0; WeirdUtils__DllNames[i] != NULL; ++i) {
HMODULE hMod = GetModuleHandleA(WeirdUtils__DllNames[i]);
if (hMod) {
FARPROC proc = GetProcAddress(hMod, func_name);
if (proc) return proc;
}
}
return NULL;
}
/* ---- Inline wrappers (no-op if DLL not loaded) ---- */
static int WeirdUtils_IsModuleActive(const char *name) {
WeirdUtils_IsModuleActiveFn fn = (WeirdUtils_IsModuleActiveFn)WeirdUtils__Resolve("WeirdUtils_IsModuleActive");
return fn ? fn(name) : 0;
}
static int WeirdUtils_DisableModule(const char *name) {
WeirdUtils_DisableModuleFn fn = (WeirdUtils_DisableModuleFn)WeirdUtils__Resolve("WeirdUtils_DisableModule");
return fn ? fn(name) : 0;
}
static int WeirdUtils_DisableAll(void) {
WeirdUtils_DisableAllFn fn = (WeirdUtils_DisableAllFn)WeirdUtils__Resolve("WeirdUtils_DisableAll");
return fn ? fn() : 0;
}
#ifdef __cplusplus
}
#endif
#endif /* WEIRDUTILS_API_H */