aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Unit
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Entities/Unit')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp31
-rw-r--r--src/server/game/Entities/Unit/Unit.h7
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();