fix(DB/SAI/Scripts) [Sholazar Basin] Quest: A Hero's Burden -- Behavior of all NPCs (#22278)

This commit is contained in:
Smirnov Sergey
2025-06-12 12:22:17 +03:00
committed by GitHub
parent 8060e2afbc
commit 40a4ed5fc7
2 changed files with 110 additions and 196 deletions

View File

@@ -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();