diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2017-06-08 00:25:06 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-06-08 00:25:06 +0200 |
| commit | f6c849729b27b77228704b595de3adaf24da2c10 (patch) | |
| tree | b9f7e1ae9c6db0aa367c353ebd2a3f5dddf860d1 /src/server/game/Entities/Unit | |
| parent | 1660bb7d27d6f42b49012a6b57e3c2b2eab20fd3 (diff) | |
[3.3.5] Get zone/area IDs from vmap data in the liquid update (#19840)
* Add new method Map::getFullVMapDataForPosition to get area info and liquid info in a single vmap lookup
* Use this lookup in Map:: relocation methods to update m_areaId and m_zoneId fields on WorldObject
* Adjust GetZoneId/GetAreaId on WorldObject to always return these cached fields
* Clean up liquid state handling on Unit and Player
* Hand floor's Z coord up through GetFullTerrainStatusForPosition, use it to update a new field in WorldObject, and use that to feed a new GetFloorZ call on WorldObject.
Closes #16489
Diffstat (limited to 'src/server/game/Entities/Unit')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 60 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 4 |
2 files changed, 25 insertions, 39 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e1633edbeaa..dcfe56ed69c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -470,7 +470,6 @@ void Unit::Update(uint32 p_time) UpdateSplineMovement(p_time); i_motionMaster->UpdateMotion(p_time); - UpdateUnderwaterState(GetMap(), GetPositionX(), GetPositionY(), GetPositionZ()); } bool Unit::haveOffhandWeapon() const @@ -3353,48 +3352,34 @@ bool Unit::IsUnderWater() const return GetBaseMap()->IsUnderWater(GetPositionX(), GetPositionY(), GetPositionZ()); } -void Unit::UpdateUnderwaterState(Map* m, float x, float y, float z) +void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data) { - if (IsFlying() || (!IsPet() && !IsVehicle())) - return; + WorldObject::ProcessPositionDataChanged(data); + ProcessTerrainStatusUpdate(data.liquidStatus, data.liquidInfo); +} - LiquidData liquid_status; - ZLiquidStatus res = m->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &liquid_status); - if (!res) - { - if (_lastLiquid && _lastLiquid->SpellId) - RemoveAurasDueToSpell(_lastLiquid->SpellId); +void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData) +{ + if (IsFlying() || (!IsControlledByPlayer())) + return; + // remove appropriate auras if we are swimming/not swimming respectively + if (status & MAP_LIQUID_STATUS_SWIMMING) + RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_ABOVEWATER); + else RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER); - _lastLiquid = NULL; - return; - } - if (uint32 liqEntry = liquid_status.entry) + // liquid aura handling + LiquidTypeEntry const* curLiquid = nullptr; + if ((status & MAP_LIQUID_STATUS_SWIMMING) && liquidData) + curLiquid = sLiquidTypeStore.LookupEntry(liquidData->entry); + if (curLiquid != _lastLiquid) { - LiquidTypeEntry const* liquid = sLiquidTypeStore.LookupEntry(liqEntry); - if (_lastLiquid && _lastLiquid->SpellId && _lastLiquid->Id != liqEntry) + if (_lastLiquid && _lastLiquid->SpellId) RemoveAurasDueToSpell(_lastLiquid->SpellId); - - if (liquid && liquid->SpellId) - { - if (res & (LIQUID_MAP_UNDER_WATER | LIQUID_MAP_IN_WATER)) - { - if (!HasAura(liquid->SpellId)) - CastSpell(this, liquid->SpellId, true); - } - else - RemoveAurasDueToSpell(liquid->SpellId); - } - - RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_ABOVEWATER); - _lastLiquid = liquid; - } - else if (_lastLiquid && _lastLiquid->SpellId) - { - RemoveAurasDueToSpell(_lastLiquid->SpellId); - RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER); - _lastLiquid = NULL; + if (curLiquid && curLiquid->SpellId) + CastSpell(this, curLiquid->SpellId, true); + _lastLiquid = curLiquid; } } @@ -13906,8 +13891,7 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel else if (turn) UpdateOrientation(orientation); - // code block for underwater state update - UpdateUnderwaterState(GetMap(), x, y, z); + UpdatePositionData(); return (relocated || turn); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2c58b250b3c..61e1ad86c3e 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1581,7 +1581,6 @@ class TC_GAME_API Unit : public WorldObject virtual bool IsInWater() const; virtual bool IsUnderWater() const; - virtual void UpdateUnderwaterState(Map* m, float x, float y, float z); bool isInAccessiblePlaceFor(Creature const* c) const; void SendHealSpellLog(HealInfo& healInfo, bool critical = false); @@ -2309,6 +2308,9 @@ class TC_GAME_API Unit : public WorldObject void DisableSpline(); + void ProcessPositionDataChanged(PositionFullTerrainStatus const& data) override; + virtual void ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData); + private: void UpdateSplineMovement(uint32 t_diff); |
