aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp11
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp15
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp6
5 files changed, 18 insertions, 17 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index eaea21c8d15..eaf95812bce 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2039,9 +2039,9 @@ bool Player::IsUnderWater() const
GetPositionZ() < (GetMap()->GetWaterLevel(GetPhaseShift(), GetPositionX(), GetPositionY()) - 2);
}
-void Player::SetInWater(bool apply)
+void Player::SetInWater(bool inWater)
{
- if (m_isInWater == apply)
+ if (m_isInWater == inWater)
return;
//define player in water by opcodes
@@ -2049,11 +2049,12 @@ void Player::SetInWater(bool apply)
//which can't swim and move guid back into ThreatList when
//on surface.
/// @todo exist also swimming mobs, and function must be symmetric to enter/leave water
- m_isInWater = apply;
+ m_isInWater = inWater;
- // remove auras that need water/land
- RemoveAurasWithInterruptFlags(apply ? AURA_INTERRUPT_FLAG_NOT_ABOVEWATER : AURA_INTERRUPT_FLAG_NOT_UNDERWATER);
+ // Call base
+ Unit::SetInWater(inWater);
+ // Update threat tables
getHostileRefManager().updateThreatTables();
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index c50a103ef65..cc73af80dd1 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1049,7 +1049,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit* caster) const override;
- void SetInWater(bool apply);
+ void SetInWater(bool inWater) override;
bool IsInWater() const override { return m_isInWater; }
bool IsUnderWater() const override;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 051708144ca..17311884e23 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3174,16 +3174,21 @@ void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data)
ProcessTerrainStatusUpdate(data.liquidStatus, data.liquidInfo);
}
-void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData)
+void Unit::SetInWater(bool inWater)
{
- if (IsFlying() || (!IsControlledByPlayer()))
- return;
-
// remove appropriate auras if we are swimming/not swimming respectively
- if (status & MAP_LIQUID_STATUS_SWIMMING)
+ if (inWater)
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_ABOVEWATER);
else
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER);
+}
+
+void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData)
+{
+ if (IsFlying() || (!IsControlledByPlayer()))
+ return;
+
+ SetInWater(status & MAP_LIQUID_STATUS_SWIMMING);
// liquid aura handling
LiquidTypeEntry const* curLiquid = nullptr;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 04a6c82efbc..5a00541e0ae 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2136,6 +2136,7 @@ class TC_GAME_API Unit : public WorldObject
void ProcessPositionDataChanged(PositionFullTerrainStatus const& data) override;
virtual void ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData);
+ virtual void SetInWater(bool inWater);
private:
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 45a502d35e7..e4e65d6d1bf 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -384,12 +384,6 @@ void WorldSession::HandleMovementOpcode(OpcodeClient opcode, MovementInfo& movem
if (opcode == CMSG_MOVE_FALL_LAND || opcode == CMSG_MOVE_START_SWIM)
mover->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_LANDING); // Parachutes
- if (plrMover && ((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != plrMover->IsInWater())
- {
- // now client not include swimming flag in case jumping under water
- plrMover->SetInWater(!plrMover->IsInWater() || plrMover->GetMap()->IsUnderWater(plrMover->GetPhaseShift(), movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ()));
- }
-
uint32 mstime = GameTime::GetGameTimeMS();
/*----------------------*/
if (m_clientTimeDelay == 0)