Scripts/Quest: Rework 'Taken by the Scourge' (11611) (#26578)

This commit is contained in:
offl
2021-06-09 19:17:24 +03:00
committed by GitHub
parent 3d0a081f8e
commit 8a2c1377a9
2 changed files with 270 additions and 60 deletions

View File

@@ -26,6 +26,7 @@
#include "ScriptedEscortAI.h"
#include "ScriptedFollowerAI.h"
#include "ScriptedGossip.h"
#include "SpellAuras.h"
#include "SpellAuraEffects.h"
#include "SpellInfo.h"
#include "SpellScript.h"
@@ -103,65 +104,6 @@ public:
}
};
/*######
## npc_nerubar_victim
######*/
enum Nerubar
{
NPC_WARSONG_PEON = 25270,
QUEST_TAKEN_BY_THE_SCOURGE = 11611,
SPELL_FREED_WARSONG_MAGE = 45526,
SPELL_FREED_WARSONG_SHAMAN = 45527,
SPELL_FREED_WARSONG_WARRIOR = 45514,
SPELL_FREED_WARSONG_PEON = 45532
};
const uint32 nerubarVictims[3] =
{
SPELL_FREED_WARSONG_MAGE, SPELL_FREED_WARSONG_SHAMAN, SPELL_FREED_WARSONG_WARRIOR
};
class npc_nerubar_victim : public CreatureScript
{
public:
npc_nerubar_victim() : CreatureScript("npc_nerubar_victim") { }
struct npc_nerubar_victimAI : public ScriptedAI
{
npc_nerubar_victimAI(Creature* creature) : ScriptedAI(creature) { }
void Reset() override { }
void JustEngagedWith(Unit* /*who*/) override { }
void MoveInLineOfSight(Unit* /*who*/) override { }
void JustDied(Unit* killer) override
{
if (!killer || killer->GetTypeId() != TYPEID_PLAYER)
return;
Player* player = killer->ToPlayer();
if (player->GetQuestStatus(QUEST_TAKEN_BY_THE_SCOURGE) == QUEST_STATUS_INCOMPLETE)
{
uint8 uiRand = urand(0, 99);
if (uiRand < 25)
{
player->CastSpell(me, SPELL_FREED_WARSONG_PEON, true);
player->KilledMonsterCredit(NPC_WARSONG_PEON);
}
else if (uiRand < 75)
player->CastSpell(me, nerubarVictims[urand(0, 2)], true);
}
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_nerubar_victimAI(creature);
}
};
enum NesingwaryTrapper
{
NPC_NESINGWARY_TRAPPER = 25835,
@@ -1878,10 +1820,124 @@ class spell_q11653_shortening_blaster : public SpellScript
}
};
/*######
## Quest 11611: Taken by the Scourge
######*/
enum TakenByTheScourge
{
SPELL_FREED_WARSONG_MAGE = 45526,
SPELL_FREED_WARSONG_SHAMAN = 45527,
SPELL_FREED_WARSONG_WARRIOR = 45514,
SPELL_FREED_WARSONG_PEON = 45532,
SPELL_FREED_SOLDIER_DEBUFF = 45523
};
std::array<uint32, 3> const CocoonSummonSpells =
{
SPELL_FREED_WARSONG_MAGE, SPELL_FREED_WARSONG_SHAMAN, SPELL_FREED_WARSONG_WARRIOR
};
// 45516 - Nerub'ar Web Random Unit (Not On Quest, Script Effect)
class spell_nerubar_web_random_unit_not_on_quest : public SpellScript
{
PrepareSpellScript(spell_nerubar_web_random_unit_not_on_quest);
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ uint32(spellInfo->Effects[EFFECT_0].CalcValue()) });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastSpell(GetHitUnit(), (uint32)GetSpellInfo()->Effects[EFFECT_0].CalcValue(), true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_nerubar_web_random_unit_not_on_quest::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
// 45515 - Nerub'ar Web Random Unit (Not On Quest, Dummy)
class spell_nerubar_web_random_unit_not_on_quest_dummy : public SpellScript
{
PrepareSpellScript(spell_nerubar_web_random_unit_not_on_quest_dummy);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(CocoonSummonSpells) && ValidateSpellInfo({ SPELL_FREED_SOLDIER_DEBUFF });
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
// Do nothing if has 3 soldiers
Aura* aura = caster->GetAura(SPELL_FREED_SOLDIER_DEBUFF);
if (!aura || aura->GetStackAmount() < 3)
caster->CastSpell(caster, Trinity::Containers::SelectRandomContainerElement(CocoonSummonSpells), true);
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_nerubar_web_random_unit_not_on_quest_dummy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 45535 - Nerub'ar Web Random Unit (On Quest, Dummy)
class spell_nerubar_web_random_unit_on_quest_dummy : public SpellScript
{
PrepareSpellScript(spell_nerubar_web_random_unit_on_quest_dummy);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(CocoonSummonSpells) && ValidateSpellInfo({ SPELL_FREED_SOLDIER_DEBUFF, SPELL_FREED_WARSONG_PEON });
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
// Always summon peon if has 3 soldiers
Aura* aura = caster->GetAura(SPELL_FREED_SOLDIER_DEBUFF);
if ((!aura || aura->GetStackAmount() < 3) && roll_chance_i(75))
caster->CastSpell(caster, Trinity::Containers::SelectRandomContainerElement(CocoonSummonSpells), true);
else
caster->CastSpell(nullptr, SPELL_FREED_WARSONG_PEON, true);
}
void Register() override
{
OnEffectHit += SpellEffectFn(spell_nerubar_web_random_unit_on_quest_dummy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 45522 - Dispel Freed Soldier Debuff
class spell_dispel_freed_soldier_debuff : public SpellScript
{
PrepareSpellScript(spell_dispel_freed_soldier_debuff);
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellInfo({ uint32(spellInfo->Effects[EFFECT_0].CalcValue()) });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Aura* aura = GetHitUnit()->GetAura((uint32)GetSpellInfo()->Effects[EFFECT_0].CalcValue()))
aura->ModStackAmount(-1);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_dispel_freed_soldier_debuff::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_borean_tundra()
{
new npc_corastrasza();
new npc_nerubar_victim();
RegisterSpellScript(spell_q11865_place_fake_fur);
new npc_nesingwary_trapper();
new spell_red_dragonblood();
@@ -1900,4 +1956,8 @@ void AddSC_borean_tundra()
new npc_bloodmage_laurith();
new npc_orabus_the_helmsman_ship_exit_pos();
RegisterSpellScript(spell_q11653_shortening_blaster);
RegisterSpellScript(spell_nerubar_web_random_unit_not_on_quest);
RegisterSpellScript(spell_nerubar_web_random_unit_not_on_quest_dummy);
RegisterSpellScript(spell_nerubar_web_random_unit_on_quest_dummy);
RegisterSpellScript(spell_dispel_freed_soldier_debuff);
}