diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 6 |
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) |