Add instant visual feedback for fixture/room changes, populate licensed
decor quantities from catalog, and implement the decor refund window.
- Fixture handlers (SetCore, Create, Delete) now despawn+respawn house
MeshObjects so changes are visible without relog
- All 8 room handlers refresh interior MeshObjects after success via
shared RefreshInteriorRoomVisuals helper
- Send SMSG_ACCOUNT_*_COLLECTION_UPDATE for room add, theme set, and
material apply operations
- HandleGetAllLicensedDecorQuantities returns catalog + starter decor
- HandleGetDecorRefundList returns recently placed decor within 2-hour
refund window using new PlacementTime field persisted to DB
- Rewrite SpawnRoomMeshObjects to iterate ALL components per room from DB2
data, each getting InitHousingRoomComponentData with proper geobox
- Add faction-aware theme selection via GetFactionDefaultThemeID (Alliance=6,
Horde=2) and FindRoomComponentOption per-component lookup
- Fix GetDefaultVisualRoomEntry to deterministically pick lowest-ID room
(Room 1 = Square Small) instead of non-deterministic unordered_map pick
- Add runtime migration in LoadFromDB to replace wrong visual room entry
(e.g., Octagon 9 → Square 1) on next login
- Fix interior decor not visible: PLACE/MOVE/REMOVE handlers now support
HouseInteriorMap via SpawnSingleInteriorDecor and UpdateDecorPosition
- SpawnInteriorDecor runs on every interior entry (not gated by
_roomsSpawned), with duplicate-spawn prevention
- Fix room GUID using subType=2 (was 0 which returned ObjectGuid::Empty)
- Fix DB2 OffsetRot degrees-to-radians conversion for component quaternions
- Teleport player to visual room center on interior entry
- Add MeshObject::InitHousingDecorData, InitHousingRoomData,
InitHousingRoomComponentData, InitHousingFixtureData for entity fragments
- Add SpawnRoomForPlot to HousingMap for exterior room entities with geobox
- Add SQL migrations for base room and visual room auto-placement
- Enhanced diagnostic logging for exterior decor spawn success/failure
P0: Fix mission rewards double-write in GetGarrisonInfoResult — inline
Encounters/Rewards/OvermaxRewards are now cleared in mission structs
sent via GarrisonInfo; rewards go only in the garrison-level parallel
arrays, preventing client packet desync.
P1: Populate FollowerSoftCaps with 5 entries matching retail sniff data.
Implement SMSG_GARRISON_MISSION_START_CONDITION_UPDATE packet and send
it after GetGarrisonInfoResult. Update CMSG_GARRISON_START_MISSION
Read() for 12.0.1 per-follower struct format (BoardIndex/Health/
HasFollowerEntry), remove obsolete MissionBonusAbilityIDs.
P2: Implement SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY packet, used by
SetFollowerQuality. Send blueprint data for all garrison types.
Read GarrTypeID in CMSG_GARRISON_CHECK_UPGRADEABLE and look up the
correct garrison by type.
P3: Add FOLLOWER_TYPE_DELVES (22) enum value. Fix building removal
packet ordering — GarrisonBuildingRemoved now sent before
ClearBuildingInfo (PlotRemoved) when replacing a different type.
Battle no longer gets stuck after capturing a wild pet when other wild
pets are still alive. The captured pet is marked and the wild team
auto-swaps to the next alive pet, continuing the fight.
Buff/debuff auras are now visible and mechanically applied:
- Add effectCategory 8 handler for self-buff auras (AURA_APPLY to caster)
- RecalculateEffectiveStats reads state modifiers and BUFF/DEBUFF auras
- CalculateAbilityDamage integrates damage dealt/taken state modifiers
- CalculateAbilityHealing integrates healing dealt state modifiers
- Add STATE_MOD_DAMAGE_TAKEN, SPEED, HEALING_DEALT/TAKEN to BattlePetState
Fix four bugs reported by tester:
- Slot swap duplication: HandleBattlePetSetBattleSlot now properly swaps
pets between source and target slots instead of only assigning the target,
which left the pet duplicated in the old slot
- Aura persistence: Populate petInfo.Auras in BuildPetBattlePlayerUpdate
so the client knows which auras are active on each pet. Fix aura round
effect params to send AuraInstanceID + AbilityID (matching wire format)
and look up real RoundsRemaining/CurrentRound instead of hardcoding 0
- Trap animation: Resolve the actual BattlePetAbilityEffect.ID from the
DB2 chain for ability 427 instead of using the raw ability ID, so the
client can look up the correct visual spell for the capture animation
- Achievement name: Change hotfix_data status from 3 (insert) to 1 (valid)
for achievement 7433 which already exists in the retail client DB2;
status=3 corrupted the client-side entry causing empty achievement links
LoadFromDB was creating decor GUIDs with subType=0 (Housing-0-0-0-counter)
but the client uses subType=1 (Housing-1-realmId-entryId-counter). The GUID
mismatch caused the Account entity storage to become stale after relog,
making all placed decor appear gone. Reconstruct the full GUID using the
decorEntryId from the same DB row.
The client sends CMSG_HOUSING_DECOR_PLACE directly (without a preceding
REDEEM_DEFERRED) when items are already in storage from the initial
storage response. Extract decorEntryId from the Housing GUID (subType=1,
arg2 in bits [31:0]) instead of requiring a pending placement entry.
The client uses MeshObject Geobox bounds (not AreaTrigger shape) for its
OutsidePlotBounds collision check during decor placement. Spawn a Room
entity (FHousingRoom_C) and Room Component MeshObject
(FHousingRoomComponentMesh_C + Geobox) per owned plot using DB2 lookups
for faction-correct values.
Also fixes RequestStorage response (Flags=0x80, Account entity update),
HouseGUID generation (BNetAccountID), and AT PeriodModifier.Field_4.
Sniff-verified all housing decor SMSG wire formats against 3 PKT captures
(108k+ packets). All formats confirmed correct except RequestStorageResponse
which sent the player's BNet account GUID instead of empty.
Changes:
- RequestStorageResponse: Send ObjectGuid::Empty for BNetAccountGuid (sniff
shows 00 00 = empty packed GUID in all cases)
- RequestStorage handler: Now also sends GetPlayerHousesInfoResponse after
StorageRsp (sniff shows both 0x510006 + 0x54000B sent together)
- Fixed in HousingHandler.cpp (3 places) and NeighborhoodHandler.cpp (1 place)
- Added new SQL files for neighborhood spawns and housing templates
- Added HouseInteriorMap source files