Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c62eb2c560 | ||
|
|
a283ffe2b6 | ||
|
|
4af5180c4d | ||
|
|
2d4bb10c6e |
@@ -9,6 +9,19 @@ On Turtle WoW, place your chosen DLLs next to your `WoW.exe` and add them to you
|
|||||||
|
|
||||||
## Features
|
## 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
|
### Transmog Fix
|
||||||
|
|
||||||
Eliminates FPS drops caused by rapid equipment visual updates when transmogged items lose durability. No configuration needed, install and forget.
|
Eliminates FPS drops caused by rapid equipment visual updates when transmogged items lose durability. No configuration needed, install and forget.
|
||||||
@@ -31,6 +44,37 @@ No configuration needed, install and forget.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Utility Minimap Trackings
|
||||||
|
|
||||||
|
Adds TBC-style minimap tracking 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`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Clickthrough
|
||||||
|
|
||||||
|
Makes interactable Objects and NPCs clickable through players and units.
|
||||||
|
|
||||||
|
- Players blocking interactable NPCs (vendors, trainers, flight masters, bankers, etc.) or Objects (mailboxes, summoning portals, soulwells) become transparent to clicks
|
||||||
|
- Units (pets, NPCs) blocking interactable Objects become transparent to clicks
|
||||||
|
- Non-interactable objects (other players' pets, random mobs) are not affected, this solely helps with player dogpiles
|
||||||
|
|
||||||
|
No configuration needed, install and forget.
|
||||||
|
|
||||||
|
**DLL:** `clickthrough.dll`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### Log Sessions
|
### Log Sessions
|
||||||
|
|
||||||
Organizes the combat, raw combat, and chat logs into per-character directories with timestamped filenames:
|
Organizes the combat, raw combat, and chat logs into per-character directories with timestamped filenames:
|
||||||
@@ -104,11 +148,11 @@ WeirdUtils exports three functions for querying and disabling modules at runtime
|
|||||||
| `WeirdUtils_DisableModule` | `int __cdecl (const char *name)` | Unhooks the named module. Returns 1 if found, 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 and core hooks. Returns count of modules disabled |
|
| `WeirdUtils_DisableAll` | `int __cdecl (void)` | Unhooks all modules and core hooks. Returns count of modules disabled |
|
||||||
|
|
||||||
Module names are case-insensitive and match the build option names:
|
Module names are case-insensitive and match the released dll names:
|
||||||
|
|
||||||
`customassets`, `logsessions`, `transmogfix`, `healtextfix`, `bigcursor`
|
`customassets`, `logsessions`, `transmogfix`, `minimapicons`, `healtextfix`, `bigcursor`, `pngscreenshots`, `clickthrough`
|
||||||
|
|
||||||
There is no re-enable API - re-hooking after unhook is unsafe.
|
There is no re-enable API.
|
||||||
|
|
||||||
#### C/C++ Header
|
#### C/C++ Header
|
||||||
|
|
||||||
@@ -122,7 +166,7 @@ if (WeirdUtils_IsModuleActive("transmogfix"))
|
|||||||
WeirdUtils_DisableModule("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`, `worldmarkers.dll`, etc.) via `GetModuleHandleA`, so it works regardless of which DLL variant is loaded.
|
||||||
|
|
||||||
#### Raw GetProcAddress
|
#### Raw GetProcAddress
|
||||||
|
|
||||||
@@ -139,9 +183,10 @@ if (hMod) {
|
|||||||
if (disable) disable("transmogfix");
|
if (disable) disable("transmogfix");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Module Mutexes
|
### 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_framecrash_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.
|
||||||
|
|||||||
@@ -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 */
|
||||||
Reference in New Issue
Block a user