aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-06-09 19:17:24 +0300
committerGitHub <noreply@github.com>2021-06-09 19:17:24 +0300
commit8a2c1377a9556f2cf2815a4e26d13639e65ee24f (patch)
tree72d65e3c8a64f71adeeca59f51e669f6dca1132e /src
parent3d0a081f8ecbcd44b8bb633dc15928bb03864aa4 (diff)
Scripts/Quest: Rework 'Taken by the Scourge' (11611) (#26578)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp180
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);
}