aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2019-12-26 13:56:51 +0100
committerShauren <shauren.trinity@gmail.com>2021-12-19 15:30:13 +0100
commit1635a342284145cb4572840f2f3fdc29e4498bc3 (patch)
treed4ae29dd73f9dfbf71eaab0ecab38e036755e488 /src
parentd17a05c0bea507cc96572a4d6bf4a044de027b5e (diff)
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)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp8
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp8
2 files changed, 16 insertions, 0 deletions
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<T>::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<PathGenerator>(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<Creature>::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)