Wire all 33 garrison CMSG opcodes and ~70 SMSG opcodes. Add complete mission
data model with DB persistence, start/complete/reward lifecycle, success chance
calculation, and follower XP progression. Implement follower operations including
assign/remove from buildings, rename, favorite, inactive, heal, and recruit stubs.
Add talent and building utility handler stubs that return appropriate error codes.
Analyzed a 12.0.1.66017 packet sniff using WowPacketParser and compared
every pet battle packet structure against our implementation. Fixed all
discrepancies to match Blizzard's actual wire format:
- SMSG_PET_BATTLE_FINALIZE_LOCATION: Replace single Position with full
PetBattleLocation struct (LocationResult, BattleOrigin, BattleFacing,
PlayerPositions[2])
- SMSG_PET_BATTLE_FINAL_ROUND: Completely restructured - no longer
contains round data. Now contains Abandoned/PvpBattle flags, Winners,
NpcCreatureIDs, and per-pet final results (PetBattleFinalPet)
- PetBattleEffectInfo: Add SourceAuraInstanceID (u16), TurnInstanceID
(u16), fix CasterPBOID to uint8, reorder fields to match wire format
- PetBattleEffectTargetInfo: Type is now 3 bits (not uint8), variable-
length params based on type (0-7 target types with 0-4 int32s each)
- PetBattleCooldownInfo: Add AbilityIndex and Pboid fields to match
PetBattleAbilityInfo format (same wire structure from 6.2.4+)
- Round packets (FirstRound, RoundResult, ReplacementsMade): All three
now share identical wire format via WriteRoundResult. Cooldowns moved
from per-player to round-level flat array. Added PetXDied (3-bit
count + PBOID entries)
- SMSG_PET_BATTLE_REPLACEMENTS_MADE: Now includes Effects (was missing)
- CMSG_PET_BATTLE_INPUT: MoveType changed from uint8 to int32, Round
from uint8 to int32, added DebugFlags (int32) and BattleInterrupted
(uint8) fields. Verified against raw hex: 19 bytes total
- CMSG_PET_BATTLE_REQUEST_WILD/PVP: Replace MovementInfo with proper
PetBattleLocation struct matching WPP V6 parser
- SMSG_PET_BATTLE_PVP_CHALLENGE: Uses PetBattleLocation struct
PlaceDecor and RemoveDecor previously only modified in-memory state,
relying on SaveToDB at logout for persistence. A server crash would
lose all placed/removed decor changes since last save.
Add crash-safe immediate persistence:
- PlaceDecor: INSERT decor row + UPDATE catalog count on placement
- RemoveDecor: DELETE decor row + UPDATE catalog count on removal
- New prepared statements: CHAR_UPD_CHARACTER_HOUSING_CATALOG_COUNT,
CHAR_DEL_CHARACTER_HOUSING_DECOR_SINGLE
Spawn the physical house structure GameObject when a player buys a plot,
using the DB2 PlotGameObjectID at the plot's HousePosition. Persist
player-chosen house positions to the database so they survive relogs.
Fix the SetHousePosition handler to actually store and apply the position
instead of being a no-op.
Spawn placed decor items as visible GameObjects with the FHousingDecor_C
entity fragment (InitHousingDecorData), following the cornerstone pattern.
Hook decor GO spawn/move/despawn into the Place/Move/Remove handlers so
furniture appears and updates in real time.
Fix outdoor decor budget enforcement: decor with roomGuid=0 now routes
to the exterior budget instead of always counting as interior.
Fix edit mode response wire format to match Fixture/Room pattern
(uint32 Result + Bit Active).
Set default _houseType to 32 (sniff-verified) instead of 0.
Fix SMSG_HOUSING_DECOR_SET_EDIT_MODE_RESPONSE wire format - the uint8
between DecorCount and DecorGuids is a HousingResult status code (0=SUCCESS,
1=ACTION_LOCKED_BY_COMBAT), not an Active boolean. Writing 1 caused the
client to show "You can't do that while in combat" even when not in combat.
Fix NeighborhoodGuid mismatch between client-supplied DB2 ID and server
canonical counter by using neighborhood->GetGuid() consistently.
Fix JamCurrentHouseInfo GUID field swap (SecondaryOwnerGuid/PlotGuid).
Add Player::UpdateHousingMapId() to update PlayerMirrorHouse.MapID when
entering housing maps, using snapshot-clear-rebuild pattern to work around
DynamicUpdateField PublicSet=false restriction.
Add GUID mismatch fallback in HousingMap::AddPlayerToMap and proactive
SMSG_NEIGHBORHOOD_PLAYER_ENTER_PLOT send.