Compare commits

..

3 Commits

Author SHA1 Message Date
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
2 changed files with 117 additions and 7 deletions
+40 -7
View File
@@ -2,13 +2,26 @@
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.
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
### 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.
@@ -31,6 +44,23 @@ No configuration needed, install and forget.
---
### Utility Minimap Trackings
Adds custom minimap icons for NPC types (vendors, trainers, innkeepers, etc.) and game objects (mailboxes).
Replaces the native tracking dropdown with a combined menu showing both spell tracking and NPC category tracking.
Can be disabled easily from normal AddOn menu.
- 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
Supports many NPC types such as Auctioneer, Banker, Flightmaster, Repair, Reagents, Poisons, and more
Supported game objects: Mailbox, Brainwasher
**DLL:** `minimapicons.dll`
---
### Log Sessions
Organizes the combat, raw combat, and chat logs into per-character directories with timestamped filenames:
@@ -74,7 +104,7 @@ This value is saved to the `cursorScale` CVar in tenths: `/script SetCVar("curso
Lua API for addon developers:
- `SetCursorScale(n)` -- set scale factor (1.04.0), takes effect on next cursor change
- `SetCursorScale(n)` -- set scale factor (1.0-4.0), takes effect on next cursor change
- `GetCursorScale()` -- returns current scale factor
**DLL:** `bigcursor.dll`
@@ -106,7 +136,9 @@ WeirdUtils exports three functions for querying and disabling modules at runtime
Module names are case-insensitive and match the build option names:
`customassets`, `logsessions`, `transmogfix`, `healtextfix`, `bigcursor`
`customassets`, `logsessions`, `transmogfix`, `minimapicons`, `healtextfix`, `bigcursor`, `pngscreenshots`
The `weirdutils_api.h` header is included with each release.
There is no re-enable API - re-hooking after unhook is unsafe.
@@ -122,7 +154,7 @@ if (WeirdUtils_IsModuleActive("transmogfix"))
WeirdUtils_DisableModule("transmogfix");
```
The header tries all known DLL names (`weirdutils.dll`, `transmogfix.dll`, etc.) via `GetModuleHandleA`, so it works regardless of which DLL variant is loaded.
The header tries all known DLL names (`weirdutils.dll`, `pngscreenshots.dll`, etc.) via `GetModuleHandleA`, so it works regardless of which DLL variant is loaded.
#### Raw GetProcAddress
@@ -139,9 +171,10 @@ if (hMod) {
if (disable) disable("transmogfix");
}
}
```
### Module Mutexes
Each module also holds a named mutex while active: `Local\WeirdUtils_<name>_<PID>` (e.g. `Local\WeirdUtils_bigcursor_12345`). The exception is transmogfix, which uses `Local\TransmogCoalesceHook_<PID>` for legacy reasons.
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.
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 */