Add GM commands and polish:
- cs_delve.cpp: comprehensive GM command suite:
.delve info - show delve system status
.delve season - show active season and spells
.delve bountiful - show today's bountiful delves
.delve progress - show account-wide progress (tier, vault, keys)
.delve settier N - set highest unlocked tier
.delve companion info - show companion state
.delve companion level N - set companion level
.delve companion role N - set role (0=DPS, 1=Healer, 2=Tank)
- Player.h/cpp: add SetDelveData() and ClearDelveData() public methods
for update field access (m_values is protected, external code can't
access it directly)
- DelveInstance.cpp: refactored to use Player methods instead of direct
m_values access, removed UpdateFields.h dependency
- Remove STRAT-SELECT diagnostic (60k lines per session)
- Downgrade CalculateObjectivePriorities from ERROR to TRACE (60k lines)
- Throttle "walking to quest giver" log to once per 5 seconds
- Detect stuck walks (distance not decreasing for 30s) and clear pending
- Fix mana snapshot using GetMaxPower(POWER_MANA) instead of GetPowerType
so Warlocks (soul shards + mana) and Paladins (holy power + mana) get
correct mana percentage instead of 100% default
Fixture System:
- Use MeshObject GUIDs (HighGuid 56) for FHousingFixture_C Guid and
AttachParentGUID fields instead of Housing GUIDs. The client's fixture
manager searches the frame tree using AttachParentGUID as key, and frames
are indexed by MeshObject entity GUIDs. This fixes fixture hookpoints
showing "None" despite fixtures being spawned.
- Force-send AT entity CREATE/VALUES to player before ENTER_PLOT packet,
matching the retail pattern where UPDATE_OBJECT and ENTER_PLOT arrive at
the same timestamp.
- Set MAX_VISIBILITY_DISTANCE on HousingMap and HouseInteriorMap so all
entities are visible map-wide, eliminating entity streaming race conditions.
- Add PreloadHousingMaps at server startup with LoadAllCells for
neighborhood maps (validates map type before loading).
Fixture Placement:
- Door (entrance) replacement: placing a new door auto-removes any existing
door at a different hook and despawns/respawns the clickable door GO.
- Hook exclusivity: placing a fixture removes any existing fixture at that
hook first.
- Fix DELETE_FIXTURE handler: pass original hookID to RemoveFixture instead
of resolved parent componentID. Fixtures are keyed by hookID.
- Remove default fixture respawn on delete (was causing flicker loop).
Door GO Management:
- Add RespawnDoorGOAtHook/DespawnDoorGO methods for targeted door GO
updates without full house rebuild.
- Door GO positioned at fixture MeshObject location (exact hookpoint).
- Force-send CREATE to player immediately after spawning door GO.
- Auto-create missing door GO templates from ExteriorComponent DB2 at
startup (EnsureDoorGameObjectTemplates) with retail values:
Lock=4296, autoClose=3000, startOpen=1.
Interior Exit:
- Use ExteriorComponentExitPoint position for interior→exterior teleport,
placing player in front of the door they entered through.
Other:
- Add MeshObject::AddRoomDoor for HousingRoomData Doors array population.
- Rename HousingPackets PlotAreaTriggerGuid to NeighborhoodEntityGuid.
Cross-referenced BattlePetState.db2 via wago.tools/WoWDBDefs and fixed
wrong state IDs: Stat_Accuracy is 41 (was 22=Mechanic_IsStunned),
Mod_HealingDealtPercent is 65 (was 26=Ramping_DamageID),
Mod_HealingTakenPercent is 66 (was 27=Ramping_DamageUses).
Added per-type weather damage bonus using the 3-state mechanism from
DB2: Mod_PetTypeDamageDealtPercent(87) + Mod_PetType_ID(89) restricts
damage bonuses to matching ability types (e.g. Rain = +25% Aquatic
only, not all damage). Also added Add_FlatDamageTaken(71) for
Sandstorm-style damage shields.
Expanded enum to 43 states covering weather markers (53-63, 316),
mechanics, cosmetics, and combat modifiers — all verified against
BattlePetState.db2 LuaName field.
Replace dead hardcoded PetBattleWeatherType enum with a data-driven
weather system that reads BattlePetAbilityState entries from DB2.
The old system had SetWeather/GetWeatherDamageModifier/GetWeatherHealingModifier
functions but SetWeather was never called, so weather abilities fired
visually (aura icon appeared) but had zero gameplay effect.
Now weather modifiers (damage %, healing %, accuracy, speed) are loaded
from BattlePetAbilityState DB2 onto the environment slot when a weather
aura is applied, and read back during combat calculations. Elemental
pets remain immune to all weather effects.
The AdaptiveAIUpdateThrottler was preventing UpdateStrategies() from
ever being reached, leaving bots idle with active but never-executed
strategies. Also swapped quest/loot priority so quest (MOVEMENT=45)
runs below loot (FOLLOW=50) only when loot is gated by IsActive.
Added temporary STRAT-SELECT diagnostic logging to trace which
strategy wins priority selection each tick.
Rename misnamed SQL columns to match WoWDBDefs 12.0:
- Aura → BattlePetEffectPropertiesID
- BattlePetEffectPropertiesID → AuraBattlePetAbilityID
- VisualID → BattlePetVisualID
Add migration script for existing databases, update SELECT query.
Also add DisplayID=0 repair in LoadPlayerTeam and a log warning
in SelectPetDisplay when creature_template is missing.
Solo strategy activation (rest, solo_combat, quest, grind, loot, solo)
was positioned after both the AI update throttler and the death recovery
guard in UpdateAI(). Bots that were throttled or dead at login never
reached the activation code, leaving them with Strategies=0 and idle.
Move the one-time strategy activation to run before all guards so it
executes on the first UpdateAI tick regardless of throttle/death state.
Fix ExteriorComponentHookEntry struct field order to match DB2 LoadInfo
(Position/Rotation before ID when IndexField=2), resolving garbage hook
IDs during fixture resolution.
Replace first-match door hook selection with center-front scoring
heuristic (|X|*2 + Y) to ensure the main entrance spawns at the front
of the house rather than on a side/back wall.
Add fixture validation in SelectFixtureOption: enforce component type
must match hook type, and only one door allowed per house. This prevents
placing windows at door hooks and spawning multiple entrances.
Only auto-resolve the single best door hook during SpawnExtCompTree —
other fixture types (windows, chimneys, dormers) require explicit player
selection, matching retail behavior where they unlock via progression.
Additional fixes: unique fixture GUIDs via atomic counter (subType=5),
size-aware default fixture lookup, range-based DB2 store iteration,
and starter fixture migration that preserves existing roots.
Map player race to house exterior WMO style on purchase:
Night Elf → Woodland (55), Blood Elf → Engraved (56),
other Alliance → Human (9), other Horde → Orc (87).
On house creation, persist starter fixtures (Base + Roof) to
character_housing_fixtures so spawning reads from DB rather than
relying on runtime default resolution. Door auto-resolves from
the hook system via GetDefaultFixtureForType.
Replace the broken GroupXHook→Group→XGroup chain with a direct
_defaultFixtureByTypeWmo index that maps (componentType, wmoDataID)
to the default fixture component ID. This correctly resolves fixtures
for all 4 racial house styles (Human/NightElf/BloodElf/Orc).
Key changes:
- BuildExteriorComponentIndexes: filter structural roots by
ExteriorComponentType.ParentComponentType==0 with hardcoded
fallback for broken DB2 store iteration
- New GetDefaultFixtureForType() replaces GetComponentAtHook()
- SpawnExtCompTree uses type+WMO lookup for hook children
- Door GO spawning fully data-driven from DB2 (entry + position
from hook offset + ExitPoint offset)
- Root selection: rootOverrides → coreExtCompID → default → first
- Fix missing fixture overrides on late-spawn path
- Add GetRootComponentOverrides() for player-selected root variants