aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2025-07-12 23:00:47 +0300
committerGitHub <noreply@github.com>2025-07-12 22:00:47 +0200
commit70d18754848c376f93e1ab9d7119c6818d594db8 (patch)
tree239d3cdfba8e3b1a0e0b986effe7b4713de22bf0 /src
parent359258cb074a60a2e95a354d2d19d4a20b9ffcd7 (diff)
Scripts/Sholazar Basin: Update several quest scripts (#31114)
* convert & update Engineering a Disaster quest to SAI * update The Lifewarden's Wrath quest with SAI * renamed a couple of spell script names
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp351
1 files changed, 99 insertions, 252 deletions
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index bba73b309e0..c0221b26ec2 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -29,162 +29,6 @@
#include "Vehicle.h"
#include "GameObject.h"
-/*######
-## npc_engineer_helice
-######*/
-
-enum EngineerHelice
-{
- // Spells
- SPELL_DETONATE_1 = 52369,
- SPELL_DETONATE_2 = 52371,
- SPELL_EXPLOSION = 46419,
-
- // Yells
- SAY_WP_1 = 0,
- SAY_WP_2 = 1,
- SAY_WP_3 = 2,
- SAY_WP_4 = 3,
- SAY_WP_5 = 4,
- SAY_WP_6 = 5,
- SAY_WP_7 = 6,
-
- // Quests
- QUEST_DISASTER = 12688
-};
-
-struct npc_engineer_helice : public EscortAI
-{
- npc_engineer_helice(Creature* creature) : EscortAI(creature) { }
-
- void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
- {
- switch (waypointId)
- {
- case 0:
- Talk(SAY_WP_2);
- break;
- case 1:
- Talk(SAY_WP_3);
- DoCast(SPELL_DETONATE_1);
- break;
- case 7:
- Talk(SAY_WP_5);
- break;
- case 8:
- DoCast(SPELL_DETONATE_2);
- break;
- case 9:
- Talk(SAY_WP_6);
- break;
- case 13:
- if (Player* player = GetPlayerForEscort())
- {
- player->GroupEventHappens(QUEST_DISASTER, me);
- Talk(SAY_WP_7);
- }
- break;
- default:
- break;
- }
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- if (HasEscortState(STATE_ESCORT_ESCORTING))
- {
- if (Player* player = GetPlayerForEscort())
- player->FailQuest(QUEST_DISASTER);
- }
- }
-
- void OnQuestAccept(Player* player, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_DISASTER)
- {
- me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE);
-
- Start(false, false, player->GetGUID());
- Talk(SAY_WP_1);
- }
- }
-};
-
-class spell_q12688_detonate_1 : public SpellScript
-{
- PrepareSpellScript(spell_q12688_detonate_1);
-
- static constexpr uint32 SPAWN_GROUP_FLAMES = 67;
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_EXPLOSION });
- }
-
- void HandleDummyEffect(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- {
- target->CastSpell(target, SPELL_EXPLOSION);
-
- std::vector<WorldObject*> flames;
- target->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_FLAMES, false, false, &flames);
- target->GetMap()->SetSpawnGroupInactive(SPAWN_GROUP_FLAMES);
- for (WorldObject* flame : flames)
- {
- if (GameObject* flame_go = flame->ToGameObject())
- flame_go->DespawnOrUnsummon(20s);
- }
- }
- }
-
- void HandleAfterHit()
- {
- if (Creature* caster = GetCaster()->ToCreature())
- caster->AI()->Talk(EngineerHelice::SAY_WP_4);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_q12688_detonate_1::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- AfterHit += SpellHitFn(spell_q12688_detonate_1::HandleAfterHit);
- }
-};
-
-class spell_q12688_detonate_2 : public SpellScript
-{
- PrepareSpellScript(spell_q12688_detonate_2);
-
- static constexpr uint32 SPAWN_GROUP_FLAMES = 68;
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_EXPLOSION });
- }
-
- void HandleDummyEffect(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- {
- target->CastSpell(target, SPELL_EXPLOSION);
-
- std::vector<WorldObject*> flames;
- target->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_FLAMES, false, false, &flames);
- target->GetMap()->SetSpawnGroupInactive(SPAWN_GROUP_FLAMES);
- for (WorldObject* flame : flames)
- {
- if (GameObject* flame_go = flame->ToGameObject())
- flame_go->DespawnOrUnsummon(20s);
- }
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_q12688_detonate_2::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
/*#####
## npc_jungle_punch_target
#####*/
@@ -367,77 +211,42 @@ private:
};
/*######
-## Quest The Lifewarden's Wrath
+## Quest: Song of Wind and Water ID: 12726
######*/
-
-enum MiscLifewarden
+/*This quest precisly needs core script since battle vehicles are not well integrated with SAI,
+may be easily converted to SAI when they get.*/
+enum SongOfWindAndWater
{
- NPC_PRESENCE = 28563, // Freya's Presence
- NPC_SABOTEUR = 28538, // Cultist Saboteur
- NPC_SERVANT = 28320, // Servant of Freya
-
- WHISPER_ACTIVATE = 0,
-
- SPELL_FREYA_DUMMY = 51318,
- SPELL_LIFEFORCE = 51395,
- SPELL_FREYA_DUMMY_TRIGGER = 51335,
- SPELL_LASHER_EMERGE = 48195,
- SPELL_WILD_GROWTH = 52948,
+ // Spells
+ SPELL_DEVOUR_WIND = 52862,
+ SPELL_DEVOUR_WATER = 52864,
+ // NPCs
+ NPC_HAIPHOON_WATER = 28999,
+ NPC_HAIPHOON_AIR = 28985
};
-// 51957 - Call of the Lifewarden
-class spell_q12620_the_lifewarden_wrath : public SpellScript
+struct npc_haiphoon : public VehicleAI
{
- PrepareSpellScript(spell_q12620_the_lifewarden_wrath);
+ npc_haiphoon(Creature* creature) : VehicleAI(creature) { }
- void HandleSendEvent(SpellEffIndex effIndex)
+ void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
{
- PreventHitDefaultEffect(effIndex);
+ if (target == me)
+ return;
- if (Unit* caster = GetCaster())
+ if (spellInfo->Id == SPELL_DEVOUR_WIND && me->GetCharmerOrOwnerPlayerOrPlayerItself())
{
- if (Creature* presence = caster->FindNearestCreature(NPC_PRESENCE, 50.0f))
- {
- presence->AI()->Talk(WHISPER_ACTIVATE, caster);
- presence->CastSpell(presence, SPELL_FREYA_DUMMY, true); // will target plants
- // Freya Dummy could be scripted with the following code
-
- // Revive plants
- std::list<Creature*> servants;
- GetCaster()->GetCreatureListWithEntryInGrid(servants, NPC_SERVANT, 200.0f);
- for (std::list<Creature*>::iterator itr = servants.begin(); itr != servants.end(); ++itr)
- {
- // Couldn't find a spell that does this
- if ((*itr)->isDead())
- (*itr)->Respawn(true);
-
- (*itr)->CastSpell(*itr, SPELL_FREYA_DUMMY_TRIGGER, true);
- (*itr)->CastSpell(*itr, SPELL_LASHER_EMERGE, false);
- (*itr)->CastSpell(*itr, SPELL_WILD_GROWTH, false);
-
- if (Unit* target = (*itr)->SelectNearestTarget(150.0f))
- (*itr)->AI()->AttackStart(target);
- }
-
- // Kill nearby enemies
- std::list<Creature*> saboteurs;
- caster->GetCreatureListWithEntryInGrid(saboteurs, NPC_SABOTEUR, 200.0f);
- for (std::list<Creature*>::iterator itr = saboteurs.begin(); itr != saboteurs.end(); ++itr)
- if ((*itr)->IsAlive())
- // Lifeforce has a cast duration, it should be cast at all saboteurs one by one
- presence->CastSpell((*itr), SPELL_LIFEFORCE, false);
- }
+ me->UpdateEntry(NPC_HAIPHOON_AIR);
+ }
+ else if (spellInfo->Id == SPELL_DEVOUR_WATER && me->GetCharmerOrOwnerPlayerOrPlayerItself())
+ {
+ me->UpdateEntry(NPC_HAIPHOON_WATER);
}
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_q12620_the_lifewarden_wrath::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
}
};
/*######
-## Quest Kick, What Kick? (12589)
+## Quest 12589: Kick, What Kick?
######*/
enum KickWhatKick
@@ -464,9 +273,9 @@ enum KickWhatKick
};
// 51330 - Shoot RJR
-class spell_q12589_shoot_rjr : public SpellScript
+class spell_sholazar_shoot_rjr : public SpellScript
{
- PrepareSpellScript(spell_q12589_shoot_rjr);
+ PrepareSpellScript(spell_sholazar_shoot_rjr);
SpellCastResult CheckCast()
{
@@ -541,46 +350,86 @@ class spell_q12589_shoot_rjr : public SpellScript
void Register() override
{
- OnCheckCast += SpellCheckCastFn(spell_q12589_shoot_rjr::CheckCast);
- OnEffectHitTarget += SpellEffectFn(spell_q12589_shoot_rjr::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_sholazar_shoot_rjr::CheckCast);
+ OnEffectHitTarget += SpellEffectFn(spell_sholazar_shoot_rjr::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
/*######
-## Quest: Song of Wind and Water ID: 12726
+## Quest 12620: The Lifewarden's Wrath
######*/
-/*This quest precisly needs core script since battle vehicles are not well integrated with SAI,
-may be easily converted to SAI when they get.*/
-enum SongOfWindAndWater
+
+enum TheLifewardensWrath
{
- // Spells
- SPELL_DEVOUR_WIND = 52862,
- SPELL_DEVOUR_WATER = 52864,
- // NPCs
- NPC_HAIPHOON_WATER = 28999,
- NPC_HAIPHOON_AIR = 28985
+ NPC_FREYAS_PRESENCE = 28563,
+
+ WHISPER_ACTIVATE = 0,
+
+ SPELL_FREYA_DUMMY_TRIGGER = 51335,
+ SPELL_LASHER_EMERGE = 48195,
+ SPELL_WILD_GROWTH = 52948
};
-struct npc_haiphoon : public VehicleAI
+// 51957 - Call of the Lifewarden
+class spell_sholazar_call_of_the_lifewarden : public SpellScript
{
- npc_haiphoon(Creature* creature) : VehicleAI(creature) { }
+ PrepareSpellScript(spell_sholazar_call_of_the_lifewarden);
- void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
+ void HandleSendEvent(SpellEffIndex effIndex)
{
- if (target == me)
- return;
+ PreventHitDefaultEffect(effIndex);
- if (spellInfo->Id == SPELL_DEVOUR_WIND && me->GetCharmerOrOwnerPlayerOrPlayerItself())
+ if (Creature* presence = GetCaster()->FindNearestCreature(NPC_FREYAS_PRESENCE, 50.0f))
{
- me->UpdateEntry(NPC_HAIPHOON_AIR);
+ presence->AI()->Talk(WHISPER_ACTIVATE, GetCaster());
+ presence->AI()->SetData(1, 1);
}
- else if (spellInfo->Id == SPELL_DEVOUR_WATER && me->GetCharmerOrOwnerPlayerOrPlayerItself())
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_sholazar_call_of_the_lifewarden::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT);
+ }
+};
+
+// 51318 - Freya Dummy
+class spell_sholazar_freya_dummy : public SpellScript
+{
+ PrepareSpellScript(spell_sholazar_freya_dummy);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
{
- me->UpdateEntry(NPC_HAIPHOON_WATER);
- }
+ SPELL_FREYA_DUMMY_TRIGGER,
+ SPELL_LASHER_EMERGE,
+ SPELL_WILD_GROWTH
+ });
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* target = GetHitUnit();
+
+ target->CastSpell(target, SPELL_FREYA_DUMMY_TRIGGER, true);
+ target->CastSpell(target, SPELL_LASHER_EMERGE, false);
+ target->CastSpell(target, SPELL_WILD_GROWTH, false);
+ // This probably is scripted by the Emerge spell from above
+ target->SetEmoteState(EMOTE_ONESHOT_NONE);
+ target->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ target->SetImmuneToNPC(false);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sholazar_freya_dummy::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
+/*######
+## Quest 12611: Returned Sevenfold
+######*/
+
enum ReturnedSevenfold
{
SPELL_FREYAS_WARD = 51845,
@@ -589,21 +438,21 @@ enum ReturnedSevenfold
};
// 51854 - Deathbolt
-class spell_q12611_deathbolt : public SpellScript
+class spell_sholazar_deathbolt : public SpellScript
{
- PrepareSpellScript(spell_q12611_deathbolt);
+ PrepareSpellScript(spell_sholazar_deathbolt);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(
- {
- SPELL_FREYAS_WARD,
- SPELL_SEVENFOLD_RETRIBUTION,
- SPELL_DEATHBOLT
- });
+ {
+ SPELL_FREYAS_WARD,
+ SPELL_SEVENFOLD_RETRIBUTION,
+ SPELL_DEATHBOLT
+ });
}
- void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ void HandleScript(SpellEffIndex /* effIndex */)
{
Unit* caster = GetCaster();
Unit* target = GetHitUnit();
@@ -616,7 +465,7 @@ class spell_q12611_deathbolt : public SpellScript
void Register() override
{
- OnEffectHitTarget += SpellEffectFn(spell_q12611_deathbolt::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ OnEffectHitTarget += SpellEffectFn(spell_sholazar_deathbolt::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
@@ -886,14 +735,12 @@ class spell_sholazar_lifeblood_dummy : public SpellScript
void AddSC_sholazar_basin()
{
- RegisterCreatureAI(npc_engineer_helice);
- RegisterSpellScript(spell_q12688_detonate_1);
- RegisterSpellScript(spell_q12688_detonate_2);
RegisterCreatureAI(npc_jungle_punch_target);
- RegisterSpellScript(spell_q12620_the_lifewarden_wrath);
- RegisterSpellScript(spell_q12589_shoot_rjr);
RegisterCreatureAI(npc_haiphoon);
- RegisterSpellScript(spell_q12611_deathbolt);
+ RegisterSpellScript(spell_sholazar_shoot_rjr);
+ RegisterSpellScript(spell_sholazar_call_of_the_lifewarden);
+ RegisterSpellScript(spell_sholazar_freya_dummy);
+ RegisterSpellScript(spell_sholazar_deathbolt);
RegisterSpellScript(spell_sholazar_take_sputum_sample);
RegisterSpellScript(spell_sholazar_sputum_collected);
RegisterSpellScript(spell_sholazar_song_of_cleansing);