aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/EasternKingdoms
diff options
context:
space:
mode:
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);
}
};