/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ /* * Scripts for spells with SPELLFAMILY_GENERIC spells used for quests. * Ordered alphabetically using questId and scriptname. * Scriptnames of files in this file should be prefixed with "spell_q#questID_". */ #include "ScriptMgr.h" #include "CreatureAIImpl.h" #include "ObjectMgr.h" #include "Player.h" #include "ScriptedCreature.h" #include "SpellAuraEffects.h" #include "SpellScript.h" #include "Vehicle.h" class spell_generic_quest_update_entry_SpellScript : public SpellScript { private: uint16 _spellEffect; uint8 _effIndex; uint32 _originalEntry; uint32 _newEntry; bool _shouldAttack; Milliseconds _despawnTime; public: spell_generic_quest_update_entry_SpellScript(uint16 spellEffect, uint8 effIndex, uint32 originalEntry, uint32 newEntry, bool shouldAttack, Milliseconds despawnTime = 0s) : SpellScript(), _spellEffect(spellEffect), _effIndex(effIndex), _originalEntry(originalEntry), _newEntry(newEntry), _shouldAttack(shouldAttack), _despawnTime(despawnTime) { } void HandleDummy(SpellEffIndex /*effIndex*/) { if (Creature* creatureTarget = GetHitCreature()) if (!creatureTarget->IsPet() && creatureTarget->GetEntry() == _originalEntry) { creatureTarget->UpdateEntry(_newEntry); if (_shouldAttack) creatureTarget->EngageWithTarget(GetCaster()); if (_despawnTime != 0s) creatureTarget->DespawnOrUnsummon(_despawnTime); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_generic_quest_update_entry_SpellScript::HandleDummy, _effIndex, _spellEffect); } }; // http://www.wowhead.com/quest=55 Morbent Fel enum Quest55Data { NPC_MORBENT = 1200, NPC_WEAKENED_MORBENT = 24782, }; // 8913 - Sacred Cleansing class spell_q55_sacred_cleansing : public SpellScriptLoader { public: spell_q55_sacred_cleansing() : SpellScriptLoader("spell_q55_sacred_cleansing") { } SpellScript* GetSpellScript() const override { return new spell_generic_quest_update_entry_SpellScript(SPELL_EFFECT_DUMMY, EFFECT_1, NPC_MORBENT, NPC_WEAKENED_MORBENT, true); } }; enum ThaumaturgyChannel { SPELL_THAUMATURGY_CHANNEL = 21029 }; // 9712 - Thaumaturgy Channel class spell_q2203_thaumaturgy_channel : public AuraScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_THAUMATURGY_CHANNEL }); } void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); if (Unit* caster = GetCaster()) caster->CastSpell(caster, SPELL_THAUMATURGY_CHANNEL, false); } void Register() override { OnEffectPeriodic += AuraEffectPeriodicFn(spell_q2203_thaumaturgy_channel::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; // http://www.wowhead.com/quest=6124 Curing the Sick (A) // http://www.wowhead.com/quest=6129 Curing the Sick (H) enum Quests6124_6129Data { NPC_SICKLY_GAZELLE = 12296, NPC_CURED_GAZELLE = 12297, NPC_SICKLY_DEER = 12298, NPC_CURED_DEER = 12299, }; constexpr Milliseconds Quest6124_6129_DESPAWN_TIME = 30s; // 19512 - Apply Salve class spell_q6124_6129_apply_salve : public SpellScript { bool Load() override { return GetCaster()->GetTypeId() == TYPEID_PLAYER; } void HandleDummy(SpellEffIndex /*effIndex*/) { Player* caster = GetCaster()->ToPlayer(); if (GetCastItem()) if (Creature* creatureTarget = GetHitCreature()) { uint32 newEntry = 0; switch (caster->GetTeam()) { case HORDE: if (creatureTarget->GetEntry() == NPC_SICKLY_GAZELLE) newEntry = NPC_CURED_GAZELLE; break; case ALLIANCE: if (creatureTarget->GetEntry() == NPC_SICKLY_DEER) newEntry = NPC_CURED_DEER; break; default: break; } if (newEntry) { creatureTarget->UpdateEntry(newEntry); creatureTarget->DespawnOrUnsummon(Quest6124_6129_DESPAWN_TIME); caster->KilledMonsterCredit(newEntry); } } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q6124_6129_apply_salve::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // http://www.wowhead.com/quest=10255 Testing the Antidote enum Quest10255Data { NPC_HELBOAR = 16880, NPC_DREADTUSK = 16992, }; // 34665 - Administer Antidote class spell_q10255_administer_antidote : public SpellScriptLoader { public: spell_q10255_administer_antidote() : SpellScriptLoader("spell_q10255_administer_antidote") { } SpellScript* GetSpellScript() const override { return new spell_generic_quest_update_entry_SpellScript(SPELL_EFFECT_DUMMY, EFFECT_0, NPC_HELBOAR, NPC_DREADTUSK, true); } }; // http://www.wowhead.com/quest=11396 Bring Down Those Shields (A) // http://www.wowhead.com/quest=11399 Bring Down Those Shields (H) enum Quest11396_11399Data { SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3 = 43874, SPELL_SCOURGING_CRYSTAL_CONTROLLER = 43878 }; // 43874 - Scourge Mur'gul Camp: Force Shield Arcane Purple x3 class spell_q11396_11399_force_shield_arcane_purple_x3 : public AuraScript { void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); target->SetImmuneToPC(true); target->AddUnitState(UNIT_STATE_ROOT); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { GetTarget()->SetImmuneToPC(false); } void Register() override { OnEffectApply += AuraEffectApplyFn(spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); OnEffectRemove += AuraEffectRemoveFn(spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; // 50133 - Scourging Crystal Controller class spell_q11396_11399_scourging_crystal_controller : public SpellScript { bool Validate(SpellInfo const* /*spellEntry*/) override { return ValidateSpellInfo({ SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3, SPELL_SCOURGING_CRYSTAL_CONTROLLER }); } void HandleDummy(SpellEffIndex /*effIndex*/) { if (Unit* target = GetHitUnit()) if (target->GetTypeId() == TYPEID_UNIT && target->HasAura(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3)) // Make sure nobody else is channeling the same target if (!target->HasAura(SPELL_SCOURGING_CRYSTAL_CONTROLLER)) GetCaster()->CastSpell(target, SPELL_SCOURGING_CRYSTAL_CONTROLLER, GetCastItem()); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q11396_11399_scourging_crystal_controller::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 43882 - Scourging Crystal Controller Dummy class spell_q11396_11399_scourging_crystal_controller_dummy : public SpellScript { bool Validate(SpellInfo const* /*spellEntry*/) override { return ValidateSpellInfo({ SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3 }); } void HandleDummy(SpellEffIndex /*effIndex*/) { if (Unit* target = GetHitUnit()) if (target->GetTypeId() == TYPEID_UNIT) target->RemoveAurasDueToSpell(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q11396_11399_scourging_crystal_controller_dummy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // http://www.wowhead.com/quest=11515 Blood for Blood enum Quest11515Data { NPC_FELBLOOD_INITIATE = 24918, NPC_EMACIATED_FELBLOOD = 24955 }; // 44936 - Quest - Fel Siphon Dummy class spell_q11515_fel_siphon_dummy : public SpellScriptLoader { public: spell_q11515_fel_siphon_dummy() : SpellScriptLoader("spell_q11515_fel_siphon_dummy") { } SpellScript* GetSpellScript() const override { return new spell_generic_quest_update_entry_SpellScript(SPELL_EFFECT_DUMMY, EFFECT_0, NPC_FELBLOOD_INITIATE, NPC_EMACIATED_FELBLOOD, true); } }; // http://www.wowhead.com/quest=11730 Master and Servant enum Quest11730Data { SPELL_SUMMON_SCAVENGEBOT_004A8 = 46063, SPELL_SUMMON_SENTRYBOT_57K = 46068, SPELL_SUMMON_DEFENDOTANK_66D = 46058, SPELL_SUMMON_SCAVENGEBOT_005B6 = 46066, SPELL_SUMMON_55D_COLLECTATRON = 46034, SPELL_ROBOT_KILL_CREDIT = 46027, NPC_SCAVENGEBOT_004A8 = 25752, NPC_SENTRYBOT_57K = 25753, NPC_DEFENDOTANK_66D = 25758, NPC_SCAVENGEBOT_005B6 = 25792, NPC_55D_COLLECTATRON = 25793 }; // 46023 - The Ultrasonic Screwdriver class spell_q11730_ultrasonic_screwdriver : public SpellScript { bool Load() override { return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem(); } bool Validate(SpellInfo const* /*spellEntry*/) override { return ValidateSpellInfo( { SPELL_SUMMON_SCAVENGEBOT_004A8, SPELL_SUMMON_SENTRYBOT_57K, SPELL_SUMMON_DEFENDOTANK_66D, SPELL_SUMMON_SCAVENGEBOT_005B6, SPELL_SUMMON_55D_COLLECTATRON, SPELL_ROBOT_KILL_CREDIT }); } void HandleDummy(SpellEffIndex /*effIndex*/) { Item* castItem = GetCastItem(); Unit* caster = GetCaster(); if (Creature* target = GetHitCreature()) { uint32 spellId = 0; switch (target->GetEntry()) { case NPC_SCAVENGEBOT_004A8: spellId = SPELL_SUMMON_SCAVENGEBOT_004A8; break; case NPC_SENTRYBOT_57K: spellId = SPELL_SUMMON_SENTRYBOT_57K; break; case NPC_DEFENDOTANK_66D: spellId = SPELL_SUMMON_DEFENDOTANK_66D; break; case NPC_SCAVENGEBOT_005B6: spellId = SPELL_SUMMON_SCAVENGEBOT_005B6; break; case NPC_55D_COLLECTATRON: spellId = SPELL_SUMMON_55D_COLLECTATRON; break; default: return; } caster->CastSpell(caster, spellId, castItem); caster->CastSpell(caster, SPELL_ROBOT_KILL_CREDIT, true); target->DespawnOrUnsummon(); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q11730_ultrasonic_screwdriver::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // http://www.wowhead.com/quest=12459 That Which Creates Can Also Destroy enum Quest12459Data { NPC_REANIMATED_FROSTWYRM = 26841, NPC_WEAK_REANIMATED_FROSTWYRM = 27821, NPC_TURGID = 27808, NPC_WEAK_TURGID = 27809, NPC_DEATHGAZE = 27122, NPC_WEAK_DEATHGAZE = 27807, }; // 49587 - Seeds of Nature's Wrath class spell_q12459_seeds_of_natures_wrath : public SpellScript { void HandleDummy(SpellEffIndex /*effIndex*/) { if (Creature* creatureTarget = GetHitCreature()) { uint32 uiNewEntry = 0; switch (creatureTarget->GetEntry()) { case NPC_REANIMATED_FROSTWYRM: uiNewEntry = NPC_WEAK_REANIMATED_FROSTWYRM; break; case NPC_TURGID: uiNewEntry = NPC_WEAK_TURGID; break; case NPC_DEATHGAZE: uiNewEntry = NPC_WEAK_DEATHGAZE; break; } if (uiNewEntry) creatureTarget->UpdateEntry(uiNewEntry); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12459_seeds_of_natures_wrath::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // http://www.wowhead.com/quest=12634 Some Make Lemonade, Some Make Liquor enum Quest12634Data { SPELL_BANANAS_FALL_TO_GROUND = 51836, SPELL_ORANGE_FALLS_TO_GROUND = 51837, SPELL_PAPAYA_FALLS_TO_GROUND = 51839, SPELL_SUMMON_ADVENTUROUS_DWARF = 52070 }; // 51840 - Despawn Fruit Tosser class spell_q12634_despawn_fruit_tosser : public SpellScript { bool Validate(SpellInfo const* /*spellEntry*/) override { return ValidateSpellInfo( { SPELL_BANANAS_FALL_TO_GROUND, SPELL_ORANGE_FALLS_TO_GROUND, SPELL_PAPAYA_FALLS_TO_GROUND, SPELL_SUMMON_ADVENTUROUS_DWARF }); } void HandleDummy(SpellEffIndex /*effIndex*/) { uint32 spellId = SPELL_BANANAS_FALL_TO_GROUND; switch (urand(0, 3)) { case 1: spellId = SPELL_ORANGE_FALLS_TO_GROUND; break; case 2: spellId = SPELL_PAPAYA_FALLS_TO_GROUND; break; } // sometimes, if you're lucky, you get a dwarf if (roll_chance_i(5)) spellId = SPELL_SUMMON_ADVENTUROUS_DWARF; GetCaster()->CastSpell(GetCaster(), spellId, true); } void Register() override { OnEffectHit += SpellEffectFn(spell_q12634_despawn_fruit_tosser::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // http://www.wowhead.com/quest=12851 Going Bearback enum Quest12851Data { NPC_FROSTGIANT = 29351, NPC_FROSTWORG = 29358, SPELL_FROSTGIANT_CREDIT = 58184, SPELL_FROSTWORG_CREDIT = 58183, SPELL_IMMOLATION = 54690, SPELL_ABLAZE = 54683, }; // 54798 - FLAMING Arrow Triggered Effect class spell_q12851_going_bearback : public AuraScript { void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Unit* caster = GetCaster()) { Unit* target = GetTarget(); // Already in fire if (target->HasAura(SPELL_ABLAZE)) return; if (Player* player = caster->GetCharmerOrOwnerPlayerOrPlayerItself()) { switch (target->GetEntry()) { case NPC_FROSTWORG: target->CastSpell(player, SPELL_FROSTWORG_CREDIT, true); target->CastSpell(target, SPELL_IMMOLATION, true); target->CastSpell(target, SPELL_ABLAZE, true); break; case NPC_FROSTGIANT: target->CastSpell(player, SPELL_FROSTGIANT_CREDIT, true); target->CastSpell(target, SPELL_IMMOLATION, true); target->CastSpell(target, SPELL_ABLAZE, true); break; } } } } void Register() override { AfterEffectApply += AuraEffectApplyFn(spell_q12851_going_bearback::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; // http://www.wowhead.com/quest=12659 Scalps! enum Quest12659Data { NPC_SCALPS_KC_BUNNY = 28622, }; // 52090 - Ahunae's Knife class spell_q12659_ahunaes_knife : public SpellScript { bool Load() override { return GetCaster()->GetTypeId() == TYPEID_PLAYER; } void HandleDummy(SpellEffIndex /*effIndex*/) { Player* caster = GetCaster()->ToPlayer(); if (Creature* target = GetHitCreature()) { target->DespawnOrUnsummon(); caster->KilledMonsterCredit(NPC_SCALPS_KC_BUNNY); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12659_ahunaes_knife::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; enum SalvagingLifesStength { NPC_SHARD_KILL_CREDIT = 29303, }; // 54190 - Lifeblood Dummy class spell_q12805_lifeblood_dummy : public SpellScript { bool Load() override { return GetCaster()->GetTypeId() == TYPEID_PLAYER; } void HandleScript(SpellEffIndex /*effIndex*/) { Player* caster = GetCaster()->ToPlayer(); if (Creature* target = GetHitCreature()) { caster->KilledMonsterCredit(NPC_SHARD_KILL_CREDIT); target->CastSpell(target, uint32(GetEffectValue()), true); target->DespawnOrUnsummon(2s); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12805_lifeblood_dummy::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; /* http://www.wowhead.com/quest=13283 King of the Mountain http://www.wowhead.com/quest=13280 King of the Mountain */ enum BattleStandard { NPC_KING_OF_THE_MOUNTAINT_KC = 31766, SPELL_PLANT_HORDE_BATTLE_STANDARD = 59643, SPELL_HORDE_BATTLE_STANDARD_STATE = 59642, SPELL_ALLIANCE_BATTLE_STANDARD_STATE = 4339, SPELL_JUMP_ROCKET_BLAST = 4340 }; // 4338 - Plant Alliance Battle Standard // 59643 - Plant Horde Battle Standard class spell_q13280_13283_plant_battle_standard : public SpellScript { void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); Unit* target = GetHitUnit(); uint32 triggeredSpellID = SPELL_ALLIANCE_BATTLE_STANDARD_STATE; caster->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); if (caster->IsVehicle()) if (Unit* player = caster->GetVehicleKit()->GetPassenger(0)) player->ToPlayer()->KilledMonsterCredit(NPC_KING_OF_THE_MOUNTAINT_KC); if (GetSpellInfo()->Id == SPELL_PLANT_HORDE_BATTLE_STANDARD) triggeredSpellID = SPELL_HORDE_BATTLE_STANDARD_STATE; target->RemoveAllAuras(); target->CastSpell(target, triggeredSpellID, true); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q13280_13283_plant_battle_standard::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 4336 - Jump Jets class spell_q13280_13283_jump_jets : public SpellScript { void HandleCast() { Unit* caster = GetCaster(); if (caster->IsVehicle()) if (Unit* rocketBunny = caster->GetVehicleKit()->GetPassenger(1)) rocketBunny->CastSpell(rocketBunny, SPELL_JUMP_ROCKET_BLAST, true); } void Register() override { OnCast += SpellCastFn(spell_q13280_13283_jump_jets::HandleCast); } }; enum FocusOnTheBeach { SPELL_BUNNY_CREDIT_BEAM = 47390, }; // 50546 - The Focus on the Beach: Ley Line Focus Control Ring Effect class spell_q12066_bunny_kill_credit : public SpellScript { void HandleDummy(SpellEffIndex /*effIndex*/) { if (Creature* target = GetHitCreature()) target->CastSpell(GetCaster(), SPELL_BUNNY_CREDIT_BEAM, false); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12066_bunny_kill_credit::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; enum DefendingWyrmrestTemple { SPELL_SUMMON_WYRMREST_DEFENDER = 49207 }; // 49213 - Defending Wyrmrest Temple: Character Script Cast From Gossip class spell_q12372_cast_from_gossip_trigger : public SpellScript { void HandleScript(SpellEffIndex /*effIndex*/) { GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_WYRMREST_DEFENDER, true); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12372_cast_from_gossip_trigger::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; // http://www.wowhead.com/quest=12372 Defending Wyrmrest Temple enum Quest12372Data { // NPCs NPC_WYRMREST_TEMPLE_CREDIT = 27698 }; // 49370 - Wyrmrest Defender: Destabilize Azure Dragonshrine Effect class spell_q12372_destabilize_azure_dragonshrine_dummy : public SpellScript { void HandleDummy(SpellEffIndex /*effIndex*/) { if (GetHitCreature()) if (Unit* caster = GetOriginalCaster()) if (Vehicle* vehicle = caster->GetVehicleKit()) if (Unit* passenger = vehicle->GetPassenger(0)) if (Player* player = passenger->ToPlayer()) player->KilledMonsterCredit(NPC_WYRMREST_TEMPLE_CREDIT); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12372_destabilize_azure_dragonshrine_dummy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // "Bombing Run" and "Bomb Them Again!" enum Quest11010_11102_11023Data { // Spell SPELL_FLAK_CANNON_TRIGGER = 40110, SPELL_CHOOSE_LOC = 40056, SPELL_AGGRO_CHECK = 40112, // NPCs NPC_FEL_CANNON2 = 23082 }; // 40113 - Knockdown Fel Cannon: The Aggro Check Aura class spell_q11010_q11102_q11023_aggro_check_aura : public AuraScript { void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { if (Unit* target = GetTarget()) // On trigger proccing target->CastSpell(target, SPELL_AGGRO_CHECK); } void Register() override { OnEffectPeriodic += AuraEffectPeriodicFn(spell_q11010_q11102_q11023_aggro_check_aura::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; // 40112 - Knockdown Fel Cannon: The Aggro Check class spell_q11010_q11102_q11023_aggro_check : public SpellScript { void HandleDummy(SpellEffIndex /*effIndex*/) { if (Player* playerTarget = GetHitPlayer()) // Check if found player target is on fly mount or using flying form if (playerTarget->HasAuraType(SPELL_AURA_FLY) || playerTarget->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED)) playerTarget->CastSpell(playerTarget, SPELL_FLAK_CANNON_TRIGGER, TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q11010_q11102_q11023_aggro_check::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 40119 - Knockdown Fel Cannon: The Aggro Burst class spell_q11010_q11102_q11023_aggro_burst : public AuraScript { void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { if (Unit* target = GetTarget()) // On each tick cast Choose Loc to trigger summon target->CastSpell(target, SPELL_CHOOSE_LOC); } void Register() override { OnEffectPeriodic += AuraEffectPeriodicFn(spell_q11010_q11102_q11023_aggro_burst::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; // 40056 - Knockdown Fel Cannon: Choose Loc class spell_q11010_q11102_q11023_choose_loc : public SpellScript { void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); // Check for player that is in 65 y range std::vector playerList; caster->GetPlayerListInGrid(playerList, 65.0f); for (Player* player : playerList) // Check if found player target is on fly mount or using flying form if (player->HasAuraType(SPELL_AURA_FLY) || player->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED)) // Summom Fel Cannon (bunny version) at found player caster->SummonCreature(NPC_FEL_CANNON2, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); } void Register() override { OnEffectHit += SpellEffectFn(spell_q11010_q11102_q11023_choose_loc::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 39844 - Skyguard Blasting Charge // 40160 - Throw Bomb class spell_q11010_q11102_q11023_q11008_check_fly_mount : public SpellScript { SpellCastResult CheckRequirement() { Unit* caster = GetCaster(); // This spell will be cast only if caster has one of these auras if (!(caster->HasAuraType(SPELL_AURA_FLY) || caster->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED))) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; return SPELL_CAST_OK; } void Register() override { OnCheckCast += SpellCheckCastFn(spell_q11010_q11102_q11023_q11008_check_fly_mount::CheckRequirement); } }; enum SpellZuldrakRat { SPELL_SUMMON_GORGED_LURKING_BASILISK = 50928 }; // 50894 - Zul'Drak Rat class spell_q12527_zuldrak_rat : public SpellScript { bool Validate(SpellInfo const* /*spell*/) override { return ValidateSpellInfo({ SPELL_SUMMON_GORGED_LURKING_BASILISK }); } void HandleScriptEffect(SpellEffIndex /* effIndex */) { if (GetHitAura() && GetHitAura()->GetStackAmount() >= GetSpellInfo()->StackAmount) { GetHitUnit()->CastSpell(nullptr, SPELL_SUMMON_GORGED_LURKING_BASILISK, true); if (Creature* basilisk = GetHitUnit()->ToCreature()) basilisk->DespawnOrUnsummon(); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12527_zuldrak_rat::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; // 55368 - Summon Stefan class spell_q12661_q12669_q12676_q12677_q12713_summon_stefan : public SpellScript { void SetDest(SpellDestination& dest) { // Adjust effect summon position Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; dest.RelocateOffset(offset); } void Register() override { OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); } }; enum QuenchingMist { SPELL_FLICKERING_FLAMES = 53504 }; // 53350 - Quenching Mist class spell_q12730_quenching_mist : public AuraScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_FLICKERING_FLAMES }); } void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { GetTarget()->RemoveAurasDueToSpell(SPELL_FLICKERING_FLAMES); } void Register() override { OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12730_quenching_mist::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); } }; // 13291 - Borrowed Technology/13292 - The Solution Solution /Daily//13239 - Volatility/13261 - Volatiliy /Daily// enum Quest13291_13292_13239_13261Data { // NPCs NPC_SKYTALON = 31583, NPC_DECOY = 31578, // Spells SPELL_RIDE = 59319 }; // 59318 - Grab Fake Soldier class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy : public SpellScript { bool Validate(SpellInfo const* /*spell*/) override { return ValidateSpellInfo({ SPELL_RIDE }); } void HandleDummy(SpellEffIndex /*effIndex*/) { if (!GetHitCreature()) return; // TO DO: Being triggered is hack, but in checkcast it doesn't pass aurastate requirements. // Beside that the decoy won't keep it's freeze animation state when enter. GetHitCreature()->CastSpell(GetCaster(), SPELL_RIDE, true); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 59303 - Summon Frost Wyrm class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : public SpellScript { void SetDest(SpellDestination& dest) { // Adjust effect summon position Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; dest.RelocateOffset(offset); } void Register() override { OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); } }; // 12601 - Second Chances: Summon Landgren's Soul Moveto Target Bunny class spell_q12847_summon_soul_moveto_bunny : public SpellScript { void SetDest(SpellDestination& dest) { // Adjust effect summon position Position const offset = { 0.0f, 0.0f, 2.5f, 0.0f }; dest.RelocateOffset(offset); } void Register() override { OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12847_summon_soul_moveto_bunny::SetDest, EFFECT_0, TARGET_DEST_CASTER); } }; // 57385 - Argent Cannon // 57412 - Reckoning Bomb class spell_q13086_cannons_target : public SpellScript { bool Validate(SpellInfo const* spellInfo) override { return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ static_cast(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); } void HandleEffectDummy(SpellEffIndex /*effIndex*/) { if (WorldLocation const* pos = GetExplTargetDest()) GetCaster()->CastSpell(pos->GetPosition(), GetEffectValue(), true); } void Register() override { OnEffectHit += SpellEffectFn(spell_q13086_cannons_target::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; enum BurstAtTheSeams { AREA_THE_BROKEN_FRONT = 4507, AREA_MORD_RETHAR_THE_DEATH_GATE = 4508, NPC_DRAKKARI_CHIEFTAINK = 29099, NPC_ICY_GHOUL = 31142, NPC_VICIOUS_GEIST = 31147, NPC_RISEN_ALLIANCE_SOLDIERS = 31205, NPC_RENIMATED_ABOMINATION = 31692, QUEST_FUEL_FOR_THE_FIRE = 12690, SPELL_BLOATED_ABOMINATION_FEIGN_DEATH = 52593, SPELL_BURST_AT_THE_SEAMS_BONE = 52516, SPELL_EXPLODE_ABOMINATION_MEAT = 52520, SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT = 52523, SPELL_TROLL_EXPLOSION = 52565, SPELL_EXPLODE_TROLL_MEAT = 52578, SPELL_EXPLODE_TROLL_BLOODY_MEAT = 52580, SPELL_BURST_AT_THE_SEAMS_59576 = 59576, //script/knockback, That's Abominable SPELL_BURST_AT_THE_SEAMS_59579 = 59579, //dummy SPELL_BURST_AT_THE_SEAMS_52510 = 52510, //script/knockback, Fuel for the Fire SPELL_BURST_AT_THE_SEAMS_52508 = 52508, //damage 20000 SPELL_BURST_AT_THE_SEAMS_59580 = 59580, //damage 50000 SPELL_ASSIGN_GHOUL_KILL_CREDIT_TO_MASTER = 59590, SPELL_ASSIGN_GEIST_KILL_CREDIT_TO_MASTER = 60041, SPELL_ASSIGN_SKELETON_KILL_CREDIT_TO_MASTER = 60039, SPELL_DRAKKARI_SKULLCRUSHER_CREDIT = 52590, SPELL_SUMMON_DRAKKARI_CHIEFTAIN = 52616, SPELL_DRAKKARI_CHIEFTAINK_KILL_CREDIT = 52620 }; // 59576 - Burst at the Seams class spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59576 : public SpellScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo( { SPELL_BURST_AT_THE_SEAMS_59576, SPELL_BLOATED_ABOMINATION_FEIGN_DEATH, SPELL_BURST_AT_THE_SEAMS_59579, SPELL_BURST_AT_THE_SEAMS_BONE, SPELL_EXPLODE_ABOMINATION_MEAT, SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT }); } void HandleScript(SpellEffIndex /*effIndex*/) { if (Creature* creature = GetCaster()->ToCreature()) { creature->CastSpell(creature, SPELL_BLOATED_ABOMINATION_FEIGN_DEATH, true); creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_59579, true); creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_BONE, true); creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_BONE, true); creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_BONE, true); creature->CastSpell(creature, SPELL_EXPLODE_ABOMINATION_MEAT, true); creature->CastSpell(creature, SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT, true); creature->CastSpell(creature, SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT, true); creature->CastSpell(creature, SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT, true); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59576::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; // 59579 - Burst at the Seams class spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59579 : public AuraScript { void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); target->CastSpell(target, SPELL_TROLL_EXPLOSION, true); target->CastSpell(target, SPELL_EXPLODE_ABOMINATION_MEAT, true); target->CastSpell(target, SPELL_EXPLODE_TROLL_MEAT, true); target->CastSpell(target, SPELL_EXPLODE_TROLL_MEAT, true); target->CastSpell(target, SPELL_EXPLODE_TROLL_BLOODY_MEAT, true); target->CastSpell(target, SPELL_BURST_AT_THE_SEAMS_BONE, true); } void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); if (Unit* caster = GetCaster()) { switch (target->GetEntry()) { case NPC_ICY_GHOUL: target->CastSpell(caster, SPELL_ASSIGN_GHOUL_KILL_CREDIT_TO_MASTER, true); break; case NPC_VICIOUS_GEIST: target->CastSpell(caster, SPELL_ASSIGN_GEIST_KILL_CREDIT_TO_MASTER, true); break; case NPC_RISEN_ALLIANCE_SOLDIERS: target->CastSpell(caster, SPELL_ASSIGN_SKELETON_KILL_CREDIT_TO_MASTER, true); break; } } target->CastSpell(target, SPELL_BURST_AT_THE_SEAMS_59580, true); } void Register() override { AfterEffectApply += AuraEffectApplyFn(spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59579::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); AfterEffectRemove += AuraEffectApplyFn(spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59579::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; // 52593 - Bloated Abomination Feign Death class spell_q13264_q13276_q13288_q13289_bloated_abom_feign_death : public AuraScript { void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); target->SetUnitFlag3(UNIT_FLAG3_FAKE_DEAD); target->SetUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); if (Creature* creature = target->ToCreature()) creature->SetReactState(REACT_PASSIVE); } void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); if (Creature* creature = target->ToCreature()) creature->DespawnOrUnsummon(); } void Register() override { AfterEffectApply += AuraEffectApplyFn(spell_q13264_q13276_q13288_q13289_bloated_abom_feign_death::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); AfterEffectRemove += AuraEffectApplyFn(spell_q13264_q13276_q13288_q13289_bloated_abom_feign_death::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; // 76245 - Area Restrict Abom class spell_q13264_q13276_q13288_q13289_area_restrict_abom : public SpellScript { void HandleScript(SpellEffIndex /*effIndex*/) { if (Creature* creature = GetHitCreature()) { uint32 area = creature->GetAreaId(); if (area != AREA_THE_BROKEN_FRONT && area != AREA_MORD_RETHAR_THE_DEATH_GATE) creature->DespawnOrUnsummon(); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q13264_q13276_q13288_q13289_area_restrict_abom::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; // 59590 - Assign Ghoul Kill Credit to Master // 60039 - Assign Skeleton Kill Credit to Master // 60041 - Assign Geist Kill Credit to Master class spell_q13264_q13276_q13288_q13289_assign_credit_to_master : public SpellScript { void HandleScript(SpellEffIndex /*effIndex*/) { if (Unit* target = GetHitUnit()) { if (Unit* owner = target->GetOwner()) { owner->CastSpell(owner, GetEffectValue(), true); } } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q13264_q13276_q13288_q13289_assign_credit_to_master::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; // 52510 - Burst at the Seams class spell_q12690_burst_at_the_seams_52510 : public SpellScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo( { SPELL_BURST_AT_THE_SEAMS_52510, SPELL_BURST_AT_THE_SEAMS_52508, SPELL_BURST_AT_THE_SEAMS_59580, SPELL_BURST_AT_THE_SEAMS_BONE, SPELL_EXPLODE_ABOMINATION_MEAT, SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT }); } bool Load() override { return GetCaster()->GetTypeId() == TYPEID_UNIT; } void HandleKnockBack(SpellEffIndex /*effIndex*/) { if (Unit* creature = GetHitCreature()) { if (Unit* charmer = GetCaster()->GetCharmerOrOwner()) { if (Player* player = charmer->ToPlayer()) { if (player->GetQuestStatus(QUEST_FUEL_FOR_THE_FIRE) == QUEST_STATUS_INCOMPLETE) { creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_BONE, true); creature->CastSpell(creature, SPELL_EXPLODE_ABOMINATION_MEAT, true); creature->CastSpell(creature, SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT, true); creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_52508, true); creature->CastSpell(creature, SPELL_BURST_AT_THE_SEAMS_59580, true); player->CastSpell(player, SPELL_DRAKKARI_SKULLCRUSHER_CREDIT, true); uint16 count = player->GetReqKillOrCastCurrentCount(QUEST_FUEL_FOR_THE_FIRE, NPC_DRAKKARI_CHIEFTAINK); if ((count % 20) == 0) player->CastSpell(player, SPELL_SUMMON_DRAKKARI_CHIEFTAIN, true); } } } } } void HandleScript(SpellEffIndex /*effIndex*/) { GetCaster()->ToCreature()->DespawnOrUnsummon(2s); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12690_burst_at_the_seams_52510::HandleKnockBack, EFFECT_1, SPELL_EFFECT_KNOCK_BACK); OnEffectHitTarget += SpellEffectFn(spell_q12690_burst_at_the_seams_52510::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum EscapeFromSilverbrook { SPELL_SUMMON_WORGEN = 48681 }; // 48682 - Escape from Silverbrook - Periodic Dummy class spell_q12308_escape_from_silverbrook : public SpellScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_SUMMON_WORGEN }); } void HandleDummy(SpellEffIndex /*effIndex*/) { GetCaster()->CastSpell(GetCaster(), SPELL_SUMMON_WORGEN, true); } void Register() override { OnEffectHit += SpellEffectFn(spell_q12308_escape_from_silverbrook::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 48681 - Summon Silverbrook Worgen class spell_q12308_escape_from_silverbrook_summon_worgen : public SpellScript { void ModDest(SpellDestination& dest) { float dist = GetEffectInfo(EFFECT_0).CalcRadius(GetCaster()); float angle = frand(0.75f, 1.25f) * float(M_PI); Position pos = GetCaster()->GetNearPosition(dist, angle); dest.Relocate(pos); } void Register() override { OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12308_escape_from_silverbrook_summon_worgen::ModDest, EFFECT_0, TARGET_DEST_CASTER_SUMMON); } }; enum DeathComesFromOnHigh { SPELL_FORGE_CREDIT = 51974, SPELL_TOWN_HALL_CREDIT = 51977, SPELL_SCARLET_HOLD_CREDIT = 51980, SPELL_CHAPEL_CREDIT = 51982, NPC_NEW_AVALON_FORGE = 28525, NPC_NEW_AVALON_TOWN_HALL = 28543, NPC_SCARLET_HOLD = 28542, NPC_CHAPEL_OF_THE_CRIMSON_FLAME = 28544 }; // 51858 - Siphon of Acherus class spell_q12641_death_comes_from_on_high : public SpellScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo( { SPELL_FORGE_CREDIT, SPELL_TOWN_HALL_CREDIT, SPELL_SCARLET_HOLD_CREDIT, SPELL_CHAPEL_CREDIT }); } void HandleDummy(SpellEffIndex /*effIndex*/) { uint32 spellId = 0; switch (GetHitCreature()->GetEntry()) { case NPC_NEW_AVALON_FORGE: spellId = SPELL_FORGE_CREDIT; break; case NPC_NEW_AVALON_TOWN_HALL: spellId = SPELL_TOWN_HALL_CREDIT; break; case NPC_SCARLET_HOLD: spellId = SPELL_SCARLET_HOLD_CREDIT; break; case NPC_CHAPEL_OF_THE_CRIMSON_FLAME: spellId = SPELL_CHAPEL_CREDIT; break; default: return; } GetCaster()->CastSpell(nullptr, spellId, true); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12641_death_comes_from_on_high::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; enum Recall_Eye_of_Acherus { THE_EYE_OF_ACHERUS = 51852 }; // 52694 - Recall Eye of Acherus class spell_q12641_recall_eye_of_acherus : public SpellScript { void HandleDummy(SpellEffIndex /*effIndex*/) { if (Player* player = GetCaster()->GetCharmerOrOwner()->ToPlayer()) { player->StopCastingCharm(); player->StopCastingBindSight(); player->RemoveAura(THE_EYE_OF_ACHERUS); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12641_recall_eye_of_acherus::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; // 51769 - Emblazon Runeblade class spell_q12619_emblazon_runeblade : public AuraScript { void HandleEffectPeriodic(AuraEffect const* aurEff) { PreventDefaultAction(); if (Unit* caster = GetCaster()) caster->CastSpell(caster, aurEff->GetSpellEffectInfo().TriggerSpell, aurEff); } void Register() override { OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12619_emblazon_runeblade::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; // 51770 - Emblazon Runeblade class spell_q12619_emblazon_runeblade_effect : public SpellScript { void HandleScript(SpellEffIndex /*effIndex*/) { GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), false); } void Register() override { OnEffectHit += SpellEffectFn(spell_q12619_emblazon_runeblade_effect::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum Quest_The_Storm_King { SPELL_RIDE_GYMER = 43671, SPELL_GRABBED = 55424 }; // 55516 - Gymer's Grab class spell_q12919_gymers_grab : public SpellScript { bool Validate(SpellInfo const* /*spell*/) override { return ValidateSpellInfo({ SPELL_RIDE_GYMER }); } void HandleScript(SpellEffIndex /*effIndex*/) { if (!GetHitCreature()) return; CastSpellExtraArgs args(TRIGGERED_FULL_MASK); args.AddSpellBP0(2); GetHitCreature()->CastSpell(GetCaster(), SPELL_RIDE_GYMER, args); GetHitCreature()->CastSpell(GetHitCreature(), SPELL_GRABBED, true); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12919_gymers_grab::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum Quest_The_Storm_King_Throw { SPELL_VARGUL_EXPLOSION = 55569 }; // 55421 - Gymer's Throw class spell_q12919_gymers_throw : public SpellScript { void HandleScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); if (caster->IsVehicle()) if (Unit* passenger = caster->GetVehicleKit()->GetPassenger(1)) { passenger->ExitVehicle(); caster->CastSpell(passenger, SPELL_VARGUL_EXPLOSION, true); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12919_gymers_throw::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum Quest_The_Hunter_And_The_Prince { SPELL_ILLIDAN_KILL_CREDIT = 61748 }; // 61752 - Illidan Kill Credit Master class spell_q13400_illidan_kill_master : public SpellScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_ILLIDAN_KILL_CREDIT }); } void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); if (caster->IsVehicle()) if (Unit* passenger = caster->GetVehicleKit()->GetPassenger(0)) passenger->CastSpell(passenger, SPELL_ILLIDAN_KILL_CREDIT, true); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q13400_illidan_kill_master::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; enum RelicOfTheEarthenRing { SPELL_TOTEM_OF_THE_EARTHEN_RING = 66747 }; // 66744 - Make Player Destroy Totems class spell_q14100_q14111_make_player_destroy_totems : public SpellScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_TOTEM_OF_THE_EARTHEN_RING }); } void HandleScriptEffect(SpellEffIndex /*effIndex*/) { if (Player* player = GetHitPlayer()) player->CastSpell(player, SPELL_TOTEM_OF_THE_EARTHEN_RING, TRIGGERED_FULL_MASK); // ignore reagent cost, consumed by quest } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q14100_q14111_make_player_destroy_totems::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum Fumping { SPELL_SUMMON_SAND_GNOME = 39240, SPELL_SUMMON_BONE_SLICER = 39241 }; // 39238 - Fumping class spell_q10929_fumping : public AuraScript { bool Validate(SpellInfo const* /*spell*/) override { return ValidateSpellInfo({ SPELL_SUMMON_SAND_GNOME, SPELL_SUMMON_BONE_SLICER }); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) return; if (Unit* caster = GetCaster()) caster->CastSpell(caster, urand(SPELL_SUMMON_SAND_GNOME, SPELL_SUMMON_BONE_SLICER), true); } void Register() override { OnEffectRemove += AuraEffectRemoveFn(spell_q10929_fumping::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; enum FearNoEvil { SPELL_RENEWED_LIFE = 93097, NPC_INJURED_STORMWIND_INFANTRY = 50047 }; // 93072 - Get Our Boys Back Dummy class spell_q28813_get_our_boys_back_dummy : public SpellScriptLoader { public: spell_q28813_get_our_boys_back_dummy() : SpellScriptLoader("spell_q28813_get_our_boys_back_dummy") { } class spell_q28813_get_our_boys_back_dummy_SpellScript : public SpellScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_RENEWED_LIFE }); } void HandleDummyEffect() { Unit* caster = GetCaster(); if (Creature* injuredStormwindInfantry = caster->FindNearestCreature(NPC_INJURED_STORMWIND_INFANTRY, 5.0f, true)) { injuredStormwindInfantry->SetCreatorGUID(caster->GetGUID()); injuredStormwindInfantry->CastSpell(injuredStormwindInfantry, SPELL_RENEWED_LIFE, true); } } void Register() override { OnCast += SpellCastFn(spell_q28813_get_our_boys_back_dummy_SpellScript::HandleDummyEffect); } }; SpellScript* GetSpellScript() const override { return new spell_q28813_get_our_boys_back_dummy_SpellScript(); } }; // 53034 - Set Health Random class spell_q28813_set_health_random : public SpellScriptLoader { public: spell_q28813_set_health_random() : SpellScriptLoader("spell_q28813_set_health_random") { } class spell_q28813_set_health_random_SpellScript : public SpellScript { void HandleDummyEffect() { Unit* caster = GetCaster(); caster->SetHealth(caster->CountPctFromMaxHealth(urand(3, 5)*10)); } void Register() override { OnCast += SpellCastFn(spell_q28813_set_health_random_SpellScript::HandleDummyEffect); } }; SpellScript* GetSpellScript() const override { return new spell_q28813_set_health_random_SpellScript(); } }; // 49285 - Hand Over Reins class spell_q12414_hand_over_reins : public SpellScript { void HandleScript(SpellEffIndex /*effIndex*/) { Creature* caster = GetCaster()->ToCreature(); GetHitUnit()->ExitVehicle(); if (caster) caster->DespawnOrUnsummon(); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q12414_hand_over_reins::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; // 13790 13793 13811 13814 - Among the Champions // 13665 13745 13750 13756 13761 13767 13772 13777 13782 13787 - The Grand Melee class spell_q13665_q13790_bested_trigger : public SpellScript { void HandleScript(SpellEffIndex /*effIndex*/) { Unit* target = GetHitUnit()->GetCharmerOrOwnerOrSelf(); target->CastSpell(target, uint32(GetEffectValue()), true); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q13665_q13790_bested_trigger::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum ApplyHeatAndStir { SPELL_SPURTS_AND_SMOKE = 38594, SPELL_FAILED_MIX_1 = 43376, SPELL_FAILED_MIX_2 = 43378, SPELL_FAILED_MIX_3 = 43970, SPELL_SUCCESSFUL_MIX = 43377, CREATURE_GENERIC_TRIGGER_LAB = 24042, TALK_0 = 0, TALK_1 = 1 }; // 43972 - Mixing Blood class spell_q11306_mixing_blood : public SpellScript { void HandleEffect(SpellEffIndex /*effIndex*/) { if (Unit* caster = GetCaster()) if (Creature* trigger = caster->FindNearestCreature(CREATURE_GENERIC_TRIGGER_LAB, 100.0f)) trigger->AI()->DoCastSelf(SPELL_SPURTS_AND_SMOKE); } void Register() override { OnEffectHit += SpellEffectFn(spell_q11306_mixing_blood::HandleEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT); } }; // 43375 - Mixing Vrykul Blood class spell_q11306_mixing_vrykul_blood : public SpellScript { void HandleDummy(SpellEffIndex /*effIndex*/) { if (Unit* caster = GetCaster()) { uint8 chance = urand(0, 99); uint32 spellId = 0; // 90% chance of getting one out of three failure effects if (chance < 30) spellId = SPELL_FAILED_MIX_1; else if (chance < 60) spellId = SPELL_FAILED_MIX_2; else if (chance < 90) spellId = SPELL_FAILED_MIX_3; else // 10% chance of successful cast spellId = SPELL_SUCCESSFUL_MIX; caster->CastSpell(caster, spellId, true); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q11306_mixing_vrykul_blood::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); } }; // 43376 - Failed Mix class spell_q11306_failed_mix_43376 : public SpellScript { void HandleEffect(SpellEffIndex /*effIndex*/) { if (Unit* caster = GetCaster()) if (Creature* trigger = caster->FindNearestCreature(CREATURE_GENERIC_TRIGGER_LAB, 100.0f)) trigger->AI()->Talk(TALK_0, caster); } void Register() override { OnEffectHit += SpellEffectFn(spell_q11306_failed_mix_43376::HandleEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT); } }; // 43378 - Failed Mix class spell_q11306_failed_mix_43378 : public SpellScript { void HandleEffect(SpellEffIndex /*effIndex*/) { if (Unit* caster = GetCaster()) if (Creature* trigger = caster->FindNearestCreature(CREATURE_GENERIC_TRIGGER_LAB, 100.0f)) trigger->AI()->Talk(TALK_1, caster); } void Register() override { OnEffectHit += SpellEffectFn(spell_q11306_failed_mix_43378::HandleEffect, EFFECT_2, SPELL_EFFECT_SEND_EVENT); } }; // 46444 - Weakness to Lightning: Cast on Master Script Effect class spell_q11896_weakness_to_lightning_46444 : public SpellScript { void HandleScript(SpellEffIndex /*effIndex*/) { if (Unit* target = GetHitUnit()) { if (Unit* owner = target->GetOwner()) { target->CastSpell(owner, GetEffectValue(), true); } } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_q11896_weakness_to_lightning_46444::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum TamingTheBeast { SPELL_TAME_ICE_CLAW_BEAR = 19548, SPELL_TAME_LARGE_CRAG_BOAR = 19674, SPELL_TAME_SNOW_LEOPARD = 19687, SPELL_TAME_ADULT_PLAINSTRIDER = 19688, SPELL_TAME_PRAIRIE_STALKER = 19689, SPELL_TAME_SWOOP = 19692, SPELL_TAME_WEBWOOD_LURKER = 19693, SPELL_TAME_DIRE_MOTTLED_BOAR = 19694, SPELL_TAME_SURF_CRAWLER = 19696, SPELL_TAME_ARMORED_SCORPID = 19697, SPELL_TAME_NIGHTSABER_STALKER = 19699, SPELL_TAME_STRIGID_SCREECHER = 19700, SPELL_TAME_BARBED_CRAWLER = 30646, SPELL_TAME_GREATER_TIMBERSTRIDER = 30653, SPELL_TAME_NIGHTSTALKER = 30654, SPELL_TAME_CRAZED_DRAGONHAWK = 30099, SPELL_TAME_ELDER_SPRINGPAW = 30102, SPELL_TAME_MISTBAT = 30105, SPELL_TAME_ICE_CLAW_BEAR_1 = 19597, SPELL_TAME_LARGE_CRAG_BOAR_1 = 19677, SPELL_TAME_SNOW_LEOPARD_1 = 19676, SPELL_TAME_ADULT_PLAINSTRIDER_1 = 19678, SPELL_TAME_PRAIRIE_STALKER_1 = 19679, SPELL_TAME_SWOOP_1 = 19680, SPELL_TAME_WEBWOOD_LURKER_1 = 19684, SPELL_TAME_DIRE_MOTTLED_BOAR_1 = 19681, SPELL_TAME_SURF_CRAWLER_1 = 19682, SPELL_TAME_ARMORED_SCORPID_1 = 19683, SPELL_TAME_NIGHTSABER_STALKER_1 = 19685, SPELL_TAME_STRIGID_SCREECHER_1 = 19686, SPELL_TAME_BARBED_CRAWLER_1 = 30647, SPELL_TAME_GREATER_TIMBERSTRIDER_1 = 30648, SPELL_TAME_NIGHTSTALKER_1 = 30652, SPELL_TAME_CRAZED_DRAGONHAWK_1 = 30100, SPELL_TAME_ELDER_SPRINGPAW_1 = 30103, SPELL_TAME_MISTBAT_1 = 30104 }; class spell_quest_taming_the_beast : public AuraScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo( { SPELL_TAME_ICE_CLAW_BEAR_1, SPELL_TAME_LARGE_CRAG_BOAR_1, SPELL_TAME_SNOW_LEOPARD_1, SPELL_TAME_ADULT_PLAINSTRIDER_1, SPELL_TAME_PRAIRIE_STALKER_1, SPELL_TAME_SWOOP_1, SPELL_TAME_WEBWOOD_LURKER_1, SPELL_TAME_DIRE_MOTTLED_BOAR_1, SPELL_TAME_SURF_CRAWLER_1, SPELL_TAME_ARMORED_SCORPID_1, SPELL_TAME_NIGHTSABER_STALKER_1, SPELL_TAME_STRIGID_SCREECHER_1, SPELL_TAME_BARBED_CRAWLER_1, SPELL_TAME_GREATER_TIMBERSTRIDER_1, SPELL_TAME_NIGHTSTALKER_1, SPELL_TAME_CRAZED_DRAGONHAWK_1, SPELL_TAME_ELDER_SPRINGPAW_1, SPELL_TAME_MISTBAT_1 }); } void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (!GetCaster() || !GetCaster()->IsAlive() || !GetTarget()->IsAlive()) return; if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) return; uint32 finalSpellId = 0; switch (GetId()) { case SPELL_TAME_ICE_CLAW_BEAR: finalSpellId = SPELL_TAME_ICE_CLAW_BEAR_1; break; case SPELL_TAME_LARGE_CRAG_BOAR: finalSpellId = SPELL_TAME_LARGE_CRAG_BOAR_1; break; case SPELL_TAME_SNOW_LEOPARD: finalSpellId = SPELL_TAME_SNOW_LEOPARD_1; break; case SPELL_TAME_ADULT_PLAINSTRIDER: finalSpellId = SPELL_TAME_ADULT_PLAINSTRIDER_1; break; case SPELL_TAME_PRAIRIE_STALKER: finalSpellId = SPELL_TAME_PRAIRIE_STALKER_1; break; case SPELL_TAME_SWOOP: finalSpellId = SPELL_TAME_SWOOP_1; break; case SPELL_TAME_WEBWOOD_LURKER: finalSpellId = SPELL_TAME_WEBWOOD_LURKER_1; break; case SPELL_TAME_DIRE_MOTTLED_BOAR: finalSpellId = SPELL_TAME_DIRE_MOTTLED_BOAR_1; break; case SPELL_TAME_SURF_CRAWLER: finalSpellId = SPELL_TAME_SURF_CRAWLER_1; break; case SPELL_TAME_ARMORED_SCORPID: finalSpellId = SPELL_TAME_ARMORED_SCORPID_1; break; case SPELL_TAME_NIGHTSABER_STALKER: finalSpellId = SPELL_TAME_NIGHTSABER_STALKER_1; break; case SPELL_TAME_STRIGID_SCREECHER: finalSpellId = SPELL_TAME_STRIGID_SCREECHER_1; break; case SPELL_TAME_BARBED_CRAWLER: finalSpellId = SPELL_TAME_BARBED_CRAWLER_1; break; case SPELL_TAME_GREATER_TIMBERSTRIDER: finalSpellId = SPELL_TAME_GREATER_TIMBERSTRIDER_1; break; case SPELL_TAME_NIGHTSTALKER: finalSpellId = SPELL_TAME_NIGHTSTALKER_1; break; case SPELL_TAME_CRAZED_DRAGONHAWK: finalSpellId = SPELL_TAME_CRAZED_DRAGONHAWK_1; break; case SPELL_TAME_ELDER_SPRINGPAW: finalSpellId = SPELL_TAME_ELDER_SPRINGPAW_1; break; case SPELL_TAME_MISTBAT: finalSpellId = SPELL_TAME_MISTBAT_1; break; } if (finalSpellId) GetCaster()->CastSpell(GetTarget(), finalSpellId, true); } void Register() override { AfterEffectRemove += AuraEffectRemoveFn(spell_quest_taming_the_beast::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; // 53099, 57896, 58418, 58420, 59064, 59065, 59439, 60900, 60940 class spell_quest_portal_with_condition : public SpellScript { bool Validate(SpellInfo const* spellInfo) override { return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }) && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) }) && sObjectMgr->GetQuestTemplate(uint32(spellInfo->GetEffect(EFFECT_1).CalcValue())); } void HandleScriptEffect(SpellEffIndex /* effIndex */) { Player* target = GetHitPlayer(); if (!target) return; uint32 spellId = GetEffectInfo().CalcValue(); uint32 questId = GetEffectInfo(EFFECT_1).CalcValue(); // This probably should be a way to throw error in SpellCastResult if (target->IsActiveQuest(questId)) target->CastSpell(target, spellId, true); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_quest_portal_with_condition::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; enum TributeSpells { SPELL_GROMS_TROLL_TRIBUTE = 24101, SPELL_GROMS_TAUREN_TRIBUTE = 24102, SPELL_GROMS_UNDEAD_TRIBUTE = 24103, SPELL_GROMS_ORC_TRIBUTE = 24104, SPELL_GROMS_BLOODELF_TRIBUTE = 69530, SPELL_UTHERS_HUMAN_TRIBUTE = 24105, SPELL_UTHERS_GNOME_TRIBUTE = 24106, SPELL_UTHERS_DWARF_TRIBUTE = 24107, SPELL_UTHERS_NIGHTELF_TRIBUTE = 24108, SPELL_UTHERS_DRAENEI_TRIBUTE = 69533 }; // 24194 - Uther's Tribute // 24195 - Grom's Tribute class spell_quest_uther_grom_tribute : public SpellScript { bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo( { SPELL_GROMS_TROLL_TRIBUTE, SPELL_UTHERS_HUMAN_TRIBUTE, SPELL_GROMS_TAUREN_TRIBUTE, SPELL_UTHERS_GNOME_TRIBUTE, SPELL_GROMS_UNDEAD_TRIBUTE, SPELL_UTHERS_DWARF_TRIBUTE, SPELL_GROMS_ORC_TRIBUTE, SPELL_UTHERS_NIGHTELF_TRIBUTE, SPELL_GROMS_BLOODELF_TRIBUTE, SPELL_UTHERS_DRAENEI_TRIBUTE }); } void HandleScript(SpellEffIndex /*effIndex*/) { Player* caster = GetCaster()->ToPlayer(); if (!caster) return; uint32 spell = 0; switch (caster->GetRace()) { case RACE_TROLL: spell = SPELL_GROMS_TROLL_TRIBUTE; break; case RACE_TAUREN: spell = SPELL_GROMS_TAUREN_TRIBUTE; break; case RACE_UNDEAD_PLAYER: spell = SPELL_GROMS_UNDEAD_TRIBUTE; break; case RACE_ORC: spell = SPELL_GROMS_ORC_TRIBUTE; break; case RACE_BLOODELF: spell = SPELL_GROMS_BLOODELF_TRIBUTE; break; case RACE_HUMAN: spell = SPELL_UTHERS_HUMAN_TRIBUTE; break; case RACE_GNOME: spell = SPELL_UTHERS_GNOME_TRIBUTE; break; case RACE_DWARF: spell = SPELL_UTHERS_DWARF_TRIBUTE; break; case RACE_NIGHTELF: spell = SPELL_UTHERS_NIGHTELF_TRIBUTE; break; case RACE_DRAENEI: spell = SPELL_UTHERS_DRAENEI_TRIBUTE; break; default: break; } if (spell) caster->CastSpell(caster, spell); } void Register() override { OnEffectHit += SpellEffectFn(spell_quest_uther_grom_tribute::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; /*###### ## Quest 14386 Leader of the Pack ######*/ enum CallAttackMastiffs { NPC_ATTACK_MASTIFF = 36405 }; // 68682 Call Attack Mastiffs class spell_q14386_call_attack_mastiffs : public SpellScript { void HandleEffect(SpellEffIndex /*eff*/) { Unit* caster = GetCaster(); caster->SummonCreature(NPC_ATTACK_MASTIFF, -1944.573f, 2657.402f, 0.994939f, 1.691919f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); caster->SummonCreature(NPC_ATTACK_MASTIFF, -2005.65f, 2663.526f, -2.086935f, 0.5942355f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); caster->SummonCreature(NPC_ATTACK_MASTIFF, -1996.506f, 2651.347f, -1.011707f, 0.8185352f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); caster->SummonCreature(NPC_ATTACK_MASTIFF, -1972.352f, 2640.07f, 1.080288f, 1.217854f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); caster->SummonCreature(NPC_ATTACK_MASTIFF, -1949.322f, 2642.76f, 1.242482f, 1.58074f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); caster->SummonCreature(NPC_ATTACK_MASTIFF, -1993.94f, 2672.535f, -2.322549f, 0.5766209f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); caster->SummonCreature(NPC_ATTACK_MASTIFF, -1982.724f, 2662.8f, -1.773986f, 0.8628055f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); caster->SummonCreature(NPC_ATTACK_MASTIFF, -1973.301f, 2655.475f, -0.7831049f, 1.098415f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); caster->SummonCreature(NPC_ATTACK_MASTIFF, -1956.509f, 2650.655f, 1.350571f, 1.441473f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1s); } void Register() override { OnEffectHit += SpellEffectFn(spell_q14386_call_attack_mastiffs::HandleEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT); } }; void AddSC_quest_spell_scripts() { new spell_q55_sacred_cleansing(); RegisterSpellScript(spell_q2203_thaumaturgy_channel); RegisterSpellScript(spell_q6124_6129_apply_salve); new spell_q10255_administer_antidote(); RegisterSpellScript(spell_q11396_11399_force_shield_arcane_purple_x3); RegisterSpellScript(spell_q11396_11399_scourging_crystal_controller); RegisterSpellScript(spell_q11396_11399_scourging_crystal_controller_dummy); new spell_q11515_fel_siphon_dummy(); RegisterSpellScript(spell_q11730_ultrasonic_screwdriver); RegisterSpellScript(spell_q12459_seeds_of_natures_wrath); RegisterSpellScript(spell_q12634_despawn_fruit_tosser); RegisterSpellScript(spell_q12851_going_bearback); RegisterSpellScript(spell_q12659_ahunaes_knife); RegisterSpellScript(spell_q12805_lifeblood_dummy); RegisterSpellScript(spell_q13280_13283_plant_battle_standard); RegisterSpellScript(spell_q13280_13283_jump_jets); RegisterSpellScript(spell_q12066_bunny_kill_credit); RegisterSpellScript(spell_q12372_cast_from_gossip_trigger); RegisterSpellScript(spell_q12372_destabilize_azure_dragonshrine_dummy); RegisterSpellScript(spell_q11010_q11102_q11023_aggro_check_aura); RegisterSpellScript(spell_q11010_q11102_q11023_aggro_check); RegisterSpellScript(spell_q11010_q11102_q11023_aggro_burst); RegisterSpellScript(spell_q11010_q11102_q11023_choose_loc); RegisterSpellScript(spell_q11010_q11102_q11023_q11008_check_fly_mount); RegisterSpellScript(spell_q12527_zuldrak_rat); RegisterSpellScript(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan); RegisterSpellScript(spell_q12730_quenching_mist); RegisterSpellScript(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy); RegisterSpellScript(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon); RegisterSpellScript(spell_q12847_summon_soul_moveto_bunny); RegisterSpellScript(spell_q13086_cannons_target); RegisterSpellScript(spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59576); RegisterSpellScript(spell_q13264_q13276_q13288_q13289_burst_at_the_seams_59579); RegisterSpellScript(spell_q13264_q13276_q13288_q13289_bloated_abom_feign_death); RegisterSpellScript(spell_q13264_q13276_q13288_q13289_area_restrict_abom); RegisterSpellScript(spell_q13264_q13276_q13288_q13289_assign_credit_to_master); RegisterSpellScript(spell_q12690_burst_at_the_seams_52510); RegisterSpellScript(spell_q11896_weakness_to_lightning_46444); RegisterSpellScript(spell_q12308_escape_from_silverbrook_summon_worgen); RegisterSpellScript(spell_q12308_escape_from_silverbrook); RegisterSpellScript(spell_q12641_death_comes_from_on_high); RegisterSpellScript(spell_q12641_recall_eye_of_acherus); RegisterSpellScript(spell_q12619_emblazon_runeblade); RegisterSpellScript(spell_q12619_emblazon_runeblade_effect); RegisterSpellScript(spell_q12919_gymers_grab); RegisterSpellScript(spell_q12919_gymers_throw); RegisterSpellScript(spell_q13400_illidan_kill_master); RegisterSpellScript(spell_q14100_q14111_make_player_destroy_totems); RegisterSpellScript(spell_q10929_fumping); new spell_q28813_get_our_boys_back_dummy(); new spell_q28813_set_health_random(); RegisterSpellScript(spell_q12414_hand_over_reins); RegisterSpellScript(spell_q13665_q13790_bested_trigger); RegisterSpellScript(spell_q11306_mixing_blood); RegisterSpellScript(spell_q11306_mixing_vrykul_blood); RegisterSpellScript(spell_q11306_failed_mix_43376); RegisterSpellScript(spell_q11306_failed_mix_43378); RegisterSpellScript(spell_quest_taming_the_beast); RegisterSpellScript(spell_quest_portal_with_condition); RegisterSpellScript(spell_quest_uther_grom_tribute); RegisterSpellScript(spell_q14386_call_attack_mastiffs); }