diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-06-09 19:17:24 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-09 19:17:24 +0300 |
commit | 8a2c1377a9556f2cf2815a4e26d13639e65ee24f (patch) | |
tree | 72d65e3c8a64f71adeeca59f51e669f6dca1132e /src | |
parent | 3d0a081f8ecbcd44b8bb633dc15928bb03864aa4 (diff) |
Scripts/Quest: Rework 'Taken by the Scourge' (11611) (#26578)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/zone_borean_tundra.cpp | 180 |
1 files changed, 120 insertions, 60 deletions
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index c9847813a9c..dc82b457806 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -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); } |