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
committerariel- <ariel-@users.noreply.github.com>2017-05-01 18:19:36 -0300
commitf913f3bb8977c127d200d5d4a608ab434b21bbcd (patch)
treebb2d18ad5c0c23667271ca98bd6754cc745256a8 /src/server/scripts/EasternKingdoms
parente4481c016a86fe7db0b83a434ea08eb7ba50174f (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)
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/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.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp92
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp91
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp113
-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.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp17
-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/SunkenTemple/sunken_temple.cpp27
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp39
-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.cpp27
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp27
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp51
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp23
-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_burning_steppes.cpp58
-rw-r--r--src/server/scripts/EasternKingdoms/zone_ghostlands.cpp17
-rw-r--r--src/server/scripts/EasternKingdoms/zone_hinterlands.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp52
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp51
-rw-r--r--src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp102
-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
42 files changed, 947 insertions, 761 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
index 9b29d8c29b0..d6e4408e478 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
@@ -19,6 +19,7 @@
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "ScriptedGossip.h"
+#include "GameObjectAI.h"
#include "blackrock_depths.h"
#include "Player.h"
#include "WorldSession.h"
@@ -26,25 +27,35 @@
//go_shadowforge_brazier
class go_shadowforge_brazier : public GameObjectScript
{
-public:
- go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { }
+ public:
+ go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
+ struct go_shadowforge_brazierAI : public GameObjectAI
{
- if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS)
- instance->SetData(TYPE_LYCEUM, DONE);
- else
- instance->SetData(TYPE_LYCEUM, IN_PROGRESS);
- // If used brazier open linked doors (North or South)
- if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N))
- instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true);
- else if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S))
- instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true);
+ go_shadowforge_brazierAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS)
+ instance->SetData(TYPE_LYCEUM, DONE);
+ else
+ instance->SetData(TYPE_LYCEUM, IN_PROGRESS);
+ // If used brazier open linked doors (North or South)
+ if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N))
+ instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true);
+ else if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S))
+ instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true);
+
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_shadowforge_brazierAI>(go);
}
- return false;
- }
};
// npc_grimstone
@@ -429,45 +440,57 @@ enum Lokhtos
class npc_lokhtos_darkbargainer : public CreatureScript
{
-public:
- npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { }
+ public:
+ npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ struct npc_lokhtos_darkbargainerAI : public ScriptedAI
{
- CloseGossipMenuFor(player);
- player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false);
- }
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
+ npc_lokhtos_darkbargainerAI(Creature* creature) : ScriptedAI(creature) { }
- return true;
- }
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ {
+ CloseGossipMenuFor(player);
+ player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false);
+ }
+ if (action == GOSSIP_ACTION_TRADE)
+ player->GetSession()->SendListInventory(me->GetGUID());
- if (creature->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY)
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ return true;
+ }
- if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 &&
- !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) &&
- player->HasItemCount(ITEM_SULFURON_INGOT))
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- }
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- if (player->GetReputationRank(59) < REP_FRIENDLY)
- SendGossipMenuFor(player, 3673, creature->GetGUID());
- else
- SendGossipMenuFor(player, 3677, creature->GetGUID());
+ if (me->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY)
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- return true;
- }
+ if (!player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) &&
+ !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) &&
+ player->HasItemCount(ITEM_SULFURON_INGOT))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ }
+
+ if (player->GetReputationRank(59) < REP_FRIENDLY)
+ SendGossipMenuFor(player, 3673, me->GetGUID());
+ else
+ SendGossipMenuFor(player, 3677, me->GetGUID());
+
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_lokhtos_darkbargainerAI(creature);
+ }
};
// npc_rocknot
@@ -483,41 +506,6 @@ class npc_rocknot : public CreatureScript
public:
npc_rocknot() : CreatureScript("npc_rocknot") { }
- bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*item*/) override
- {
- InstanceScript* instance = creature->GetInstanceScript();
- if (!instance)
- return true;
-
- if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL)
- return true;
-
- if (quest->GetQuestId() == QUEST_ALE)
- {
- if (instance->GetData(TYPE_BAR) != IN_PROGRESS)
- instance->SetData(TYPE_BAR, IN_PROGRESS);
-
- instance->SetData(TYPE_BAR, SPECIAL);
-
- //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress
- if (instance->GetData(TYPE_BAR) == SPECIAL)
- {
- creature->AI()->Talk(SAY_GOT_BEER);
- creature->CastSpell(creature, SPELL_DRUNKEN_RAGE, false);
-
- if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, creature->AI()))
- escortAI->Start(false, false);
- }
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_rocknotAI>(creature);
- }
-
struct npc_rocknotAI : public npc_escortAI
{
npc_rocknotAI(Creature* creature) : npc_escortAI(creature)
@@ -607,7 +595,35 @@ public:
npc_escortAI::UpdateAI(diff);
}
+
+ void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*item*/) override
+ {
+ if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL)
+ return;
+
+ if (quest->GetQuestId() == QUEST_ALE)
+ {
+ if (instance->GetData(TYPE_BAR) != IN_PROGRESS)
+ instance->SetData(TYPE_BAR, IN_PROGRESS);
+
+ instance->SetData(TYPE_BAR, SPECIAL);
+
+ //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress
+ if (instance->GetData(TYPE_BAR) == SPECIAL)
+ {
+ Talk(SAY_GOT_BEER);
+ DoCastSelf(SPELL_DRUNKEN_RAGE, false);
+
+ Start(false, false);
+ }
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<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 b9e9e6186b4..4c4bb437f54 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
@@ -121,10 +121,10 @@ public:
{
boss_coren_direbrewAI(Creature* creature) : BossAI(creature, DATA_COREN) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId != GOSSIP_ID)
- return;
+ return false;
if (gossipListId == GOSSIP_OPTION_FIGHT)
{
@@ -133,6 +133,8 @@ public:
}
else if (gossipListId == GOSSIP_OPTION_APOLOGIZE)
CloseGossipMenuFor(player);
+
+ return false;
}
void Reset() override
@@ -427,16 +429,16 @@ public:
void Reset() override
{
- go->SetLootState(GO_READY);
+ me->SetLootState(GO_READY);
_scheduler
.Schedule(Seconds(1), [this](TaskContext /*context*/)
{
- go->UseDoorOrButton(8);
- go->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true);
+ me->UseDoorOrButton(8);
+ me->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true);
})
.Schedule(Seconds(4), [this](TaskContext /*context*/)
{
- if (GameObject* trap = go->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f))
+ if (GameObject* trap = me->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f))
{
trap->SetLootState(GO_ACTIVATED);
trap->UseDoorOrButton();
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
index 86ae8fdccee..b0ea64b47e6 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
@@ -51,49 +51,59 @@ enum Phases
class boss_gloomrel : public CreatureScript
{
-public:
- boss_gloomrel() : CreatureScript("boss_gloomrel") { }
+ public:
+ boss_gloomrel() : CreatureScript("boss_gloomrel") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ struct boss_gloomrelAI : public ScriptedAI
{
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
- SendGossipMenuFor(player, 2606, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+11:
- CloseGossipMenuFor(player);
- player->CastSpell(player, SPELL_LEARN_SMELT, false);
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22);
- SendGossipMenuFor(player, 2604, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+22:
- CloseGossipMenuFor(player);
- if (InstanceScript* instance = creature->GetInstanceScript())
+ boss_gloomrelAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
{
- //are 5 minutes expected? go template may have data to despawn when used at quest
- instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE*5);
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
+ SendGossipMenuFor(player, 2606, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 11:
+ CloseGossipMenuFor(player);
+ player->CastSpell(player, SPELL_LEARN_SMELT, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22);
+ SendGossipMenuFor(player, 2604, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 22:
+ CloseGossipMenuFor(player);
+ //are 5 minutes expected? go template may have data to despawn when used at quest
+ instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE * 5);
+ break;
}
- break;
- }
- return true;
- }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
+ };
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<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->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- creature->AI()->AttackStart(player);
- InstanceScript* instance = creature->GetInstanceScript();
- if (instance)
- instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID());
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, 2601, creature->GetGUID());
-
- return true;
- }
-
struct boss_doomrelAI : public ScriptedAI
{
boss_doomrelAI(Creature* creature) : ScriptedAI(creature)
@@ -246,6 +225,38 @@ class boss_doomrel : public CreatureScript
DoMeleeAttackIfReady();
}
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, 2605, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ CloseGossipMenuFor(player);
+ //start event here
+ me->SetFaction(FACTION_HOSTILE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ me->AI()->AttackStart(player);
+
+ _instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID());
+ break;
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, 2601, me->GetGUID());
+
+ return true;
+ }
+
private:
InstanceScript* _instance;
EventMap _events;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
index ad9dfd240f9..7984f688dc2 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
@@ -371,7 +371,7 @@ public:
}
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID)
{
@@ -379,6 +379,7 @@ public:
Talk(SAY_GAMESBEGIN_1);
BeginEvent(player);
}
+ return false;
}
private:
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
index 56b6731da84..8cfd63f975d 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
@@ -19,6 +19,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
+#include "GameObjectAI.h"
#include "blackwing_lair.h"
#include "Player.h"
@@ -174,20 +175,33 @@ public:
class go_orb_of_domination : public GameObjectScript
{
-public:
- go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { }
+ public:
+ go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
- if (instance->GetData(DATA_EGG_EVENT) != DONE)
- if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED))
+ struct go_orb_of_dominationAI : public GameObjectAI
+ {
+ go_orb_of_dominationAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (instance->GetData(DATA_EGG_EVENT) != DONE)
{
- razorgore->Attack(player, true);
- player->CastSpell(razorgore, SPELL_MINDCONTROL);
+ if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED))
+ {
+ razorgore->Attack(player, true);
+ player->CastSpell(razorgore, SPELL_MINDCONTROL);
+ }
}
- return true;
- }
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_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 ffee18f54cf..55c048f50e8 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
@@ -222,13 +222,14 @@ public:
DoMeleeAttackIfReady();
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_ID && gossipListId == 0)
{
CloseGossipMenuFor(player);
BeginSpeech(player);
}
+ return false;
}
private:
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
index c061ae2a429..2949bbeb37e 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
@@ -196,13 +196,14 @@ class boss_majordomo : public CreatureScript
}
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == MENU_OPTION_YOU_CHALLENGED_US && gossipListId == OPTION_ID_YOU_CHALLENGED_US)
{
CloseGossipMenuFor(player);
DoAction(ACTION_START_RAGNAROS);
}
+ return false;
}
};
diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
index d6bbed40e9e..bf781c171e5 100644
--- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
@@ -121,7 +121,7 @@ public:
}
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
if (gossipListId == 0)
{
@@ -132,6 +132,7 @@ public:
player->PlayerTalkClass->SendCloseGossip();
}
+ return false;
}
void NextStep(uint32 uiTimerStep, bool bNextStep = true, uint8 uiPhaseStep = 0)
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
index c40def9a5c6..7e4308c685f 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "karazhan.h"
@@ -415,25 +416,36 @@ class spell_rain_of_bones : public SpellScriptLoader
class go_blackened_urn : public GameObjectScript
{
-public:
- go_blackened_urn() : GameObjectScript("go_blackened_urn") { }
+ public:
+ go_blackened_urn() : GameObjectScript("go_blackened_urn") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
- {
- if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE))
- return false;
+ struct go_blackened_urnAI : GameObjectAI
+ {
+ go_blackened_urnAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- InstanceScript* instance = go->GetInstanceScript();
- if (!instance || instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS)
- return false;
+ InstanceScript* instance;
- if (Creature* nightbane = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_NIGHTBANE)))
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE))
+ return false;
+
+ if (instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS)
+ return false;
+
+ if (Creature* nightbane = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NIGHTBANE)))
+ {
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
+ nightbane->AI()->DoAction(ACTION_SUMMON);
+ }
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
{
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
- nightbane->AI()->DoAction(ACTION_SUMMON);
+ return GetKarazhanAI<go_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 3a13da90857..55bbbbc0e03 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
@@ -816,7 +816,7 @@ class npc_grandmother : public CreatureScript
{
npc_grandmotherAI(Creature* creature) : ScriptedAI(creature) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == OPTION_WHAT_PHAT_LEWTS_YOU_HAVE && gossipListId == 0)
{
@@ -827,6 +827,7 @@ class npc_grandmother : public CreatureScript
me->DespawnOrUnsummon();
}
+ return false;
}
};
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index 264a21d880f..09dff7b6f0f 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -335,46 +335,43 @@ public:
}
}
}
- };
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- npc_barnesAI* pBarnesAI = ENSURE_AI(npc_barnes::npc_barnesAI, creature->AI());
- switch (action)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, 8971, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- CloseGossipMenuFor(player);
- pBarnesAI->StartEvent();
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- CloseGossipMenuFor(player);
- pBarnesAI->m_uiEventId = EVENT_OZ;
- TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- CloseGossipMenuFor(player);
- pBarnesAI->m_uiEventId = EVENT_HOOD;
- TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- CloseGossipMenuFor(player);
- pBarnesAI->m_uiEventId = EVENT_RAJ;
- TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str());
- break;
- }
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
- return true;
- }
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, 8971, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ CloseGossipMenuFor(player);
+ StartEvent();
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ CloseGossipMenuFor(player);
+ m_uiEventId = EVENT_OZ;
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ CloseGossipMenuFor(player);
+ m_uiEventId = EVENT_HOOD;
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ CloseGossipMenuFor(player);
+ m_uiEventId = EVENT_RAJ;
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str());
+ break;
+ }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (InstanceScript* instance = creature->GetInstanceScript())
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
{
// Check for death of Moroes and if opera event is not done already
if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE)
@@ -388,25 +385,22 @@ public:
AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
}
- if (npc_barnesAI* pBarnesAI = CAST_AI(npc_barnes::npc_barnesAI, creature->AI()))
- {
- if (!pBarnesAI->RaidWiped)
- SendGossipMenuFor(player, 8970, creature->GetGUID());
- else
- SendGossipMenuFor(player, 8975, creature->GetGUID());
+ if (!RaidWiped)
+ SendGossipMenuFor(player, 8970, me->GetGUID());
+ else
+ SendGossipMenuFor(player, 8975, me->GetGUID());
- return true;
- }
+ return true;
}
- }
- SendGossipMenuFor(player, 8978, creature->GetGUID());
- return true;
- }
+ SendGossipMenuFor(player, 8978, me->GetGUID());
+ return true;
+ }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<npc_barnesAI>(creature);
+ return GetKarazhanAI<npc_barnesAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
index 9792ea0cfba..21e90d9a24d 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
@@ -68,51 +68,6 @@ class npc_kalecgos : public CreatureScript
public:
npc_kalecgos() : CreatureScript("npc_kalecgos") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, 12500, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- SendGossipMenuFor(player, 12502, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- SendGossipMenuFor(player, 12606, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- SendGossipMenuFor(player, 12607, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- SendGossipMenuFor(player, 12608, creature->GetGUID());
- break;
- }
-
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, 12498, creature->GetGUID());
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_kalecgosAI(creature);
- }
-
struct npc_kalecgosAI : public ScriptedAI
{
npc_kalecgosAI(Creature* creature) : ScriptedAI(creature) { }
@@ -153,9 +108,55 @@ public:
}
}
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, 12500, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, 12502, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ SendGossipMenuFor(player, 12606, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ SendGossipMenuFor(player, 12607, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ SendGossipMenuFor(player, 12608, me->GetGUID());
+ break;
+ }
+
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, 12498, me->GetGUID());
+
+ return true;
+ }
+
private:
EventMap events;
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_kalecgosAI(creature);
+ }
};
void AddSC_magisters_terrace()
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index d4a17aca5be..8421c1658ab 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -23,6 +23,7 @@
#include "ScriptedEscortAI.h"
#include "CombatAI.h"
#include "PassiveAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
#include "SpellInfo.h"
#include "CreatureTextMgr.h"
@@ -319,19 +320,28 @@ public:
class go_acherus_soul_prison : public GameObjectScript
{
-public:
- go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { }
+ public:
+ go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (Creature* anchor = go->FindNearestCreature(29521, 15))
- if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID())
- if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID))
- ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player);
+ struct go_acherus_soul_prisonAI : public GameObjectAI
+ {
+ go_acherus_soul_prisonAI(GameObject* go) : GameObjectAI(go) { }
- return false;
- }
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (Creature* anchor = me->FindNearestCreature(29521, 15))
+ if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID())
+ if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID))
+ ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player);
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_acherus_soul_prisonAI(go);
+ }
};
/*######
@@ -474,47 +484,6 @@ class npc_death_knight_initiate : public CreatureScript
public:
npc_death_knight_initiate() : CreatureScript("npc_death_knight_initiate") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF)
- {
- CloseGossipMenuFor(player);
-
- if (player->IsInCombat() || creature->IsInCombat())
- return true;
-
- if (npc_death_knight_initiateAI* pInitiateAI = CAST_AI(npc_death_knight_initiate::npc_death_knight_initiateAI, creature->AI()))
- {
- if (pInitiateAI->m_bIsDuelInProgress)
- return true;
- }
-
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15);
-
- player->CastSpell(creature, SPELL_DUEL, false);
- player->CastSpell(player, SPELL_DUEL_FLAG, true);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && creature->IsFullHealth())
- {
- if (player->HealthBelowPct(10))
- return true;
-
- if (player->IsInCombat() || creature->IsInCombat())
- return true;
-
- AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- }
- return true;
- }
-
struct npc_death_knight_initiateAI : public CombatAI
{
npc_death_knight_initiateAI(Creature* creature) : CombatAI(creature)
@@ -617,6 +586,45 @@ public:
CombatAI::UpdateAI(uiDiff);
}
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF)
+ {
+ CloseGossipMenuFor(player);
+
+ if (player->IsInCombat() || me->IsInCombat())
+ return true;
+
+ if (m_bIsDuelInProgress)
+ return true;
+
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15);
+
+ player->CastSpell(me, SPELL_DUEL, false);
+ player->CastSpell(player, SPELL_DUEL_FLAG, true);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && me->IsFullHealth())
+ {
+ if (player->HealthBelowPct(10))
+ return true;
+
+ if (player->IsInCombat() || me->IsInCombat())
+ return true;
+
+ AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ }
+ return true;
+ }
};
CreatureAI* GetAI(Creature* creature) const override
@@ -750,13 +758,14 @@ public:
{
npc_salanar_the_horsemanAI(Creature* creature) : ScriptedAI(creature) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_SALANAR_MENU && gossipListId == GOSSIP_SALANAR_OPTION)
{
player->CastSpell(player, SPELL_REALM_OF_SHADOWS, true);
player->PlayerTalkClass->SendCloseGossip();
}
+ return false;
}
void SpellHit(Unit* caster, const SpellInfo* spell) override
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
index 59f510ded28..1ad704b2495 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
@@ -199,18 +199,6 @@ class npc_koltira_deathweaver : public CreatureScript
public:
npc_koltira_deathweaver() : CreatureScript("npc_koltira_deathweaver") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_BREAKOUT)
- {
- creature->SetStandState(UNIT_STAND_STATE_STAND);
-
- if (npc_escortAI* escortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI()))
- escortAI->Start(false, false, player->GetGUID());
- }
- return true;
- }
-
struct npc_koltira_deathweaverAI : public npc_escortAI
{
npc_koltira_deathweaverAI(Creature* creature) : npc_escortAI(creature)
@@ -354,6 +342,15 @@ public:
}
}
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_BREAKOUT)
+ {
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ Start(false, false, player->GetGUID());
+ }
+ }
+
private:
uint8 wave;
uint32 waveTimer;
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
index 396d5fb2fa1..24ead674f2b 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
@@ -270,38 +270,6 @@ class npc_highlord_darion_mograine : public CreatureScript
public:
npc_highlord_darion_mograine() : CreatureScript("npc_highlord_darion_mograine") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- CloseGossipMenuFor(player);
- ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->uiStep = 1;
- ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->Start(true, false, player->GetGUID());
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_highlord_darion_mograineAI(creature);
- }
-
struct npc_highlord_darion_mograineAI : public npc_escortAI
{
npc_highlord_darion_mograineAI(Creature* creature) : npc_escortAI(creature)
@@ -1636,8 +1604,40 @@ public:
temp->KillSelf();
}
}
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ CloseGossipMenuFor(player);
+ uiStep = 1;
+ Start(true, false, player->GetGUID());
+ break;
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_highlord_darion_mograineAI(creature);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index 3102b7461d5..c1b3bbd8aec 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellMgr.h"
#include "scarlet_monastery.h"
#include "LFGMgr.h"
@@ -876,32 +877,41 @@ enum LooselyTurnedSoil
class go_loosely_turned_soil : public GameObjectScript
{
-public:
- go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { }
+ public:
+ go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
- {
- if (InstanceScript* instance = player->GetInstanceScript())
- if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE)
- return true;
+ struct go_loosely_turned_soilAI : public GameObjectAI
+ {
+ go_loosely_turned_soilAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- return false;
- }
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE)
+ return true;
- bool OnQuestReward(Player* player, GameObject* go, Quest const* /*quest*/, uint32 /*opt*/) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
- if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS)
return false;
+ }
- player->AreaExploredOrEventHappens(11405);
- if (Creature* horseman = go->SummonCreature(HH_MOUNTED, FlightPoint[20].x, FlightPoint[20].y, FlightPoint[20].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0))
+ void QuestReward(Player* player, Quest const* /*quest*/, uint32 /*opt*/) override
+ {
+ if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS)
+ return;
+
+ player->AreaExploredOrEventHappens(11405);
+ if (Creature* horseman = me->SummonCreature(HH_MOUNTED, FlightPoint[20].x, FlightPoint[20].y, FlightPoint[20].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0))
+ {
+ ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID();
+ ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode();
+ }
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
{
- ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID();
- ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode();
+ return GetScarletMonasteryAI<go_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 fede79df5d3..94db224f4ce 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
@@ -60,10 +60,10 @@ enum SMGameObjectIds
GO_PUMPKIN_SHRINE = 186267
};
-template<class 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 acb90732940..d2306164846 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
@@ -280,12 +280,22 @@ class go_brazier_of_the_herald : public GameObjectScript
public:
go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_brazier_of_the_heraldAI : public GameObjectAI
{
- go->UseDoorOrButton();
- go->PlayDirectSound(SOUND_SCREECH, 0);
- player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000);
- return true;
+ go_brazier_of_the_heraldAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ me->UseDoorOrButton();
+ me->PlayDirectSound(SOUND_SCREECH, 0);
+ player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_brazier_of_the_heraldAI>(go);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp
index 1ca23799f83..485c7b3d6a5 100644
--- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp
@@ -99,7 +99,7 @@ class boss_apothecary_hummel : public CreatureScript
{
boss_apothecary_hummelAI(Creature* creature) : BossAI(creature, DATA_APOTHECARY_HUMMEL), _deadCount(0), _isDead(false) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_MENU_HUMMEL && gossipListId == GOSSIP_OPTION_START)
{
@@ -107,6 +107,7 @@ class boss_apothecary_hummel : public CreatureScript
CloseGossipMenuFor(player);
DoAction(ACTION_START_EVENT);
}
+ return false;
}
void Reset() override
@@ -261,6 +262,12 @@ class boss_apothecary_hummel : public CreatureScript
DoMeleeAttackIfReady();
}
+ void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override
+ {
+ if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED)
+ DoAction(ACTION_START_EVENT);
+ }
+
private:
uint8 _deadCount;
bool _isDead;
@@ -270,14 +277,6 @@ class boss_apothecary_hummel : public CreatureScript
{
return GetInstanceAI<boss_apothecary_hummelAI>(creature);
}
-
- bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override
- {
- if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED)
- creature->AI()->DoAction(ACTION_START_EVENT);
-
- return true;
- }
};
struct npc_apothecary_genericAI : public ScriptedAI
diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
index f1cc7223d27..077a5664b93 100644
--- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
@@ -67,36 +67,6 @@ class npc_shadowfang_prisoner : public CreatureScript
public:
npc_shadowfang_prisoner() : CreatureScript("npc_shadowfang_prisoner") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<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)
@@ -143,8 +113,33 @@ public:
void Reset() override { }
void EnterCombat(Unit* /*who*/) override { }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ {
+ CloseGossipMenuFor(player);
+ Start(false, false);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE)
+ AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<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 3ccf0e3dd19..c67a1c2b4bb 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
@@ -32,6 +32,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "stratholme.h"
#include "Group.h"
#include "Player.h"
@@ -43,41 +44,48 @@ EndContentData */
class go_gauntlet_gate : public GameObjectScript
{
-public:
- go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { }
-
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- InstanceScript* instance = go->GetInstanceScript();
+ public:
+ go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { }
- if (!instance)
- return false;
+ struct go_gauntlet_gateAI : public GameObjectAI
+ {
+ go_gauntlet_gateAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED)
- return false;
+ InstanceScript* instance;
- if (Group* group = player->GetGroup())
- {
- for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- Player* pGroupie = itr->GetSource();
- if (!pGroupie || !pGroupie->IsInMap(player))
- continue;
-
- if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
- !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) &&
- pGroupie->GetMap() == go->GetMap())
- pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true);
- }
- } else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
+ if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED)
+ return false;
+
+ if (Group* group = player->GetGroup())
+ {
+ for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ {
+ Player* pGroupie = itr->GetSource();
+ if (!pGroupie || !pGroupie->IsInMap(player))
+ continue;
+
+ if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
+ !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) &&
+ pGroupie->GetMap() == me->GetMap())
+ pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true);
+ }
+ }
+ else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
!player->HasAura(SPELL_BARON_ULTIMATUM) &&
- player->GetMap() == go->GetMap())
+ player->GetMap() == me->GetMap())
player->CastSpell(player, SPELL_BARON_ULTIMATUM, true);
- instance->SetData(TYPE_BARON_RUN, IN_PROGRESS);
- return false;
- }
+ instance->SetData(TYPE_BARON_RUN, IN_PROGRESS);
+ return false;
+ }
+ };
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_gauntlet_gateAI>(go);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
index e6be567052d..581c5b3afbd 100644
--- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
+++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
@@ -29,6 +29,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "sunken_temple.h"
#include "Player.h"
@@ -63,16 +64,26 @@ class at_malfurion_stormrage : public AreaTriggerScript
class go_atalai_statue : public GameObjectScript
{
-public:
- go_atalai_statue() : GameObjectScript("go_atalai_statue") { }
+ public:
+ go_atalai_statue() : GameObjectScript("go_atalai_statue") { }
+
+ struct go_atalai_statueAI : public GameObjectAI
+ {
+ go_atalai_statueAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (InstanceScript* instance = player->GetInstanceScript())
- instance->SetData(EVENT_STATE, go->GetEntry());
- return false;
- }
+ InstanceScript* instance;
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ instance->SetData(EVENT_STATE, me->GetEntry());
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_atalai_statueAI>(go);
+ }
};
void AddSC_sunken_temple()
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 34289a5a414..89a1de21f31 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "sunwell_plateau.h"
#include "Player.h"
#include "WorldSession.h"
@@ -536,27 +537,35 @@ class kalecgos_teleporter : public GameObjectScript
public:
kalecgos_teleporter() : GameObjectScript("kalecgos_teleporter") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct kalecgos_teleporterAI : public GameObjectAI
{
-#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0
- uint8 SpectralPlayers = 0;
- Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers();
- for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
- {
- if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5)
- ++SpectralPlayers;
- }
+ kalecgos_teleporterAI(GameObject* go) : GameObjectAI(go) { }
- if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM)
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
+#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0
+ uint8 SpectralPlayers = 0;
+ Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers();
+ for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ {
+ if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5)
+ ++SpectralPlayers;
+ }
+
+ if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM)
+ {
+ return true;
+ }
+#endif
+
+ player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true);
return true;
}
-#else
- (void)go;
-#endif
+ };
- player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true);
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetSunwellPlateauAI<kalecgos_teleporterAI>(go);
}
};
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index 8ad5f24b639..557e566fb2f 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -26,6 +26,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "sunwell_plateau.h"
#include <math.h>
#include "Player.h"
@@ -359,25 +360,36 @@ public:
class go_orb_of_the_blue_flight : public GameObjectScript
{
-public:
- go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { }
+ public:
+ go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (go->GetFaction() == 35)
+ struct go_orb_of_the_blue_flightAI : public GameObjectAI
{
- InstanceScript* instance = go->GetInstanceScript();
- player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
- player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false);
- go->SetFaction(0);
+ go_orb_of_the_blue_flightAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (me->GetFaction() == 35)
+ {
+ player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
+ player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false);
+ me->SetFaction(0);
- if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ)))
- ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames();
+ if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ)))
+ ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames();
- go->Refresh();
+ me->Refresh();
+ }
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetSunwellPlateauAI<go_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 eb99ba3ebae..f843f011ff2 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
@@ -112,10 +112,10 @@ enum SWPGameObjectIds
GO_MURUS_GATE_2 = 188118
};
-template<class AI>
-AI* GetSunwellPlateauAI(Creature* creature)
+template<class AI, class T>
+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 eae2d3a0470..e3b658e76d9 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
@@ -28,6 +28,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "uldaman.h"
#include "Player.h"
@@ -394,22 +395,26 @@ EndScriptData */
class go_altar_of_archaedas : public GameObjectScript
{
public:
+ go_altar_of_archaedas() : GameObjectScript("go_altar_of_archaedas") { }
- go_altar_of_archaedas()
- : GameObjectScript("go_altar_of_archaedas")
+ struct go_altar_of_archaedasAI : public GameObjectAI
{
- }
+ go_altar_of_archaedasAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
- {
- InstanceScript* instance = player->GetInstanceScript();
- if (!instance)
- return false;
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ player->CastSpell(player, SPELL_BOSS_OBJECT_VISUAL, false);
- player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false);
+ instance->SetGuidData(0, player->GetGUID()); // activate archaedas
+ return false;
+ }
+ };
- instance->SetGuidData(0, player->GetGUID()); // activate archaedas
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_altar_of_archaedasAI>(go);
}
};
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
index 0d36c1e3aa1..f2571748332 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
@@ -31,6 +31,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "uldaman.h"
#include "Player.h"
@@ -116,16 +117,26 @@ class npc_jadespine_basilisk : public CreatureScript
class go_keystone_chamber : public GameObjectScript
{
-public:
- go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { }
+ public:
+ go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { }
+
+ struct go_keystone_chamberAI : public GameObjectAI
+ {
+ go_keystone_chamberAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
- instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state.
+ InstanceScript* instance;
- return false;
- }
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state.
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_keystone_chamberAI>(go);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
index f23a9fab812..affb1ab9406 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
@@ -136,42 +136,52 @@ class npc_zulaman_hostage : public CreatureScript
public:
npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_zulaman_hostageAI : public ScriptedAI
{
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
+ npc_zulaman_hostageAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
- CloseGossipMenuFor(player);
+ InstanceScript* instance;
- if (!creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
+ bool GossipHello(Player* player) override
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
return true;
+ }
- creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
-
- if (InstanceScript* instance = creature->GetInstanceScript())
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ CloseGossipMenuFor(player);
+
+ if (!me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
+ return true;
+
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+
//uint8 progress = instance->GetData(DATA_CHESTLOOTED);
instance->SetData(DATA_CHESTLOOTED, 0);
float x, y, z;
- creature->GetPosition(x, y, z);
- uint32 entry = creature->GetEntry();
+ me->GetPosition(x, y, z);
+ uint32 entry = me->GetEntry();
for (uint8 i = 0; i < 4; ++i)
{
if (HostageEntry[i] == entry)
{
- creature->SummonGameObject(ChestEntry[i], Position(x - 2, y, z, 0.f), G3D::Quat(), 0);
+ me->SummonGameObject(ChestEntry[i], Position(x - 2, y, z, 0.f), G3D::Quat(), 0);
break;
}
}
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetZulAmanAI<npc_zulaman_hostageAI>(creature);
}
};
@@ -268,7 +278,7 @@ class npc_harrison_jones : public CreatureScript
void EnterCombat(Unit* /*who*/) override { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId)
{
@@ -279,6 +289,7 @@ class npc_harrison_jones : public CreatureScript
_gongEvent = GONG_EVENT_1;
_gongTimer = 4000;
}
+ return false;
}
void SpellHit(Unit*, const SpellInfo* spell) override
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 6a2435e2147..9110ac28069 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
@@ -26,6 +26,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellInfo.h"
#include "zulgurub.h"
@@ -440,17 +441,25 @@ Position const PosSummonArlokk[1] =
class go_gong_of_bethekk : public GameObjectScript
{
- public: go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { }
+ public:
+ go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_gong_of_bethekkAI : public GameObjectAI
{
- if (go->GetInstanceScript())
+ go_gong_of_bethekkAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SendCustomAnim(0);
- go->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000);
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->SendCustomAnim(0);
+ me->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000);
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetZulGurubAI<go_gong_of_bethekkAI>(go);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 9359f37206a..4148b4d9e08 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -67,10 +67,10 @@ enum ZGGameObjectIds
GO_GONG_OF_BETHEKK = 180526 // Arlokk Event
};
-template<class AI>
-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 43c5dbdc584..dd2b3d32f83 100644
--- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
@@ -114,7 +114,7 @@ class npc_professor_phizzlethorpe : public CreatureScript
Talk(SAY_AGGRO);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
index 892f9929968..e6170d0e65e 100644
--- a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
@@ -45,47 +45,47 @@ enum RaggedJohn
class npc_ragged_john : public CreatureScript
{
-public:
- npc_ragged_john() : CreatureScript("npc_ragged_john") { }
+ public:
+ npc_ragged_john() : CreatureScript("npc_ragged_john") { }
- struct npc_ragged_johnAI : public ScriptedAI
- {
- npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) { }
+ struct npc_ragged_johnAI : public ScriptedAI
+ {
+ npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) { }
- void Reset() override { }
+ void Reset() override { }
- void MoveInLineOfSight(Unit* who) override
- {
- if (who->HasAura(SPELL_MOTHERS_MILK))
+ void MoveInLineOfSight(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me))
+ if (who->HasAura(SPELL_MOTHERS_MILK))
{
- DoCast(who, SPELL_WICKED_MILKING);
- if (Player* player = who->ToPlayer())
- player->AreaExploredOrEventHappens(QUEST_MOTHERS_MILK);
+ if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me))
+ {
+ DoCast(who, SPELL_WICKED_MILKING);
+ if (Player* player = who->ToPlayer())
+ player->AreaExploredOrEventHappens(QUEST_MOTHERS_MILK);
+ }
}
+
+ ScriptedAI::MoveInLineOfSight(who);
}
- ScriptedAI::MoveInLineOfSight(who);
- }
+ void EnterCombat(Unit* /*who*/) override { }
- void EnterCombat(Unit* /*who*/) override { }
- };
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ {
+ player->PrepareQuestMenu(me->GetGUID());
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ }
+ return true;
+ }
+ };
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
+ CreatureAI* GetAI(Creature* creature) const override
{
- player->PrepareQuestMenu(creature->GetGUID());
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ return new npc_ragged_johnAI(creature);
}
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_ragged_johnAI(creature);
- }
};
void AddSC_burning_steppes()
diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
index 2156b772e75..d562b95370d 100644
--- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
@@ -126,19 +126,16 @@ public:
if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20))
Cage->SetGoState(GO_STATE_READY);
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- creature->SetFaction(FACTION_QUEST_ESCAPE);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_ranger_lilatha::npc_ranger_lilathaAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
+ if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS)
+ {
+ me->SetFaction(FACTION_QUEST_ESCAPE);
+ Start(true, false, player->GetGUID());
+ }
}
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
index 66e999ec85a..b2610a82038 100644
--- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
@@ -75,7 +75,7 @@ public:
summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_RESQUE_OOX_09)
{
@@ -235,7 +235,7 @@ public:
summoned->GetMotionMaster()->MovePoint(0, AmbushMoveTo[spawnId]);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_RINJI_TRAPPED)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
index df55de6f35f..e5545231083 100644
--- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
@@ -63,7 +63,7 @@ public:
Initialize();
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_MISSING_IN_ACTION)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index 9e71280a2a8..c194b700830 100644
--- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
@@ -114,20 +114,16 @@ public:
{
Talk(SAY_AGGRO, who);
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCORTING)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- creature->AI()->Talk(SAY_QUESTACCEPT, player);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_deathstalker_erland::npc_deathstalker_erlandAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
+ if (quest->GetQuestId() == QUEST_ESCORTING)
+ {
+ Talk(SAY_QUESTACCEPT, player);
+ Start(true, false, player->GetGUID());
+ }
}
-
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
@@ -176,24 +172,6 @@ class pyrewood_ambush : public CreatureScript
public:
pyrewood_ambush() : CreatureScript("pyrewood_ambush") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest *quest) override
- {
- if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress)
- {
- ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true;
- ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0;
- ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0;
- ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID();
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new pyrewood_ambushAI(creature);
- }
-
struct pyrewood_ambushAI : public ScriptedAI
{
pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me)
@@ -331,7 +309,23 @@ public:
}
++Phase; //prepare next phase
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !QuestInProgress)
+ {
+ QuestInProgress = true;
+ Phase = 0;
+ KillCount = 0;
+ PlayerGUID = player->GetGUID();
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new pyrewood_ambushAI(creature);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index 704253f2cfc..6b1652a0acc 100644
--- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
@@ -52,21 +52,6 @@ class npc_bartleby : public CreatureScript
public:
npc_bartleby() : CreatureScript("npc_bartleby") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_BEAT)
- {
- creature->SetFaction(FACTION_ENEMY);
- creature->AI()->AttackStart(player);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_bartlebyAI(creature);
- }
-
struct npc_bartlebyAI : public ScriptedAI
{
npc_bartlebyAI(Creature* creature) : ScriptedAI(creature)
@@ -105,7 +90,21 @@ public:
EnterEvadeMode();
}
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_BEAT)
+ {
+ me->SetFaction(FACTION_ENEMY);
+ AttackStart(player);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_bartlebyAI(creature);
+ }
};
/*######
@@ -541,18 +540,26 @@ class npc_tyrion : public CreatureScript
public:
npc_tyrion() : CreatureScript("npc_tyrion") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
+ struct npc_tyrionAI : ScriptedAI
{
- if (quest->GetQuestId() == QUEST_THE_ATTACK)
+ npc_tyrionAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true))
+ if (quest->GetQuestId() == QUEST_THE_ATTACK)
{
- ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID());
- ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f);
+ if (Creature* spybot = me->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true))
+ {
+ ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, spybot->AI())->Start(false, false, player->GetGUID());
+ ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, spybot->AI())->SetMaxPlayerDistance(200.0f);
+ }
}
- return true;
}
- return false;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_tyrionAI(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
index 0aabe071a0d..5cd85585a9d 100644
--- a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
@@ -61,7 +61,7 @@ public:
Talk(SAY_ATTACKED, who);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_GALENS_ESCAPE)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
index 6d54c9f0f88..37be4a844cc 100644
--- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
@@ -31,6 +31,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "Player.h"
/*######
@@ -50,22 +51,6 @@ class npc_calvin_montague : public CreatureScript
public:
npc_calvin_montague() : CreatureScript("npc_calvin_montague") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_590)
- {
- creature->SetFaction(FACTION_HOSTILE);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- ENSURE_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_calvin_montagueAI(creature);
- }
-
struct npc_calvin_montagueAI : public ScriptedAI
{
npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature)
@@ -159,7 +144,22 @@ public:
DoMeleeAttackIfReady();
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_590)
+ {
+ me->SetFaction(FACTION_HOSTILE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ AttackStart(player);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_calvin_montagueAI(creature);
+ }
};
/*######
@@ -177,45 +177,65 @@ enum Mausoleum
class go_mausoleum_door : public GameObjectScript
{
-public:
- go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { }
+ public:
+ go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
- {
- if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
- return false;
+ struct go_mausoleum_doorAI : public GameObjectAI
+ {
+ go_mausoleum_doorAI(GameObject* go) : GameObjectAI(go) { }
- if (!player->FindNearestCreature(NPC_ULAG, 50.0f))
- if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f))
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- pTrigger->SetGoState(GO_STATE_READY);
- player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
+ if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
+ return false;
+
+ if (!player->FindNearestCreature(NPC_ULAG, 50.0f))
+ {
+ if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f))
+ {
+ pTrigger->SetGoState(GO_STATE_READY);
+ player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
+ return false;
+ }
+ }
return false;
}
+ };
- return false;
- }
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_mausoleum_doorAI(go);
+ }
};
class go_mausoleum_trigger : public GameObjectScript
{
-public:
- go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { }
+ public:
+ go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
- return false;
+ struct go_mausoleum_triggerAI : public GameObjectAI
+ {
+ go_mausoleum_triggerAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
+ return false;
+
+ if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f))
+ {
+ me->SetGoState(GO_STATE_ACTIVE);
+ pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ return true;
+ }
+ return false;
+ }
+ };
- if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f))
+ GameObjectAI* GetAI(GameObject* go) const override
{
- go->SetGoState(GO_STATE_ACTIVE);
- pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- return true;
+ return new go_mausoleum_triggerAI(go);
}
-
- return false;
- }
};
void AddSC_tirisfal_glades()
diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
index 3245a4e147e..e8bb32bf3a9 100644
--- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
@@ -96,14 +96,6 @@ class npc_lady_sylvanas_windrunner : public CreatureScript
public:
npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { }
- bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override
- {
- if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY)
- creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER);
-
- return true;
- }
-
struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI
{
npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature)
@@ -238,6 +230,12 @@ public:
DoMeleeAttackIfReady();
}
+ void QuestReward(Player* player, Quest const* quest, uint32 /*opt*/) override
+ {
+ if (quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY)
+ SetGUID(player->GetGUID(), GUID_EVENT_INVOKER);
+ }
+
private:
EventMap _events;
bool LamentEvent;
diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index 11857b038cb..5839d40c15f 100644
--- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
@@ -59,62 +59,73 @@ enum DithersAndArbington
class npcs_dithers_and_arbington : public CreatureScript
{
-public:
- npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { }
+ public:
+ npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ struct npcs_dithers_and_arbingtonAI : public ScriptedAI
{
- case GOSSIP_ACTION_TRADE:
- player->GetSession()->SendListInventory(creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, NPC_TEXT_OSSEOUS_AGITATORS, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_1, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_2, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, NPC_TEXT_ECTOPLASMIC_RESONATORS, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- CloseGossipMenuFor(player);
- creature->CastSpell(player, CREATE_ITEM_VITREOUS_FOCUSER, false);
- break;
- }
- return true;
- }
+ npcs_dithers_and_arbingtonAI(Creature* creature) : ScriptedAI(creature) { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_TRADE:
+ player->GetSession()->SendListInventory(me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, NPC_TEXT_OSSEOUS_AGITATORS, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_1, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_2, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, NPC_TEXT_ECTOPLASMIC_RESONATORS, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ CloseGossipMenuFor(player);
+ DoCast(player, CREATE_ITEM_VITREOUS_FOCUSER, false);
+ break;
+ }
+ return true;
+ }
- if (creature->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (me->IsVendor())
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+
+ if (player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_H) || player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_A))
+ {
+ AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_FELSTONE_FIELD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_DALSON_S_TEARS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_WRITHING_HAUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_GAHRRON_S_WITH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ SendGossipMenuFor(player, NPC_TEXT_LET_S_GET_TO_WORK, me->GetGUID());
+ }
+ else
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+
+ return true;
+ }
+ };
- if (player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_H) || player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_A))
+ CreatureAI* GetAI(Creature* creature) const override
{
- AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_FELSTONE_FIELD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_DALSON_S_TEARS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_WRITHING_HAUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_GAHRRON_S_WITH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- SendGossipMenuFor(player, NPC_TEXT_LET_S_GET_TO_WORK, creature->GetGUID());
+ return new npcs_dithers_and_arbingtonAI(creature);
}
- else
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
index c5fd05924da..ecc4e805595 100644
--- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
@@ -149,22 +149,30 @@ class npc_mikhail : public CreatureScript
public:
npc_mikhail() : CreatureScript("npc_mikhail") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
+ struct npc_mikhailAI : public ScriptedAI
{
- if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11)
- {
- Creature* pSlim = creature->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f);
+ npc_mikhailAI(Creature* creature) : ScriptedAI(creature) { }
- if (!pSlim)
- return false;
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11)
+ {
+ Creature* slim = me->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f);
+ if (!slim)
+ return;
- if (!pSlim->HasStealthAura())
- pSlim->CastSpell(pSlim, SPELL_STEALTH, true);
+ if (!slim->HasStealthAura())
+ slim->CastSpell(slim, SPELL_STEALTH, true);
- if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* pEscortAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, pSlim->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
+ if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* slimAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, slim->AI()))
+ slimAI->Start(false, false, player->GetGUID(), quest);
+ }
}
- return false;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_mikhailAI(creature);
}
};