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
Implements all remaining garrison subsystems for full Blizzlike coverage:
- 17 garrison spell effects (upgrade, add mission, follower XP/quality/abilities,
building construction, shipments, talents, item level upgrades)
- Building swap between same-type plots
- Follower item level upgrade system with GarrItemLevelUpgradeData support
- Building-specific mechanics: Barracks extra follower slots (+5/+10),
Salvage Yard crate drops from missions, Inn/Tavern treasure missions
- Bodyguard companion system (follows player in Draenor, assists in combat)
- Party garrison (visit group leader's garrison)
- Invasion wave system with 3 invasion types and GM commands
- Stub handler completions (monument revert, pet name, talent unlocks)
- Targeted event packets replacing heavy GetGarrisonInfoResult sends
- Auto-combat simulator for adventure missions
Load 12 new Garr* DB2 stores (GarrBuildingDoodadSet, GarrFollItemSetMember,
GarrFollowerLevelXP, GarrFollowerQuality, GarrFollowerType,
GarrItemLevelUpgradeData, GarrMissionSet, GarrMissionType,
GarrMissionXFollower, GarrMssnBonusAbility, GarrSpecialization, GarrType)
across the full loading pipeline.
Implement Garrison::Upgrade() for WoD level 1-3 progression with cinematic
playback, building persistence across level transitions, and plot respawning.
Replace hardcoded follower XP formula with DB2-driven progression using
GarrFollowerLevelXP and GarrFollowerQuality stores, including quality
upgrades with ability re-rolling at tier boundaries.
Add follower custom name persistence (customName column) and mission
required follower validation via GarrMissionXFollower index.
Refactor to multi-garrison framework: Player stores map of garrisons keyed
by GarrisonType, GetGarrison() defaults to WoD for backwards compatibility,
GetGarrisonInfo sends data for all garrison types to client.
Fix 5 data correctness issues and 1 flow ordering issue found by comparing
against a retail 12.0 NPC trainer battle sniff:
- AwardedXP: set true for all pets (both teams) via CanAwardXP(), not just
the winner team
- NpcCreatureID: use trainer NPC entry (via GetNpcTrainerGUID) instead of
pet species CreatureID
- SeenAction: set false for all pets (matches sniff)
- Remove HealBattlePetsPct(50) auto-heal — sniff shows dead pets stay at 0
- Split end flow: FinalRound packet sent immediately, but Finished packet,
health sync, and journal update deferred until client sends FinalNotify
(player must click OK on results screen)
- Add logout cleanup in WorldSession::LogoutPlayer for disconnect safety
CompleteBattle() centralizes the FINISHED transition, Finished packet,
health sync, and journal send — used by FinalNotify handler, forfeit
handler, and logout cleanup.
Wire 3 unhandled CMSG opcodes (GetAllLicensedDecorQuantities,
GetDecorRefundList, InitiativeUpdateActiveNeighborhood) with full handler
implementations and SMSG responses. Add extensive TC_LOG_DEBUG logging to
all ~120 housing packet Read()/Write() methods for runtime tracing.
Validate ExteriorComponent, ExteriorComponentHook, and ExteriorComponentType
DB2 lookups in fixture handlers before passing IDs to the housing backend.
- Create MeshObject class (WorldObject + GridObject + MapObject) for housing
fixture rendering with FMeshObjectData_C, FMirroredPositionData_C, and
FHousingFixture_C entity fragments
- Spawn 10 structural MeshObjects per house (base, door assembly, walls,
corners, chimney, windows) with parent-child hierarchy and local-space
positioning
- Fix child MeshObject grid placement: use parent's world position for
server-side grid cell so child pieces are visible to nearby players,
while storing local-space offset in FMirroredPositionData_C for client
rendering
- Fix SMSG_HOUSING_DECOR_SET_EDIT_MODE_RESPONSE wire format to match retail:
PackedGUID HouseGuid + PackedGUID HouseGuid2 + uint8 IsInEditMode +
uint32 Result + PackedGUID DecorGuid (conditional)
- Remove duplicate GO 574432 dynamic spawn that caused brown rectangle on
plot floor (DB already has 23 properly-rotated pre-spawned instances)
- Add front door GO spawn (entry 602702, type Goober, displayId 116971)
- Add MeshObject to Map type list, grid infrastructure, and object store
- Implement MeshObject movement block in BaseEntity::BuildCreateUpdateBlockMovement
- Add post-purchase initialization in plot reserve handler
- Add per-player plot ownership WorldState values
until Equipped (type 9) items. Previously only binding types 1-4 were
handled, so warbound items never bound on pickup and bypassed all
trade/mail restrictions.
- Rename ITEM_FIELD_FLAG_UNK2 to ITEM_FIELD_FLAG_CONVERTED_WARBOUND to
persist BtWuE-to-soulbound conversion across sessions
- Add IsWarbandBound(), IsAccountBound(), ConvertToSoulbound() helpers
- Bind warbound items on pickup in _StoreItem (new + stack merge)
- Convert BtWuE items to permanent soulbound on equip in VisualizeItem
- Allow warbound items to be mailed cross-faction and within bnet account
- Block warbound items from player-to-player trade window