mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 16:38:42 +01:00
Scripts/TSC: reworked High Priestes Azil phase two behaivior
* corrected the number of summoned adds during phase two * corrected overall timers for summoning adds during phase one and two * randomize the summon destinations of the followers to get correct spawn behaivior
This commit is contained in:
4
sql/updates/world/custom/custom_2019_12_08_02_world.sql
Normal file
4
sql/updates/world/custom/custom_2019_12_08_02_world.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_azil_summon_follower';
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(79193, 'spell_azil_summon_follower'),
|
||||
(79199, 'spell_azil_summon_follower');
|
||||
@@ -81,8 +81,7 @@ enum Events
|
||||
EVENT_SUMMON_GRAVITY_WELL,
|
||||
EVENT_ENERGY_SHIELD,
|
||||
EVENT_EARTH_FURY,
|
||||
EVENT_SUMMON_WAVE_SOUTH,
|
||||
EVENT_SUMMON_WAVE_WEST,
|
||||
EVENT_SUMMON_FOLLOWERS,
|
||||
EVENT_GRAVITY_WELL_AURA_DAMAGE,
|
||||
EVENT_GRAVITY_WELL_AURA_PULL,
|
||||
EVENT_APPLY_IMMUNITY,
|
||||
@@ -96,9 +95,10 @@ enum Events
|
||||
EVENT_SEISMIC_SHARD_MOUNT
|
||||
};
|
||||
|
||||
enum EventGroups
|
||||
enum Phases
|
||||
{
|
||||
EVENT_GROUP_PHASE_ONE = 1
|
||||
PHASE_ONE = 1,
|
||||
PHASE_TWO = 2
|
||||
};
|
||||
|
||||
enum Points
|
||||
@@ -161,14 +161,7 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
|
||||
DoCast(me, SPELL_ENERGY_SHIELD);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_INTRO_MOVE, Seconds(2));
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, Seconds(6), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_FORCE_GRIP, Seconds(8), Seconds(10), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, Seconds(16), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_ENERGY_SHIELD, Seconds(35), Seconds(36));
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_SOUTH, Milliseconds(1));
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_WEST, Seconds(42));
|
||||
SchedulePhaseOne();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
@@ -240,15 +233,15 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
case POINT_FLY_UP:
|
||||
me->SetCanFly(true);
|
||||
me->SetDisableGravity(true);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM, Seconds(1));
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM, 1s, 0, PHASE_TWO);
|
||||
break;
|
||||
case POINT_ABOVE_PLATFORM:
|
||||
me->SetFacingTo(5.218534f);
|
||||
DoCast(me, SPELL_EARTH_FURY_CASTING_VISUAL);
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_1);
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_2);
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_SUMMON_3);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_PREPARE_SHARD, Seconds(6) + Milliseconds(700));
|
||||
DoCastSelf(SPELL_EARTH_FURY_CASTING_VISUAL);
|
||||
DoCastSelf(SPELL_SEISMIC_SHARD_SUMMON_1);
|
||||
DoCastSelf(SPELL_SEISMIC_SHARD_SUMMON_2);
|
||||
DoCastSelf(SPELL_SEISMIC_SHARD_SUMMON_3);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_PREPARE_SHARD, 6s + 700ms, 0, PHASE_TWO);
|
||||
break;
|
||||
case POINT_GROUND:
|
||||
DoCast(me, SPELL_EJECT_ALL_PASSENGERS);
|
||||
@@ -256,10 +249,7 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
me->SetDisableGravity(false);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
DoStartMovement(me->GetVictim());
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, Seconds(6), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_FORCE_GRIP, Seconds(8), Seconds(10), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, Seconds(16), EVENT_GROUP_PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_ENERGY_SHIELD, Seconds(35), Seconds(36));
|
||||
SchedulePhaseOne();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -286,14 +276,14 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
case EVENT_CURSE_OF_BLOOD:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_CURSE_OF_BLOOD);
|
||||
events.Repeat(Seconds(13), Seconds(15));
|
||||
events.Repeat(13s, 15s);
|
||||
break;
|
||||
case EVENT_FORCE_GRIP:
|
||||
MakeInterruptable(true);
|
||||
SetVehicleId(VEHICLE_ID_FORCE_GRIP);
|
||||
DoCastVictim(SPELL_FORCE_GRIP);
|
||||
events.ScheduleEvent(EVENT_APPLY_IMMUNITY, Seconds(6) + Milliseconds(500));
|
||||
events.Repeat(Seconds(13), Seconds(15));
|
||||
events.ScheduleEvent(EVENT_APPLY_IMMUNITY, 6s + 500ms, 0, PHASE_ONE);
|
||||
events.Repeat(13s, 15s);
|
||||
break;
|
||||
case EVENT_FORCE_GRIP_SMASH:
|
||||
if (Vehicle* vehicle = me->GetVehicleKit())
|
||||
@@ -304,7 +294,7 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
if (Vehicle* vehicle = me->GetVehicleKit())
|
||||
if (Unit* passenger = vehicle->GetPassenger(SEAT_FORCE_GRIP_2))
|
||||
DoCast(passenger, SPELL_FORCE_GRIP_DAMAGE, true);
|
||||
events.ScheduleEvent(EVENT_REPEAT_FORCE_GRIP_SMASH, Milliseconds(400));
|
||||
events.ScheduleEvent(EVENT_REPEAT_FORCE_GRIP_SMASH, 400ms, 0, PHASE_ONE);
|
||||
break;
|
||||
case EVENT_REPEAT_FORCE_GRIP_SMASH:
|
||||
if (Vehicle* vehicle = me->GetVehicleKit())
|
||||
@@ -316,29 +306,30 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
case EVENT_SUMMON_GRAVITY_WELL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
DoCast(target, SPELL_SUMMON_GRAVITY_WELL);
|
||||
events.Repeat(Seconds(13), Seconds(15));
|
||||
events.Repeat(13s, 15s);
|
||||
break;
|
||||
case EVENT_ENERGY_SHIELD:
|
||||
events.CancelEventGroup(EVENT_GROUP_PHASE_ONE);
|
||||
DoCast(me, SPELL_EARTH_FURY_ENERGY_SHIELD);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY, Milliseconds(1));
|
||||
events.SetPhase(PHASE_TWO);
|
||||
DoCastSelf(SPELL_EARTH_FURY_ENERGY_SHIELD);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY, 1ms, 0, PHASE_TWO);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FOLLOWERS, 3s + 800ms, 0, PHASE_TWO);
|
||||
break;
|
||||
case EVENT_EARTH_FURY:
|
||||
_seismicShardCount = 0;
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFacingTo(5.862942f);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_FLY_UP, Seconds(1) + Milliseconds(600));
|
||||
me->AttackStop();
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_FLY_UP, 1s + 600ms, 0, PHASE_TWO);
|
||||
break;
|
||||
case EVENT_EARTH_FURY_FLY_UP:
|
||||
Talk(SAY_PHASE_TWO);
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLY_UP, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5);
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLY_UP, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 5.f);
|
||||
break;
|
||||
case EVENT_EARTH_FURY_FLY_ABOVE_PLATFORM:
|
||||
me->GetMotionMaster()->MovePoint(POINT_ABOVE_PLATFORM, AbovePlatformPos, false);
|
||||
break;
|
||||
case EVENT_EARTH_FURY_PREPARE_SHARD:
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_PREPARE);
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_LAUNCH_SHARD, Seconds(1) + Milliseconds(800));
|
||||
events.ScheduleEvent(EVENT_EARTH_FURY_LAUNCH_SHARD, 1s + 800ms, 0, PHASE_TWO);
|
||||
break;
|
||||
case EVENT_EARTH_FURY_LAUNCH_SHARD:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
|
||||
@@ -348,7 +339,7 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
DoCast(me, SPELL_SEISMIC_SHARD_LAUNCH);
|
||||
_seismicShardCount++;
|
||||
}
|
||||
events.ScheduleEvent(_seismicShardCount < 3 ? EVENT_EARTH_FURY_PREPARE_SHARD : EVENT_EARTH_FURY_FLY_DOWN, Seconds(4) + Milliseconds(800));
|
||||
events.ScheduleEvent(_seismicShardCount < 3 ? EVENT_EARTH_FURY_PREPARE_SHARD : EVENT_EARTH_FURY_FLY_DOWN, 4s + 800ms, 0, PHASE_TWO);
|
||||
break;
|
||||
case EVENT_EARTH_FURY_FLY_DOWN:
|
||||
{
|
||||
@@ -359,15 +350,21 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
me->GetMotionMaster()->MovePoint(POINT_GROUND, pos, false);
|
||||
break;
|
||||
}
|
||||
case EVENT_SUMMON_WAVE_SOUTH:
|
||||
if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f))
|
||||
worldtrigger->CastSpell(worldtrigger, SPELL_SUMMON_WAVE_SOUTH);
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_SOUTH, Seconds(12));
|
||||
break;
|
||||
case EVENT_SUMMON_WAVE_WEST:
|
||||
if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f))
|
||||
worldtrigger->CastSpell(worldtrigger, SPELL_SUMMON_WAVE_WEST);
|
||||
events.ScheduleEvent(EVENT_SUMMON_WAVE_WEST, Seconds(22));
|
||||
case EVENT_SUMMON_FOLLOWERS:
|
||||
if (events.IsInPhase(PHASE_ONE))
|
||||
{
|
||||
if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f))
|
||||
worldtrigger->CastCustomSpell(SPELL_SUMMON_WAVE_SOUTH, SPELLVALUE_BASE_POINT0, 3, worldtrigger, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 150.0f))
|
||||
{
|
||||
worldtrigger->CastCustomSpell(SPELL_SUMMON_WAVE_SOUTH, SPELLVALUE_BASE_POINT0, 10, worldtrigger, true);
|
||||
worldtrigger->CastCustomSpell(SPELL_SUMMON_WAVE_WEST, SPELLVALUE_BASE_POINT0, 10, worldtrigger, true);
|
||||
events.Repeat(10s, 13s);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EVENT_APPLY_IMMUNITY:
|
||||
MakeInterruptable(false);
|
||||
@@ -389,6 +386,17 @@ class boss_high_priestess_azil : public CreatureScript
|
||||
me->CreateVehicleKit(id, me->GetEntry());
|
||||
}
|
||||
|
||||
void SchedulePhaseOne()
|
||||
{
|
||||
events.SetPhase(PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_INTRO_MOVE, 2s, 0, PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 6s, 0, PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_FORCE_GRIP, 8s, 10s, 0, PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAVITY_WELL, 16s, 0, PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_ENERGY_SHIELD, 35s, 36s, 0, PHASE_ONE);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FOLLOWERS, 22s + 500ms, 0, PHASE_ONE);
|
||||
}
|
||||
|
||||
uint8 _seismicShardCount;
|
||||
bool _isChannelingForceGrip;
|
||||
};
|
||||
@@ -410,21 +418,10 @@ class npc_azil_devout_follower : public CreatureScript
|
||||
|
||||
void IsSummonedBy(Unit* summoner) override
|
||||
{
|
||||
if (summoner->GetEntry() != NPC_WORLDTRIGGER)
|
||||
return;
|
||||
|
||||
if (Creature* azil = _instance->GetCreature(DATA_HIGH_PRIESTESS_AZIL))
|
||||
{
|
||||
azil->AI()->JustSummoned(me);
|
||||
|
||||
if (Unit* target = azil->SelectNearestPlayer(60.0f))
|
||||
{
|
||||
me->AddThreat(target, 0.0f);
|
||||
me->AI()->AttackStart(target);
|
||||
}
|
||||
else
|
||||
me->GetMotionMaster()->MovePoint(POINT_NONE, summoner->GetPosition());
|
||||
}
|
||||
DoZoneInCombat();
|
||||
}
|
||||
private:
|
||||
InstanceScript* _instance;
|
||||
@@ -574,7 +571,7 @@ class spell_azil_summon_wave_south : public SpellScript
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
for (uint8 i = 0; i < 3; i++)
|
||||
for (uint8 i = 0; i < GetEffectValue(); i++)
|
||||
caster->CastSpell(caster, SPELL_SUMMON_ADD_SOUTH, true);
|
||||
}
|
||||
|
||||
@@ -596,7 +593,7 @@ class spell_azil_summon_wave_west : public SpellScript
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
for (uint8 i = 0; i < 10; i++)
|
||||
for (uint8 i = 0; i < GetEffectValue(); i++)
|
||||
caster->CastSpell(caster, SPELL_SUMMON_ADD_WEST, true);
|
||||
}
|
||||
|
||||
@@ -606,6 +603,29 @@ class spell_azil_summon_wave_west : public SpellScript
|
||||
}
|
||||
};
|
||||
|
||||
class spell_azil_summon_follower : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_azil_summon_follower);
|
||||
|
||||
void SetDestPosition(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
float angle = frand(0.f, float(M_PI * 2));
|
||||
uint32 dist = frand(0.f, GetSpellInfo()->Effects[EFFECT_0].CalcRadius());
|
||||
Position const pos = GetExplTargetDest()->GetPosition();
|
||||
|
||||
float x = pos.GetPositionX() + dist * std::cos(angle);
|
||||
float y = pos.GetPositionY() + dist * std::sin(angle);
|
||||
float z = caster->GetMapHeight(x, y, pos.GetPositionZ() + 5.f);
|
||||
GetHitDest()->Relocate({ x, y, z });
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectLaunch += SpellEffectFn(spell_azil_summon_follower::SetDestPosition, EFFECT_0, SPELL_EFFECT_SUMMON);
|
||||
}
|
||||
};
|
||||
|
||||
class PlayerPetOrDevoutFollowerCheck
|
||||
{
|
||||
public:
|
||||
@@ -788,6 +808,7 @@ void AddSC_boss_high_priestess_azil()
|
||||
new npc_azil_seismic_shard();
|
||||
RegisterSpellScript(spell_azil_summon_wave_south);
|
||||
RegisterSpellScript(spell_azil_summon_wave_west);
|
||||
RegisterSpellScript(spell_azil_summon_follower);
|
||||
RegisterSpellScript(spell_azil_gravity_well_damage_nearby);
|
||||
RegisterSpellScript(spell_azil_gravity_well_damage);
|
||||
RegisterSpellScript(spell_azil_gravity_well_pull);
|
||||
|
||||
Reference in New Issue
Block a user