- Fix DB2 store iteration bug: ExteriorComponentHook entries with
ParentIndexField were only partially accessible via range-based
iteration (1808 of 23881 entries). Use LookupEntry() over
GetNumRows() to reach all entries, fixing hook resolution
(compByHook was 0, now resolves all 1461 GroupXHook mappings).
- Spawn all root components per HouseExteriorWmoDataID: houses
consist of multiple independent roots (Base type=9, Roof type=10)
sharing the same WMO data ID. Each root spawns independently at
house position with its own hook children (doors on base,
chimney/windows on roof). Filter by Size to avoid spawning
small/medium/large variants simultaneously.
- Build parent-child index from ExteriorComponent.ParentComponentID
for component variants that reference a parent component.
- Add _rootCompsByWmoDataId index for fast lookup of all root
components belonging to a house exterior.
- Fix MeshObject fixture data to pass fixtureGuid and
parentFixtureGuid for proper client-side attachment hierarchy.
- Fix BNetAccount dirty state in fixture edit mode by clearing
update mask after PopulateCatalogStorageEntries.
Comprehensive audit of all neighborhood and housing DB2 tables against
WoWDBDefs canonical field definitions. Renames all misnamed fields across
DB2Structure.h, DB2LoadInfo.h, and internal cache structs in HousingMgr.h.
Key field corrections across 12 DB2 tables:
- NeighborhoodMap: Radius→EntryRotation, PlotCount→UiTextureKitID, FactionRestriction→Flags
- NeighborhoodNameGen: Suffix→Middle, FullName→Suffix
- HouseTheme: IconFileDataID→Flags, CategoryID→ParentThemeID
- HouseDecorMaterial: 5 fields renamed (WMOMaterialReference, MaterialTextureIndex, etc.)
- HouseLevelRewardInfo: HouseLevelID→HouseLevelDataID, RewardType→Field_4, RewardValue→IconFileDataID
- InitiativeCycle: Duration→HouseXPCap
- InitiativeMilestone: 4 fields renamed (MilestoneOrderIndex, RequiredContributionAmount, etc.)
- InitiativeReward: 7 fields renamed (Money, DecorID, DecorQuantity, Favor, RewardQuestID, etc.)
- InitiativeTask: 6 fields renamed (CriteriaTreeID, QuestID, ProgressContributionAmount, etc.)
- DecorCategory/DecorSubcategory/DecorDyeSlot: display fields renamed
Logic bugs revealed and fixed by the audit:
- Budget wiring removed (DB2 has no budget type/value; budgets come from hardcoded table)
- Initiative task type filtering removed (CriteriaTreeID is a FK, not a type enum)
- Initiative target counts fixed (was using QuestID as threshold, now ProgressContributionAmount)
- Initiative duration sourced from NeighborhoodInitiative.Duration, not InitiativeCycle.HouseXPCap
- Initiative rewards rewritten to use correct DB2 fields (Money, DecorID, Favor, etc.)
- Plot count derived from actual plot data instead of misnamed UiTextureKitID field
- NeighborhoodMgr faction checks updated to use Flags with confirmed bitmask values
CriteriaTree-based initiative task matching:
- Replace 4 ad-hoc OnPlayerAction() calls that used non-existent TaskType enum (1-4)
- Add single hook in CriteriaHandler::UpdateCriteria after validation passes
- BuildCriteriaIndex() walks each task's CriteriaTree to find leaf Criteria entries,
builds reverse index CriteriaID → (neighborhood, initiative, task) for O(1) lookup
- OnCriteriaProgress() matches criteria fires against active initiative tasks,
covering all 250+ criteria types (kills, crafting, gathering, quests, etc.) automatically
- Index rebuilt on initiative start/complete to stay current
PlayerPositions in SMSG_PET_BATTLE_FINALIZE_LOCATION does not move the
player character. Use NearTeleportTo to explicitly position the player
5 units behind the midpoint along the facing axis.
- Weather now targets environment slot 2 (PBOID 8 / PetbattleEnviros::Weather)
instead of slot 0 (Pad0), matching client expectations
- Replace hardcoded weather ability name list with generic DB2-driven detection:
PropsID chain walk + reverse AuraBattlePetAbilityID walk + BattlePetAbilityState
diagnostic logging to discover remaining weather abilities
- Multi-hit abilities now stop when the target dies (prevents overkill)
- Battle positioning: offset player 5 units behind pet along facing axis
The BattlePetEffectPropertiesID values in the DB2 don't map 0-18
sequentially — they're arbitrary IDs (222, 26, 24, etc.). Add startup
logging that dumps all unique PropertiesIDs with their ParamLabel
strings and usage counts, so we can build the correct mapping.
Also improve the UNHANDLED effect warning to include all 6 Param values
and the ParamLabel strings from the DB2, making the logs self-documenting.
Two bugs prevented TryMarkAsWildBattlePet() from ever marking critters:
1. Init order: BattlePetMgr::Initialize() ran AFTER sMapMgr->Initialize(),
so the species-by-creature map was empty during creature spawning.
Moved battle pet initialization before map system startup.
2. Respawn flag wipe: TryMarkAsWildBattlePet() ran BEFORE
setDeathState(JUST_RESPAWNED), which calls ReplaceAllNpcFlags from
template, wiping the dynamically added UNIT_NPC_FLAG_WILD_BATTLE_PET.
Moved TryMarkAsWildBattlePet() to after setDeathState.
- Move TickWeather() inside AURA_PROCESSING_BEGIN/END block so client
processes weather effects correctly (was outside the wrapper)
- Emit AURA_CHANGE for environment auras each round with CurrentRound
increment (was missing — pet auras had this but weather did not)
- Add AURA_APPLY/AURA_CANCEL for multi-turn abilities so client shows
buff icon during multi-turn sequences (Burrow, Lift-Off, etc.)
- Fix HandlePetBattleInput to only accept input during ROUND_IN_PROGRESS
state, preventing ProcessRound from firing with dead front pet during
WAITING_FOR_FRONT_PET state
Move _roundTimerSecs increment inside the 1-second tick block.
Previously it incremented every Update() call (~100ms), reaching
the 45s threshold in ~4.5 seconds instead of 45 seconds.
Matches Blizzard sniff pattern where every round wraps aura tick
processing in BEGIN(PBOID=9) / END(PBOID=9) sentinel effects.
- Emit AURA_PROCESSING_BEGIN before aura ticking
- Phase 1: DoT/HoT periodic damage/healing (SET_HEALTH)
- Phase 2: AURA_CHANGE per active aura with updated CurrentRound
- Phase 3: Decrement rounds, AURA_CANCEL for expired auras
- Emit AURA_PROCESSING_END after all aura processing
- Add explicit switch cases for effect types 13/14 in BuildRoundEffects
- Fill SourceTeam/SourcePet and Param3/Param4 on AURA_CANCEL effects