aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2025-05-08 19:45:15 +0300
committerGitHub <noreply@github.com>2025-05-08 18:45:15 +0200
commitda2adb613816217f207e06ee24c9a61cc6322f63 (patch)
tree39e0de4c8e41d3a498c09576faf699698b36065e
parent4a6b73782beb6981a6ea48dd0da34303d5af3edb (diff)
Scripts/Spells: Implement Putrid Mushroom Primer spell (#30914)
-rw-r--r--sql/updates/world/3.3.5/2025_05_08_00_world.sql4
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp49
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp30
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