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