Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d71ab9d4fd | |||
| eb21c08706 | |||
| 95704a412d | |||
| a3d5b47910 | |||
| 58f2f788b1 | |||
| 434a4f1129 | |||
| 11e954857b | |||
| 49d9a43235 | |||
| 4a4ae22a2d | |||
| ad4e44dc55 | |||
| 6c216ddf28 | |||
| 12465cfd58 | |||
| 6d216e8201 | |||
| 44d56ebe1b | |||
| ad2dd20ca1 | |||
| f266852fa5 | |||
| caac25cb73 | |||
| baf0a7997d | |||
| 9b1f7c2600 | |||
| e674a1634d | |||
| d1dc5ec31d | |||
| 30c827647c | |||
| b49a633456 | |||
| ae5caa0098 | |||
| b8facd60e9 | |||
| 1b19fde999 | |||
| 83d97ab1db | |||
| c62eb2c560 | |||
| a283ffe2b6 | |||
| 4af5180c4d | |||
| 2d4bb10c6e |
@@ -0,0 +1,41 @@
|
||||
name: Bug Report
|
||||
about: Report a crash, error, or unexpected behavior
|
||||
labels:
|
||||
- bug
|
||||
body:
|
||||
- type: dropdown
|
||||
id: launcher
|
||||
attributes:
|
||||
label: Launcher
|
||||
options:
|
||||
- WoW.exe (direct)
|
||||
- VanillaFixes.exe
|
||||
- Other
|
||||
default: 0
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: platform
|
||||
attributes:
|
||||
label: Platform
|
||||
options:
|
||||
- Windows
|
||||
- Linux (Wine)
|
||||
- macOS (Wine/CrossOver)
|
||||
default: 0
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Bug Report
|
||||
description: Attach your WeirdUtils DLL(s) and crash log (.txt from Errors/ folder) by dragging them into this box.
|
||||
value: |
|
||||
## What happened?
|
||||
|
||||
## Steps to reproduce:
|
||||
|
||||
## Other DLLs loaded (nampower, SuperWoW, UnitXP, etc.):
|
||||
|
||||
validations:
|
||||
required: true
|
||||
@@ -0,0 +1,2 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links: []
|
||||
@@ -0,0 +1,10 @@
|
||||
name: Feature Request / Question
|
||||
about: Suggest a feature or ask a question
|
||||
body:
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: What would you like to see, or what question do you have?
|
||||
validations:
|
||||
required: true
|
||||
@@ -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.
|
||||
@@ -31,6 +44,39 @@ 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
|
||||
|
||||
Smart cursor targeting that prioritizes useful interactions. Instead of always selecting the nearest object under the cursor, the module finds the most useful target along the ray in priority order.
|
||||
|
||||
- Lootable corpses first, then interactable game objects/portals, then interactable NPCs, then normal selection
|
||||
- Dead non-lootable corpses can still be selected when nothing more useful is behind them
|
||||
- Disabled inside battlegrounds to prevent targeting objectives through enemy players
|
||||
|
||||
Can replaces SuperWoW's `Clickthrough()` toggle with always-on smart targeting that doesn't require a manual toggle and preserves the ability to select dead bodies when needed. Disable corpse-clickthrough in SuperAPI if you want this.
|
||||
|
||||
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:
|
||||
@@ -81,6 +127,21 @@ Lua API for addon developers:
|
||||
|
||||
---
|
||||
|
||||
### 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.
|
||||
@@ -102,13 +163,13 @@ WeirdUtils exports three functions for querying and disabling modules at runtime
|
||||
|---|---|---|
|
||||
| `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 and core hooks. Returns count of modules disabled |
|
||||
| `WeirdUtils_DisableAll` | `int __cdecl (void)` | Unhooks all modules. 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`, `weirdperformance`
|
||||
|
||||
There is no re-enable API - re-hooking after unhook is unsafe.
|
||||
There is no re-enable API.
|
||||
|
||||
#### C/C++ Header
|
||||
|
||||
@@ -122,7 +183,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`, `minimapicons.dll`, etc.) via `GetModuleHandleA`, so it works regardless of which DLL variant is loaded.
|
||||
|
||||
#### Raw GetProcAddress
|
||||
|
||||
@@ -139,9 +200,41 @@ if (hMod) {
|
||||
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_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.
|
||||
|
||||
@@ -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