diff options
author | offl <11556157+offl@users.noreply.github.com> | 2025-05-08 19:45:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-08 18:45:15 +0200 |
commit | da2adb613816217f207e06ee24c9a61cc6322f63 (patch) | |
tree | 39e0de4c8e41d3a498c09576faf699698b36065e | |
parent | 4a6b73782beb6981a6ea48dd0da34303d5af3edb (diff) |
Scripts/Spells: Implement Putrid Mushroom Primer spell (#30914)
3 files changed, 58 insertions, 25 deletions
diff --git a/sql/updates/world/3.3.5/2025_05_08_00_world.sql b/sql/updates/world/3.3.5/2025_05_08_00_world.sql new file mode 100644 index 00000000000..d5cf7fc10f3 --- /dev/null +++ b/sql/updates/world/3.3.5/2025_05_08_00_world.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hungarfen_putrid_mushroom_primer'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(31693, 'spell_hungarfen_putrid_mushroom_primer'); diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp index 916783f03e3..be90b9a2bec 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp @@ -15,9 +15,11 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "Containers.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellAuras.h" +#include "SpellScript.h" #include "the_underbog.h" enum HungarfenTexts @@ -53,17 +55,15 @@ struct boss_hungarfen : public BossAI void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - _scheduler.Schedule(IsHeroic() ? 2500ms : 5s, [this](TaskContext task) + scheduler.Schedule(IsHeroic() ? 2500ms : 5s, [this](TaskContext task) { - /// @todo cast here SPELL_PUTRID_MUSHROOM_PRIMER and do it in spell script - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - target->CastSpell(target, SPELL_SUMMON_UNDERBOG_MUSHROOM, true); + DoCastSelf(SPELL_PUTRID_MUSHROOM_PRIMER); task.Repeat(IsHeroic() ? 2500ms : 10s); }); if (IsHeroic()) { - _scheduler.Schedule(3s, 5s, [this](TaskContext task) + scheduler.Schedule(3s, 5s, [this](TaskContext task) { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) DoCast(target, SPELL_ACID_GEYSER); @@ -89,7 +89,7 @@ struct boss_hungarfen : public BossAI if (!UpdateVictim()) return; - _scheduler.Update(diff, [this] + scheduler.Update(diff, [this] { DoMeleeAttackIfReady(); }); @@ -100,7 +100,7 @@ struct boss_hungarfen : public BossAI _roared = true; me->SetReactState(REACT_PASSIVE); - _scheduler.Schedule(2s, [this](TaskContext /*task*/) + scheduler.Schedule(2s, [this](TaskContext /*task*/) { DoCastSelf(SPELL_FOUL_SPORES); me->SetReactState(REACT_AGGRESSIVE); @@ -109,7 +109,6 @@ struct boss_hungarfen : public BossAI } private: - TaskScheduler _scheduler; bool _roared; }; @@ -159,8 +158,42 @@ private: uint32 _counter; }; +// 31693 - Putrid Mushroom Primer +class spell_hungarfen_putrid_mushroom_primer : public SpellScript +{ + PrepareSpellScript(spell_hungarfen_putrid_mushroom_primer); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SUMMON_UNDERBOG_MUSHROOM }); + } + + /// @todo: Check if something else should be done here + void FilterTargets(std::list<WorldObject*>& targets) + { + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUMMON_UNDERBOG_MUSHROOM, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hungarfen_putrid_mushroom_primer::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_hungarfen_putrid_mushroom_primer::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_boss_hungarfen() { RegisterTheUnderbogCreatureAI(boss_hungarfen); RegisterTheUnderbogCreatureAI(npc_underbog_mushroom); + RegisterSpellScript(spell_hungarfen_putrid_mushroom_primer); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp index 6a04a457345..4640f9e00ff 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp @@ -63,17 +63,17 @@ enum Events struct boss_the_black_stalker : public BossAI { - boss_the_black_stalker(Creature* creature) : BossAI(creature, DATA_THE_BLACK_STALKER), _summons(creature) { } + boss_the_black_stalker(Creature* creature) : BossAI(creature, DATA_THE_BLACK_STALKER) { } void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - _events.ScheduleEvent(EVENT_LEASH_CHECK, 5s); - _events.ScheduleEvent(EVENT_LEVITATE, 8s, 18s); - _events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 0s, 3s); - _events.ScheduleEvent(EVENT_STATIC_CHARGE, 10s); + events.ScheduleEvent(EVENT_LEASH_CHECK, 5s); + events.ScheduleEvent(EVENT_LEVITATE, 8s, 18s); + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 0s, 3s); + events.ScheduleEvent(EVENT_STATIC_CHARGE, 10s); if (IsHeroic()) - _events.ScheduleEvent(EVENT_SUMMON_SPORE_STRIDER, 20s, 30s); + events.ScheduleEvent(EVENT_SUMMON_SPORE_STRIDER, 20s, 30s); } void UpdateAI(uint32 diff) override @@ -81,12 +81,12 @@ struct boss_the_black_stalker : public BossAI if (!UpdateVictim()) return; - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { @@ -99,25 +99,25 @@ struct boss_the_black_stalker : public BossAI EnterEvadeMode(); return; } - _events.Repeat(1s); + events.Repeat(1s); break; } case EVENT_LEVITATE: DoCastSelf(SPELL_LEVITATE); - _events.Repeat(18s, 24s); + events.Repeat(18s, 24s); break; case EVENT_CHAIN_LIGHTNING: DoCastVictim(SPELL_CHAIN_LIGHTNING); - _events.Repeat(6s, 12s); + events.Repeat(6s, 12s); break; case EVENT_STATIC_CHARGE: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30, true)) DoCast(target, SPELL_STATIC_CHARGE); - _events.Repeat(10s); + events.Repeat(10s); break; case EVENT_SUMMON_SPORE_STRIDER: DoCastSelf(SPELL_SUMMON_SPORE_STRIDER_SCRIPT); - _events.Repeat(15s, 25s); + events.Repeat(15s, 25s); break; default: break; @@ -129,10 +129,6 @@ struct boss_the_black_stalker : public BossAI DoMeleeAttackIfReady(); } - -private: - EventMap _events; - SummonList _summons; }; // 31704 - Levitate |