# Changelog ## [Unreleased] — changes since v1.8.1-preview (2026-03-23) ### Performance - Eliminate ~70 unnecessary sqrt ops per frame; constexpr reciprocals and cache optimizations - Skip bone animation for LOD3 models; frustum-cull water surfaces - Eliminate per-frame heap allocations in M2 renderer - Convert entity/skill/DBC/warden maps to unordered_map; fix 3x contacts scan - Eliminate double map lookups and dynamic_cast in render loops - Use second GPU queue for parallel texture/buffer uploads - Time-budget tile finalization to prevent 1+ second main-loop stalls - Add Vulkan pipeline cache persistence for faster startup ### Bug Fixes - Fix spline parsing with expansion context; preload DBC caches at world entry - Fix NPC/player attack animation to use weapon-appropriate anim ID - Fix equipment visibility and follow-target run speed - Fix inspect (packed GUID) and client-side auto-walk for follow - Fix mail money uint64, other-player cape textures, zone toast dedup, TCP_NODELAY - Guard spline point loop against unsigned underflow; guard hexDecode/stoi/stof - Fix infinite recursion in toLowerInPlace and operator precedence bugs - Fix 3D audio coords for PLAY_OBJECT_SOUND; correct melee swing sound paths - Prevent Vulkan sampler exhaustion crash; skip pipeline cache on NVIDIA - Skip FSR3 frame gen on non-AMD GPUs to prevent driver crash - Fix chest GO interaction (send GAMEOBJ_USE+LOOT together) - Restore WMO wall collision threshold; fix off-screen bag positions - Guard texture log dedup sets with mutex for thread safety - Fix lua_pcall return check in ACTIONBAR_PAGE_CHANGED ### Features - Render equipment on other players (helmets, weapons, belts, wrists, shoulders) - Target frame right-click context menu - Crafting sounds and Create All button - Server-synced bag sort - Log GPU vendor/name at init ### Security - Add path traversal rejection and packet length validation ### Code Quality - Packet API: add readPackedGuid, writePackedGuid, writeFloat, getRemainingSize, hasRemaining, hasData, skipAll (replacing 1300+ verbose expressions) - GameHandler helpers: isInWorld, isPreWotlk, guidToUnitId, lookupName, getUnitByGuid, fireAddonEvent, withSoundManager - Dispatch table: registerHandler, registerSkipHandler, registerWorldHandler, registerErrorHandler (replacing 120+ lambda wrappers) - Shared ui_colors.hpp with named constants replacing 200+ inline color literals - Promote 50+ static const arrays to constexpr across audio/core/rendering/UI - Deduplicate class name/color functions, enchantment cache, item-set DBC keys - Extract settings tabs, GameHandler::update() phases, loadWeaponM2 into methods - Remove 12 duplicate dispatch registrations and C-style casts - Extract toHexString, toLowerInPlace, duration formatting, Lua return helpers