aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp699
1 files changed, 695 insertions, 4 deletions
diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index e8b4127f24c..4f7c865f3ac 100644
--- a/src/server/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
@@ -21,12 +21,15 @@
#include "ScriptedEscortAI.h"
#include "Player.h"
#include "SpellInfo.h"
+#include "SpellScript.h"
+#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
/*####
## npc_drakuru_shackles
####*/
-enum eDrakuruShackles
+enum DrakuruShackles
{
SPELL_LEFT_CHAIN = 59951,
SPELL_RIGHT_CHAIN = 59952,
@@ -34,7 +37,7 @@ enum eDrakuruShackles
SPELL_FREE_RAGECLAW = 55223,
NPC_RAGECLAW = 29686,
- QUEST_TROLLS_IS_GONE_CRAZY = 12861,
+ QUEST_TROLLS_IS_GONE_CRAZY = 12861
};
class npc_drakuru_shackles : public CreatureScript
@@ -115,7 +118,7 @@ public:
## npc_captured_rageclaw
####*/
-enum eRageclaw
+enum Rageclaw
{
SPELL_UNSHACKLED = 55085,
SPELL_KNEEL = 39656
@@ -1385,7 +1388,7 @@ public:
## go_scourge_enclosure
######*/
-enum eScourgeEnclosure
+enum ScourgeEnclosure
{
QUEST_OUR_ONLY_HOPE = 12916,
NPC_GYMER_DUMMY = 29928 //from quest template
@@ -1413,6 +1416,686 @@ public:
}
};
+/*######
+## Quest: Troll Patrol: The Alchemist's Apprentice
+######*/
+
+enum Finklestein
+{
+ // Creatre
+ NPC_FINKLESTEIN = 28205,
+ // Quest
+ QUEST_THE_ALCHEMIST_APPRENTICE_DAILY = 12541,
+ // Spells
+ SPELL_ALCHEMIST_APPRENTICE_INVISBUFF = 51216,
+ SPELL_RANDOM_INGREDIENT_EASY_AURA = 51015,
+ SPELL_RANDOM_INGREDIENT_MEDIUM_AURA = 51154,
+ SPELL_RANDOM_INGREDIENT_HARD_AURA = 51157,
+ SPELL_RANDOM_INGREDIENT_EASY = 51134,
+ SPELL_RANDOM_INGREDIENT_MEDIUM = 51105,
+ SPELL_RANDOM_INGREDIENT_HARD = 51107,
+ SPELL_NEXT_INGREDIENT = 51049,
+ SPELL_POT_CHECK = 51046,
+ SPELL_THROW_INGREDIENT = 51025,
+ SPELL_KILL_CREDIT = 51111,
+ // Spell Fetch Easy
+ SPELL_FETCH_KNOTROOT = 51018,
+ SPELL_FETCH_PICKLED_EAGLE_EGG = 51055,
+ SPELL_FETCH_SPECKLED_GUANO = 51057,
+ SPELL_FETCH_WITHERED_BATWING = 51059,
+ SPELL_FETCH_SEASONED_SLIDER_CIDER = 51062,
+ SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH = 51064,
+ SPELL_FETCH_MUDDY_MIRE_MAGGOT = 51067,
+ SPELL_FETCH_SPIKY_SPIDER_EGG = 51069,
+ SPELL_FETCH_HAIRY_HERRING_HEAD = 51072,
+ SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION = 51077,
+ SPELL_FETCH_ICECROWN_BOTTLED_WATER = 51079,
+ // Spell Have Easy
+ SPELL_HAVE_KNOTROOT = 51047,
+ SPELL_HAVE_PICKLED_EAGLE_EGG = 51056,
+ SPELL_HAVE_SPECKLED_GUANO = 51058,
+ SPELL_HAVE_WITHERED_BATWING = 51060,
+ SPELL_HAVE_SEASONED_SLIDER_CIDER = 51063,
+ SPELL_HAVE_PULVERIZED_GARGOYLE_TEETH = 51065,
+ SPELL_HAVE_MUDDY_MIRE_MAGGOT = 51068,
+ SPELL_HAVE_SPIKY_SPIDER_EGG = 51070,
+ SPELL_HAVE_HAIRY_HERRING_HEAD = 51075,
+ SPELL_HAVE_PUTRID_PIRATE_PERSPIRATION = 51078,
+ SPELL_HAVE_ICECROWN_BOTTLED_WATER = 51080,
+ // Spell Fetch Medium
+ SPELL_FETCH_WASPS_WINGS = 51081,
+ SPELL_FETCH_PRISMATIC_MOJO = 51083,
+ SPELL_FETCH_RAPTOR_CLAW = 51085,
+ SPELL_FETCH_AMBERSEED = 51087,
+ SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW = 51091,
+ // Spell Have Medium
+ SPELL_HAVE_WASPS_WINGS = 51082,
+ SPELL_HAVE_PRISMATIC_MOJO = 51084,
+ SPELL_HAVE_RAPTOR_CLAW = 51086,
+ SPELL_HAVE_AMBERSEED = 51088,
+ SPELL_HAVE_SHRUNKEN_DRAGONS_CLAW = 51092,
+ // Spell Fetch Hard
+ SPELL_FETCH_CHILLED_SERPENT_MUCUS = 51093,
+ SPELL_FETCH_CRYSTALLIZED_HOGSNOT = 51095,
+ SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS = 51097,
+ SPELL_FETCH_TROLLBANE = 51100,
+ SPELL_FETCH_FROZEN_SPIDER_ICHOR = 51102,
+ // Spell Have Hard
+ SPELL_HAVE_CHILLED_SERPENT_MUCUS = 51094,
+ SPELL_HAVE_CRYSTALLIZED_HOGSNOT = 51096,
+ SPELL_HAVE_CRUSHED_BASILISK_CRYSTALS = 51098,
+ SPELL_HAVE_TROLLBANE = 51101,
+ SPELL_HAVE_FROZEN_SPIDER_ICHOR = 51104,
+ // Text
+ SAY_EASY_123 = 0,
+ SAY_MEDIUM_4 = 1,
+ SAY_MEDIUM_5 = 2,
+ SAY_HARD_6 = 3,
+ SAY_RUINED = 4,
+ // Text Easy
+ SAY_KNOTROOT = 5,
+ SAY_PICKLED_EAGLE_EGG = 6,
+ SAY_SPECKLED_GUANO = 7,
+ SAY_WITHERED_BATWING = 8,
+ SAY_SEASONED_SLIDER_CIDER = 9,
+ SAY_PULVERIZED_GARGOYLE_TEETH = 10,
+ SAY_MUDDY_MIRE_MAGGOT = 11,
+ SAY_SPIKY_SPIDER_EGG = 12,
+ SAY_HAIRY_HERRING_HEAD = 13,
+ SAY_PUTRID_PIRATE_PERSPIRATION = 14,
+ SAY_ICECROWN_BOTTLED_WATER = 15,
+ // Text Medium
+ SAY_WASPS_WINGS = 16,
+ SAY_PRISMATIC_MOJO = 17,
+ SAY_RAPTOR_CLAW = 18,
+ SAY_AMBERSEED = 19,
+ SAY_SHRUNKEN_DRAGONS_CLAW = 20,
+ // Text Hard
+ SAY_CHILLED_SERPENT_MUCUS = 21,
+ SAY_CRYSTALLIZED_HOGSNOT = 22,
+ SAY_CRUSHED_BASILISK_CRYSTALS = 23,
+ SAY_TROLLBANE = 24,
+ SAY_FROZEN_SPIDER_ICHOR = 25
+};
+
+enum FinklesteinEvents
+{
+ EVENT_TURN_TO_POT = 1,
+ EVENT_TURN_BACK = 2,
+ EVENT_EASY_123 = 3,
+ EVENT_MEDIUM_4 = 4,
+ EVENT_MEDIUM_5 = 5,
+ EVENT_HARD_6 = 6
+};
+
+class npc_alchemist_finklestein : public CreatureScript
+{
+public:
+ npc_alchemist_finklestein() : CreatureScript("npc_alchemist_finklestein") { }
+
+ struct npc_alchemist_finklesteinAI : public ScriptedAI
+ {
+ npc_alchemist_finklesteinAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset()
+ {
+ _events.ScheduleEvent(EVENT_TURN_TO_POT, urand(15000, 26000));
+ }
+
+ void SetData(uint32 Type, uint32 Data)
+ {
+ if (Type == 1 && Data == 1)
+ switch (_getingredienttry)
+ {
+ case 2:
+ case 3:
+ _events.ScheduleEvent(EVENT_EASY_123, 100);
+ break;
+ case 4:
+ _events.ScheduleEvent(EVENT_MEDIUM_4, 100);
+ break;
+ case 5:
+ _events.ScheduleEvent(EVENT_MEDIUM_5, 100);
+ break;
+ case 6:
+ _events.ScheduleEvent(EVENT_HARD_6, 100);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_TURN_TO_POT:
+ me->SetFacingTo(6.230825f);
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING_NO_SHEATHE);
+ _events.ScheduleEvent(EVENT_TURN_BACK, 11000);
+ break;
+ case EVENT_TURN_BACK:
+ me->SetFacingTo(4.886922f);
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
+ _events.ScheduleEvent(EVENT_TURN_TO_POT, urand(25000, 41000));
+ break;
+ case EVENT_EASY_123:
+ if (Player* player = Unit::GetPlayer(*me, _playerGUID))
+ {
+ Talk(SAY_EASY_123, _playerGUID);
+ DoCast(player, SPELL_RANDOM_INGREDIENT_EASY_AURA);
+ ++_getingredienttry;
+ }
+ break;
+ case EVENT_MEDIUM_4:
+ if (Player* player = Unit::GetPlayer(*me, _playerGUID))
+ {
+ Talk(SAY_MEDIUM_4, _playerGUID);
+ DoCast(player, SPELL_RANDOM_INGREDIENT_MEDIUM_AURA);
+ ++_getingredienttry;
+ }
+ break;
+ case EVENT_MEDIUM_5:
+ if (Player* player = Unit::GetPlayer(*me, _playerGUID))
+ {
+ Talk(SAY_MEDIUM_5, _playerGUID);
+ DoCast(player, SPELL_RANDOM_INGREDIENT_MEDIUM_AURA);
+ ++_getingredienttry;
+ }
+ break;
+ case EVENT_HARD_6:
+ if (Player* player = Unit::GetPlayer(*me, _playerGUID))
+ {
+ Talk(SAY_HARD_6, _playerGUID);
+ DoCast(player, SPELL_RANDOM_INGREDIENT_HARD_AURA);
+ ++_getingredienttry;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/)
+ {
+ player->CLOSE_GOSSIP_MENU();
+ DoCast(player, SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
+ _playerGUID = player->GetGUID();
+ _getingredienttry = 1;
+ _events.ScheduleEvent(EVENT_EASY_123, 100);
+ }
+
+ private:
+ EventMap _events;
+ uint64 _playerGUID;
+ uint8 _getingredienttry;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_alchemist_finklesteinAI(creature);
+ }
+};
+
+class go_finklesteins_cauldron : public GameObjectScript
+{
+public:
+ go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { }
+
+ bool OnGossipHello(Player* player, GameObject* go)
+ {
+ player->CastSpell(player, SPELL_POT_CHECK);
+ return true;
+ }
+};
+
+/*#####
+# spell_random_ingredient_aura
+#####*/
+
+class spell_random_ingredient_aura : public SpellScriptLoader
+{
+ public: spell_random_ingredient_aura() : SpellScriptLoader("spell_random_ingredient_aura") { }
+
+ class spell_random_ingredient_aura_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_random_ingredient_aura_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_EASY) || !sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_MEDIUM) || !sSpellMgr->GetSpellInfo(SPELL_RANDOM_INGREDIENT_HARD))
+ return false;
+ return true;
+ }
+
+ void PeriodicTick(AuraEffect const* aurEff)
+ {
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_RANDOM_INGREDIENT_EASY_AURA:
+ GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_EASY);
+ break;
+ case SPELL_RANDOM_INGREDIENT_MEDIUM_AURA:
+ GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_MEDIUM);
+ break;
+ case SPELL_RANDOM_INGREDIENT_HARD_AURA:
+ GetTarget()->CastSpell(GetTarget(), SPELL_RANDOM_INGREDIENT_HARD);
+ break;
+ }
+ }
+
+ void Register()
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_random_ingredient_aura_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_random_ingredient_aura_AuraScript();
+ }
+};
+
+/*#####
+# spell_random_ingredient_easy
+#####*/
+
+class spell_random_ingredient_easy : public SpellScriptLoader
+{
+ public: spell_random_ingredient_easy() : SpellScriptLoader("spell_random_ingredient_easy") { }
+
+ class spell_random_ingredient_easy_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_random_ingredient_easy_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPECKLED_GUANO) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_WITHERED_BATWING) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SEASONED_SLIDER_CIDER) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_MUDDY_MIRE_MAGGOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPIKY_SPIDER_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_HAIRY_HERRING_HEAD) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_ICECROWN_BOTTLED_WATER))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ {
+ if (Player* player = GetHitPlayer())
+ {
+ uint8 spelltocast = urand(1, 11);
+
+ Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f);
+
+ if (!finklestein)
+ return;
+
+ switch (spelltocast)
+ {
+ case 1:
+ finklestein->CastSpell(player, SPELL_FETCH_KNOTROOT, true, NULL);
+ finklestein->AI()->Talk(SAY_KNOTROOT, player->GetGUID());
+ break;
+ case 2:
+ finklestein->CastSpell(player, SPELL_FETCH_PICKLED_EAGLE_EGG, true, NULL);
+ finklestein->AI()->Talk(SAY_PICKLED_EAGLE_EGG, player->GetGUID());
+ break;
+ case 3:
+ finklestein->CastSpell(player, SPELL_FETCH_SPECKLED_GUANO, true, NULL);
+ finklestein->AI()->Talk(SAY_SPECKLED_GUANO, player->GetGUID());
+ break;
+ case 4:
+ finklestein->CastSpell(player, SPELL_FETCH_WITHERED_BATWING, true, NULL);
+ finklestein->AI()->Talk(SAY_WITHERED_BATWING, player->GetGUID());
+ break;
+ case 5:
+ finklestein->CastSpell(player, SPELL_FETCH_SEASONED_SLIDER_CIDER, true, NULL);
+ finklestein->AI()->Talk(SAY_SEASONED_SLIDER_CIDER, player->GetGUID());
+ break;
+ case 6:
+ finklestein->CastSpell(player, SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH, true, NULL);
+ finklestein->AI()->Talk(SAY_PULVERIZED_GARGOYLE_TEETH, player->GetGUID());
+ break;
+ case 7:
+ finklestein->CastSpell(player, SPELL_FETCH_MUDDY_MIRE_MAGGOT, true, NULL);
+ finklestein->AI()->Talk(SAY_MUDDY_MIRE_MAGGOT, player->GetGUID());
+ break;
+ case 8:
+ finklestein->CastSpell(player, SPELL_FETCH_SPIKY_SPIDER_EGG, true, NULL);
+ finklestein->AI()->Talk(SAY_SPIKY_SPIDER_EGG, player->GetGUID());
+ break;
+ case 9:
+ finklestein->CastSpell(player, SPELL_FETCH_HAIRY_HERRING_HEAD, true, NULL);
+ finklestein->AI()->Talk(SAY_HAIRY_HERRING_HEAD, player->GetGUID());
+ break;
+ case 10:
+ finklestein->CastSpell(player, SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION, true, NULL);
+ finklestein->AI()->Talk(SAY_PUTRID_PIRATE_PERSPIRATION, player->GetGUID());
+ break;
+ case 11:
+ finklestein->CastSpell(player, SPELL_FETCH_ICECROWN_BOTTLED_WATER, true, NULL);
+ finklestein->AI()->Talk(SAY_ICECROWN_BOTTLED_WATER, player->GetGUID());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_random_ingredient_easy_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_random_ingredient_easy_SpellScript();
+ }
+};
+
+/*#####
+# spell_random_ingredient_medium
+#####*/
+
+class spell_random_ingredient_medium : public SpellScriptLoader
+{
+ public: spell_random_ingredient_medium() : SpellScriptLoader("spell_random_ingredient_medium") { }
+
+ class spell_random_ingredient_medium_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_random_ingredient_medium_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_WASPS_WINGS) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PRISMATIC_MOJO) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_RAPTOR_CLAW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_AMBERSEED) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ {
+ if (Player* player = GetHitPlayer())
+ {
+ uint8 spelltocast = urand(1, 5);
+
+ Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f);
+
+ if (!finklestein)
+ return;
+
+ switch (spelltocast)
+ {
+ case 1:
+ finklestein->CastSpell(player, SPELL_FETCH_WASPS_WINGS, true, NULL);
+ finklestein->AI()->Talk(SAY_WASPS_WINGS, player->GetGUID());
+ break;
+ case 2:
+ finklestein->CastSpell(player, SPELL_FETCH_PRISMATIC_MOJO, true, NULL);
+ finklestein->AI()->Talk(SAY_PRISMATIC_MOJO, player->GetGUID());
+ break;
+ case 3:
+ finklestein->CastSpell(player, SPELL_FETCH_RAPTOR_CLAW, true, NULL);
+ finklestein->AI()->Talk(SAY_RAPTOR_CLAW, player->GetGUID());
+ break;
+ case 4:
+ finklestein->CastSpell(player, SPELL_FETCH_AMBERSEED, true, NULL);
+ finklestein->AI()->Talk(SAY_AMBERSEED, player->GetGUID());
+ break;
+ case 5:
+ finklestein->CastSpell(player, SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW, true, NULL);
+ finklestein->AI()->Talk(SAY_SHRUNKEN_DRAGONS_CLAW, player->GetGUID());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_random_ingredient_medium_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_random_ingredient_medium_SpellScript();
+ }
+};
+
+/*#####
+# spell_random_ingredient_hard
+#####*/
+
+class spell_random_ingredient_hard : public SpellScriptLoader
+{
+ public: spell_random_ingredient_hard() : SpellScriptLoader("spell_random_ingredient_hard") { }
+
+ class spell_random_ingredient_hard_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_random_ingredient_hard_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_CHILLED_SERPENT_MUCUS) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_CRYSTALLIZED_HOGSNOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_TROLLBANE) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_FROZEN_SPIDER_ICHOR))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ {
+ if (Player* player = GetHitPlayer())
+ {
+ uint8 spelltocast = urand(1, 5);
+
+ Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f);
+
+ if (!finklestein)
+ return;
+
+ switch (spelltocast)
+ {
+ case 1:
+ finklestein->CastSpell(player, SPELL_FETCH_CHILLED_SERPENT_MUCUS, true, NULL);
+ finklestein->AI()->Talk(SAY_CHILLED_SERPENT_MUCUS, player->GetGUID());
+ break;
+ case 2:
+ finklestein->CastSpell(player, SPELL_FETCH_CRYSTALLIZED_HOGSNOT, true, NULL);
+ finklestein->AI()->Talk(SAY_CRYSTALLIZED_HOGSNOT, player->GetGUID());
+ break;
+ case 3:
+ finklestein->CastSpell(player, SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS, true, NULL);
+ finklestein->AI()->Talk(SAY_CRUSHED_BASILISK_CRYSTALS, player->GetGUID());
+ break;
+ case 4:
+ finklestein->CastSpell(player, SPELL_FETCH_TROLLBANE, true, NULL);
+ finklestein->AI()->Talk(SAY_TROLLBANE, player->GetGUID());
+ break;
+ case 5:
+ finklestein->CastSpell(player, SPELL_FETCH_FROZEN_SPIDER_ICHOR, true, NULL);
+ finklestein->AI()->Talk(SAY_FROZEN_SPIDER_ICHOR, player->GetGUID());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_random_ingredient_hard_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_random_ingredient_hard_SpellScript();
+ }
+};
+
+/*#####
+# spell_pot_check
+#####*/
+
+uint32 const FetchSpells[21] [4] =
+{
+ // { Fetch spell, Have spell, Item, Text }
+ { 51018, 51047, 38338, 6 }, // Knotroot
+ { 51055, 51056, 38341, 7 }, // Pickled Eagle Egg
+ { 51057, 51058, 38337, 8 }, // Speckled Guano
+ { 51059, 51060, 38339, 9 }, // Withered Batwing
+ { 51062, 51063, 38381, 10 }, // Seasoned Slider Cider
+ { 51064, 51065, 38384, 11 }, // Pulverized Gargoyle Teeth
+ { 51067, 51068, 38386, 12 }, // Muddy Mire Maggot
+ { 51069, 51070, 38393, 13 }, // Spiky Spider Egg
+ { 51072, 51075, 38396, 14 }, // Hairy Herring Head
+ { 51077, 51078, 38397, 15 }, // Putrid Pirate Perspiration
+ { 51079, 51080, 38398, 16 }, // Icecrown Bottled Water
+ { 51081, 51082, 38369, 17 }, // Wasp's Wings
+ { 51083, 51084, 38343, 18 }, // Prismatic Mojo
+ { 51085, 51086, 38370, 19 }, // Raptor Claw
+ { 51087, 51088, 38340, 20 }, // Amberseed
+ { 51091, 51092, 38344, 21 }, // Shrunken Dragon's Claw
+ { 51093, 51094, 38346, 22 }, // Chilled Serpent Mucus
+ { 51095, 51096, 38336, 23 }, // Crystallized Hogsnot
+ { 51097, 51098, 38379, 24 }, // Crushed Basilisk Crystals
+ { 51100, 51101, 38342, 25 }, // Trollbane
+ { 51102, 51104, 38345, 26 } // Frozen Spider Ichor
+};
+
+class spell_pot_check : public SpellScriptLoader
+{
+ public: spell_pot_check() : SpellScriptLoader("spell_pot_check") { }
+
+ class spell_pot_check_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pot_check_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_FETCH_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPECKLED_GUANO) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_WITHERED_BATWING) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SEASONED_SLIDER_CIDER) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_PULVERIZED_GARGOYLE_TEETH) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_MUDDY_MIRE_MAGGOT) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_SPIKY_SPIDER_EGG) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_HAIRY_HERRING_HEAD) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_PUTRID_PIRATE_PERSPIRATION) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_ICECROWN_BOTTLED_WATER) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_WASPS_WINGS) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_PRISMATIC_MOJO) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_RAPTOR_CLAW) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_AMBERSEED) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_SHRUNKEN_DRAGONS_CLAW) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_CHILLED_SERPENT_MUCUS) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_CRYSTALLIZED_HOGSNOT) ||
+ !sSpellMgr->GetSpellInfo(SPELL_FETCH_CRUSHED_BASILISK_CRYSTALS) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_TROLLBANE) || !sSpellMgr->GetSpellInfo(SPELL_FETCH_FROZEN_SPIDER_ICHOR) ||
+ !sSpellMgr->GetSpellInfo(SPELL_HAVE_KNOTROOT) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_PICKLED_EAGLE_EGG) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_SPECKLED_GUANO) ||
+ !sSpellMgr->GetSpellInfo(SPELL_HAVE_WITHERED_BATWING) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_SEASONED_SLIDER_CIDER) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_PULVERIZED_GARGOYLE_TEETH) ||
+ !sSpellMgr->GetSpellInfo(SPELL_HAVE_MUDDY_MIRE_MAGGOT) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_SPIKY_SPIDER_EGG) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_HAIRY_HERRING_HEAD) ||
+ !sSpellMgr->GetSpellInfo(SPELL_HAVE_PUTRID_PIRATE_PERSPIRATION) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_ICECROWN_BOTTLED_WATER) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_WASPS_WINGS) ||
+ !sSpellMgr->GetSpellInfo(SPELL_HAVE_PRISMATIC_MOJO) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_RAPTOR_CLAW) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_AMBERSEED) ||
+ !sSpellMgr->GetSpellInfo(SPELL_HAVE_SHRUNKEN_DRAGONS_CLAW) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_CHILLED_SERPENT_MUCUS) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_CRYSTALLIZED_HOGSNOT) ||
+ !sSpellMgr->GetSpellInfo(SPELL_HAVE_CRUSHED_BASILISK_CRYSTALS) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_TROLLBANE) || !sSpellMgr->GetSpellInfo(SPELL_HAVE_FROZEN_SPIDER_ICHOR))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /* effIndex */)
+ {
+ if (Player* player = GetHitPlayer())
+ {
+ for (uint8 i = 0; i < 21; ++i)
+ {
+ if(player->HasAura(FetchSpells[i] [0]))
+ {
+ player->CastSpell(player, SPELL_THROW_INGREDIENT);
+ player->RemoveAura(FetchSpells[i] [0]);
+ if(player->HasAura(FetchSpells[i] [1]))
+ {
+ player->RemoveAura(FetchSpells[i] [1]);
+ player->DestroyItemCount(FetchSpells[i] [2], 1, true);
+ if (i < 15)
+ {
+ if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
+ finklestein->AI()->SetData(1, 1);
+ return;
+ }
+ else
+ {
+ if (player->GetQuestStatus(QUEST_THE_ALCHEMIST_APPRENTICE_DAILY) == QUEST_STATUS_INCOMPLETE)
+ {
+ player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
+ player->CastSpell(player, SPELL_KILL_CREDIT);
+ }
+ }
+ }
+ else
+ {
+ RemoveItems(player);
+ player->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
+ if (Creature* finklestein = GetClosestCreatureWithEntry(player, NPC_FINKLESTEIN, 25.0f))
+ finklestein->AI()->Talk(SAY_RUINED, player->GetGUID());
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ void RemoveItems(Player* player)
+ {
+ for (uint8 i = 0; i < 21; ++i)
+ if (player->HasItemCount(FetchSpells[i] [2], 1, true))
+ player->DestroyItemCount(FetchSpells[i] [2], 1, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_pot_check_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pot_check_SpellScript();
+ }
+};
+
+/*#####
+# spell_fetch_ingredient_aura
+#####*/
+
+class spell_fetch_ingredient_aura : public SpellScriptLoader
+{
+ public: spell_fetch_ingredient_aura() : SpellScriptLoader("spell_fetch_ingredient_aura") { }
+
+ class spell_fetch_ingredient_aura_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_fetch_ingredient_aura_AuraScript);
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
+ if (Unit* target = GetTarget())
+ if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
+ if (target->HasAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF))
+ if (Creature* finklestein = GetClosestCreatureWithEntry(target, NPC_FINKLESTEIN, 100.0f))
+ {
+ target->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
+ finklestein->AI()->Talk(SAY_RUINED, target->GetGUID());
+ }
+ }
+
+ void Register()
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_fetch_ingredient_aura_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_fetch_ingredient_aura_AuraScript();
+ }
+};
+
void AddSC_zuldrak()
{
new npc_drakuru_shackles;
@@ -1428,4 +2111,12 @@ void AddSC_zuldrak()
new npc_elemental_lord;
new npc_fiend_elemental;
new go_scourge_enclosure;
+ new npc_alchemist_finklestein;
+ new go_finklesteins_cauldron;
+ new spell_random_ingredient_aura;
+ new spell_random_ingredient_easy;
+ new spell_random_ingredient_medium;
+ new spell_random_ingredient_hard;
+ new spell_pot_check;
+ new spell_fetch_ingredient_aura;
}