diff options
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(); |
