From 9e7c443f3c43373d4622b3124f99edd578fbba23 Mon Sep 17 00:00:00 2001
From: Dan <83884799+elthehablo@users.noreply.github.com>
Date: Wed, 6 Mar 2024 20:51:51 +0100
Subject: [PATCH] fix(Scripts/TheEye): Al'ar phoenix spawn positions in p2
(#18504)
* wip
* wip
* finalise
---
.../Outland/TempestKeep/Eye/boss_alar.cpp | 49 +++++++++++++++++--
1 file changed, 45 insertions(+), 4 deletions(-)
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
index f8e1e0f5d..dca10b3f2 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
@@ -15,6 +15,7 @@
* with this program. If not, see .
*/
+#include
#include "CreatureScript.h"
#include "MoveSplineInit.h"
#include "ScriptedCreature.h"
@@ -85,6 +86,8 @@ enum qruseoftheAshtongue
QUEST_RUSE_OF_THE_ASHTONGUE = 10946,
};
+const float INNER_CIRCLE_RADIUS = 60.0f;
+
struct boss_alar : public BossAI
{
@@ -136,7 +139,7 @@ struct boss_alar : public BossAI
if (_noQuillTimes++ > 0)
{
me->SetOrientation(alarPoints[_platform].GetOrientation());
- SpawnPhoenixes(1, me);
+ SpawnPhoenixes(1, me, false);
}
me->GetMotionMaster()->MovePoint(POINT_PLATFORM, alarPoints[_platform], false, true);
_platform = (_platform+1)%4;
@@ -244,13 +247,21 @@ struct boss_alar : public BossAI
ScheduleMainSpellAttack(0s);
}
- void SpawnPhoenixes(uint8 count, Unit* targetToSpawnAt)
+ void SpawnPhoenixes(uint8 count, Unit* targetToSpawnAt, bool onPosition)
{
if (targetToSpawnAt)
{
for (uint8 i = 0; i < count; ++i)
{
- me->SummonCreature(NPC_EMBER_OF_ALAR, *targetToSpawnAt, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000);
+ if (onPosition)
+ {
+ Position spawnPosition = DeterminePhoenixPosition(targetToSpawnAt->GetPosition());
+ me->SummonCreature(NPC_EMBER_OF_ALAR, spawnPosition, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000);
+ }
+ else
+ {
+ me->SummonCreature(NPC_EMBER_OF_ALAR, *targetToSpawnAt, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000);
+ }
}
}
}
@@ -262,7 +273,7 @@ struct boss_alar : public BossAI
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f, true))
{
- SpawnPhoenixes(2, target);
+ SpawnPhoenixes(2, target, true);
}
}).Schedule(6s, [this](TaskContext)
{
@@ -366,6 +377,36 @@ struct boss_alar : public BossAI
}
}
+ Position DeterminePhoenixPosition(Position playerPosition)
+ {
+ // set finalPosition to playerPosition in case the fraction fails
+ Position finalPosition = playerPosition;
+ float playerXPosition = playerPosition.GetPositionX();
+ float playerYPosition = playerPosition.GetPositionY();
+ float centreXPosition = alarPoints[POINT_MIDDLE].GetPositionX();
+ float centreYPosition = alarPoints[POINT_MIDDLE].GetPositionY();
+ float deltaX = std::abs(playerXPosition-centreXPosition);
+ float deltaY = std::abs(playerYPosition-centreYPosition);
+ int8 signMultiplier[2] = {1, 1};
+ // if fraction has x position 0.0f we get nan as a result
+ if (float playerFraction = deltaX/deltaY)
+ {
+ // player angle based on delta X and delta Y
+ float playerAngle = std::atan(playerFraction);
+ float phoenixDeltaYPosition = std::cos(playerAngle)*INNER_CIRCLE_RADIUS;
+ float phoenixDeltaXPosition = std::sin(playerAngle)*INNER_CIRCLE_RADIUS;
+ // as calculations are absolute values we have to multiply in the end
+ // should be negative if player position was further down than centre
+ if (playerXPosition < centreXPosition)
+ signMultiplier[0] = -1;
+ if (playerYPosition < centreYPosition)
+ signMultiplier[1] = -1;
+ // phoenix position based on set distance
+ finalPosition = {centreXPosition+signMultiplier[0]*phoenixDeltaXPosition, centreYPosition+signMultiplier[1]*phoenixDeltaYPosition, 0.0f, 0.0f};
+ }
+ return finalPosition;
+ }
+
private:
bool _canAttackCooldown;
bool _baseAttackOverride;