mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Merge pull request #14371 from Kittnz/movecirclepath_003
Core: Move FillCirclePath function to MotionMaster
Closes #14371
(cherry picked from commit cf14e9051d)
This commit is contained in:
@@ -381,6 +381,43 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee
|
||||
Mutate(new EffectMovementGenerator(id), MOTION_SLOT_CONTROLLED);
|
||||
}
|
||||
|
||||
void MotionMaster::MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount)
|
||||
{
|
||||
float step = 2 * float(M_PI) / stepCount * (clockwise ? -1.0f : 1.0f);
|
||||
Position const& pos = { x, y, z, 0.0f };
|
||||
float angle = pos.GetAngle(_owner->GetPositionX(), _owner->GetPositionY());
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
|
||||
for (uint8 i = 0; i < stepCount; angle += step, ++i)
|
||||
{
|
||||
G3D::Vector3 point;
|
||||
point.x = x + radius * cosf(angle);
|
||||
point.y = y + radius * sinf(angle);
|
||||
|
||||
if (_owner->IsFlying())
|
||||
point.z = z;
|
||||
else
|
||||
point.z = _owner->GetMap()->GetHeight(_owner->GetPhaseMask(), point.x, point.y, z);
|
||||
|
||||
init.Path().push_back(point);
|
||||
}
|
||||
|
||||
if (_owner->IsFlying())
|
||||
{
|
||||
init.SetFly();
|
||||
init.SetCyclic();
|
||||
init.SetAnimation(Movement::ToFly);
|
||||
}
|
||||
else
|
||||
{
|
||||
init.SetWalk(true);
|
||||
init.SetCyclic();
|
||||
}
|
||||
|
||||
init.Launch();
|
||||
}
|
||||
|
||||
void MotionMaster::MoveFall(uint32 id /*=0*/)
|
||||
{
|
||||
// use larger distance for vmap height search than in most other cases
|
||||
|
||||
@@ -184,6 +184,7 @@ class MotionMaster //: private std::stack<MovementGenerator *>
|
||||
void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP)
|
||||
{ MoveJump(pos.m_positionX, pos.m_positionY, pos.m_positionZ, speedXY, speedZ, id); };
|
||||
void MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id = EVENT_JUMP);
|
||||
void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount);
|
||||
void MoveFall(uint32 id = 0);
|
||||
|
||||
void MoveSeekAssistance(float x, float y, float z);
|
||||
|
||||
@@ -2640,13 +2640,7 @@ class npc_quel_delar_sword : public CreatureScript
|
||||
break;
|
||||
case EVENT_QUEL_DELAR_FLIGHT:
|
||||
{
|
||||
Movement::MoveSplineInit init(me);
|
||||
FillCirclePath(QuelDelarCenterPos, 18.0f, 718.046f, init.Path(), true);
|
||||
init.SetFly();
|
||||
init.SetCyclic();
|
||||
init.SetAnimation(Movement::ToFly);
|
||||
init.Launch();
|
||||
|
||||
me->GetMotionMaster()->MoveCirclePath(QuelDelarCenterPos.GetPositionX(), QuelDelarCenterPos.GetPositionY(), 718.046f, 18.0f, true, 16);
|
||||
_events.ScheduleEvent(EVENT_QUEL_DELAR_LAND, 15000);
|
||||
break;
|
||||
}
|
||||
@@ -2694,21 +2688,6 @@ class npc_quel_delar_sword : public CreatureScript
|
||||
}
|
||||
|
||||
private:
|
||||
void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
|
||||
{
|
||||
float step = clockwise ? -M_PI / 8.0f : M_PI / 8.0f;
|
||||
float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
|
||||
|
||||
for (uint8 i = 0; i < 16; angle += step, ++i)
|
||||
{
|
||||
G3D::Vector3 point;
|
||||
point.x = centerPos.GetPositionX() + radius * cosf(angle);
|
||||
point.y = centerPos.GetPositionY() + radius * sinf(angle);
|
||||
point.z = z;
|
||||
path.push_back(point);
|
||||
}
|
||||
}
|
||||
|
||||
EventMap _events;
|
||||
InstanceScript* _instance;
|
||||
bool _intro;
|
||||
|
||||
@@ -520,11 +520,7 @@ public:
|
||||
_despawned = false;
|
||||
break;
|
||||
case ACTION_CYCLIC_MOVEMENT:
|
||||
Movement::MoveSplineInit init(me);
|
||||
FillCirclePath(MalygosPositions[3], 120.0f, 283.2763f, init.Path(), true);
|
||||
init.SetFly();
|
||||
init.SetCyclic();
|
||||
init.Launch();
|
||||
me->GetMotionMaster()->MoveCirclePath(MalygosPositions[3].GetPositionX(), MalygosPositions[3].GetPositionY(), 283.2763f, 120.0f, true, 16);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1020,22 +1016,6 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
// Used to generate perfect cyclic movements (Enter Circle).
|
||||
void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
|
||||
{
|
||||
float step = clockwise ? float(-M_PI) / 8.0f : float(M_PI) / 8.0f;
|
||||
float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
|
||||
|
||||
for (uint8 i = 0; i < 16; angle += step, ++i)
|
||||
{
|
||||
G3D::Vector3 point;
|
||||
point.x = centerPos.GetPositionX() + radius * cosf(angle);
|
||||
point.y = centerPos.GetPositionY() + radius * sinf(angle);
|
||||
point.z = z; // Don't use any height getters unless all bugs are fixed.
|
||||
path.push_back(point);
|
||||
}
|
||||
}
|
||||
|
||||
uint8 _phase; // Counter for phases used with a getter.
|
||||
uint8 _summonDeaths; // Keeps count of arcane trash.
|
||||
uint8 _preparingPulsesChecker; // In retail they use 2 preparing pulses with 7 sec CD, after they pass 2 seconds.
|
||||
@@ -1326,11 +1306,7 @@ public:
|
||||
{
|
||||
if (action < ACTION_DELAYED_DESPAWN)
|
||||
{
|
||||
Movement::MoveSplineInit init(me);
|
||||
FillCirclePath(MalygosPositions[3], 35.0f, 282.3402f, init.Path(), true);
|
||||
init.SetFly();
|
||||
init.SetCyclic();
|
||||
init.Launch();
|
||||
me->GetMotionMaster()->MoveCirclePath(MalygosPositions[3].GetPositionX(), MalygosPositions[3].GetPositionY(), 282.3402f, 35.0f, true, 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1339,21 +1315,6 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
|
||||
{
|
||||
float step = clockwise ? float(-M_PI) / 9.0f : float(M_PI) / 9.0f;
|
||||
float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
|
||||
|
||||
for (uint8 i = 0; i < 18; angle += step, ++i)
|
||||
{
|
||||
G3D::Vector3 point;
|
||||
point.x = centerPos.GetPositionX() + radius * cosf(angle);
|
||||
point.y = centerPos.GetPositionY() + radius * sinf(angle);
|
||||
point.z = z; // Don't use any height getters unless all bugs are fixed.
|
||||
path.push_back(point);
|
||||
}
|
||||
}
|
||||
|
||||
InstanceScript* _instance;
|
||||
};
|
||||
|
||||
|
||||
@@ -1126,30 +1126,11 @@ class npc_ominous_cloud : public CreatureScript
|
||||
DoCast(me, SPELL_OMINOUS_CLOUD_VISUAL);
|
||||
}
|
||||
|
||||
void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
|
||||
{
|
||||
float step = clockwise ? float(-M_PI) / 8.0f : float(M_PI) / 8.0f;
|
||||
float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
|
||||
|
||||
for (uint8 i = 0; i < 16; angle += step, ++i)
|
||||
{
|
||||
G3D::Vector3 point;
|
||||
point.x = centerPos.GetPositionX() + radius * cosf(angle);
|
||||
point.y = centerPos.GetPositionY() + radius * sinf(angle);
|
||||
point.z = me->GetMap()->GetHeight(me->GetPhaseMask(), point.x, point.y, z + 5.0f);
|
||||
path.push_back(point);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) override { }
|
||||
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
Movement::MoveSplineInit init(me);
|
||||
FillCirclePath(YoggSaronSpawnPos, me->GetDistance2d(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY()), me->GetPositionZ(), init.Path(), action != 0);
|
||||
init.SetWalk(true);
|
||||
init.SetCyclic();
|
||||
init.Launch();
|
||||
me->GetMotionMaster()->MoveCirclePath(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY(), me->GetPositionZ() + 5.0f, me->GetDistance2d(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY()), true, 16);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user