diff options
| author | Ovah <dreadkiller@gmx.de> | 2020-04-07 23:28:44 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-01-01 12:42:17 +0100 |
| commit | d18d2b84f2c3e6e1005316625da80c99dd414bcc (patch) | |
| tree | 0fdf01612054c463fde784110d8c8d3f8a50554b /src/server/game/Entities/Unit | |
| parent | fa1eb9f36f2e703ba29446064ae1957934fa7e5e (diff) | |
Core/Objects: cache current liquid status of objects when updating position data and use it to replace unnecessary vmap lookups (#24399)
* dropped unneeded IsUnderwater override for players since the default position data update considers collision height already so we don't have to rely on that tempfix anymore. This actually fixes breathing bars showing up depending on your characters size (gnomes get their breathing bar earlier, taurens later etc)
(cherry picked from commit bea850fb73c6c3b3cc4e51bd3a42d178947882a5)
Diffstat (limited to 'src/server/game/Entities/Unit')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 31 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 7 |
2 files changed, 17 insertions, 21 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e10a7f333d5..377fe90c0f3 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2999,40 +2999,36 @@ bool Unit::isInAccessiblePlaceFor(Creature const* c) const bool Unit::IsInWater() const { - return GetMap()->IsInWater(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ()); + return GetLiquidStatus() & (LIQUID_MAP_IN_WATER | LIQUID_MAP_UNDER_WATER); } bool Unit::IsUnderWater() const { - return GetMap()->IsUnderWater(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ()); + return GetLiquidStatus() & LIQUID_MAP_UNDER_WATER; } void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data) { + ZLiquidStatus oldLiquidStatus = GetLiquidStatus(); WorldObject::ProcessPositionDataChanged(data); - ProcessTerrainStatusUpdate(data.liquidStatus, data.liquidInfo); + ProcessTerrainStatusUpdate(oldLiquidStatus, data.liquidInfo); } -void Unit::SetInWater(bool inWater) +void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus oldLiquidStatus, Optional<LiquidData> const& newLiquidData) { + if (!IsControlledByPlayer()) + return; + // remove appropriate auras if we are swimming/not swimming respectively - if (inWater) + if (IsInWater()) RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::UnderWater); else RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::AboveWater); -} - -void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData) -{ - if (!IsControlledByPlayer()) - return; - - SetInWater(status & MAP_LIQUID_STATUS_SWIMMING); // liquid aura handling LiquidTypeEntry const* curLiquid = nullptr; - if ((status & MAP_LIQUID_STATUS_SWIMMING) && liquidData) - curLiquid = sLiquidTypeStore.LookupEntry(liquidData->entry); + if (IsInWater() && newLiquidData) + curLiquid = sLiquidTypeStore.LookupEntry(newLiquidData->entry); if (curLiquid != _lastLiquid) { if (_lastLiquid && _lastLiquid->SpellID) @@ -3044,10 +3040,11 @@ void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> if (curLiquid && curLiquid->SpellID && (!player || !player->IsGameMaster())) CastSpell(this, curLiquid->SpellID, true); + } - // mount capability depends on liquid state change + // mount capability depends on liquid state change + if (oldLiquidStatus != GetLiquidStatus()) UpdateMountCapability(); - } } void Unit::DeMorph() diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f85f43731e7..320d62804b9 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1156,8 +1156,8 @@ class TC_GAME_API Unit : public WorldObject bool isTargetableForAttack(bool checkFakeDeath = true) const; - virtual bool IsInWater() const; - virtual bool IsUnderWater() const; + bool IsInWater() const; + bool IsUnderWater() const; bool isInAccessiblePlaceFor(Creature const* c) const; void SendHealSpellLog(HealInfo& healInfo, bool critical = false); @@ -1945,8 +1945,7 @@ class TC_GAME_API Unit : public WorldObject void DisableSpline(); void ProcessPositionDataChanged(PositionFullTerrainStatus const& data) override; - virtual void ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData); - virtual void SetInWater(bool inWater); + virtual void ProcessTerrainStatusUpdate(ZLiquidStatus oldLiquidStatus, Optional<LiquidData> const& newLiquidData); // notifiers virtual void AtEnterCombat(); |
