refactor(Scripts/EoE): Make use of creature/GO storages (#24724)

This commit is contained in:
Andrew
2026-02-15 18:39:21 -03:00
committed by GitHub
parent dea82df9a9
commit 35126423ac
3 changed files with 234 additions and 253 deletions
@@ -235,8 +235,8 @@ struct boss_malygos : public BossAI
{ {
float angle = me->GetOrientation(); float angle = me->GetOrientation();
float dist = 75.0f; float dist = 75.0f;
if (Creature* c = me->SummonCreature(NPC_PORTAL, me->GetPositionX() + cos(angle) * dist, me->GetPositionY() + std::sin(angle) * dist, me->GetPositionZ(), FourSidesPos[id].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 13000)) if (Creature* portal = me->SummonCreature(NPC_PORTAL, me->GetPositionX() + cos(angle) * dist, me->GetPositionY() + std::sin(angle) * dist, me->GetPositionZ(), FourSidesPos[id].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN, 13000))
me->CastSpell(c, SPELL_PORTAL_BEAM, false); me->CastSpell(portal, SPELL_PORTAL_BEAM, false);
timer2 = INTRO_MOVEMENT_INTERVAL - 10000; timer2 = INTRO_MOVEMENT_INTERVAL - 10000;
} }
break; break;
@@ -245,8 +245,8 @@ struct boss_malygos : public BossAI
events.RescheduleEvent(EVENT_INTRO_LAND, 0ms, 1); events.RescheduleEvent(EVENT_INTRO_LAND, 0ms, 1);
break; break;
case MI_POINT_VORTEX_CENTER: case MI_POINT_VORTEX_CENTER:
if (Creature* c = me->SummonCreature(NPC_WORLD_TRIGGER_LAOI, CenterPos, TEMPSUMMON_TIMED_DESPAWN, 15000)) if (Creature* trigger = me->SummonCreature(NPC_WORLD_TRIGGER_LAOI, CenterPos, TEMPSUMMON_TIMED_DESPAWN, 15000))
c->CastSpell(c, SPELL_VORTEX_VISUAL, true); trigger->CastSpell(trigger, SPELL_VORTEX_VISUAL, true);
events.RescheduleEvent(EVENT_START_VORTEX_REAL, 1s, 1); events.RescheduleEvent(EVENT_START_VORTEX_REAL, 1s, 1);
break; break;
case MI_POINT_CENTER_GROUND_PH_2: case MI_POINT_CENTER_GROUND_PH_2:
@@ -394,12 +394,12 @@ struct boss_malygos : public BossAI
case EVENT_SUMMON_POWER_SPARK: case EVENT_SUMMON_POWER_SPARK:
{ {
uint8 random = urand(0, 3); uint8 random = urand(0, 3);
if (Creature* c = me->SummonCreature(NPC_PORTAL, FourSidesPos[random], TEMPSUMMON_TIMED_DESPAWN, 6000)) if (Creature* portal = me->SummonCreature(NPC_PORTAL, FourSidesPos[random], TEMPSUMMON_TIMED_DESPAWN, 6000))
c->CastSpell(c, SPELL_PORTAL_BEAM, false); portal->CastSpell(portal, SPELL_PORTAL_BEAM, false);
if (Creature* c = me->SummonCreature(NPC_POWER_SPARK, FourSidesPos[random], TEMPSUMMON_MANUAL_DESPAWN, 0)) if (Creature* spark = me->SummonCreature(NPC_POWER_SPARK, FourSidesPos[random], TEMPSUMMON_MANUAL_DESPAWN, 0))
{ {
c->AI()->DoAction(ACTION_POWER_SPARK_FOLLOW); spark->AI()->DoAction(ACTION_POWER_SPARK_FOLLOW);
c->AI()->Talk(EMOTE_POWER_SPARK); spark->AI()->Talk(EMOTE_POWER_SPARK);
} }
events.Repeat(20s, 30s); events.Repeat(20s, 30s);
@@ -444,47 +444,47 @@ struct boss_malygos : public BossAI
{ {
vp->SetDisableGravity(true); vp->SetDisableGravity(true);
me->GetMap()->DoForAllPlayers([&](Player* pPlayer) me->GetMap()->DoForAllPlayers([&](Player* player)
{ {
if (!pPlayer->IsAlive() || pPlayer->IsGameMaster()) if (!player->IsAlive() || player->IsGameMaster())
return; return;
Position plrpos; Position plrpos;
float playerAngle = CenterPos.GetAngle(pPlayer); float playerAngle = CenterPos.GetAngle(player);
plrpos.m_positionX = CenterPos.GetPositionX() + cos(playerAngle) * 5.0f; plrpos.m_positionX = CenterPos.GetPositionX() + cos(playerAngle) * 5.0f;
plrpos.m_positionY = CenterPos.GetPositionY() + std::sin(playerAngle) * 5.0f; plrpos.m_positionY = CenterPos.GetPositionY() + std::sin(playerAngle) * 5.0f;
plrpos.m_positionZ = CenterPos.GetPositionZ() + 18.0f; plrpos.m_positionZ = CenterPos.GetPositionZ() + 18.0f;
plrpos.SetOrientation(plrpos.GetAngle(&CenterPos)); plrpos.SetOrientation(plrpos.GetAngle(&CenterPos));
if (Creature* c = me->SummonCreature(NPC_VORTEX, plrpos, TEMPSUMMON_TIMED_DESPAWN, 15000)) if (Creature* vortex = me->SummonCreature(NPC_VORTEX, plrpos, TEMPSUMMON_TIMED_DESPAWN, 15000))
{ {
pPlayer->CastSpell(pPlayer, SPELL_FREEZE_ANIM, true); player->CastSpell(player, SPELL_FREEZE_ANIM, true);
pPlayer->CastSpell(c, SPELL_VORTEX_CONTROL_VEHICLE, true); player->CastSpell(vortex, SPELL_VORTEX_CONTROL_VEHICLE, true);
if (!pPlayer->GetVehicle()) // didn't work somehow, try again with a different way, if fails - break if (!player->GetVehicle()) // didn't work somehow, try again with a different way, if fails - break
{ {
pPlayer->EnterVehicle(c, 0); player->EnterVehicle(vortex, 0);
if (!pPlayer->GetVehicle()) if (!player->GetVehicle())
return; return;
} }
//pPlayer->ClearUnitState(UNIT_STATE_ONVEHICLE); //player->ClearUnitState(UNIT_STATE_ONVEHICLE);
Movement::MoveSplineInit init(pPlayer); // TODO: has to be removed and handled with vehicle exit and vehicle enter code Movement::MoveSplineInit init(player); // TODO: has to be removed and handled with vehicle exit and vehicle enter code
init.MoveTo(CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ()); init.MoveTo(CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ());
init.SetFacing(pPlayer->GetOrientation()); init.SetFacing(player->GetOrientation());
init.SetTransportExit(); init.SetTransportExit();
init.Launch(); init.Launch();
pPlayer->SetUnitMovementFlags(MOVEMENTFLAG_NONE); player->SetUnitMovementFlags(MOVEMENTFLAG_NONE);
pPlayer->SetDisableGravity(true); player->SetDisableGravity(true);
WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8); WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8);
data << pPlayer->GetPackGUID(); data << player->GetPackGUID();
pPlayer->SendMessageToSet(&data, true); player->SendMessageToSet(&data, true);
sScriptMgr->AnticheatSetUnderACKmount(pPlayer); sScriptMgr->AnticheatSetUnderACKmount(player);
pPlayer->SetGuidValue(PLAYER_FARSIGHT, vp->GetGUID()); player->SetGuidValue(PLAYER_FARSIGHT, vp->GetGUID());
c->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); vortex->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
} }
}); });
} }
@@ -538,9 +538,9 @@ struct boss_malygos : public BossAI
float dist = 22.0f; float dist = 22.0f;
float angle = M_PI / 2 + ((float)i / MAX_NEXUS_LORDS) * 2 * M_PI; float angle = M_PI / 2 + ((float)i / MAX_NEXUS_LORDS) * 2 * M_PI;
if (Creature* disk = me->SummonCreature(NPC_HOVER_DISK, CenterPos.GetPositionX() + cos(angle) * dist, CenterPos.GetPositionY() + std::sin(angle) * dist, CenterPos.GetPositionZ() + 30.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) if (Creature* disk = me->SummonCreature(NPC_HOVER_DISK, CenterPos.GetPositionX() + cos(angle) * dist, CenterPos.GetPositionY() + std::sin(angle) * dist, CenterPos.GetPositionZ() + 30.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0))
if (Creature* c = me->SummonCreature(NPC_NEXUS_LORD, *disk, TEMPSUMMON_MANUAL_DESPAWN, 0)) if (Creature* lord = me->SummonCreature(NPC_NEXUS_LORD, *disk, TEMPSUMMON_MANUAL_DESPAWN, 0))
{ {
c->EnterVehicle(disk, 0); lord->EnterVehicle(disk, 0);
disk->AI()->DoAction(ACTION_DISK_START_MOVING); disk->AI()->DoAction(ACTION_DISK_START_MOVING);
} }
} }
@@ -549,9 +549,9 @@ struct boss_malygos : public BossAI
float dist = 30.0f; float dist = 30.0f;
float angle = 0.0f + ((float)i / MAX_SCIONS_OF_ETERNITY) * 2 * M_PI; float angle = 0.0f + ((float)i / MAX_SCIONS_OF_ETERNITY) * 2 * M_PI;
if (Creature* disk = me->SummonCreature(NPC_HOVER_DISK, CenterPos.GetPositionX() + cos(angle) * dist, CenterPos.GetPositionY() + std::sin(angle) * dist, CenterPos.GetPositionZ() + 30.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0)) if (Creature* disk = me->SummonCreature(NPC_HOVER_DISK, CenterPos.GetPositionX() + cos(angle) * dist, CenterPos.GetPositionY() + std::sin(angle) * dist, CenterPos.GetPositionZ() + 30.0f, 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 0))
if (Creature* c = me->SummonCreature(NPC_SCION_OF_ETERNITY, *disk, TEMPSUMMON_MANUAL_DESPAWN, 0)) if (Creature* scion = me->SummonCreature(NPC_SCION_OF_ETERNITY, *disk, TEMPSUMMON_MANUAL_DESPAWN, 0))
{ {
c->EnterVehicle(disk, 0); scion->EnterVehicle(disk, 0);
disk->AI()->DoAction(ACTION_DISK_START_MOVING); disk->AI()->DoAction(ACTION_DISK_START_MOVING);
} }
} }
@@ -595,8 +595,8 @@ struct boss_malygos : public BossAI
events.RescheduleEvent(EVENT_SPELL_SURGE_OF_POWER, 1500ms, 1); events.RescheduleEvent(EVENT_SPELL_SURGE_OF_POWER, 1500ms, 1);
break; break;
case EVENT_SPELL_SURGE_OF_POWER: case EVENT_SPELL_SURGE_OF_POWER:
if (Creature* c = me->SummonCreature(NPC_SURGE_OF_POWER, CenterPos, TEMPSUMMON_TIMED_DESPAWN, 10000)) if (Creature* surge = me->SummonCreature(NPC_SURGE_OF_POWER, CenterPos, TEMPSUMMON_TIMED_DESPAWN, 10000))
me->CastSpell(c, SPELL_SURGE_OF_POWER, false); me->CastSpell(surge, SPELL_SURGE_OF_POWER, false);
Talk(SAY_SURGE_OF_POWER); Talk(SAY_SURGE_OF_POWER);
events.RescheduleEvent(EVENT_CLEAR_TARGET, 10s, 1); events.RescheduleEvent(EVENT_CLEAR_TARGET, 10s, 1);
events.RescheduleEvent(EVENT_RESUME_FLYING_CIRCLES_PH_2, 10s, 1); events.RescheduleEvent(EVENT_RESUME_FLYING_CIRCLES_PH_2, 10s, 1);
@@ -632,11 +632,11 @@ struct boss_malygos : public BossAI
me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_CHANGE_DIMENSIONS, 2s); me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_CHANGE_DIMENSIONS, 2s);
break; break;
case EVENT_DESTROY_PLATFORM_0: case EVENT_DESTROY_PLATFORM_0:
if (Creature* c = me->SummonCreature(NPC_WORLD_TRIGGER_LAOI, CenterPos, TEMPSUMMON_TIMED_DESPAWN, 3000)) if (Creature* trigger = me->SummonCreature(NPC_WORLD_TRIGGER_LAOI, CenterPos, TEMPSUMMON_TIMED_DESPAWN, 3000))
{ {
c->SetFaction(me->GetFaction()); trigger->SetFaction(me->GetFaction());
c->CastSpell(c, SPELL_DESTROY_PLATFORM_VISUAL, true); trigger->CastSpell(trigger, SPELL_DESTROY_PLATFORM_VISUAL, true);
c->CastSpell(c, SPELL_DESTROY_PLATFORM_EFFECT, false); trigger->CastSpell(trigger, SPELL_DESTROY_PLATFORM_EFFECT, false);
} }
me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_OBSCURE_SPACE, 1s); me->GetMap()->SetZoneOverrideLight(AREA_EYE_OF_ETERNITY, LIGHT_OBSCURE_SPACE, 1s);
events.RescheduleEvent(EVENT_MOVE_TO_PHASE_3_POSITION, 2s, 1); events.RescheduleEvent(EVENT_MOVE_TO_PHASE_3_POSITION, 2s, 1);
@@ -784,7 +784,7 @@ struct boss_malygos : public BossAI
struct npc_vortex_ride : public VehicleAI struct npc_vortex_ride : public VehicleAI
{ {
npc_vortex_ride(Creature* pCreature) : VehicleAI(pCreature) npc_vortex_ride(Creature* creature) : VehicleAI(creature)
{ {
vortexRadius = urand(22, 28); vortexRadius = urand(22, 28);
float h = urand(15, 30); float h = urand(15, 30);
@@ -810,15 +810,15 @@ struct npc_vortex_ride : public VehicleAI
if (!pass || apply || !pass->IsPlayer()) if (!pass || apply || !pass->IsPlayer())
return; return;
Player* plr = pass->ToPlayer(); Player* player = pass->ToPlayer();
float speed = plr->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()) / (1.0f * 0.001f); float speed = player->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()) / (1.0f * 0.001f);
plr->SetDisableGravity(false); // packet only would lead to issues elsewhere player->SetDisableGravity(false); // packet only would lead to issues elsewhere
plr->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), speed); player->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), speed);
plr->RemoveAura(SPELL_FREEZE_ANIM); player->RemoveAura(SPELL_FREEZE_ANIM);
plr->SetGuidValue(PLAYER_FARSIGHT, ObjectGuid::Empty); player->SetGuidValue(PLAYER_FARSIGHT, ObjectGuid::Empty);
sScriptMgr->AnticheatSetCanFlybyServer(plr, false); sScriptMgr->AnticheatSetCanFlybyServer(player, false);
sScriptMgr->AnticheatSetUnderACKmount(plr); sScriptMgr->AnticheatSetUnderACKmount(player);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -848,15 +848,15 @@ struct npc_vortex_ride : public VehicleAI
float dist = 2 * me->GetDistance2d(newx, newy); float dist = 2 * me->GetDistance2d(newx, newy);
if (me->GetVehicleKit()) if (me->GetVehicleKit())
if (Unit* pass = me->GetVehicleKit()->GetPassenger(0)) if (Unit* pass = me->GetVehicleKit()->GetPassenger(0))
if (Player* plr = pass->ToPlayer()) if (Player* player = pass->ToPlayer())
{ {
if (!bUpdatedFlying && timer) if (!bUpdatedFlying && timer)
{ {
bUpdatedFlying = true; bUpdatedFlying = true;
plr->SetDisableGravity(true); player->SetDisableGravity(true);
} }
plr->SendMonsterMove(me->GetPositionX() + dist * cos(arcangle), me->GetPositionY() + dist * std::sin(arcangle), me->GetPositionZ(), VORTEX_DEFAULT_DIFF * 2, SPLINEFLAG_FLYING); player->SendMonsterMove(me->GetPositionX() + dist * cos(arcangle), me->GetPositionY() + dist * std::sin(arcangle), me->GetPositionZ(), VORTEX_DEFAULT_DIFF * 2, SPLINEFLAG_FLYING);
me->Relocate(newx, newy); me->Relocate(newx, newy);
} }
@@ -873,27 +873,27 @@ struct npc_vortex_ride : public VehicleAI
struct npc_power_spark : public NullCreatureAI struct npc_power_spark : public NullCreatureAI
{ {
npc_power_spark(Creature* pCreature) : NullCreatureAI(pCreature) npc_power_spark(Creature* creature) : NullCreatureAI(creature)
{ {
pInstance = me->GetInstanceScript(); _instance = me->GetInstanceScript();
me->CastSpell(me, SPELL_POWER_SPARK_VISUAL, false); me->CastSpell(me, SPELL_POWER_SPARK_VISUAL, false);
CheckTimer = 1000; _checkTimer = 1000;
MoveTimer = 0; _moveTimer = 0;
} }
InstanceScript* pInstance; InstanceScript* _instance;
uint16 CheckTimer; uint16 _checkTimer;
uint16 MoveTimer; uint16 _moveTimer;
void DoAction(int32 param) override void DoAction(int32 param) override
{ {
switch (param) switch (param)
{ {
case ACTION_POWER_SPARK_FOLLOW: case ACTION_POWER_SPARK_FOLLOW:
MoveTimer = 1; _moveTimer = 1;
break; break;
case ACTION_POWER_SPARK_STOP: case ACTION_POWER_SPARK_STOP:
MoveTimer = 0; _moveTimer = 0;
me->GetMotionMaster()->MoveIdle(); me->GetMotionMaster()->MoveIdle();
me->DisableSpline(); me->DisableSpline();
me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.05f, FORCED_MOVEMENT_NONE, 7.0f); me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.05f, FORCED_MOVEMENT_NONE, 7.0f);
@@ -910,7 +910,7 @@ struct npc_power_spark : public NullCreatureAI
if (me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE)) if (me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
return; return;
MoveTimer = 0; _moveTimer = 0;
me->GetMotionMaster()->MoveIdle(); me->GetMotionMaster()->MoveIdle();
me->DisableSpline(); me->DisableSpline();
me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ(), FORCED_MOVEMENT_NONE, 100.0f); me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ(), FORCED_MOVEMENT_NONE, 100.0f);
@@ -925,39 +925,40 @@ struct npc_power_spark : public NullCreatureAI
if (me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE)) if (me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
return; return;
if (CheckTimer <= diff) if (_checkTimer <= diff)
{ {
if (pInstance) if (_instance)
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(DATA_MALYGOS_GUID))) {
if (me->IsWithinDist3d(c, 12.0f)) if (Creature* malygos = _instance->GetCreature(DATA_MALYGOS))
{
if (me->IsWithinDist3d(malygos, 12.0f))
{ {
me->CastSpell(c, SPELL_POWER_SPARK_MALYGOS_BUFF, true); me->CastSpell(malygos, SPELL_POWER_SPARK_MALYGOS_BUFF, true);
me->DespawnOrUnsummon(); me->DespawnOrUnsummon();
return; return;
} }
CheckTimer = 1000; }
}
_checkTimer = 1000;
} }
else else
CheckTimer -= diff; _checkTimer -= diff;
if (MoveTimer) if (_moveTimer <= diff)
{ {
if (MoveTimer <= diff) if (_instance)
{ if (Creature* malygos = _instance->GetCreature(DATA_MALYGOS))
if (pInstance) me->GetMotionMaster()->MovePoint(0, *malygos);
if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(DATA_MALYGOS_GUID))) _moveTimer = 2000;
me->GetMotionMaster()->MovePoint(0, *c);
MoveTimer = 2000;
}
else
MoveTimer -= diff;
} }
else
_moveTimer -= diff;
} }
}; };
struct npc_nexus_lord : public ScriptedAI struct npc_nexus_lord : public ScriptedAI
{ {
npc_nexus_lord(Creature* pCreature) : ScriptedAI(pCreature) npc_nexus_lord(Creature* creature) : ScriptedAI(creature)
{ {
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
timer = 0; timer = 0;
@@ -1016,28 +1017,28 @@ struct npc_nexus_lord : public ScriptedAI
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
if (Vehicle* v = me->GetVehicle()) if (Vehicle* vehicle = me->GetVehicle())
v->RemoveAllPassengers(); vehicle->RemoveAllPassengers();
} }
}; };
struct npc_scion_of_eternity : public ScriptedAI struct npc_scion_of_eternity : public ScriptedAI
{ {
npc_scion_of_eternity(Creature* pCreature) : ScriptedAI(pCreature) npc_scion_of_eternity(Creature* creature) : ScriptedAI(creature)
{ {
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true); me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
ScheduleTimedEvent(20s, 25s, [&] ScheduleTimedEvent(20s, 25s, [&]
{ {
GuidVector guids; GuidVector guids;
me->GetMap()->DoForAllPlayers([&](Player* pPlayer) me->GetMap()->DoForAllPlayers([&](Player* player)
{ {
if (pPlayer->IsAlive() && !pPlayer->GetVehicle()) if (player->IsAlive() && !player->GetVehicle())
guids.push_back(pPlayer->GetGUID()); guids.push_back(player->GetGUID());
}); });
if (!guids.empty()) if (!guids.empty())
if (Player* plr = ObjectAccessor::GetPlayer(*me, guids.at(urand(0, guids.size() - 1)))) if (Player* player = ObjectAccessor::GetPlayer(*me, guids.at(urand(0, guids.size() - 1))))
me->CastSpell(plr, SPELL_SCION_ARCANE_BARRAGE); me->CastSpell(player, SPELL_SCION_ARCANE_BARRAGE);
}, 5s, 8s); }, 5s, 8s);
} }
@@ -1051,8 +1052,8 @@ struct npc_scion_of_eternity : public ScriptedAI
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
{ {
if (Vehicle* v = me->GetVehicle()) if (Vehicle* vehicle = me->GetVehicle())
v->RemoveAllPassengers(); vehicle->RemoveAllPassengers();
if (killer) if (killer)
if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
@@ -1065,7 +1066,7 @@ struct npc_scion_of_eternity : public ScriptedAI
struct npc_hover_disk : public VehicleAI struct npc_hover_disk : public VehicleAI
{ {
npc_hover_disk(Creature* pCreature) : VehicleAI(pCreature) npc_hover_disk(Creature* creature) : VehicleAI(creature)
{ {
events.Reset(); events.Reset();
} }
@@ -1120,72 +1121,61 @@ struct npc_hover_disk : public VehicleAI
if (type != POINT_MOTION_TYPE) if (type != POINT_MOTION_TYPE)
return; return;
switch (id) if (id == MI_POINT_NEXUS_LORD)
{ {
case MI_POINT_SCION:
events.RescheduleEvent(EVENT_DISK_MOVE_NEXT_POINT, 0ms);
break;
case MI_POINT_NEXUS_LORD:
if (me->GetPositionZ() > CenterPos.GetPositionZ() + 2.0f) if (me->GetPositionZ() > CenterPos.GetPositionZ() + 2.0f)
events.RescheduleEvent(EVENT_DISK_MOVE_NEXT_POINT, 0ms); events.RescheduleEvent(EVENT_DISK_MOVE_NEXT_POINT, 0ms);
else if (Vehicle* v = me->GetVehicleKit()) else if (Vehicle* vehicle = me->GetVehicleKit())
if (Unit* pass = v->GetPassenger(0)) if (Unit* passenger = vehicle->GetPassenger(0))
if (Creature* c = pass->ToCreature()) if (Creature* creature = passenger->ToCreature())
{ {
c->SetReactState(REACT_AGGRESSIVE); creature->SetReactState(REACT_AGGRESSIVE);
if (Player* plr = c->SelectNearestPlayer(100.0f)) if (Player* player = creature->SelectNearestPlayer(100.0f))
c->AI()->AttackStart(plr); creature->AI()->AttackStart(player);
} }
break; } else if (id == MI_POINT_SCION)
} events.RescheduleEvent(EVENT_DISK_MOVE_NEXT_POINT, 0ms);
} }
void DoAction(int32 param) override void DoAction(int32 param) override
{ {
switch (param) if (param != ACTION_DISK_START_MOVING)
{ return;
case ACTION_DISK_START_MOVING:
if (Vehicle* v = me->GetVehicleKit()) if (Vehicle* vehicle = me->GetVehicleKit())
if (Unit* pass = v->GetPassenger(0)) if (Unit* pass = vehicle->GetPassenger(0))
switch (pass->GetEntry()) {
{ if (pass->GetEntry() == NPC_NEXUS_LORD)
case NPC_NEXUS_LORD: {
{ float angle = CenterPos.GetAngle(me);
float angle = CenterPos.GetAngle(me); float newangle = angle - 0.5f;
float newangle = angle - 0.5f; if (newangle < 0.0f)
if (newangle < 0.0f) newangle += 2 * M_PI; newangle += 2 * M_PI;
float newz = me->GetPositionZ() - 4.0f; float newz = me->GetPositionZ() - 4.0f;
if (newz < CenterPos.GetPositionZ()) newz = CenterPos.GetPositionZ(); if (newz < CenterPos.GetPositionZ())
me->GetMotionMaster()->MovePoint(MI_POINT_NEXUS_LORD, CenterPos.GetPositionX() + cos(newangle) * 22.0f, CenterPos.GetPositionY() + std::sin(newangle) * 22.0f, newz); newz = CenterPos.GetPositionZ();
} me->GetMotionMaster()->MovePoint(MI_POINT_NEXUS_LORD, CenterPos.GetPositionX() + cos(newangle) * 22.0f, CenterPos.GetPositionY() + std::sin(newangle) * 22.0f, newz);
break; }
case NPC_SCION_OF_ETERNITY: else if (pass->GetEntry() == NPC_SCION_OF_ETERNITY)
{ {
float angle = CenterPos.GetAngle(me); float angle = CenterPos.GetAngle(me);
float newangle = angle - 0.3f; float newangle = angle - 0.3f;
if (newangle < 0.0f) newangle += 2 * M_PI; if (newangle < 0.0f)
float newz = me->GetPositionZ() - 2.0f; newangle += 2 * M_PI;
if (newz < CenterPos.GetPositionZ() + 20.0f) newz = CenterPos.GetPositionZ() + 20.0f; float newz = me->GetPositionZ() - 2.0f;
me->GetMotionMaster()->MovePoint(MI_POINT_SCION, CenterPos.GetPositionX() + cos(newangle) * 30.0f, CenterPos.GetPositionY() + std::sin(newangle) * 30.0f, newz); if (newz < CenterPos.GetPositionZ() + 20.0f)
} newz = CenterPos.GetPositionZ() + 20.0f;
break; me->GetMotionMaster()->MovePoint(MI_POINT_SCION, CenterPos.GetPositionX() + cos(newangle) * 30.0f, CenterPos.GetPositionY() + std::sin(newangle) * 30.0f, newz);
} }
break; }
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
events.Update(diff); events.Update(diff);
switch (events.ExecuteEvent()) if (events.ExecuteEvent() == EVENT_DISK_MOVE_NEXT_POINT)
{
case 0:
break;
case EVENT_DISK_MOVE_NEXT_POINT:
DoAction(ACTION_DISK_START_MOVING); DoAction(ACTION_DISK_START_MOVING);
break;
}
} }
void MoveInLineOfSight(Unit* /*who*/) override {} void MoveInLineOfSight(Unit* /*who*/) override {}
@@ -1194,7 +1184,7 @@ struct npc_hover_disk : public VehicleAI
struct npc_alexstrasza : public ScriptedAI struct npc_alexstrasza : public ScriptedAI
{ {
npc_alexstrasza(Creature* pCreature) : ScriptedAI(pCreature) npc_alexstrasza(Creature* creature) : ScriptedAI(creature)
{ {
me->SetCanFly(true); me->SetCanFly(true);
me->SetDisableGravity(true); me->SetDisableGravity(true);
@@ -1276,8 +1266,8 @@ struct go_the_focusing_iris : public GameObjectAI
bool GossipHello(Player* /*user*/, bool /*reportUse*/) override bool GossipHello(Player* /*user*/, bool /*reportUse*/) override
{ {
if (InstanceScript* pInstance = me->GetInstanceScript()) if (InstanceScript* instance = me->GetInstanceScript())
pInstance->SetData(DATA_IRIS_ACTIVATED, 0); instance->SetData(DATA_IRIS_ACTIVATED, 0);
return true; return true;
} }
@@ -1292,18 +1282,18 @@ class spell_eoe_ph3_surge_of_power : public SpellScript
bool Load() override bool Load() override
{ {
if (Unit* caster = GetCaster()) if (Unit* caster = GetCaster())
if (Creature* c = caster->ToCreature()) if (Creature* creature = caster->ToCreature())
{ {
uint8 i = 0; uint8 i = 0;
std::list<Unit*> drakes; std::list<Unit*> drakes;
c->AI()->SelectTargetList(drakes, (c->GetMap()->GetSpawnMode() == 0 ? 1 : 3), SelectTargetMethod::Random, 0, 0.0f, false, true, 57403 /*only drakes have this aura*/); creature->AI()->SelectTargetList(drakes, (creature->GetMap()->GetSpawnMode() == 0 ? 1 : 3), SelectTargetMethod::Random, 0, 0.0f, false, true, 57403 /*only drakes have this aura*/);
for (std::list<Unit*>::iterator itr = drakes.begin(); itr != drakes.end() && i < 3; ++itr) for (std::list<Unit*>::iterator itr = drakes.begin(); itr != drakes.end() && i < 3; ++itr)
{ {
DrakeGUID[i++] = (*itr)->GetGUID(); DrakeGUID[i++] = (*itr)->GetGUID();
if (Vehicle* v = (*itr)->GetVehicleKit()) if (Vehicle* vehicle = (*itr)->GetVehicleKit())
if (Unit* p = v->GetPassenger(0)) if (Unit* passenger = vehicle->GetPassenger(0))
if (Player* plr = p->ToPlayer()) if (Player* player = passenger->ToPlayer())
c->AI()->Talk(EMOTE_SURGE_OF_POWER_WARNING_P3, plr); creature->AI()->Talk(EMOTE_SURGE_OF_POWER_WARNING_P3, player);
} }
} }
@@ -54,10 +54,12 @@ enum NPCs
enum Data enum Data
{ {
DATA_MALYGOS = 0, DATA_MALYGOS = 0,
DATA_IRIS,
DATA_EXIT_PORTAL,
DATA_NEXUS_PLATFORM,
DATA_IRIS_ACTIVATED, DATA_IRIS_ACTIVATED,
DATA_SET_IRIS_INACTIVE, DATA_SET_IRIS_INACTIVE,
DATA_HIDE_IRIS_AND_PORTAL, DATA_HIDE_IRIS_AND_PORTAL,
DATA_MALYGOS_GUID,
}; };
enum eSpells enum eSpells
@@ -21,68 +21,60 @@
#include "Vehicle.h" #include "Vehicle.h"
#include "eye_of_eternity.h" #include "eye_of_eternity.h"
ObjectData const creatureData[] =
{
{ NPC_MALYGOS, DATA_MALYGOS },
{ 0, 0 }
};
ObjectData const gameobjectData[] =
{
{ GO_IRIS_N, DATA_IRIS },
{ GO_IRIS_H, DATA_IRIS },
{ GO_EXIT_PORTAL, DATA_EXIT_PORTAL },
{ GO_NEXUS_PLATFORM, DATA_NEXUS_PLATFORM },
{ 0, 0 }
};
struct instance_eye_of_eternity : public InstanceScript struct instance_eye_of_eternity : public InstanceScript
{ {
instance_eye_of_eternity(Map* pMap) : InstanceScript(pMap) { Initialize(); } instance_eye_of_eternity(Map* pMap) : InstanceScript(pMap)
ObjectGuid NPC_MalygosGUID;
ObjectGuid GO_IrisGUID;
ObjectGuid GO_ExitPortalGUID;
ObjectGuid GO_PlatformGUID;
bool bPokeAchiev;
void Initialize() override
{ {
SetHeaders(DataHeader); SetHeaders(DataHeader);
SetBossNumber(EncounterCount); SetBossNumber(EncounterCount);
bPokeAchiev = false; LoadObjectData(creatureData, gameobjectData);
Initialize();
_pokeAchievementValid = false;
} }
bool _pokeAchievementValid = false;
void OnPlayerEnter(Player* player) override void OnPlayerEnter(Player* player) override
{ {
if (GetBossState(DATA_MALYGOS) != DONE) if (GetBossState(DATA_MALYGOS) != DONE)
return; return;
ProcessEvent(nullptr, EVENT_IRIS_ACTIVATED); ProcessEvent(nullptr, EVENT_IRIS_ACTIVATED);
if (GameObject* go = instance->GetGameObject(GO_IrisGUID)) if (GameObject* iris = GetGameObject(DATA_IRIS))
if (go->GetPhaseMask() != 2) if (iris->GetPhaseMask() != 2)
go->SetPhaseMask(2, true); iris->SetPhaseMask(2, true);
if (player && player->IsAlive()) if (player && player->IsAlive())
player->CastSpell(player, SPELL_SUMMON_RED_DRAGON_BUDDY, true); player->CastSpell(player, SPELL_SUMMON_RED_DRAGON_BUDDY, true);
} }
void OnCreatureCreate(Creature* creature) override void OnGameObjectCreate(GameObject* gameobject) override
{ {
switch (creature->GetEntry()) InstanceScript::OnGameObjectCreate(gameobject);
{
case NPC_MALYGOS:
NPC_MalygosGUID = creature->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* go) override uint32 entry = gameobject->GetEntry();
{ if ((entry == GO_IRIS_N || entry == GO_IRIS_H) && GetBossState(DATA_MALYGOS) == DONE)
switch (go->GetEntry()) gameobject->SetPhaseMask(2, true);
if (entry == GO_NEXUS_PLATFORM && GetBossState(DATA_MALYGOS) == DONE)
{ {
case GO_IRIS_N: gameobject->ModifyHealth(-int32(PLATFORM_DESTROY_DAMAGE));
case GO_IRIS_H: gameobject->EnableCollision(false);
GO_IrisGUID = go->GetGUID();
if (GetBossState(DATA_MALYGOS) == DONE)
go->SetPhaseMask(2, true);
break;
case GO_EXIT_PORTAL:
GO_ExitPortalGUID = go->GetGUID();
break;
case GO_NEXUS_PLATFORM:
GO_PlatformGUID = go->GetGUID();
if (GetBossState(DATA_MALYGOS) == DONE)
{
go->ModifyHealth(-int32(PLATFORM_DESTROY_DAMAGE));
go->EnableCollision(false);
}
break;
} }
} }
@@ -92,23 +84,29 @@ struct instance_eye_of_eternity : public InstanceScript
{ {
case DATA_IRIS_ACTIVATED: case DATA_IRIS_ACTIVATED:
if (GetBossState(DATA_MALYGOS) == NOT_STARTED) if (GetBossState(DATA_MALYGOS) == NOT_STARTED)
if (Creature* c = instance->GetCreature(NPC_MalygosGUID))
if (Player* plr = c->SelectNearestPlayer(250.0f))
c->AI()->AttackStart(plr);
break;
case DATA_SET_IRIS_INACTIVE:
if (GameObject* go = instance->GetGameObject(GO_IrisGUID))
{ {
HandleGameObject(GO_IrisGUID, true, go); if (Creature* malygos = GetCreature(DATA_MALYGOS))
if (Creature* c = go->SummonCreature(NPC_WORLD_TRIGGER_LAOI, *go, TEMPSUMMON_TIMED_DESPAWN, 10000)) {
c->CastSpell(c, SPELL_IRIS_ACTIVATED, true); if (Player* player = malygos->SelectNearestPlayer(250.0f))
malygos->AI()->AttackStart(player);
}
} }
break; break;
case DATA_SET_IRIS_INACTIVE:
{
if (GameObject* iris = GetGameObject(DATA_IRIS))
{
HandleGameObject(ObjectGuid::Empty, true, iris);
if (Creature* trigger = iris->SummonCreature(NPC_WORLD_TRIGGER_LAOI, *iris, TEMPSUMMON_TIMED_DESPAWN, 10000))
trigger->CastSpell(trigger, SPELL_IRIS_ACTIVATED, true);
}
break;
}
case DATA_HIDE_IRIS_AND_PORTAL: case DATA_HIDE_IRIS_AND_PORTAL:
if (GameObject* go = instance->GetGameObject(GO_IrisGUID)) if (GameObject* iris = GetGameObject(DATA_IRIS))
go->SetPhaseMask(2, true); iris->SetPhaseMask(2, true);
if (GameObject* go = instance->GetGameObject(GO_ExitPortalGUID)) if (GameObject* portal = GetGameObject(DATA_EXIT_PORTAL))
go->SetPhaseMask(2, true); portal->SetPhaseMask(2, true);
break; break;
} }
} }
@@ -118,63 +116,54 @@ struct instance_eye_of_eternity : public InstanceScript
if (!InstanceScript::SetBossState(type, state)) if (!InstanceScript::SetBossState(type, state))
return false; return false;
if (type == DATA_MALYGOS) if (type != DATA_MALYGOS)
return true;
switch (state)
{ {
switch (state) case NOT_STARTED:
{ _pokeAchievementValid = false;
case NOT_STARTED: if (GameObject* iris = GetGameObject(DATA_IRIS))
bPokeAchiev = false; {
if (GameObject* go = instance->GetGameObject(GO_IrisGUID)) iris->SetPhaseMask(1, true);
{ HandleGameObject(iris->GetGUID(), false, iris);
go->SetPhaseMask(1, true); }
HandleGameObject(GO_IrisGUID, false, go); if (GameObject* portal = GetGameObject(DATA_EXIT_PORTAL))
} portal->SetPhaseMask(1, true);
if (GameObject* go = instance->GetGameObject(GO_ExitPortalGUID)) if (GameObject* platform = GetGameObject(DATA_NEXUS_PLATFORM))
go->SetPhaseMask(1, true); {
if (GameObject* go = instance->GetGameObject(GO_PlatformGUID)) platform->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, nullptr, true);
{ platform->EnableCollision(true);
go->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, nullptr, true); }
go->EnableCollision(true); break;
} case IN_PROGRESS:
break; _pokeAchievementValid = (instance->GetPlayersCountExceptGMs() < (instance->GetSpawnMode() == 0 ? (uint32)9 : (uint32)21));
case IN_PROGRESS: break;
bPokeAchiev = (instance->GetPlayersCountExceptGMs() < (instance->GetSpawnMode() == 0 ? (uint32)9 : (uint32)21)); case DONE:
break; _pokeAchievementValid = false;
case DONE: if (GameObject* portal = GetGameObject(DATA_EXIT_PORTAL))
bPokeAchiev = false; portal->SetPhaseMask(1, true);
if (GameObject* go = instance->GetGameObject(GO_ExitPortalGUID)) if (Creature* malygos = GetCreature(DATA_MALYGOS))
go->SetPhaseMask(1, true); malygos->SummonCreature(NPC_ALEXSTRASZA, 798.0f, 1268.0f, 299.0f, 2.45f, TEMPSUMMON_MANUAL_DESPAWN);
if (Creature* c = instance->GetCreature(NPC_MalygosGUID)) break;
c->SummonCreature(NPC_ALEXSTRASZA, 798.0f, 1268.0f, 299.0f, 2.45f, TEMPSUMMON_MANUAL_DESPAWN); default:
break; break;
default:
break;
}
} }
return true; return true;
} }
ObjectGuid GetGuidData(uint32 type) const override
{
switch (type)
{
case DATA_MALYGOS_GUID:
return NPC_MalygosGUID;
}
return ObjectGuid::Empty;
}
void ProcessEvent(WorldObject* /*unit*/, uint32 eventId) override void ProcessEvent(WorldObject* /*unit*/, uint32 eventId) override
{ {
if (eventId == EVENT_IRIS_ACTIVATED) if (eventId != EVENT_IRIS_ACTIVATED)
if (GameObject* go = instance->GetGameObject(GO_PlatformGUID)) return;
if (Creature* c = instance->GetCreature(NPC_MalygosGUID))
{ if (GameObject* platform = GetGameObject(DATA_NEXUS_PLATFORM))
go->ModifyHealth(-int32(PLATFORM_DESTROY_DAMAGE), c); if (Creature* malygos = GetCreature(DATA_MALYGOS))
go->EnableCollision(false); {
} platform->ModifyHealth(-int32(PLATFORM_DESTROY_DAMAGE), malygos);
platform->EnableCollision(false);
}
} }
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* /*target*/, uint32 /*miscvalue1*/) override bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* /*target*/, uint32 /*miscvalue1*/) override
@@ -183,7 +172,7 @@ struct instance_eye_of_eternity : public InstanceScript
{ {
case ACHIEV_CRITERIA_A_POKE_IN_THE_EYE_10: case ACHIEV_CRITERIA_A_POKE_IN_THE_EYE_10:
case ACHIEV_CRITERIA_A_POKE_IN_THE_EYE_25: case ACHIEV_CRITERIA_A_POKE_IN_THE_EYE_25:
return bPokeAchiev; return _pokeAchievementValid;
case ACHIEV_CRITERIA_DENYIN_THE_SCION_10: case ACHIEV_CRITERIA_DENYIN_THE_SCION_10:
case ACHIEV_CRITERIA_DENYIN_THE_SCION_25: case ACHIEV_CRITERIA_DENYIN_THE_SCION_25:
return source && source->GetVehicle() && source->GetVehicle()->GetVehicleInfo()->m_ID == 224; return source && source->GetVehicle() && source->GetVehicle()->GetVehicleInfo()->m_ID == 224;