mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-16 18:40:28 +00:00
fix(DB/SAI/Scripts) [Sholazar Basin] Quest: A Hero's Burden -- Behavior of all NPCs (#22278)
This commit is contained in:
@@ -65,201 +65,6 @@ class spell_q12726_song_of_wind_and_water : public SpellScript
|
||||
}
|
||||
};
|
||||
|
||||
enum AHerosBurden
|
||||
{
|
||||
SPELL_TOMB_OF_THE_HEARTLESS = 52182,
|
||||
SPELL_ARTRUIS_FROST_NOVA = 11831,
|
||||
SPELL_ARTRUIS_FROSTBOLT = 15530,
|
||||
SPELL_ARTRUIS_ICE_LANCE = 54261,
|
||||
SPELL_ARTRUIS_ICY_VEINS = 54792,
|
||||
SPELL_ARTRUIS_BINDING = 52185,
|
||||
|
||||
NPC_JALOOT = 28667,
|
||||
NPC_ZEPIK = 28668,
|
||||
NPC_ARTRUIS = 28659,
|
||||
|
||||
EVENT_CAST_FROST_BOLT = 1,
|
||||
EVENT_CAST_FROST_NOVA = 2,
|
||||
EVENT_CAST_ICE_LANCE = 3,
|
||||
EVENT_CAST_ICY_VEINS = 4,
|
||||
EVENT_ARTRUIS_HP_CHECK = 5,
|
||||
EVENT_ARTRUIS_TALK1 = 6,
|
||||
EVENT_ARTRUIS_TALK2 = 7,
|
||||
EVENT_ARTRUIS_TALK3 = 8,
|
||||
|
||||
ACTION_BIND_MINIONS = 1,
|
||||
ACTION_MAKE_FRIENDLY = 2,
|
||||
|
||||
GO_ARTRUIS_PHYLACTERY = 190777,
|
||||
|
||||
// Texts
|
||||
SAY_TURNED_FRIENDLY = 0, // Zepik and Jaloot
|
||||
|
||||
SAY_ARTRUIS_AGGRO = 0,
|
||||
SAY_ARTRUIS_TALK_1 = 1,
|
||||
SAY_ARTRUIS_TALK_2 = 2,
|
||||
SAY_ARTRUIS_TALK_3 = 3,
|
||||
SAY_ARTRUIS_SHIELD = 4, // Boss emote
|
||||
SAY_ARTRUIS_TALK_4 = 5,
|
||||
};
|
||||
|
||||
class npc_artruis_the_hearthless : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_artruis_the_hearthless() : CreatureScript("npc_artruis_the_hearthless") { }
|
||||
|
||||
struct npc_artruis_the_hearthlessAI : public ScriptedAI
|
||||
{
|
||||
npc_artruis_the_hearthlessAI(Creature* creature) : ScriptedAI(creature), summons(me) { }
|
||||
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->SetControlled(false, UNIT_STATE_STUNNED);
|
||||
|
||||
Creature* cr;
|
||||
if ((cr = me->SummonCreature(NPC_JALOOT, 5616.91f, 3772.67f, -94.26f, 1.78f)))
|
||||
{
|
||||
summons.Summon(cr);
|
||||
cr->CastSpell(cr, SPELL_TOMB_OF_THE_HEARTLESS, true);
|
||||
cr->SetFaction(me->GetFaction());
|
||||
}
|
||||
if ((cr = me->SummonCreature(NPC_ZEPIK, 5631.63f, 3794.36f, -92.24f, 3.45f)))
|
||||
{
|
||||
summons.Summon(cr);
|
||||
cr->CastSpell(cr, SPELL_TOMB_OF_THE_HEARTLESS, true);
|
||||
cr->SetFaction(me->GetFaction());
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (who->GetEntry() == NPC_JALOOT || who->GetEntry() == NPC_ZEPIK)
|
||||
return;
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_ARTRUIS_AGGRO);
|
||||
me->CastSpell(me, SPELL_ARTRUIS_ICY_VEINS, true);
|
||||
events.RescheduleEvent(EVENT_CAST_FROST_BOLT, 4s);
|
||||
events.RescheduleEvent(EVENT_CAST_FROST_NOVA, 15s);
|
||||
events.RescheduleEvent(EVENT_CAST_ICE_LANCE, 8500ms);
|
||||
events.RescheduleEvent(EVENT_CAST_ICY_VEINS, 30s);
|
||||
events.RescheduleEvent(EVENT_ARTRUIS_HP_CHECK, 1s);
|
||||
events.RescheduleEvent(EVENT_ARTRUIS_TALK1, 6s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
if (GameObject* go = me->SummonGameObject(GO_ARTRUIS_PHYLACTERY, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 600000))
|
||||
me->RemoveGameObject(go, false);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* summon, Unit*) override
|
||||
{
|
||||
SummonsAction(ACTION_MAKE_FRIENDLY);
|
||||
me->RemoveAurasDueToSpell(SPELL_ARTRUIS_BINDING);
|
||||
summon->DespawnOrUnsummon(60000);
|
||||
me->SetControlled(false, UNIT_STATE_STUNNED);
|
||||
}
|
||||
|
||||
void SummonsAction(uint8 action)
|
||||
{
|
||||
if (!summons.empty())
|
||||
{
|
||||
if (action == ACTION_BIND_MINIONS)
|
||||
me->CastSpell(me, SPELL_ARTRUIS_BINDING, true);
|
||||
|
||||
for (ObjectGuid const& guid : summons)
|
||||
{
|
||||
Creature* minion = ObjectAccessor::GetCreature(*me, guid);
|
||||
if (minion && minion->IsAlive())
|
||||
{
|
||||
if (action == ACTION_BIND_MINIONS)
|
||||
{
|
||||
minion->RemoveAurasDueToSpell(SPELL_TOMB_OF_THE_HEARTLESS);
|
||||
if (me->GetVictim())
|
||||
minion->AI()->AttackStart(me->GetVictim());
|
||||
}
|
||||
else if (action == ACTION_MAKE_FRIENDLY && me->GetVictim())
|
||||
{
|
||||
minion->AI()->Talk(SAY_TURNED_FRIENDLY);
|
||||
minion->RemoveAurasDueToSpell(SPELL_ARTRUIS_BINDING);
|
||||
minion->SetFaction(me->GetVictim()->GetFaction());
|
||||
minion->AddThreat(me, 100000.0f);
|
||||
minion->AI()->AttackStart(me);
|
||||
minion->DespawnOrUnsummon(900000);
|
||||
events.RescheduleEvent(EVENT_ARTRUIS_TALK3, 5s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARTRUIS_HP_CHECK:
|
||||
if (me->GetHealthPct() <= 30)
|
||||
{
|
||||
me->SetControlled(true, UNIT_STATE_STUNNED);
|
||||
Talk(SAY_ARTRUIS_SHIELD);
|
||||
Talk(SAY_ARTRUIS_TALK_3);
|
||||
SummonsAction(ACTION_BIND_MINIONS);
|
||||
break;
|
||||
}
|
||||
events.Repeat(1s);
|
||||
break;
|
||||
case EVENT_ARTRUIS_TALK1:
|
||||
Talk(SAY_ARTRUIS_TALK_1);
|
||||
events.RescheduleEvent(EVENT_ARTRUIS_TALK2, 10s);
|
||||
break;
|
||||
case EVENT_ARTRUIS_TALK2:
|
||||
Talk(SAY_ARTRUIS_TALK_2);
|
||||
break;
|
||||
case EVENT_ARTRUIS_TALK3:
|
||||
Talk(SAY_ARTRUIS_TALK_4);
|
||||
break;
|
||||
case EVENT_CAST_FROST_BOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARTRUIS_FROSTBOLT, false);
|
||||
events.Repeat(4s);
|
||||
break;
|
||||
case EVENT_CAST_ICE_LANCE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARTRUIS_ICE_LANCE, false);
|
||||
events.Repeat(8500ms);
|
||||
break;
|
||||
case EVENT_CAST_FROST_NOVA:
|
||||
me->CastSpell(me, SPELL_ARTRUIS_FROST_NOVA, false);
|
||||
events.Repeat(15s);
|
||||
break;
|
||||
case EVENT_CAST_ICY_VEINS:
|
||||
me->CastSpell(me, SPELL_ARTRUIS_ICY_VEINS, false);
|
||||
events.Repeat(30s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new npc_artruis_the_hearthlessAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/******
|
||||
quest Still At It (12644)
|
||||
******/
|
||||
@@ -1488,7 +1293,6 @@ class spell_q12611_deathbolt : public SpellScript
|
||||
void AddSC_sholazar_basin()
|
||||
{
|
||||
RegisterSpellScript(spell_q12726_song_of_wind_and_water);
|
||||
new npc_artruis_the_hearthless();
|
||||
new npc_still_at_it_trigger();
|
||||
new npc_mcmanus();
|
||||
new go_pressure_valve();
|
||||
|
||||
Reference in New Issue
Block a user