From 1635a342284145cb4572840f2f3fdc29e4498bc3 Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Thu, 26 Dec 2019 13:56:51 +0100 Subject: Core/Movement: Add more LOS checks (#23991) Add more LOS checks to ensure Units don't cross trees/walls when fleeing/moving (cherry picked from commit 13ad8b66d9f4abcb55b4369a24d89d8cde3ca361) --- .../Movement/MovementGenerators/ConfusedMovementGenerator.cpp | 8 ++++++++ .../game/Movement/MovementGenerators/RandomMovementGenerator.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) (limited to 'src') diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp index b7a9ab32f13..9296cddc242 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp @@ -92,6 +92,14 @@ bool ConfusedMovementGenerator::DoUpdate(T* owner, uint32 diff) float angle = frand(0.0f, 1.0f) * float(M_PI) * 2.0f; owner->MovePositionToFirstCollision(destination, distance, angle); + // Check if the destination is in LOS + if (!owner->IsWithinLOS(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ())) + { + // Retry later on + _timer.Reset(200); + return true; + } + if (!_path) { _path = std::make_unique(owner); diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 15071757069..cd32124df2d 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -123,6 +123,14 @@ void RandomMovementGenerator::SetRandomLocation(Creature* owner) float angle = frand(0.f, 1.f) * float(M_PI) * 2.f; owner->MovePositionToFirstCollision(position, distance, angle); + // Check if the destination is in LOS + if (!owner->IsWithinLOS(position.GetPositionX(), position.GetPositionY(), position.GetPositionZ())) + { + // Retry later on + _timer.Reset(200); + return; + } + uint32 resetTimer = roll_chance_i(50) ? urand(5000, 10000) : urand(1000, 2000); if (!_path) -- cgit v1.2.3