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
Add warband_achievement and warband_achievement_progress tables for
account-level achievement storage. On login, merge account-wide
achievements and criteria progress from warband tables. Titles from
account-wide achievements are retroactively granted to all characters.
Existing per-character account-wide achievements are promoted to
warband tables on first login after migration.
Discovered flight paths are now shared across all characters on the same
Battle.net account. On login, each character merges the account-wide taxi
mask into their own. When a new node is discovered, the account mask is
updated immediately. Nodes with TaxiNodeFlags::NotAccountWide are excluded.
- Add warband_taxi_mask table (one row per bnet account)
- Add PlayerTaxi::MergeAccountTaxiMask() and LoadTaxiMaskFromString()
- Merge account taxi mask during Player::LoadFromDB
- Save character's merged mask back to account on Player::SaveToDB
- Update account mask on SendLearnNewTaxiNode/SendDiscoverNewTaxiNode
Add full handler implementations in CurrencyHandler.cpp:
- HandleRequestCurrencyDataForAccountCharacters: queries all same-account
characters' transferable currencies and sends to client
- HandleTransferCurrencyFromAccountCharacter: validates source character
ownership, currency transferability, balance checks, applies transfer
percentage, updates source via DB and destination via ModifyCurrency,
logs transfer to warband_currency_transfer_log
- HandleGetCharacterCurrencyTransferLog: queries and returns recent
transfer history for the bnet account
Add ReputationMgr methods for warband-wide reputation sharing:
- LoadAccountWideFromDB: merges account highest standings into character
reputation on login, syncing both regular and renown factions
- SaveAccountWideToDB: upserts warband_reputation when character's
standing exceeds the stored account-wide maximum
- Login query for account reputation via LoginQueryHolder
- Renown factions compare level first, then standing as tiebreaker
- Regular factions compare standing delta directly
Add database tables and ObjectMgr infrastructure for account-wide
reputation sharing:
- warband_reputation_faction (world DB): eligible factions config
- warband_reputation (characters DB): per-account highest standings
- Prepared statements for both world and character databases
- ObjectMgr::LoadWarbandReputationFactions() called at startup
- Pre-populate with TWW renown factions (2570, 2590, 2594, 2600)
Fix several bugs causing battle pet progression to not persist:
- Reorder logout cleanup so battle resolution (FinishBattle + XP award)
happens before journal lock release, ensuring XP is applied on disconnect
- Add captured wild pets to player journal via AddPet() on successful trap
- Keep slot pet data in sync with _pets map after level-up, health sync,
quality change, and healing to fix stale criteria/display data
- Change mid-level-up GameTable miss from hard return to break so partial
XP is still saved
- Add diagnostic logging (battlepet category) for save/load/XP operations