The classic and turtle update_fields.json files had several wrong
indices that aliased fields together and misread the unit record.
Cross-referenced vmangos UpdateFields_1_12_1.h
(github.com/vmangos/core, OBJECT_END=6) and corrected:
- UNIT_FIELD_BYTES_1: 133 -> 138 (was colliding with MOUNTDISPLAYID)
- UNIT_FIELD_STAT0..STAT4: 138..142 -> 150..154 (the old slot held
pet fields PETNUMBER/PET_NAME_TIMESTAMP/
PETEXPERIENCE/PETNEXTLEVELEXP, not stats)
- UNIT_FIELD_RESISTANCES: 154 -> 155 (off by one — STAT4 lives at 154)
- UNIT_FIELD_NATIVEDISPLAYID: added (was missing) -> 132
The verified other indices (DISPLAYID=131, MOUNTDISPLAYID=133,
DYNAMIC_FLAGS=143, NPC_FLAGS=147, BYTES_0=36) all matched vmangos
and were left alone.
Practical impact on Classic/Turtle prior to this fix:
- entity_controller.cpp:548-553 read MOUNTDISPLAYID and BYTES_1 from
the same slot — mount/dismount detection and shapeshift form
detection would race and clobber each other.
- All STAT* readers were reading pet-related fields instead of stats,
so character-sheet stats and stat-derived UI on Classic/Turtle
would be wrong/zero.
- UNIT_FIELD_RESISTANCES readers got STAT4 instead of armor resist.
Python collision check after patch: no UNIT_* collisions in either
file.
While auditing docs found that classic/update_fields.json and
turtle/update_fields.json both assign index 133 to two distinct
fields:
UNIT_FIELD_BYTES_1 = 133
UNIT_FIELD_MOUNTDISPLAYID = 133
These are read separately at entity_controller.cpp:548-553 for
display-change detection vs mount/dismount vs shapeshift, so on
Classic/Turtle the two events alias and one will be misattributed
(visible as mount stutter or wrong shapeshift transitions).
TBC and WotLK assign distinct values (BYTES_1=137/137,
MOUNTDISPLAYID=154/69), so the issue is specific to the two
classic-family JSONs. Adding to status.md as a known gap rather
than patching the index blindly — the correct vanilla 1.12 value
should be sourced from CMaNGOS-Zero before changing.
- CMakeLists.txt:29: WOWEE_ENABLE_ASAN description said 'AddressSanitizer
(Debug builds)', but the implementation at lines 1206-1219 applies
-fsanitize=address,undefined to ALL configs (no $<$<CONFIG:Debug>:>
guard) and prints 'AddressSanitizer + UBSan: ENABLED'. Updated to
match reality.
- CHANGELOG.md / docs/architecture.md: TransportManager decomposition
claimed 1,200→500 LOC, but transport_manager.cpp is now 367 lines
(wc -l). Updated to ~370.
- CHANGELOG.md: world editor 'World Editor (tools/editor/)' header
claimed '14.7k+ lines, 59 files'. Actual: ~132k LOC across ~500
files in tools/editor/ (find + wc). Updated. The understatement
most likely reflects an early-2026 snapshot.
- docs/AMD_FSR2_INTEGRATION.md: removed 'Startup safety behavior'
bullets — WOWEE_ALLOW_STARTUP_FSR2 has zero references in src/,
include/, CMakeLists.txt, or any build script; the IN_WORLD-deferred
FSR2 logic does not exist. Documenting a knob that nothing reads
misleads users.
- README.md / docs/status.md / docs/server-setup.md / GETTING_STARTED.md:
Turtle WoW version was 1.17 in four places, but
Data/expansions/turtle/expansion.json declares major=1 minor=18
(build 7234). Sync docs to the canonical config.
- docs/status.md: 'Last updated' bumped from 2026-04-14 to 2026-05-14
to reflect the v1.9.1-preview-era body that has already replaced the
v1.8.9 snapshot.
- ATTRIBUTION.md: removed GLEW (not used — no glew.h includes, no
find_package(GLEW) in CMakeLists.txt); added the libraries that
ARE actually used (Vulkan, vk-bootstrap, zlib, FFmpeg, Lua, Catch2,
nlohmann/json, stb, FidelityFX-FSR2). OpenSSL row clarified for 3.x.
- container/{builder-linux,builder-macos,builder-windows}.Dockerfile:
drop libglew-dev / vcpkg 'glew' — nothing links against GLEW, so
these were dead weight in the images.
- container/FLOW.md: matched the Dockerfile changes.
- docs/perf_baseline.md: Tracy is NOT vendored — building with
WOWEE_ENABLE_TRACY=ON references extern/tracy/ which doesn't exist.
Documented the required 'git clone' step. Also corrected the
M2::computeBoneMatrices / M2Renderer::update file paths
(m2_renderer_internal.h and m2_renderer_render.cpp, not
m2_renderer.cpp).
- WARDEN_IMPLEMENTATION.md: status said 'Complete' but
src/game/warden_module.cpp still has placeholder import binding
(line 1023), TODO for WardenFuncList extraction (line 1155), and
falls back to fake responses (line 234). Documented honestly.
- WARDEN_IMPLEMENTATION.md: removed the WoW.exe offset 0x005e3a03
claim — that exact offset appears nowhere in the codebase; the
modulus is a hardcoded placeholder (per include header).
- SKY_SYSTEM.md: example code used glEnable/glBlendFunc/glDisable in
a Vulkan-only project. Replaced with a Vulkan-blend description.
- docs/server-setup.md: realmlist column is 'flag', not 'realmflags'
(TrinityCore 3.3.5 schema). Add gamebuild for clarity. Bumped stale
v1.8.9-preview reference to v1.9.1-preview to match README.
- docs/packet-framing.md: status line claimed the doc was 'tested
against AzerothCore/TC/Mangos/Turtle' but the doc only describes
auth framing; world framing (with encryption) lives in WorldSocket.
Reworded so the scope is unambiguous.
- README.md / docs/architecture.md: remove the '664 opcode handlers' /
'664+ opcodes' figure (unverifiable — actual register*Handler() call
count is 33, but most opcodes are bulk-registered via array loops).
Reword to describe coverage qualitatively.
- docs/threading.md: WorldSocket::connectAsync(), startWatchdog(), and
TerrainManager::startWorkers() do not exist. Reference the actual
symbols: connect() / asyncPumpLoop(), the inline lambda in run(),
and TerrainManager::initialize() spawning workerLoop().
- TESTING.md: WOWEE_BUILD_TESTS defaults to ON in CMakeLists.txt:28,
not OFF as the doc claimed.
- TROUBLESHOOTING.md: log path is logs/wowee.log in CWD (per
src/core/logger.cpp:61), not ~/.wowee/logs/.
- CONTRIBUTING.md / docs/status.md: align test count with actual
31 test_*.cpp files in tests/ (was 27 in both docs, 31 in README).
- docs/quickstart.md: section numbering jumped from 2 to 4 to 5;
renumbered to 1-4.
- architecture.md: add chat system modules (src/ui/chat/), world map
modules (src/rendering/world_map/), CatmullRomSpline (src/math/),
transport decomposition, and updated namespace list
- status.md: update timestamp to 2026-04-14, add recent refactors
section and world map known gaps
- CHANGELOG.md: add detailed entries for PRs #58-63 covering
architecture, features, bug fixes, and 19 new test files
- TESTING.md: expand test suite layout from 8 to 27 files organized
by category (core, animation, transport, world map, chat)
- CONTRIBUTING.md: update namespace table, testing section, and key
files list to reflect new module directories
- README.md: update status timestamp to 2026-04-14
Complete rewrite — the previous version extensively referenced OpenGL
(glClearColor, VAO/VBO/EBO, GLSL shaders) throughout all sections.
The project has used Vulkan exclusively for months.
Key changes:
- Replace all OpenGL references with Vulkan equivalents (VkContext,
VMA, descriptor sets, pipeline cache, SPIR-V shaders)
- Update system diagram to show actual sub-renderer hierarchy
(TerrainRenderer, WMORenderer, M2Renderer, CharacterRenderer, etc.)
- Document GameHandler SOLID decomposition (8 domain handlers +
EntityController + GameServices dependency injection)
- Add Warden 4-layer architecture section
- Add audio system section (miniaudio, 5 sound managers)
- Update opcode count from "100+" to 664+
- Update UI section: talent screen and settings are implemented (not TODO)
- Document threading model (async terrain, GPU upload queue, normal maps)
- Fix dependencies list (Vulkan SDK, VMA, vk-bootstrap, Unicorn, FFmpeg)
- Add container builds and CI platforms
- Remove stale "TODO" items for features that are complete
- CONTRIBUTING.md: C++17 → C++20 (matches CMakeLists.txt)
- TROUBLESHOOTING.md: fix log path (~/.wowee/logs/ → logs/wowee.log)
- docs/authentication.md: remove stale "next milestone" (char enum
and world entry have been working for months)
- docs/srp-implementation.md: update session key status (RC4 encryption
is implemented), fix file reference to actual src/auth/srp.cpp
- docs/packet-framing.md: remove stale "next steps" (realm list is
fully implemented), update status with tested servers
- docs/WARDEN_IMPLEMENTATION.md: fix file list — handler is in
warden_handler.cpp not game_handler.cpp, add warden_memory.hpp/cpp
- docs/WARDEN_QUICK_REFERENCE.md: fix header/source paths (include/
not src/), add warden_handler and warden_memory
- docs/quickstart.md: fix clone command (--recurse-submodules, WoWee
not wowee), remove obsolete manual ImGui clone step, fix log path
- docs/server-setup.md: update version to v1.8.9-preview, date to
2026-03-30, add all supported expansions
- assets/textures/README.md: remove broken doc references
(TURTLEHD_IMPORT.md, TEXTURE_MANIFEST.txt), update integration
status to reflect working PNG override pipeline
- README: update status date to 2026-03-30, version to v1.8.9-preview,
add container builds line, update current focus to code quality
- CHANGELOG: move v1.8.1 entries to their own section, add v1.8.2-v1.8.9
unreleased section covering architecture (GameHandler decomposition,
Docker cross-compilation), bug fixes (7 UB/overflow/safety fixes),
and code quality (30+ constants, 55+ comments, 8 DRY extractions)
- docs/status.md: update last-updated date to 2026-03-30
Inventory sort: clicking "Sort Bags" now generates CMSG_SWAP_ITEM packets
to move items server-side (one swap per frame to avoid race conditions).
Client-side sort runs immediately for visual preview; server swaps follow.
New Inventory::computeSortSwaps() computes minimal swap sequence using
selection-sort permutation on quality→itemId→stackCount comparator.
World map: fix continent bounds derivation that used intersection (max/min)
instead of union (min/max) of child zone bounds, causing continent views
to display zoomed-in/clipped.
Update README.md and docs/status.md with current features, release info,
and known gaps (v1.8.2-preview, 664 opcode handlers, NPC voices, bag
independence, CharSections auto-detect, quest GO server limitation).
The VK_ERROR_DEVICE_LOST crash on AMD/Mali GPUs (barrier srcAccessMask)
was fixed in 2026-03-18. Enable refraction for new sessions so players
get the improved water visuals without needing to touch Settings.
Existing saved configs that explicitly disabled it are preserved.
- AmdFsr3Runtime now probes both the legacy ffxFsr3* API and the newer
generic ffxCreateContext/ffxDispatch API; selects whichever the loaded
runtime library exports (GenericApi takes priority fallback)
- Generic API path implements full upscale + frame-generation context
creation, configure, dispatch, and destroy lifecycle
- dlopen error captured and surfaced in lastError_ on Linux so runtime
initialization failures are actionable
- FSR3 runtime init failure log now includes path kind, error string,
and loaded library path for easier debugging
- tools/generate_ffx_sdk_vk_permutations.sh added: auto-bootstraps
missing VK permutation headers; DXC auto-downloaded on Linux/Windows
MSYS2; macOS reads from PATH (CI installs via brew dxc)
- CMakeLists: add upscalers/include to probe include dirs, invoke
permutation script before SDK build, scope FFX pragma/ODR warning
suppressions to affected TUs, add runtime-copy dependency on wowee
- UI labels updated from "FSR2" → "FSR3" in settings, tuning panel,
performance HUD, and combo boxes
- CI macOS job now installs dxc via Homebrew for permutation codegen
- Add water/lava/lighting rendering features to README
- Add transport riding to movement features
- Update status date and rendering capabilities
- Note interior shadow and lava steam known gaps