diff options
Diffstat (limited to 'src/server/scripts/EasternKingdoms')
43 files changed, 807 insertions, 639 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index b0c7e149bd3..3851a74d263 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "blackrock_depths.h" #include "CreatureAIImpl.h" #include "GameObject.h" @@ -31,25 +32,35 @@ //go_shadowforge_brazier class go_shadowforge_brazier : public GameObjectScript { -public: - go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { } + public: + go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) + struct go_shadowforge_brazierAI : public GameObjectAI { - if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS) - instance->SetData(TYPE_LYCEUM, DONE); - else - instance->SetData(TYPE_LYCEUM, IN_PROGRESS); - // If used brazier open linked doors (North or South) - if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N)) - instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true); - else if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S)) - instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true); + go_shadowforge_brazierAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS) + instance->SetData(TYPE_LYCEUM, DONE); + else + instance->SetData(TYPE_LYCEUM, IN_PROGRESS); + // If used brazier open linked doors (North or South) + if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N)) + instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true); + else if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S)) + instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true); + + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetBlackrockDepthsAI<go_shadowforge_brazierAI>(go); } - return false; - } }; // npc_grimstone @@ -434,45 +445,57 @@ enum Lokhtos class npc_lokhtos_darkbargainer : public CreatureScript { -public: - npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { } + public: + npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1) + struct npc_lokhtos_darkbargainerAI : public ScriptedAI { - CloseGossipMenuFor(player); - player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false); - } - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + npc_lokhtos_darkbargainerAI(Creature* creature) : ScriptedAI(creature) { } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false); + } + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); - if (creature->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + return true; + } - if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 && - !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) && - player->HasItemCount(ITEM_SULFURON_INGOT)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - } + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - if (player->GetReputationRank(59) < REP_FRIENDLY) - SendGossipMenuFor(player, 3673, creature->GetGUID()); - else - SendGossipMenuFor(player, 3677, creature->GetGUID()); + if (me->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - return true; - } + if (!player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) && + !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) && + player->HasItemCount(ITEM_SULFURON_INGOT)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + } + + if (player->GetReputationRank(59) < REP_FRIENDLY) + SendGossipMenuFor(player, 3673, me->GetGUID()); + else + SendGossipMenuFor(player, 3677, me->GetGUID()); + + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_lokhtos_darkbargainerAI(creature); + } }; // npc_rocknot @@ -488,41 +511,6 @@ class npc_rocknot : public CreatureScript public: npc_rocknot() : CreatureScript("npc_rocknot") { } - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*item*/) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; - - if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL) - return true; - - if (quest->GetQuestId() == QUEST_ALE) - { - if (instance->GetData(TYPE_BAR) != IN_PROGRESS) - instance->SetData(TYPE_BAR, IN_PROGRESS); - - instance->SetData(TYPE_BAR, SPECIAL); - - //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress - if (instance->GetData(TYPE_BAR) == SPECIAL) - { - creature->AI()->Talk(SAY_GOT_BEER); - creature->CastSpell(creature, SPELL_DRUNKEN_RAGE, false); - - if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, creature->AI())) - escortAI->Start(false, false); - } - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackrockDepthsAI<npc_rocknotAI>(creature); - } - struct npc_rocknotAI : public npc_escortAI { npc_rocknotAI(Creature* creature) : npc_escortAI(creature) @@ -612,7 +600,35 @@ public: npc_escortAI::UpdateAI(diff); } + + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*item*/) override + { + if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL) + return; + + if (quest->GetQuestId() == QUEST_ALE) + { + if (instance->GetData(TYPE_BAR) != IN_PROGRESS) + instance->SetData(TYPE_BAR, IN_PROGRESS); + + instance->SetData(TYPE_BAR, SPECIAL); + + //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress + if (instance->GetData(TYPE_BAR) == SPECIAL) + { + Talk(SAY_GOT_BEER); + DoCastSelf(SPELL_DRUNKEN_RAGE, false); + + Start(false, false); + } + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetBlackrockDepthsAI<npc_rocknotAI>(creature); + } }; void AddSC_blackrock_depths() diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp index af91790fb12..923b771b04b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp @@ -125,10 +125,10 @@ public: { boss_coren_direbrewAI(Creature* creature) : BossAI(creature, DATA_COREN) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId != GOSSIP_ID) - return; + return false; if (gossipListId == GOSSIP_OPTION_FIGHT) { @@ -137,6 +137,8 @@ public: } else if (gossipListId == GOSSIP_OPTION_APOLOGIZE) CloseGossipMenuFor(player); + + return false; } void Reset() override @@ -431,16 +433,16 @@ public: void Reset() override { - go->SetLootState(GO_READY); + me->SetLootState(GO_READY); _scheduler .Schedule(Seconds(1), [this](TaskContext /*context*/) { - go->UseDoorOrButton(8); - go->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true); + me->UseDoorOrButton(8); + me->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true); }) .Schedule(Seconds(4), [this](TaskContext /*context*/) { - if (GameObject* trap = go->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f)) + if (GameObject* trap = me->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f)) { trap->SetLootState(GO_ACTIVATED); trap->UseDoorOrButton(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp index afb97ec93d1..d5af35b77b0 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp @@ -51,49 +51,59 @@ enum Phases class boss_gloomrel : public CreatureScript { -public: - boss_gloomrel() : CreatureScript("boss_gloomrel") { } + public: + boss_gloomrel() : CreatureScript("boss_gloomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct boss_gloomrelAI : public ScriptedAI { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - SendGossipMenuFor(player, 2606, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+11: - CloseGossipMenuFor(player); - player->CastSpell(player, SPELL_LEARN_SMELT, false); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); - SendGossipMenuFor(player, 2604, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+22: - CloseGossipMenuFor(player); - if (InstanceScript* instance = creature->GetInstanceScript()) + boss_gloomrelAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) { - //are 5 minutes expected? go template may have data to despawn when used at quest - instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE*5); + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); + SendGossipMenuFor(player, 2606, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 11: + CloseGossipMenuFor(player); + player->CastSpell(player, SPELL_LEARN_SMELT, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22); + SendGossipMenuFor(player, 2604, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 22: + CloseGossipMenuFor(player); + //are 5 minutes expected? go template may have data to despawn when used at quest + instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE * 5); + break; } - break; - } - return true; - } + return true; + } + + bool GossipHello(Player* player) override + { + if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + }; - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + CreatureAI* GetAI(Creature* creature) const override + { + return GetBlackrockDepthsAI<boss_gloomrelAI>(creature); + } }; enum DoomrelSpells @@ -122,37 +132,6 @@ class boss_doomrel : public CreatureScript public: boss_doomrel() : CreatureScript("boss_doomrel") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, 2605, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - CloseGossipMenuFor(player); - //start event here - creature->SetFaction(FACTION_HOSTILE); - creature->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); - creature->AI()->AttackStart(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) - instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 2601, creature->GetGUID()); - - return true; - } - struct boss_doomrelAI : public ScriptedAI { boss_doomrelAI(Creature* creature) : ScriptedAI(creature) @@ -246,6 +225,38 @@ class boss_doomrel : public CreatureScript DoMeleeAttackIfReady(); } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 2605, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + CloseGossipMenuFor(player); + //start event here + me->SetFaction(FACTION_HOSTILE); + me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); + me->AI()->AttackStart(player); + + _instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID()); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 2601, me->GetGUID()); + + return true; + } + private: InstanceScript* _instance; EventMap _events; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h index 678530b149f..8145578f43a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h @@ -82,10 +82,10 @@ enum BWLMisc DATA_EGG_EVENT }; -template<typename AI> -inline AI* GetBlackwingLairAI(Creature* creature) +template <class AI, class T> +inline AI* GetBlackwingLairAI(T* obj) { - return GetInstanceAI<AI>(creature, BWLScriptName); + return GetInstanceAI<AI>(obj, BWLScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 5af9bf91aaa..e5c2d97a9d4 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -373,7 +373,7 @@ public: } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) { @@ -381,6 +381,7 @@ public: Talk(SAY_GAMESBEGIN_1); BeginEvent(player); } + return false; } private: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index d05cf64ab74..8b175f0ac69 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -18,6 +18,7 @@ #include "ScriptMgr.h" #include "blackwing_lair.h" #include "GameObject.h" +#include "GameObjectAI.h" #include "InstanceScript.h" #include "Player.h" #include "ScriptedCreature.h" @@ -175,20 +176,33 @@ public: class go_orb_of_domination : public GameObjectScript { -public: - go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { } + public: + go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetData(DATA_EGG_EVENT) != DONE) - if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) + struct go_orb_of_dominationAI : public GameObjectAI + { + go_orb_of_dominationAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (instance->GetData(DATA_EGG_EVENT) != DONE) { - razorgore->Attack(player, true); - player->CastSpell(razorgore, SPELL_MINDCONTROL); + if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) + { + razorgore->Attack(player, true); + player->CastSpell(razorgore, SPELL_MINDCONTROL); + } } - return true; - } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetBlackwingLairAI<go_orb_of_dominationAI>(go); + } }; class spell_egg_event : public SpellScriptLoader diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 43c0d05805b..184b64a9cde 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -222,13 +222,14 @@ public: DoMeleeAttackIfReady(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_ID && gossipListId == 0) { CloseGossipMenuFor(player); BeginSpeech(player); } + return false; } private: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index 6d03826d7b6..cd1aeef7b97 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -196,13 +196,14 @@ class boss_majordomo : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_OPTION_YOU_CHALLENGED_US && gossipListId == OPTION_ID_YOU_CHALLENGED_US) { CloseGossipMenuFor(player); DoAction(ACTION_START_RAGNAROS); } + return false; } }; diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index a7998726e1e..db48554625c 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -124,7 +124,7 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == 0) { @@ -135,6 +135,7 @@ public: player->PlayerTalkClass->SendCloseGossip(); } + return false; } void NextStep(uint32 uiTimerStep, bool bNextStep = true, uint8 uiPhaseStep = 0) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index c5366285de7..4303a856e68 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -22,6 +22,7 @@ #include "MotionMaster.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellScript.h" #include "SpellAuraEffects.h" @@ -417,25 +418,36 @@ class spell_rain_of_bones : public SpellScriptLoader class go_blackened_urn : public GameObjectScript { -public: - go_blackened_urn() : GameObjectScript("go_blackened_urn") { } + public: + go_blackened_urn() : GameObjectScript("go_blackened_urn") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (go->HasFlag(GO_FLAG_IN_USE)) - return false; + struct go_blackened_urnAI : GameObjectAI + { + go_blackened_urnAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (me->HasFlag(GO_FLAG_IN_USE)) + return false; - InstanceScript* instance = go->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) - return false; + if (instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) + return false; - if (Creature* nightbane = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_NIGHTBANE))) + if (Creature* nightbane = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NIGHTBANE))) + { + me->AddFlag(GO_FLAG_IN_USE); + nightbane->AI()->DoAction(ACTION_SUMMON); + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - go->AddFlag(GO_FLAG_IN_USE); - nightbane->AI()->DoAction(ACTION_SUMMON); + return GetKarazhanAI<go_blackened_urnAI>(go); } - return false; - } }; void AddSC_boss_nightbane() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index bfc74a71127..28bdb8e9056 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -820,8 +820,7 @@ class npc_grandmother : public CreatureScript { npc_grandmotherAI(Creature* creature) : ScriptedAI(creature) { } - - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == OPTION_WHAT_PHAT_LEWTS_YOU_HAVE && gossipListId == 0) { @@ -832,6 +831,7 @@ class npc_grandmother : public CreatureScript me->DespawnOrUnsummon(); } + return false; } }; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index 33d53ca61f9..002010f70f1 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -335,46 +335,43 @@ public: } } } - }; - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - npc_barnesAI* pBarnesAI = ENSURE_AI(npc_barnes::npc_barnesAI, creature->AI()); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, 8971, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - CloseGossipMenuFor(player); - pBarnesAI->StartEvent(); - break; - case GOSSIP_ACTION_INFO_DEF+3: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_OZ; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_HOOD; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - CloseGossipMenuFor(player); - pBarnesAI->m_uiEventId = EVENT_RAJ; - TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str()); - break; - } + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); - return true; - } + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 8971, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + CloseGossipMenuFor(player); + StartEvent(); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_OZ; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_HOOD; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + CloseGossipMenuFor(player); + m_uiEventId = EVENT_RAJ; + TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str()); + break; + } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (InstanceScript* instance = creature->GetInstanceScript()) + return true; + } + + bool GossipHello(Player* player) override { // Check for death of Moroes and if opera event is not done already if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE) @@ -388,21 +385,18 @@ public: AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); } - if (npc_barnesAI* pBarnesAI = CAST_AI(npc_barnes::npc_barnesAI, creature->AI())) - { - if (!pBarnesAI->RaidWiped) - SendGossipMenuFor(player, 8970, creature->GetGUID()); - else - SendGossipMenuFor(player, 8975, creature->GetGUID()); + if (!RaidWiped) + SendGossipMenuFor(player, 8970, me->GetGUID()); + else + SendGossipMenuFor(player, 8975, me->GetGUID()); - return true; - } + return true; } - } - SendGossipMenuFor(player, 8978, creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, 8978, me->GetGUID()); + return true; + } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h index 4ee7756b65e..a25d09e5ba4 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h @@ -112,10 +112,10 @@ enum KZMisc OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50 }; -template<typename AI> -inline AI* GetKarazhanAI(Creature* creature) +template <class AI, class T> +inline AI* GetKarazhanAI(T* obj) { - return GetInstanceAI<AI>(creature, KZScriptName); + return GetInstanceAI<AI>(obj, KZScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index faff214f9fa..98494d2703c 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -67,51 +67,6 @@ class npc_kalecgos : public CreatureScript public: npc_kalecgos() : CreatureScript("npc_kalecgos") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 12500, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, 12502, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - SendGossipMenuFor(player, 12606, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - SendGossipMenuFor(player, 12607, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - SendGossipMenuFor(player, 12608, creature->GetGUID()); - break; - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 12498, creature->GetGUID()); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_kalecgosAI(creature); - } - struct npc_kalecgosAI : public ScriptedAI { npc_kalecgosAI(Creature* creature) : ScriptedAI(creature) { } @@ -152,9 +107,55 @@ public: } } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, 12500, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, 12502, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + SendGossipMenuFor(player, 12606, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, 12607, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + SendGossipMenuFor(player, 12608, me->GetGUID()); + break; + } + + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 12498, me->GetGUID()); + + return true; + } + private: EventMap events; }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_kalecgosAI(creature); + } }; void AddSC_magisters_terrace() diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 89d8c159194..d7e50807867 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -24,6 +24,7 @@ #include "MoveSplineInit.h" #include "ObjectAccessor.h" #include "PassiveAI.h" +#include "GameObjectAI.h" #include "Player.h" #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" @@ -322,22 +323,31 @@ public: class go_acherus_soul_prison : public GameObjectScript { -public: - go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { } + public: + go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (Creature* anchor = go->FindNearestCreature(29521, 15)) + struct go_acherus_soul_prisonAI : public GameObjectAI { - ObjectGuid prisonerGUID = anchor->AI()->GetGUID(); - if (!prisonerGUID.IsEmpty()) - if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) - ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); - } + go_acherus_soul_prisonAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (Creature* anchor = me->FindNearestCreature(29521, 15)) + { + ObjectGuid prisonerGUID = anchor->AI()->GetGUID(); + if (!prisonerGUID.IsEmpty()) + if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) + ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); + } + + return false; + } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_acherus_soul_prisonAI(go); + } }; /*###### @@ -483,47 +493,6 @@ class npc_death_knight_initiate : public CreatureScript public: npc_death_knight_initiate() : CreatureScript("npc_death_knight_initiate") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) - { - CloseGossipMenuFor(player); - - if (player->IsInCombat() || creature->IsInCombat()) - return true; - - if (npc_death_knight_initiateAI* pInitiateAI = CAST_AI(npc_death_knight_initiate::npc_death_knight_initiateAI, creature->AI())) - { - if (pInitiateAI->m_bIsDuelInProgress) - return true; - } - - creature->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); - creature->RemoveUnitFlag(UNIT_FLAG_UNK_15); - - player->CastSpell(creature, SPELL_DUEL, false); - player->CastSpell(player, SPELL_DUEL_FLAG, true); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && creature->IsFullHealth()) - { - if (player->HealthBelowPct(10)) - return true; - - if (player->IsInCombat() || creature->IsInCombat()) - return true; - - AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - return true; - } - struct npc_death_knight_initiateAI : public CombatAI { npc_death_knight_initiateAI(Creature* creature) : CombatAI(creature) @@ -626,6 +595,45 @@ public: CombatAI::UpdateAI(uiDiff); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF) + { + CloseGossipMenuFor(player); + + if (player->IsInCombat() || me->IsInCombat()) + return true; + + if (m_bIsDuelInProgress) + return true; + + me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); + me->RemoveUnitFlag(UNIT_FLAG_UNK_15); + + player->CastSpell(me, SPELL_DUEL, false); + player->CastSpell(player, SPELL_DUEL_FLAG, true); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && me->IsFullHealth()) + { + if (player->HealthBelowPct(10)) + return true; + + if (player->IsInCombat() || me->IsInCombat()) + return true; + + AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + return true; + } }; CreatureAI* GetAI(Creature* creature) const override @@ -759,13 +767,14 @@ public: { npc_salanar_the_horsemanAI(Creature* creature) : ScriptedAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_SALANAR_MENU && gossipListId == GOSSIP_SALANAR_OPTION) { player->CastSpell(player, SPELL_REALM_OF_SHADOWS, true); player->PlayerTalkClass->SendCloseGossip(); } + return false; } void SpellHit(Unit* caster, const SpellInfo* spell) override diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 2733669aa9d..ba35f642194 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -201,18 +201,6 @@ class npc_koltira_deathweaver : public CreatureScript public: npc_koltira_deathweaver() : CreatureScript("npc_koltira_deathweaver") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_BREAKOUT) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - - if (npc_escortAI* escortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI())) - escortAI->Start(false, false, player->GetGUID()); - } - return true; - } - struct npc_koltira_deathweaverAI : public npc_escortAI { npc_koltira_deathweaverAI(Creature* creature) : npc_escortAI(creature) @@ -356,6 +344,15 @@ public: } } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_BREAKOUT) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + Start(false, false, player->GetGUID()); + } + } + private: uint8 wave; uint32 waveTimer; diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index 97c0296df30..255e709ae90 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -274,38 +274,6 @@ class npc_highlord_darion_mograine : public CreatureScript public: npc_highlord_darion_mograine() : CreatureScript("npc_highlord_darion_mograine") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - CloseGossipMenuFor(player); - ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->uiStep = 1; - ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->Start(true, false, player->GetGUID()); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_highlord_darion_mograineAI(creature); - } - struct npc_highlord_darion_mograineAI : public npc_escortAI { npc_highlord_darion_mograineAI(Creature* creature) : npc_escortAI(creature) @@ -1640,8 +1608,40 @@ public: temp->KillSelf(); } } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + CloseGossipMenuFor(player); + uiStep = 1; + Start(true, false, player->GetGUID()); + break; + } + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_highlord_darion_mograineAI(creature); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 338b93d96e1..d27c334a0de 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -23,6 +23,7 @@ SDCategory: Scarlet Monastery EndScriptData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "Group.h" #include "InstanceScript.h" @@ -880,32 +881,41 @@ enum LooselyTurnedSoil class go_loosely_turned_soil : public GameObjectScript { -public: - go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { } + public: + go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE) - return true; + struct go_loosely_turned_soilAI : public GameObjectAI + { + go_loosely_turned_soilAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - return false; - } + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE) + return true; - bool OnQuestReward(Player* player, GameObject* go, Quest const* /*quest*/, uint32 /*opt*/) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS) return false; + } - player->AreaExploredOrEventHappens(11405); - if (Creature* horseman = go->SummonCreature(HH_MOUNTED, FlightPoint[20], TEMPSUMMON_MANUAL_DESPAWN, 0)) + void QuestReward(Player* player, Quest const* /*quest*/, uint32 /*opt*/) override + { + if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS) + return; + + player->AreaExploredOrEventHappens(11405); + if (Creature* horseman = me->SummonCreature(HH_MOUNTED, FlightPoint[20], TEMPSUMMON_MANUAL_DESPAWN, 0)) + { + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); + } + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); - ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); + return GetScarletMonasteryAI<go_loosely_turned_soilAI>(go); } - return true; - } }; void npc_head::npc_headAI::Disappear() diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h index 39fac73d489..c1ba06d446b 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h @@ -62,10 +62,10 @@ enum SMGameObjectIds GO_PUMPKIN_SHRINE = 186267 }; -template<typename AI> -inline AI* GetScarletMonasteryAI(Creature* creature) +template<class AI, class T> +inline AI* GetScarletMonasteryAI(T* obj) { - return GetInstanceAI<AI>(creature, SMScriptName); + return GetInstanceAI<AI>(obj, SMScriptName); } #endif // SCARLET_M_ diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index ba0a5b7b4e2..db0b4fee60c 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "InstanceScript.h" #include "MotionMaster.h" @@ -283,12 +284,22 @@ class go_brazier_of_the_herald : public GameObjectScript public: go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_brazier_of_the_heraldAI : public GameObjectAI { - go->UseDoorOrButton(); - go->PlayDirectSound(SOUND_SCREECH, 0); - player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000); - return true; + go_brazier_of_the_heraldAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->UseDoorOrButton(); + me->PlayDirectSound(SOUND_SCREECH, 0); + player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetScholomanceAI<go_brazier_of_the_heraldAI>(go); } }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h index 975e1ccb741..651f1c26625 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h +++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h @@ -56,10 +56,10 @@ enum SCGameobjectIds GO_BRAZIER_OF_THE_HERALD = 175564 }; -template<typename AI> -inline AI* GetScholomanceAI(Creature* creature) +template <class AI, class T> +inline AI* GetScholomanceAI(T* obj) { - return GetInstanceAI<AI>(creature, ScholomanceScriptName); + return GetInstanceAI<AI>(obj, ScholomanceScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp index 6edda7824be..a1714085160 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp @@ -102,7 +102,7 @@ class boss_apothecary_hummel : public CreatureScript { boss_apothecary_hummelAI(Creature* creature) : BossAI(creature, DATA_APOTHECARY_HUMMEL), _deadCount(0), _isDead(false) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_HUMMEL && gossipListId == GOSSIP_OPTION_START) { @@ -110,6 +110,7 @@ class boss_apothecary_hummel : public CreatureScript CloseGossipMenuFor(player); DoAction(ACTION_START_EVENT); } + return false; } void Reset() override @@ -267,17 +268,20 @@ class boss_apothecary_hummel : public CreatureScript DoMeleeAttackIfReady(); } + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + { + if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) + DoAction(ACTION_START_EVENT); + } + private: uint8 _deadCount; bool _isDead; }; - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override + CreatureAI* GetAI(Creature* creature) const override { - if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) - creature->AI()->DoAction(ACTION_START_EVENT); - - return true; + return GetShadowfangKeepAI<boss_apothecary_hummelAI>(creature); } }; @@ -325,6 +329,11 @@ class npc_apothecary_frye : public CreatureScript Talk(SAY_FRYE_DEATH); } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetShadowfangKeepAI<npc_apothecary_fryeAI>(creature); + } }; class npc_apothecary_baxter : public CreatureScript @@ -383,6 +392,11 @@ class npc_apothecary_baxter : public CreatureScript private: EventMap _events; }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetShadowfangKeepAI<npc_apothecary_baxterAI>(creature); + } }; // 68965 -[DND] Lingering Fumes Targetting (starter) diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp index c323d87f091..b1b641806a8 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp @@ -66,36 +66,6 @@ class npc_shadowfang_prisoner : public CreatureScript public: npc_shadowfang_prisoner() : CreatureScript("npc_shadowfang_prisoner") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetShadowfangKeepAI<npc_shadowfang_prisonerAI>(creature); - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_shadowfang_prisoner::npc_shadowfang_prisonerAI, creature->AI())) - pEscortAI->Start(false, false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - - if (instance && instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE) - AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - struct npc_shadowfang_prisonerAI : public npc_escortAI { npc_shadowfang_prisonerAI(Creature* creature) : npc_escortAI(creature) @@ -142,8 +112,33 @@ public: void Reset() override { } void EnterCombat(Unit* /*who*/) override { } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + Start(false, false); + } + return true; + } + + bool GossipHello(Player* player) override + { + if (instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE) + AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetShadowfangKeepAI<npc_shadowfang_prisonerAI>(creature); + } }; class npc_arugal_voidwalker : public CreatureScript diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index ec82afb6cab..5c0881958ce 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -30,6 +30,7 @@ npc_spectral_ghostly_citizen EndContentData */ #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "GameObject.h" #include "Group.h" #include "InstanceScript.h" @@ -46,41 +47,48 @@ EndContentData */ class go_gauntlet_gate : public GameObjectScript { -public: - go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { } - - bool OnGossipHello(Player* player, GameObject* go) override - { - InstanceScript* instance = go->GetInstanceScript(); + public: + go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { } - if (!instance) - return false; + struct go_gauntlet_gateAI : public GameObjectAI + { + go_gauntlet_gateAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED) - return false; + InstanceScript* instance; - if (Group* group = player->GetGroup()) - { - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + bool GossipHello(Player* player, bool /*reportUse*/) override { - Player* pGroupie = itr->GetSource(); - if (!pGroupie || !pGroupie->IsInMap(player)) - continue; - - if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && - !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) && - pGroupie->GetMap() == go->GetMap()) - pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true); - } - } else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && + if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED) + return false; + + if (Group* group = player->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* pGroupie = itr->GetSource(); + if (!pGroupie || !pGroupie->IsInMap(player)) + continue; + + if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && + !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) && + pGroupie->GetMap() == me->GetMap()) + pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true); + } + } + else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE && !player->HasAura(SPELL_BARON_ULTIMATUM) && - player->GetMap() == go->GetMap()) + player->GetMap() == me->GetMap()) player->CastSpell(player, SPELL_BARON_ULTIMATUM, true); - instance->SetData(TYPE_BARON_RUN, IN_PROGRESS); - return false; - } + instance->SetData(TYPE_BARON_RUN, IN_PROGRESS); + return false; + } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetStratholmeAI<go_gauntlet_gateAI>(go); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h index 8c3d50e0eef..f3f5121bb5a 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h @@ -83,10 +83,10 @@ enum STRSpellIds SPELL_BARON_ULTIMATUM = 27861 }; -template<typename AI> -inline AI* GetStratholmeAI(Creature* creature) +template <class AI, class T> +inline AI* GetStratholmeAI(T* obj) { - return GetInstanceAI<AI>(creature, StratholmeScriptName); + return GetInstanceAI<AI>(obj, StratholmeScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp index b680823c1a5..1b2bbbfa4fc 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp @@ -31,6 +31,7 @@ EndContentData */ #include "InstanceScript.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "sunken_temple.h" /*##### @@ -56,16 +57,26 @@ public: class go_atalai_statue : public GameObjectScript { -public: - go_atalai_statue() : GameObjectScript("go_atalai_statue") { } + public: + go_atalai_statue() : GameObjectScript("go_atalai_statue") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = player->GetInstanceScript()) - instance->SetData(EVENT_STATE, go->GetEntry()); - return false; - } + struct go_atalai_statueAI : public GameObjectAI + { + go_atalai_statueAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + instance->SetData(EVENT_STATE, me->GetEntry()); + return false; + } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSunkenTempleAI<go_atalai_statueAI>(go); + } }; void AddSC_sunken_temple() diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h index c905702d3bc..4815e6ac7ac 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h @@ -18,6 +18,7 @@ #ifndef DEF_SUNKEN_TEMPLE_H #define DEF_SUNKEN_TEMPLE_H +#define STScriptName "instance_sunken_temple" #define DataHeader "ST" enum STEvents @@ -25,4 +26,10 @@ enum STEvents EVENT_STATE = 1 }; +template <class AI, class T> +inline AI* GetSunkenTempleAI(T* obj) +{ + return GetInstanceAI<AI>(obj, STScriptName); +} + #endif diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index d68a463a5ee..e7ee54390ed 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -30,6 +30,8 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" +#include "GameObject.h" #include "sunwell_plateau.h" #include "TemporarySummon.h" @@ -543,27 +545,35 @@ class kalecgos_teleporter : public GameObjectScript public: kalecgos_teleporter() : GameObjectScript("kalecgos_teleporter") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct kalecgos_teleporterAI : public GameObjectAI { -#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0 - uint8 SpectralPlayers = 0; - Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - { - if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5) - ++SpectralPlayers; - } + kalecgos_teleporterAI(GameObject* go) : GameObjectAI(go) { } - if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM) + bool GossipHello(Player* player, bool /*reportUse*/) override { +#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0 + uint8 SpectralPlayers = 0; + Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5) + ++SpectralPlayers; + } + + if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM) + { + return true; + } +#endif + + player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true); return true; } -#else - (void)go; -#endif + }; - player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true); - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSunwellPlateauAI<kalecgos_teleporterAI>(go); } }; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 1a4999d450f..0eff7cda638 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -32,6 +32,7 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "sunwell_plateau.h" #include "TemporarySummon.h" #include <cmath> @@ -365,25 +366,36 @@ public: class go_orb_of_the_blue_flight : public GameObjectScript { -public: - go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { } + public: + go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (go->GetFaction() == 35) + struct go_orb_of_the_blue_flightAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000); - player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false); - go->SetFaction(0); + go_orb_of_the_blue_flightAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetFaction() == 35) + { + player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000); + player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false); + me->SetFaction(0); - if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ))) - ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); + if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ))) + ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); - go->Refresh(); + me->Refresh(); + } + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetSunwellPlateauAI<go_orb_of_the_blue_flightAI>(go); } - return true; - } }; //AI for Kil'jaeden Event Controller diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h index c3adfb74dd3..2e70fbe6922 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h @@ -114,10 +114,10 @@ enum SWPGameObjectIds GO_MURUS_GATE_2 = 188118 }; -template<typename AI> -inline AI* GetSunwellPlateauAI(Creature* creature) +template <class AI, class T> +inline AI* GetSunwellPlateauAI(T* obj) { - return GetInstanceAI<AI>(creature, SunwellPlateauScriptName); + return GetInstanceAI<AI>(obj, SunwellPlateauScriptName); } #endif // SUNWELL_PLATEAU_H diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp index 38ab7cd851f..1b301d553dc 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp @@ -30,8 +30,10 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellInfo.h" #include "uldaman.h" +#include "GameObject.h" enum Says { @@ -396,22 +398,26 @@ EndScriptData */ class go_altar_of_archaedas : public GameObjectScript { public: + go_altar_of_archaedas() : GameObjectScript("go_altar_of_archaedas") { } - go_altar_of_archaedas() - : GameObjectScript("go_altar_of_archaedas") + struct go_altar_of_archaedasAI : public GameObjectAI { - } + go_altar_of_archaedasAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - InstanceScript* instance = player->GetInstanceScript(); - if (!instance) - return false; + InstanceScript* instance; + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->CastSpell(player, SPELL_BOSS_OBJECT_VISUAL, false); - player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false); + instance->SetGuidData(0, player->GetGUID()); // activate archaedas + return false; + } + }; - instance->SetGuidData(0, player->GetGUID()); // activate archaedas - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUldamanAI<go_altar_of_archaedasAI>(go); } }; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp index aa8eba40674..e7d78c1ac48 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp @@ -33,6 +33,7 @@ EndContentData */ #include "InstanceScript.h" #include "Player.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "uldaman.h" /*###### @@ -117,16 +118,26 @@ class npc_jadespine_basilisk : public CreatureScript class go_keystone_chamber : public GameObjectScript { -public: - go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { } + public: + go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { } + + struct go_keystone_chamberAI : public GameObjectAI + { + go_keystone_chamberAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override - { - if (InstanceScript* instance = go->GetInstanceScript()) - instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state. + InstanceScript* instance; - return false; - } + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state. + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUldamanAI<go_keystone_chamberAI>(go); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h index 675118ac9c8..595354f1c92 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h +++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h @@ -44,10 +44,10 @@ enum UDGameObjectIds GO_KEYSTONE = 124371, }; -template<typename AI> -inline AI* GetUldamanAI(Creature* creature) +template <class AI, class T> +inline AI* GetUldamanAI(T* obj) { - return GetInstanceAI<AI>(creature, UldamanScriptName); + return GetInstanceAI<AI>(obj, UldamanScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index ce854dd882e..61688d363a2 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -101,10 +101,10 @@ class npc_voljin_zulaman : public CreatureScript _gongCount = 0; } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (_instance->GetData(DATA_ZULAMAN_STATE) != NOT_STARTED) - return; + return true; if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { @@ -116,6 +116,7 @@ class npc_voljin_zulaman : public CreatureScript Talk(SAY_INTRO_1, player); me->SetWalk(true); } + return false; } void DoAction(int32 action) override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 9277c2e6eb4..d4d2908dec5 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -89,10 +89,10 @@ enum ZGGameObjectIds GO_THE_CACHE_OF_MADNESS_DOOR = 208843 }; -template<typename AI> -inline AI* GetZulGurubAI(Creature* creature) +template<class AI, class T> +AI* GetZulGurubAI(T* obj) { - return GetInstanceAI<AI>(creature, ZGScriptName); + return GetInstanceAI<AI>(obj, ZGScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index f07c55b2752..f9f0985b416 100644 --- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp @@ -107,7 +107,7 @@ class npc_professor_phizzlethorpe : public CreatureScript Talk(SAY_AGGRO); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) { diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp index 1e4d75852a2..fd4617bb183 100644 --- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -127,19 +127,16 @@ public: if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) Cage->SetGoState(GO_STATE_READY); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS) + void QuestAccept(Player* player, Quest const* quest) override { - creature->SetFaction(FACTION_QUEST_ESCAPE); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_ranger_lilatha::npc_ranger_lilathaAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS) + { + me->SetFaction(FACTION_QUEST_ESCAPE); + Start(true, false, player->GetGUID()); + } } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index 821f99ffc9a..3fd9345ef0e 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -74,7 +74,7 @@ public: summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_RESQUE_OOX_09) { diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index a808a175178..137b779878e 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -111,20 +111,16 @@ public: { Talk(SAY_AGGRO, who); } - }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCORTING) + void QuestAccept(Player* player, Quest const* quest) override { - creature->AI()->Talk(SAY_QUESTACCEPT, player); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_deathstalker_erland::npc_deathstalker_erlandAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + if (quest->GetQuestId() == QUEST_ESCORTING) + { + Talk(SAY_QUESTACCEPT, player); + Start(true, false, player->GetGUID()); + } } - - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp index 54335415ac2..a30fb95d026 100644 --- a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp @@ -55,7 +55,7 @@ class npc_tb_spirit_guide : public CreatureScript DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { player->PlayerTalkClass->SendCloseGossip(); @@ -81,11 +81,13 @@ class npc_tb_spirit_guide : public CreatureScript areaId = TB_GY_SOUTH_SPIRE; break; default: - return; + return true; } if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(areaId)) player->TeleportTo(safeLoc->Loc); + + return false; } }; diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index ff2aa97601c..56cc8d49c25 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -96,14 +96,6 @@ class npc_lady_sylvanas_windrunner : public CreatureScript public: npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { } - bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override - { - if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) - creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); - - return true; - } - struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI { npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature) @@ -238,6 +230,12 @@ public: DoMeleeAttackIfReady(); } + void QuestReward(Player* player, Quest const* quest, uint32 /*opt*/) override + { + if (quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) + SetGUID(player->GetGUID(), GUID_EVENT_INVOKER); + } + private: EventMap _events; bool LamentEvent; diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index 621e8f13603..c706e47f739 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -58,62 +58,73 @@ enum DithersAndArbington class npcs_dithers_and_arbington : public CreatureScript { -public: - npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { } + public: + npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + struct npcs_dithers_and_arbingtonAI : public ScriptedAI { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, NPC_TEXT_OSSEOUS_AGITATORS, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_1, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_2, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - SendGossipMenuFor(player, NPC_TEXT_ECTOPLASMIC_RESONATORS, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - CloseGossipMenuFor(player); - creature->CastSpell(player, CREATE_ITEM_VITREOUS_FOCUSER, false); - break; - } - return true; - } + npcs_dithers_and_arbingtonAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, NPC_TEXT_OSSEOUS_AGITATORS, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_1, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_2, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, NPC_TEXT_ECTOPLASMIC_RESONATORS, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + CloseGossipMenuFor(player); + DoCast(player, CREATE_ITEM_VITREOUS_FOCUSER, false); + break; + } + return true; + } - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + if (player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_H) || player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_A)) + { + AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_FELSTONE_FIELD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_DALSON_S_TEARS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_WRITHING_HAUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_GAHRRON_S_WITH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + SendGossipMenuFor(player, NPC_TEXT_LET_S_GET_TO_WORK, me->GetGUID()); + } + else + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } + }; - if (player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_H) || player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_A)) + CreatureAI* GetAI(Creature* creature) const override { - AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_FELSTONE_FIELD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_DALSON_S_TEARS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_WRITHING_HAUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_GAHRRON_S_WITH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - SendGossipMenuFor(player, NPC_TEXT_LET_S_GET_TO_WORK, creature->GetGUID()); + return new npcs_dithers_and_arbingtonAI(creature); } - else - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp index f561db22727..856080be6fa 100644 --- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp @@ -148,22 +148,30 @@ class npc_mikhail : public CreatureScript public: npc_mikhail() : CreatureScript("npc_mikhail") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override + struct npc_mikhailAI : public ScriptedAI { - if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) - { - Creature* pSlim = creature->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f); + npc_mikhailAI(Creature* creature) : ScriptedAI(creature) { } - if (!pSlim) - return false; + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11) + { + Creature* slim = me->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f); + if (!slim) + return; - if (!pSlim->HasStealthAura()) - pSlim->CastSpell(pSlim, SPELL_STEALTH, true); + if (!slim->HasStealthAura()) + slim->CastSpell(slim, SPELL_STEALTH, true); - if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* pEscortAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, pSlim->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); + if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* slimAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, slim->AI())) + slimAI->Start(false, false, player->GetGUID(), quest); + } } - return false; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_mikhailAI(creature); } }; |
