aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp37
-rw-r--r--src/server/game/Entities/Player/Player.h6
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp13
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp6
5 files changed, 20 insertions, 46 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index bd4e771a74e..8c3fcafaf83 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -260,7 +260,6 @@ Player::Player(WorldSession* session): Unit(true)
m_MirrorTimerFlags = UNDERWATER_NONE;
m_MirrorTimerFlagsLast = UNDERWATER_NONE;
- m_isInWater = false;
m_hostileReferenceCheckTimer = 0;
m_drunkTimer = 0;
m_deathTimer = 0;
@@ -2339,22 +2338,6 @@ GameObject* Player::GetGameObjectIfCanInteractWith(ObjectGuid const& guid, Gameo
return go;
}
-void Player::SetInWater(bool apply)
-{
- if (m_isInWater == apply)
- return;
-
- //define player in water by opcodes
- //move player's guid into HateOfflineList of those mobs
- //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;
-
- // remove auras that need water/land
- RemoveAurasWithInterruptFlags(apply ? AURA_INTERRUPT_FLAG_NOT_ABOVEWATER : AURA_INTERRUPT_FLAG_NOT_UNDERWATER);
-}
-
bool Player::IsInAreaTriggerRadius(AreaTriggerEntry const* trigger) const
{
if (!trigger || GetMapId() != trigger->ContinentID)
@@ -24299,42 +24282,42 @@ void Player::SetOriginalGroup(Group* group, int8 subgroup)
}
}
-void Player::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData)
+void Player::ProcessTerrainStatusUpdate(ZLiquidStatus oldLiquidStatus, Optional<LiquidData> const& newLiquidData)
{
// process liquid auras using generic unit code
- Unit::ProcessTerrainStatusUpdate(status, liquidData);
+ Unit::ProcessTerrainStatusUpdate(oldLiquidStatus, newLiquidData);
// player specific logic for mirror timers
- if (status && liquidData)
+ if (GetLiquidStatus() && newLiquidData)
{
// Breath bar state (under water in any liquid type)
- if (liquidData->type_flags & MAP_ALL_LIQUIDS)
+ if (newLiquidData->type_flags & MAP_ALL_LIQUIDS)
{
- if (status & LIQUID_MAP_UNDER_WATER)
+ if (GetLiquidStatus() & LIQUID_MAP_UNDER_WATER)
m_MirrorTimerFlags |= UNDERWATER_INWATER;
else
m_MirrorTimerFlags &= ~UNDERWATER_INWATER;
}
// Fatigue bar state (if not on flight path or transport)
- if ((liquidData->type_flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport())
+ if ((newLiquidData->type_flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport())
m_MirrorTimerFlags |= UNDERWATER_INDARKWATER;
else
m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
// Lava state (any contact)
- if (liquidData->type_flags & MAP_LIQUID_TYPE_MAGMA)
+ if (newLiquidData->type_flags & MAP_LIQUID_TYPE_MAGMA)
{
- if (status & MAP_LIQUID_STATUS_IN_CONTACT)
+ if (GetLiquidStatus() & MAP_LIQUID_STATUS_IN_CONTACT)
m_MirrorTimerFlags |= UNDERWATER_INLAVA;
else
m_MirrorTimerFlags &= ~UNDERWATER_INLAVA;
}
// Slime state (any contact)
- if (liquidData->type_flags & MAP_LIQUID_TYPE_SLIME)
+ if (newLiquidData->type_flags & MAP_LIQUID_TYPE_SLIME)
{
- if (status & MAP_LIQUID_STATUS_IN_CONTACT)
+ if (GetLiquidStatus() & MAP_LIQUID_STATUS_IN_CONTACT)
m_MirrorTimerFlags |= UNDERWATER_INSLIME;
else
m_MirrorTimerFlags &= ~UNDERWATER_INSLIME;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 695dfbb69da..b5ddaca836c 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -916,9 +916,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInfo const& spellEffectInfo, WorldObject const* caster) const override;
- void SetInWater(bool apply);
-
- bool IsInWater() const override { return m_isInWater; }
bool IsFalling() { return GetPositionZ() < m_lastFallZ; }
bool IsInAreaTriggerRadius(AreaTriggerEntry const* trigger) const;
@@ -1689,7 +1686,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool UpdatePosition(float x, float y, float z, float orientation, bool teleport = false) override;
bool UpdatePosition(Position const& pos, bool teleport = false) override { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
- void ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData) override;
+ void ProcessTerrainStatusUpdate(ZLiquidStatus oldLiquidStatus, Optional<LiquidData> const& newLiquidData) override;
void AtExitCombat() override;
void SendMessageToSet(WorldPacket const* data, bool self) const override { SendMessageToSetInRange(data, GetVisibilityRange(), self); }
@@ -2475,7 +2472,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
int32 m_MirrorTimer[MAX_TIMERS];
uint8 m_MirrorTimerFlags;
uint8 m_MirrorTimerFlagsLast;
- bool m_isInWater;
// Rune type / Rune timer
uint32 m_runeGraceCooldown[MAX_RUNES];
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 278087e4890..2f4678c5367 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3194,25 +3194,26 @@ bool Unit::IsUnderWater() const
void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data)
{
+ ZLiquidStatus oldLiquidStatus = GetLiquidStatus();
WorldObject::ProcessPositionDataChanged(data);
- ProcessTerrainStatusUpdate(data.liquidStatus, data.liquidInfo);
+ ProcessTerrainStatusUpdate(oldLiquidStatus, data.liquidInfo);
}
-void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData)
+void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus /*oldLiquidStatus*/, Optional<LiquidData> const& newLiquidData)
{
- if (IsFlying() || (!IsControlledByPlayer()))
+ if (!IsControlledByPlayer())
return;
// remove appropriate auras if we are swimming/not swimming respectively
- if (status & MAP_LIQUID_STATUS_SWIMMING)
+ if (IsInWater())
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_ABOVEWATER);
else
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER);
// 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)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 07f46b6a7c7..795c631358e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1118,7 +1118,7 @@ class TC_GAME_API Unit : public WorldObject
bool isTargetableForAttack(bool checkFakeDeath = true) const;
- virtual bool IsInWater() const;
+ bool IsInWater() const;
bool IsUnderWater() const;
bool isInAccessiblePlaceFor(Creature const* c) const;
@@ -1833,7 +1833,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 ProcessTerrainStatusUpdate(ZLiquidStatus oldLiquidStatus, Optional<LiquidData> const& newLiquidData);
// notifiers
virtual void AtEnterCombat() { }
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 13009d81cd6..bad6e220c1a 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -372,12 +372,6 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData)
if (opcode == MSG_MOVE_FALL_LAND || opcode == MSG_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->GetPhaseMask(), movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY(), movementInfo.pos.GetPositionZ()));
- }
-
/* process position-change */
WorldPacket data(opcode, recvData.size());
int64 movementTime = (int64) movementInfo.time + _timeSyncClockDelta;