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