From f913f3bb8977c127d200d5d4a608ab434b21bbcd Mon Sep 17 00:00:00 2001 From: ariel- Date: Mon, 1 May 2017 18:19:36 -0300 Subject: Core/Scripts: unified scripted gossip/quest api - Changed self-accessor on GameObjectAI to "me", like UnitAI - Moved all related functions to AI, now Unit and GameObject have the same function names with identical behaviour - Remove "OnUpdate" from CreatureScript/GameObjectScript, was never used and we already have AI Update method - Quest methods no longer return a bool, the return value was used to call the AI version if the ScriptMgr one returned false - Implemented GameObjectAI::Destroyed hook (was never called), implemented Damaged method - Rename OnStateChanged to OnLootStateChanged to reflect when it's really called, and created a new hook OnStateChanged that only gets called on GOState change - Since the functions are now only getting called from AI, made GetAI methods full virtual. (CanSpawn method is anyways going to be used on creatures with AI) --- .../BlackrockDepths/blackrock_depths.cpp | 180 +++++++++++---------- .../BlackrockDepths/boss_coren_direbrew.cpp | 14 +- .../BlackrockDepths/boss_tomb_of_seven.cpp | 145 +++++++++-------- .../BlackwingLair/boss_nefarian.cpp | 3 +- .../BlackwingLair/boss_razorgore.cpp | 36 +++-- .../BlackwingLair/boss_vaelastrasz.cpp | 3 +- .../MoltenCore/boss_majordomo_executus.cpp | 3 +- .../EasternKingdoms/Gnomeregan/gnomeregan.cpp | 3 +- .../EasternKingdoms/Karazhan/boss_nightbane.cpp | 40 +++-- .../EasternKingdoms/Karazhan/bosses_opera.cpp | 3 +- .../scripts/EasternKingdoms/Karazhan/karazhan.cpp | 92 +++++------ .../MagistersTerrace/magisters_terrace.cpp | 91 +++++------ .../EasternKingdoms/ScarletEnclave/chapter1.cpp | 113 +++++++------ .../EasternKingdoms/ScarletEnclave/chapter2.cpp | 21 ++- .../EasternKingdoms/ScarletEnclave/chapter5.cpp | 64 ++++---- .../ScarletMonastery/boss_headless_horseman.cpp | 48 +++--- .../ScarletMonastery/scarlet_monastery.h | 6 +- .../Scholomance/boss_kirtonos_the_herald.cpp | 20 ++- .../ShadowfangKeep/boss_apothecary_hummel.cpp | 17 +- .../ShadowfangKeep/shadowfang_keep.cpp | 55 +++---- .../EasternKingdoms/Stratholme/stratholme.cpp | 62 +++---- .../EasternKingdoms/SunkenTemple/sunken_temple.cpp | 27 +++- .../SunwellPlateau/boss_kalecgos.cpp | 39 +++-- .../SunwellPlateau/boss_kiljaeden.cpp | 40 +++-- .../SunwellPlateau/sunwell_plateau.h | 6 +- .../EasternKingdoms/Uldaman/boss_archaedas.cpp | 27 ++-- .../scripts/EasternKingdoms/Uldaman/uldaman.cpp | 27 +++- .../scripts/EasternKingdoms/ZulAman/zulaman.cpp | 51 +++--- .../EasternKingdoms/ZulGurub/boss_arlokk.cpp | 23 ++- .../scripts/EasternKingdoms/ZulGurub/zulgurub.h | 6 +- .../EasternKingdoms/zone_arathi_highlands.cpp | 2 +- .../EasternKingdoms/zone_burning_steppes.cpp | 58 +++---- .../scripts/EasternKingdoms/zone_ghostlands.cpp | 17 +- .../scripts/EasternKingdoms/zone_hinterlands.cpp | 4 +- .../EasternKingdoms/zone_redridge_mountains.cpp | 2 +- .../EasternKingdoms/zone_silverpine_forest.cpp | 52 +++--- .../EasternKingdoms/zone_stormwind_city.cpp | 51 +++--- .../EasternKingdoms/zone_swamp_of_sorrows.cpp | 2 +- .../EasternKingdoms/zone_tirisfal_glades.cpp | 102 +++++++----- .../scripts/EasternKingdoms/zone_undercity.cpp | 14 +- .../EasternKingdoms/zone_western_plaguelands.cpp | 109 +++++++------ .../scripts/EasternKingdoms/zone_wetlands.cpp | 30 ++-- 42 files changed, 947 insertions(+), 761 deletions(-) (limited to 'src/server/scripts/EasternKingdoms') diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 9b29d8c29b0..d6e4408e478 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -19,6 +19,7 @@ #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" +#include "GameObjectAI.h" #include "blackrock_depths.h" #include "Player.h" #include "WorldSession.h" @@ -26,25 +27,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 GetInstanceAI(go); } - return false; - } }; // npc_grimstone @@ -429,45 +440,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 @@ -483,41 +506,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 GetInstanceAI(creature); - } - struct npc_rocknotAI : public npc_escortAI { npc_rocknotAI(Creature* creature) : npc_escortAI(creature) @@ -607,7 +595,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 GetInstanceAI(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 b9e9e6186b4..4c4bb437f54 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp @@ -121,10 +121,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) { @@ -133,6 +133,8 @@ public: } else if (gossipListId == GOSSIP_OPTION_APOLOGIZE) CloseGossipMenuFor(player); + + return false; } void Reset() override @@ -427,16 +429,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 86ae8fdccee..b0ea64b47e6 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 GetInstanceAI(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->RemoveFlag(UNIT_FIELD_FLAGS, 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->RemoveFlag(UNIT_FIELD_FLAGS, 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/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index ad9dfd240f9..7984f688dc2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -371,7 +371,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) { @@ -379,6 +379,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 56b6731da84..8cfd63f975d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -19,6 +19,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" +#include "GameObjectAI.h" #include "blackwing_lair.h" #include "Player.h" @@ -174,20 +175,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 GetInstanceAI(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 ffee18f54cf..55c048f50e8 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 c061ae2a429..2949bbeb37e 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 d6bbed40e9e..bf781c171e5 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -121,7 +121,7 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { if (gossipListId == 0) { @@ -132,6 +132,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 c40def9a5c6..7e4308c685f 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -17,6 +17,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellScript.h" #include "SpellAuraEffects.h" #include "karazhan.h" @@ -415,25 +416,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(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) - return false; + struct go_blackened_urnAI : GameObjectAI + { + go_blackened_urnAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - InstanceScript* instance = go->GetInstanceScript(); - if (!instance || instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) - return false; + InstanceScript* instance; - if (Creature* nightbane = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_NIGHTBANE))) + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) + return false; + + if (instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) + return false; + + if (Creature* nightbane = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NIGHTBANE))) + { + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + nightbane->AI()->DoAction(ACTION_SUMMON); + } + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - nightbane->AI()->DoAction(ACTION_SUMMON); + return GetKarazhanAI(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 3a13da90857..55bbbbc0e03 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -816,7 +816,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) { @@ -827,6 +827,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 264a21d880f..09dff7b6f0f 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,25 +385,22 @@ 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 { - return GetInstanceAI(creature); + return GetKarazhanAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index 9792ea0cfba..21e90d9a24d 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -68,51 +68,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) { } @@ -153,9 +108,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 d4a17aca5be..8421c1658ab 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -23,6 +23,7 @@ #include "ScriptedEscortAI.h" #include "CombatAI.h" #include "PassiveAI.h" +#include "GameObjectAI.h" #include "Player.h" #include "SpellInfo.h" #include "CreatureTextMgr.h" @@ -319,19 +320,28 @@ 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)) - if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID()) - if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) - ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); + struct go_acherus_soul_prisonAI : public GameObjectAI + { + go_acherus_soul_prisonAI(GameObject* go) : GameObjectAI(go) { } - return false; - } + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (Creature* anchor = me->FindNearestCreature(29521, 15)) + if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID()) + 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); + } }; /*###### @@ -474,47 +484,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->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - creature->RemoveFlag(UNIT_FIELD_FLAGS, 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) @@ -617,6 +586,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->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->RemoveFlag(UNIT_FIELD_FLAGS, 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 @@ -750,13 +758,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 59f510ded28..1ad704b2495 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -199,18 +199,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) @@ -354,6 +342,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 396d5fb2fa1..24ead674f2b 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -270,38 +270,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) @@ -1636,8 +1604,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 3102b7461d5..c1b3bbd8aec 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -25,6 +25,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellMgr.h" #include "scarlet_monastery.h" #include "LFGMgr.h" @@ -876,32 +877,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].x, FlightPoint[20].y, FlightPoint[20].z, 0, 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].x, FlightPoint[20].y, FlightPoint[20].z, 0, 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); } - 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 fede79df5d3..94db224f4ce 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h @@ -60,10 +60,10 @@ enum SMGameObjectIds GO_PUMPKIN_SHRINE = 186267 }; -template -inline AI* GetScarletMonasteryAI(Creature* creature) +template +inline AI* GetScarletMonasteryAI(T* obj) { - return GetInstanceAI(creature, SMScriptName); + return GetInstanceAI(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 acb90732940..d2306164846 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -280,12 +280,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 GetInstanceAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp index 1ca23799f83..485c7b3d6a5 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp @@ -99,7 +99,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) { @@ -107,6 +107,7 @@ class boss_apothecary_hummel : public CreatureScript CloseGossipMenuFor(player); DoAction(ACTION_START_EVENT); } + return false; } void Reset() override @@ -261,6 +262,12 @@ 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; @@ -270,14 +277,6 @@ class boss_apothecary_hummel : public CreatureScript { return GetInstanceAI(creature); } - - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override - { - if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED) - creature->AI()->DoAction(ACTION_START_EVENT); - - return true; - } }; struct npc_apothecary_genericAI : public ScriptedAI diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp index f1cc7223d27..077a5664b93 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp @@ -67,36 +67,6 @@ class npc_shadowfang_prisoner : public CreatureScript public: npc_shadowfang_prisoner() : CreatureScript("npc_shadowfang_prisoner") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(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) @@ -143,8 +113,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 GetInstanceAI(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 3ccf0e3dd19..c67a1c2b4bb 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -32,6 +32,7 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "stratholme.h" #include "Group.h" #include "Player.h" @@ -43,41 +44,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 GetInstanceAI(go); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp index e6be567052d..581c5b3afbd 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp @@ -29,6 +29,7 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "sunken_temple.h" #include "Player.h" @@ -63,16 +64,26 @@ class at_malfurion_stormrage : public AreaTriggerScript class go_atalai_statue : public GameObjectScript { -public: - go_atalai_statue() : GameObjectScript("go_atalai_statue") { } + public: + go_atalai_statue() : GameObjectScript("go_atalai_statue") { } + + struct go_atalai_statueAI : public GameObjectAI + { + go_atalai_statueAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (InstanceScript* instance = player->GetInstanceScript()) - instance->SetData(EVENT_STATE, go->GetEntry()); - return false; - } + InstanceScript* instance; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + instance->SetData(EVENT_STATE, me->GetEntry()); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetInstanceAI(go); + } }; void AddSC_sunken_temple() diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index 34289a5a414..89a1de21f31 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -25,6 +25,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "sunwell_plateau.h" #include "Player.h" #include "WorldSession.h" @@ -536,27 +537,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(go); } }; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 8ad5f24b639..557e566fb2f 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "sunwell_plateau.h" #include #include "Player.h" @@ -359,25 +360,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); } - 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 eb99ba3ebae..f843f011ff2 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h @@ -112,10 +112,10 @@ enum SWPGameObjectIds GO_MURUS_GATE_2 = 188118 }; -template -AI* GetSunwellPlateauAI(Creature* creature) +template +AI* GetSunwellPlateauAI(T* obj) { - return GetInstanceAI(creature, SunwellPlateauScriptName); + return GetInstanceAI(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 eae2d3a0470..e3b658e76d9 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "uldaman.h" #include "Player.h" @@ -394,22 +395,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 GetInstanceAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp index 0d36c1e3aa1..f2571748332 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp @@ -31,6 +31,7 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "uldaman.h" #include "Player.h" @@ -116,16 +117,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 GetInstanceAI(go); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index f23a9fab812..affb1ab9406 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -136,42 +136,52 @@ class npc_zulaman_hostage : public CreatureScript public: npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_zulaman_hostageAI : public ScriptedAI { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); + npc_zulaman_hostageAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } - if (action == GOSSIP_ACTION_INFO_DEF + 1) - CloseGossipMenuFor(player); + InstanceScript* instance; - if (!creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) + bool GossipHello(Player* player) override + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); return true; + } - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - - if (InstanceScript* instance = creature->GetInstanceScript()) + 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); + + if (!me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) + return true; + + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + //uint8 progress = instance->GetData(DATA_CHESTLOOTED); instance->SetData(DATA_CHESTLOOTED, 0); float x, y, z; - creature->GetPosition(x, y, z); - uint32 entry = creature->GetEntry(); + me->GetPosition(x, y, z); + uint32 entry = me->GetEntry(); for (uint8 i = 0; i < 4; ++i) { if (HostageEntry[i] == entry) { - creature->SummonGameObject(ChestEntry[i], Position(x - 2, y, z, 0.f), G3D::Quat(), 0); + me->SummonGameObject(ChestEntry[i], Position(x - 2, y, z, 0.f), G3D::Quat(), 0); break; } } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetZulAmanAI(creature); } }; @@ -268,7 +278,7 @@ class npc_harrison_jones : public CreatureScript void EnterCombat(Unit* /*who*/) override { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { @@ -279,6 +289,7 @@ class npc_harrison_jones : public CreatureScript _gongEvent = GONG_EVENT_1; _gongTimer = 4000; } + return false; } void SpellHit(Unit*, const SpellInfo* spell) override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp index 6a2435e2147..9110ac28069 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellInfo.h" #include "zulgurub.h" @@ -440,17 +441,25 @@ Position const PosSummonArlokk[1] = class go_gong_of_bethekk : public GameObjectScript { - public: go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { } + public: + go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_gong_of_bethekkAI : public GameObjectAI { - if (go->GetInstanceScript()) + go_gong_of_bethekkAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SendCustomAnim(0); - go->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SendCustomAnim(0); + me->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000); + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetZulGurubAI(go); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 9359f37206a..4148b4d9e08 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -67,10 +67,10 @@ enum ZGGameObjectIds GO_GONG_OF_BETHEKK = 180526 // Arlokk Event }; -template -AI* GetZulGurubAI(Creature* creature) +template +AI* GetZulGurubAI(T* obj) { - return GetInstanceAI(creature, ZGScriptName); + return GetInstanceAI(obj, ZGScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index 43c5dbdc584..dd2b3d32f83 100644 --- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp @@ -114,7 +114,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_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp index 892f9929968..e6170d0e65e 100644 --- a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp @@ -45,47 +45,47 @@ enum RaggedJohn class npc_ragged_john : public CreatureScript { -public: - npc_ragged_john() : CreatureScript("npc_ragged_john") { } + public: + npc_ragged_john() : CreatureScript("npc_ragged_john") { } - struct npc_ragged_johnAI : public ScriptedAI - { - npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) { } + struct npc_ragged_johnAI : public ScriptedAI + { + npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) { } - void Reset() override { } + void Reset() override { } - void MoveInLineOfSight(Unit* who) override - { - if (who->HasAura(SPELL_MOTHERS_MILK)) + void MoveInLineOfSight(Unit* who) override { - if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me)) + if (who->HasAura(SPELL_MOTHERS_MILK)) { - DoCast(who, SPELL_WICKED_MILKING); - if (Player* player = who->ToPlayer()) - player->AreaExploredOrEventHappens(QUEST_MOTHERS_MILK); + if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me)) + { + DoCast(who, SPELL_WICKED_MILKING); + if (Player* player = who->ToPlayer()) + player->AreaExploredOrEventHappens(QUEST_MOTHERS_MILK); + } } + + ScriptedAI::MoveInLineOfSight(who); } - ScriptedAI::MoveInLineOfSight(who); - } + void EnterCombat(Unit* /*who*/) override { } - void EnterCombat(Unit* /*who*/) override { } - }; + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + { + player->PrepareQuestMenu(me->GetGUID()); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + return true; + } + }; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) + CreatureAI* GetAI(Creature* creature) const override { - player->PrepareQuestMenu(creature->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + return new npc_ragged_johnAI(creature); } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_ragged_johnAI(creature); - } }; void AddSC_burning_steppes() diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp index 2156b772e75..d562b95370d 100644 --- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -126,19 +126,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 66e999ec85a..b2610a82038 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -75,7 +75,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) { @@ -235,7 +235,7 @@ public: summoned->GetMotionMaster()->MovePoint(0, AmbushMoveTo[spawnId]); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_RINJI_TRAPPED) { diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp index df55de6f35f..e5545231083 100644 --- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp @@ -63,7 +63,7 @@ public: Initialize(); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_MISSING_IN_ACTION) { diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index 9e71280a2a8..c194b700830 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -114,20 +114,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 { @@ -176,24 +172,6 @@ class pyrewood_ambush : public CreatureScript public: pyrewood_ambush() : CreatureScript("pyrewood_ambush") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest *quest) override - { - if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress) - { - ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true; - ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0; - ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0; - ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID(); - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new pyrewood_ambushAI(creature); - } - struct pyrewood_ambushAI : public ScriptedAI { pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me) @@ -331,7 +309,23 @@ public: } ++Phase; //prepare next phase } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !QuestInProgress) + { + QuestInProgress = true; + Phase = 0; + KillCount = 0; + PlayerGUID = player->GetGUID(); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new pyrewood_ambushAI(creature); + } }; /*###### diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 704253f2cfc..6b1652a0acc 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -52,21 +52,6 @@ class npc_bartleby : public CreatureScript public: npc_bartleby() : CreatureScript("npc_bartleby") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_BEAT) - { - creature->SetFaction(FACTION_ENEMY); - creature->AI()->AttackStart(player); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_bartlebyAI(creature); - } - struct npc_bartlebyAI : public ScriptedAI { npc_bartlebyAI(Creature* creature) : ScriptedAI(creature) @@ -105,7 +90,21 @@ public: EnterEvadeMode(); } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_BEAT) + { + me->SetFaction(FACTION_ENEMY); + AttackStart(player); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_bartlebyAI(creature); + } }; /*###### @@ -541,18 +540,26 @@ class npc_tyrion : public CreatureScript public: npc_tyrion() : CreatureScript("npc_tyrion") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override + struct npc_tyrionAI : ScriptedAI { - if (quest->GetQuestId() == QUEST_THE_ATTACK) + npc_tyrionAI(Creature* creature) : ScriptedAI(creature) { } + + void QuestAccept(Player* player, Quest const* quest) override { - if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true)) + if (quest->GetQuestId() == QUEST_THE_ATTACK) { - ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID()); - ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f); + if (Creature* spybot = me->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true)) + { + ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, spybot->AI())->Start(false, false, player->GetGUID()); + ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, spybot->AI())->SetMaxPlayerDistance(200.0f); + } } - return true; } - return false; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_tyrionAI(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp index 0aabe071a0d..5cd85585a9d 100644 --- a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp +++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp @@ -61,7 +61,7 @@ public: Talk(SAY_ATTACKED, who); } - void sQuestAccept(Player* player, Quest const* quest) override + void QuestAccept(Player* player, Quest const* quest) override { if (quest->GetQuestId() == QUEST_GALENS_ESCAPE) { diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp index 6d54c9f0f88..37be4a844cc 100644 --- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp @@ -31,6 +31,7 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "Player.h" /*###### @@ -50,22 +51,6 @@ class npc_calvin_montague : public CreatureScript public: npc_calvin_montague() : CreatureScript("npc_calvin_montague") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_590) - { - creature->SetFaction(FACTION_HOSTILE); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - ENSURE_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_calvin_montagueAI(creature); - } - struct npc_calvin_montagueAI : public ScriptedAI { npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature) @@ -159,7 +144,22 @@ public: DoMeleeAttackIfReady(); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_590) + { + me->SetFaction(FACTION_HOSTILE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + AttackStart(player); + } + } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_calvin_montagueAI(creature); + } }; /*###### @@ -177,45 +177,65 @@ enum Mausoleum class go_mausoleum_door : public GameObjectScript { -public: - go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { } + public: + go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) - return false; + struct go_mausoleum_doorAI : public GameObjectAI + { + go_mausoleum_doorAI(GameObject* go) : GameObjectAI(go) { } - if (!player->FindNearestCreature(NPC_ULAG, 50.0f)) - if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f)) + bool GossipHello(Player* player, bool /*reportUse*/) override { - pTrigger->SetGoState(GO_STATE_READY); - player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000); + if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) + return false; + + if (!player->FindNearestCreature(NPC_ULAG, 50.0f)) + { + if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f)) + { + pTrigger->SetGoState(GO_STATE_READY); + player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000); + return false; + } + } return false; } + }; - return false; - } + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_mausoleum_doorAI(go); + } }; class go_mausoleum_trigger : public GameObjectScript { -public: - go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { } + public: + go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { } - bool OnGossipHello(Player* player, GameObject* go) override - { - if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) - return false; + struct go_mausoleum_triggerAI : public GameObjectAI + { + go_mausoleum_triggerAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) + return false; + + if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f)) + { + me->SetGoState(GO_STATE_ACTIVE); + pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); + return true; + } + return false; + } + }; - if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f)) + GameObjectAI* GetAI(GameObject* go) const override { - go->SetGoState(GO_STATE_ACTIVE); - pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - return true; + return new go_mausoleum_triggerAI(go); } - - return false; - } }; void AddSC_tirisfal_glades() diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index 3245a4e147e..e8bb32bf3a9 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 11857b038cb..5839d40c15f 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -59,62 +59,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 c5fd05924da..ecc4e805595 100644 --- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp @@ -149,22 +149,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); } }; -- cgit v1.2.3