aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Kalimdor
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-05-01 18:19:36 -0300
committerfunjoker <funjoker109@gmail.com>2020-05-03 03:04:32 +0200
commit6604849716bc73d82a4cdbf8c66bb188086ceae4 (patch)
treebd293ee1fdac3baf8bef0a55aa854fe8bf793bc2 /src/server/scripts/Kalimdor
parente3489c48ee6929018618322571adbb8dc59e11b1 (diff)
Core/Scripts: unified scripted gossip/quest api
- Changed self-accessor on GameObjectAI to "me", like UnitAI - Moved all related functions to AI, now Unit and GameObject have the same function names with identical behaviour - Remove "OnUpdate" from CreatureScript/GameObjectScript, was never used and we already have AI Update method - Quest methods no longer return a bool, the return value was used to call the AI version if the ScriptMgr one returned false - Implemented GameObjectAI::Destroyed hook (was never called), implemented Damaged method - Rename OnStateChanged to OnLootStateChanged to reflect when it's really called, and created a new hook OnStateChanged that only gets called on GOState change - Since the functions are now only getting called from AI, made GetAI methods full virtual. (CanSpawn method is anyways going to be used on creatures with AI) (cherry picked from commit f913f3bb8977c127d200d5d4a608ab434b21bbcd)
Diffstat (limited to 'src/server/scripts/Kalimdor')
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp60
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp369
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp177
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp16
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp304
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h7
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp5
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp20
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h6
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp2
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp27
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h6
-rw-r--r--src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp102
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp223
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h6
-rw-r--r--src/server/scripts/Kalimdor/zone_ashenvale.cpp29
-rw-r--r--src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp58
-rw-r--r--src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp2
-rw-r--r--src/server/scripts/Kalimdor/zone_desolace.cpp21
-rw-r--r--src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp67
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp524
-rw-r--r--src/server/scripts/Kalimdor/zone_tanaris.cpp66
-rw-r--r--src/server/scripts/Kalimdor/zone_the_barrens.cpp61
-rw-r--r--src/server/scripts/Kalimdor/zone_thunder_bluff.cpp34
-rw-r--r--src/server/scripts/Kalimdor/zone_winterspring.cpp110
26 files changed, 1214 insertions, 1094 deletions
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
index 334e3ebb26c..9f6e4c19c17 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "blackfathom_deeps.h"
+#include "GameObjectAI.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "Player.h"
@@ -37,35 +38,51 @@ const Position HomePosition = {-815.817f, -145.299f, -25.870f, 0};
class go_blackfathom_altar : public GameObjectScript
{
-public:
- go_blackfathom_altar() : GameObjectScript("go_blackfathom_altar") { }
+ public:
+ go_blackfathom_altar() : GameObjectScript("go_blackfathom_altar") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
- {
- if (!player->HasAura(SPELL_BLESSING_OF_BLACKFATHOM))
- player->AddAura(SPELL_BLESSING_OF_BLACKFATHOM, player);
- return true;
- }
+ struct go_blackfathom_altarAI : public GameObjectAI
+ {
+ go_blackfathom_altarAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (!player->HasAura(SPELL_BLESSING_OF_BLACKFATHOM))
+ player->AddAura(SPELL_BLESSING_OF_BLACKFATHOM, player);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetBlackfathomDeepsAI<go_blackfathom_altarAI>(go);
+ }
};
class go_blackfathom_fire : public GameObjectScript
{
-public:
- go_blackfathom_fire() : GameObjectScript("go_blackfathom_fire") { }
+ public:
+ go_blackfathom_fire() : GameObjectScript("go_blackfathom_fire") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
- {
- InstanceScript* instance = go->GetInstanceScript();
+ struct go_blackfathom_fireAI : public GameObjectAI
+ {
+ go_blackfathom_fireAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
- if (instance)
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ me->SetGoState(GO_STATE_ACTIVE);
+ me->AddFlag(GO_FLAG_NOT_SELECTABLE);
+ instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
{
- go->SetGoState(GO_STATE_ACTIVE);
- go->AddFlag(GO_FLAG_NOT_SELECTABLE);
- instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1);
- return true;
+ return GetBlackfathomDeepsAI<go_blackfathom_fireAI>(go);
}
- return false;
- }
};
class npc_blackfathom_deeps_event : public CreatureScript
@@ -206,9 +223,10 @@ public:
}
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
DoCast(player, SPELL_TELEPORT_DARNASSUS);
+ return false;
}
};
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
index 2b0a208c780..06f2481e88d 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
@@ -70,10 +70,10 @@ enum BFDGameObjectIds
GO_ALTAR_OF_THE_DEEPS = 103016
};
-template<typename AI>
-inline AI* GetBlackfathomDeepsAI(Creature* creature)
+template<class AI, class T>
+AI* GetBlackfathomDeepsAI(T* obj)
{
- return GetInstanceAI<AI>(creature, BFDScriptName);
+ return GetInstanceAI<AI>(obj, BFDScriptName);
}
#endif // BFD_H_
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
index 5e4c6421bba..21b57e80004 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
@@ -50,209 +50,208 @@ EndContentData */
class npc_jaina_proudmoore : public CreatureScript
{
-public:
- npc_jaina_proudmoore() : CreatureScript("npc_jaina_proudmoore") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI());
- switch (action)
+ public:
+ npc_jaina_proudmoore() : CreatureScript("npc_jaina_proudmoore") { }
+
+ struct npc_jaina_proudmooreAI : public hyjalAI
{
- case GOSSIP_ACTION_INFO_DEF + 1:
- ai->StartEvent(player);
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- ai->FirstBossDead = true;
- ai->WaveCount = 9;
- ai->StartEvent(player);
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- ai->Retreat();
- break;
- case GOSSIP_ACTION_INFO_DEF:
- ai->Debug = !ai->Debug;
- TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled");
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI());
- if (ai->EventBegun)
- return false;
-
- uint32 RageEncounter = ai->GetInstanceData(DATA_RAGEWINTERCHILLEVENT);
- uint32 AnetheronEncounter = ai->GetInstanceData(DATA_ANETHERONEVENT);
- if (RageEncounter == NOT_STARTED)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_ALLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- else if (RageEncounter == DONE && AnetheronEncounter == NOT_STARTED)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ANETHERON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- else if (RageEncounter == DONE && AnetheronEncounter == DONE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
-
- if (player->IsGameMaster())
- AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- SendGossipMenuFor(player, 907, creature->GetGUID());
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- if (hyjalAI* ai = GetHyjalAI<hyjalAI>(creature))
+ npc_jaina_proudmooreAI(Creature* creature) : hyjalAI(creature)
+ {
+ Reset();
+ EnterEvadeMode();
+
+ Spells[0].SpellId = SPELL_BLIZZARD;
+ Spells[0].Cooldown = urand(15000, 35000);
+ Spells[0].TargetType = TARGETTYPE_RANDOM;
+
+ Spells[1].SpellId = SPELL_PYROBLAST;
+ Spells[1].Cooldown = urand(5500, 9500);
+ Spells[1].TargetType = TARGETTYPE_RANDOM;
+
+ Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS;
+ Spells[2].Cooldown = urand(15000, 45000);
+ Spells[2].TargetType = TARGETTYPE_SELF;
+ }
+
+ 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:
+ StartEvent(player);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ FirstBossDead = true;
+ WaveCount = 9;
+ StartEvent(player);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ Retreat();
+ break;
+ case GOSSIP_ACTION_INFO_DEF:
+ Debug = !Debug;
+ TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled");
+ break;
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (EventBegun)
+ return false;
+
+ uint32 RageEncounter = GetInstanceData(DATA_RAGEWINTERCHILLEVENT);
+ uint32 AnetheronEncounter = GetInstanceData(DATA_ANETHERONEVENT);
+ if (RageEncounter == NOT_STARTED)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_ALLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ else if (RageEncounter == DONE && AnetheronEncounter == NOT_STARTED)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ANETHERON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ else if (RageEncounter == DONE && AnetheronEncounter == DONE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+
+ if (player->IsGameMaster())
+ AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+
+ SendGossipMenuFor(player, 907, me->GetGUID());
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
{
- ai->Reset();
- ai->EnterEvadeMode();
-
- ai->Spells[0].SpellId = SPELL_BLIZZARD;
- ai->Spells[0].Cooldown = urand(15000, 35000);
- ai->Spells[0].TargetType = TARGETTYPE_RANDOM;
-
- ai->Spells[1].SpellId = SPELL_PYROBLAST;
- ai->Spells[1].Cooldown = urand(5500, 9500);
- ai->Spells[1].TargetType = TARGETTYPE_RANDOM;
-
- ai->Spells[2].SpellId = SPELL_SUMMON_ELEMENTALS;
- ai->Spells[2].Cooldown = urand(15000, 45000);
- ai->Spells[2].TargetType = TARGETTYPE_SELF;
-
- return ai;
+ return GetHyjalAI<npc_jaina_proudmooreAI>(creature);
}
-
- return nullptr;
- }
-
};
class npc_thrall : public CreatureScript
{
-public:
- npc_thrall() : CreatureScript("npc_thrall") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI());
- ai->DeSpawnVeins();//despawn the alliance veins
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1:
- ai->StartEvent(player);
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- ai->FirstBossDead = true;
- ai->WaveCount = 9;
- ai->StartEvent(player);
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- ai->Retreat();
- break;
- case GOSSIP_ACTION_INFO_DEF:
- ai->Debug = !ai->Debug;
- TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled");
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI());
- if (ai->EventBegun)
- return false;
-
- uint32 AnetheronEvent = ai->GetInstanceData(DATA_ANETHERONEVENT);
- // Only let them start the Horde phases if Anetheron is dead.
- if (AnetheronEvent == DONE && ai->GetInstanceData(DATA_ALLIANCE_RETREAT))
- {
- uint32 KazrogalEvent = ai->GetInstanceData(DATA_KAZROGALEVENT);
- uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
- if (KazrogalEvent == NOT_STARTED)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_HORDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- else if (KazrogalEvent == DONE && AzgalorEvent == NOT_STARTED)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AZGALOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- else if (AzgalorEvent == DONE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- }
-
- if (player->IsGameMaster())
- AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- SendGossipMenuFor(player, 907, creature->GetGUID());
- return true;
- }
+ public:
+ npc_thrall() : CreatureScript("npc_thrall") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- if (hyjalAI* ai = GetHyjalAI<hyjalAI>(creature))
+ struct npc_thrallAI : public hyjalAI
{
- ai->Reset();
- ai->EnterEvadeMode();
-
- ai->Spells[0].SpellId = SPELL_CHAIN_LIGHTNING;
- ai->Spells[0].Cooldown = urand(3000, 8000);
- ai->Spells[0].TargetType = TARGETTYPE_VICTIM;
-
- ai->Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF;
- ai->Spells[1].Cooldown = urand(6000, 41000);
- ai->Spells[1].TargetType = TARGETTYPE_RANDOM;
-
- return ai;
+ npc_thrallAI(Creature* creature) : hyjalAI(creature)
+ {
+ Reset();
+ EnterEvadeMode();
+
+ Spells[0].SpellId = SPELL_CHAIN_LIGHTNING;
+ Spells[0].Cooldown = urand(3000, 8000);
+ Spells[0].TargetType = TARGETTYPE_VICTIM;
+
+ Spells[1].SpellId = SPELL_SUMMON_DIRE_WOLF;
+ Spells[1].Cooldown = urand(6000, 41000);
+ Spells[1].TargetType = TARGETTYPE_RANDOM;
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ DeSpawnVeins();//despawn the alliance veins
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ StartEvent(player);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ FirstBossDead = true;
+ WaveCount = 9;
+ StartEvent(player);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ Retreat();
+ break;
+ case GOSSIP_ACTION_INFO_DEF:
+ Debug = !Debug;
+ TC_LOG_DEBUG("scripts", "HyjalAI - Debug mode has been toggled");
+ break;
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (EventBegun)
+ return false;
+
+ uint32 AnetheronEvent = GetInstanceData(DATA_ANETHERONEVENT);
+ // Only let them start the Horde phases if Anetheron is dead.
+ if (AnetheronEvent == DONE && GetInstanceData(DATA_ALLIANCE_RETREAT))
+ {
+ uint32 KazrogalEvent = GetInstanceData(DATA_KAZROGALEVENT);
+ uint32 AzgalorEvent = GetInstanceData(DATA_AZGALOREVENT);
+ if (KazrogalEvent == NOT_STARTED)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BEGIN_HORDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ else if (KazrogalEvent == DONE && AzgalorEvent == NOT_STARTED)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AZGALOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ else if (AzgalorEvent == DONE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_RETREAT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ }
+
+ if (player->IsGameMaster())
+ AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_ITEM_GM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+
+ SendGossipMenuFor(player, 907, me->GetGUID());
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHyjalAI<npc_thrallAI>(creature);
}
-
- return nullptr;
- }
-
};
class npc_tyrande_whisperwind : public CreatureScript
{
-public:
- npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { }
+ public:
+ npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- if (hyjalAI* ai = GetHyjalAI<hyjalAI>(creature))
+ struct npc_tyrande_whisperwindAI : public hyjalAI
{
- ai->Reset();
- ai->EnterEvadeMode();
- return ai;
- }
-
- return nullptr;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF)
+ npc_tyrande_whisperwindAI(Creature* creature) : hyjalAI(creature)
+ {
+ Reset();
+ EnterEvadeMode();
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF)
+ {
+ ItemPosCountVec dest;
+ uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1);
+ if (msg == EQUIP_ERR_OK)
+ if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true))
+ player->SendNewItem(item, 1, true, false, true);
+
+ SendGossipMenuFor(player, 907, me->GetGUID());
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ uint32 AzgalorEvent = GetInstanceData(DATA_AZGALOREVENT);
+
+ // Only let them get item if Azgalor is dead.
+ if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, 907, me->GetGUID());
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
{
- ItemPosCountVec dest;
- uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1);
- if (msg == EQUIP_ERR_OK)
- if (Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true))
- player->SendNewItem(item, 1, true, false, true);
-
- SendGossipMenuFor(player, 907, creature->GetGUID());
+ return GetHyjalAI<npc_tyrande_whisperwindAI>(creature);
}
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI());
- uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
-
- // Only let them get item if Azgalor is dead.
- if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, 907, creature->GetGUID());
- return true;
- }
-
};
void AddSC_hyjal()
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
index 59d4ac249be..97848ddcde9 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -258,98 +258,6 @@ class npc_arthas : public CreatureScript
public:
npc_arthas() : CreatureScript("npc_arthas") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- npc_arthasAI* ai = CAST_AI(npc_arthas::npc_arthasAI, creature->AI());
-
- if (!ai)
- return false;
-
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF:
- ai->Start(true, true, player->GetGUID(), 0, false, false);
- ai->SetDespawnAtEnd(false);
- ai->bStepping = false;
- ai->step = 1;
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- ai->bStepping = true;
- ai->step = 24;
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- ai->SetHoldState(false);
- ai->bStepping = false;
- ai->step = 61;
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- ai->SetHoldState(false);
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- ai->bStepping = true;
- ai->step = 84;
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- ai->bStepping = true;
- ai->step = 85;
- break;
- }
- CloseGossipMenuFor(player);
- ai->SetDespawnAtFar(false);
- creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- npc_arthasAI* ai = CAST_AI(npc_arthas::npc_arthasAI, creature->AI());
-
- if (ai && ai->bStepping == false)
- {
- switch (ai->gossipStep)
- {
- case 0: //This one is a workaround since the very beggining of the script is wrong.
- {
- QuestStatus status = player->GetQuestStatus(13149);
- if (status != QUEST_STATUS_COMPLETE && status != QUEST_STATUS_REWARDED)
- return false;
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, 907, creature->GetGUID());
- break;
- }
- case 1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, creature->GetGUID());
- break;
- case 2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, creature->GetGUID());
- break;
- case 3:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, creature->GetGUID());
- break;
- case 4:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, creature->GetGUID());
- break;
- case 5:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, creature->GetGUID());
- break;
- default:
- return false;
- }
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetCullingOfStratholmeAI<npc_arthasAI>(creature);
- }
-
struct npc_arthasAI : public npc_escortAI
{
npc_arthasAI(Creature* creature) : npc_escortAI(creature)
@@ -1234,8 +1142,93 @@ public:
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:
+ Start(true, true, player->GetGUID(), 0, false, false);
+ SetDespawnAtEnd(false);
+ bStepping = false;
+ step = 1;
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ bStepping = true;
+ step = 24;
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ SetHoldState(false);
+ bStepping = false;
+ step = 61;
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ SetHoldState(false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ bStepping = true;
+ step = 84;
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ bStepping = true;
+ step = 85;
+ break;
+ }
+ CloseGossipMenuFor(player);
+ SetDespawnAtFar(false);
+ me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (!bStepping)
+ {
+ switch (gossipStep)
+ {
+ case 0: //This one is a workaround since the very beggining of the script is wrong.
+ {
+ QuestStatus status = player->GetQuestStatus(13149);
+ if (status != QUEST_STATUS_COMPLETE && status != QUEST_STATUS_REWARDED)
+ return false;
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, 907, me->GetGUID());
+ break;
+ }
+ case 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_1, me->GetGUID());
+ break;
+ case 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_2, me->GetGUID());
+ break;
+ case 3:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_3, me->GetGUID());
+ break;
+ case 4:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_4, me->GetGUID());
+ break;
+ case 5:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_ARTHAS_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, GOSSIP_MENU_ARTHAS_5, me->GetGUID());
+ break;
+ default:
+ return false;
+ }
+ }
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetCullingOfStratholmeAI<npc_arthasAI>(creature);
+ }
};
class npc_crate_helper : public CreatureScript
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
index c9f497ae971..5f0730df796 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
@@ -28,6 +28,7 @@ EndScriptData */
#include "MotionMaster.h"
#include "old_hillsbrad.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
/*######
## go_barrel_old_hillsbrad
@@ -38,19 +39,26 @@ class go_barrel_old_hillsbrad : public GameObjectScript
public:
go_barrel_old_hillsbrad() : GameObjectScript("go_barrel_old_hillsbrad") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_barrel_old_hillsbradAI : public GameObjectAI
{
- if (InstanceScript* instance = go->GetInstanceScript())
+ go_barrel_old_hillsbradAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE)
return false;
instance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS);
+ return false;
}
+ };
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetOldHillsbradAI<go_barrel_old_hillsbradAI>(go);
}
-
};
/*######
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
index 1fbd0a3474d..c921ec42e6b 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
@@ -57,41 +57,51 @@ class npc_erozion : public CreatureScript
public:
npc_erozion() : CreatureScript("npc_erozion") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
+ struct npc_erozionAI : public ScriptedAI
{
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
+ npc_erozionAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- ItemPosCountVec dest;
- uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1);
- if (msg == EQUIP_ERR_OK)
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- player->StoreNewItem(dest, ITEM_ENTRY_BOMBS, true);
+ ItemPosCountVec dest;
+ uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_ENTRY_BOMBS, 1);
+ if (msg == EQUIP_ERR_OK)
+ {
+ player->StoreNewItem(dest, ITEM_ENTRY_BOMBS, true);
+ }
+ SendGossipMenuFor(player, 9515, me->GetGUID());
}
- SendGossipMenuFor(player, 9515, creature->GetGUID());
+ if (action == GOSSIP_ACTION_INFO_DEF + 2)
+ CloseGossipMenuFor(player);
+ return true;
}
- if (action == GOSSIP_ACTION_INFO_DEF+2)
+
+ bool GossipHello(Player* player) override
{
- CloseGossipMenuFor(player);
- }
- return true;
- }
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ if (instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- InstanceScript* instance = creature->GetInstanceScript();
- if (instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ if (player->GetQuestStatus(QUEST_ENTRY_RETURN) == QUEST_STATUS_COMPLETE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- if (player->GetQuestStatus(QUEST_ENTRY_RETURN) == QUEST_STATUS_COMPLETE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
+ SendGossipMenuFor(player, 9778, me->GetGUID());
- SendGossipMenuFor(player, 9778, creature->GetGUID());
+ return true;
+ }
+ };
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetOldHillsbradAI<npc_erozionAI>(creature);
}
};
@@ -186,93 +196,6 @@ class npc_thrall_old_hillsbrad : public CreatureScript
public:
npc_thrall_old_hillsbrad() : CreatureScript("npc_thrall_old_hillsbrad") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetOldHillsbradAI<npc_thrall_old_hillsbradAI>(creature);
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- InstanceScript* instance = creature->GetInstanceScript();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- CloseGossipMenuFor(player);
- if (instance)
- {
- instance->SetData(TYPE_THRALL_EVENT, IN_PROGRESS);
- instance->SetData(TYPE_THRALL_PART1, IN_PROGRESS);
- }
-
- creature->AI()->Talk(SAY_TH_START_EVENT_PART1);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI()))
- pEscortAI->Start(true, true, player->GetGUID());
-
- ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far
- ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false);
- ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false);
- break;
-
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+20);
- SendGossipMenuFor(player, GOSSIP_ID_SKARLOC2, creature->GetGUID());
- break;
-
- case GOSSIP_ACTION_INFO_DEF+20:
- SendGossipMenuFor(player, GOSSIP_ID_SKARLOC3, creature->GetGUID());
- creature->SummonCreature(SKARLOC_MOUNT, 2038.81f, 270.26f, 63.20f, 5.41f, TEMPSUMMON_TIMED_DESPAWN, 12000);
- if (instance)
- instance->SetData(TYPE_THRALL_PART2, IN_PROGRESS);
-
- creature->AI()->Talk(SAY_TH_START_EVENT_PART2);
-
- ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP();
- break;
-
- case GOSSIP_ACTION_INFO_DEF+3:
- CloseGossipMenuFor(player);
- if (instance)
- instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS);
- ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP();
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- {
- player->PrepareQuestMenu(creature->GetGUID());
- player->SendPreparedQuest(creature);
- }
-
- InstanceScript* instance = creature->GetInstanceScript();
- if (instance)
- {
- if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE && !instance->GetData(TYPE_THRALL_EVENT))
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_WALKING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, GOSSIP_ID_START, creature->GetGUID());
- }
-
- if (instance->GetData(TYPE_THRALL_PART1) == DONE && !instance->GetData(TYPE_THRALL_PART2))
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_ID_SKARLOC1, creature->GetGUID());
- }
-
- if (instance->GetData(TYPE_THRALL_PART2) == DONE && !instance->GetData(TYPE_THRALL_PART3))
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TARREN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- SendGossipMenuFor(player, GOSSIP_ID_TARREN, creature->GetGUID());
- }
- }
- return true;
- }
-
struct npc_thrall_old_hillsbradAI : public npc_escortAI
{
npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature)
@@ -543,8 +466,84 @@ public:
LowHp = true;
}
}
+
+ 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);
+ instance->SetData(TYPE_THRALL_EVENT, IN_PROGRESS);
+ instance->SetData(TYPE_THRALL_PART1, IN_PROGRESS);
+
+ Talk(SAY_TH_START_EVENT_PART1);
+
+ Start(true, true, player->GetGUID());
+
+ SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far
+ SetDespawnAtEnd(false);
+ SetDespawnAtFar(false);
+ break;
+
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20);
+ SendGossipMenuFor(player, GOSSIP_ID_SKARLOC2, me->GetGUID());
+ break;
+
+ case GOSSIP_ACTION_INFO_DEF + 20:
+ SendGossipMenuFor(player, GOSSIP_ID_SKARLOC3, me->GetGUID());
+ me->SummonCreature(SKARLOC_MOUNT, 2038.81f, 270.26f, 63.20f, 5.41f, TEMPSUMMON_TIMED_DESPAWN, 12000);
+ instance->SetData(TYPE_THRALL_PART2, IN_PROGRESS);
+
+ Talk(SAY_TH_START_EVENT_PART2);
+
+ StartWP();
+ break;
+
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ CloseGossipMenuFor(player);
+ instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS);
+ StartWP();
+ break;
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ {
+ player->PrepareQuestMenu(me->GetGUID());
+ player->SendPreparedQuest(me);
+ }
+
+ if (instance->GetData(TYPE_BARREL_DIVERSION) == DONE && !instance->GetData(TYPE_THRALL_EVENT))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_WALKING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_ID_START, me->GetGUID());
+ }
+
+ if (instance->GetData(TYPE_THRALL_PART1) == DONE && !instance->GetData(TYPE_THRALL_PART2))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_SKARLOC1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_ID_SKARLOC1, me->GetGUID());
+ }
+
+ if (instance->GetData(TYPE_THRALL_PART2) == DONE && !instance->GetData(TYPE_THRALL_PART3))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TARREN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ SendGossipMenuFor(player, GOSSIP_ID_TARREN, me->GetGUID());
+ }
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetOldHillsbradAI<npc_thrall_old_hillsbradAI>(creature);
+ }
};
/*######
@@ -564,48 +563,6 @@ class npc_taretha : public CreatureScript
public:
npc_taretha() : CreatureScript("npc_taretha") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetOldHillsbradAI<npc_tarethaAI>(creature);
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- InstanceScript* instance = creature->GetInstanceScript();
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_ID_EPOCH2, creature->GetGUID());
- }
- if (action == GOSSIP_ACTION_INFO_DEF+2)
- {
- CloseGossipMenuFor(player);
-
- if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS)
- {
- instance->SetData(TYPE_THRALL_PART4, IN_PROGRESS);
- if (instance->GetGuidData(DATA_EPOCH).IsEmpty())
- creature->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
-
- if (Creature* thrall = (ObjectAccessor::GetCreature(*creature, instance->GetGuidData(DATA_THRALL))))
- ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP();
- }
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- InstanceScript* instance = creature->GetInstanceScript();
- if (instance->GetData(TYPE_THRALL_PART3) == DONE && instance->GetData(TYPE_THRALL_PART4) == NOT_STARTED)
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, GOSSIP_ID_EPOCH1, creature->GetGUID());
- }
- return true;
- }
-
struct npc_tarethaAI : public npc_escortAI
{
npc_tarethaAI(Creature* creature) : npc_escortAI(creature)
@@ -635,8 +592,49 @@ public:
{
npc_escortAI::UpdateAI(diff);
}
+
+ 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)
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_ID_EPOCH2, me->GetGUID());
+ }
+ if (action == GOSSIP_ACTION_INFO_DEF + 2)
+ {
+ CloseGossipMenuFor(player);
+
+ if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS)
+ {
+ instance->SetData(TYPE_THRALL_PART4, IN_PROGRESS);
+ if (instance->GetGuidData(DATA_EPOCH).IsEmpty())
+ me->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
+
+ if (Creature* thrall = (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THRALL))))
+ ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP();
+ }
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (instance->GetData(TYPE_THRALL_PART3) == DONE && instance->GetData(TYPE_THRALL_PART4) == NOT_STARTED)
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_ID_EPOCH1, me->GetGUID());
+ }
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetOldHillsbradAI<npc_tarethaAI>(creature);
+ }
};
/*######
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
index 82fdc18e7c6..950ea70df57 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
@@ -43,11 +43,10 @@ enum OHWorldStateIds
WORLD_STATE_OH = 2436
};
-
-template<typename AI>
-inline AI* GetOldHillsbradAI(Creature* creature)
+template <class AI, class T>
+inline AI* GetOldHillsbradAI(T* obj)
{
- return GetInstanceAI<AI>(creature, OHScriptName);
+ return GetInstanceAI<AI>(obj, OHScriptName);
}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
index 71784911f34..c4846fbc611 100644
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
@@ -331,10 +331,10 @@ class npc_brann_bronzebeard_anraphet : public CreatureScript
{
npc_brann_bronzebeard_anraphetAI(Creature* creature) : CreatureAI(creature), _currentPoint(0), _instance(creature->GetInstanceScript()) { }
- void sGossipSelect(Player* /*player*/, uint32 sender, uint32 action) override
+ bool GossipSelect(Player* /*player*/, uint32 sender, uint32 action) override
{
if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE)
- return;
+ return true;
if (me->GetCreatureTemplate()->GossipMenuId == sender && !action)
{
@@ -346,6 +346,7 @@ class npc_brann_bronzebeard_anraphet : public CreatureScript
Talk(BRANN_SAY_DOOR_INTRO);
events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500);
}
+ return false;
}
void DoAction(int32 action) override
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
index adfca4e9a7e..2c1059a9bd9 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
@@ -34,6 +34,7 @@ EndContentData */
#include "Player.h"
#include "razorfen_downs.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "ScriptedGossip.h"
#include "TemporarySummon.h"
@@ -129,7 +130,7 @@ public:
me->DespawnOrUnsummon(5000);
}
- void sQuestAccept(Player* /*player*/, Quest const* quest) override
+ void QuestAccept(Player* /*player*/, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL)
{
@@ -376,19 +377,24 @@ class go_gong : public GameObjectScript
public:
go_gong() : GameObjectScript("go_gong") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_gongAI : public GameObjectAI
{
- InstanceScript* instance = go->GetInstanceScript();
+ go_gongAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- if (instance)
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
- go->SendCustomAnim(0);
+ me->SendCustomAnim(0);
instance->SetData(DATA_WAVE, IN_PROGRESS);
return true;
}
- return false;
- }
+ };
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetRazorfenDownsAI<go_gongAI>(go);
+ }
};
void AddSC_razorfen_downs()
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
index ea328c6da8c..8d4d3e042bb 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
@@ -63,10 +63,10 @@ enum RFDGameObjectIds
GO_BELNISTRASZS_BRAZIER = 152097
};
-template<typename AI>
-inline AI* GetRazorfenDownsAI(Creature* creature)
+template<class AI, class T>
+AI* GetRazorfenDownsAI(T* obj)
{
- return GetInstanceAI<AI>(creature, RFDScriptName);
+ return GetInstanceAI<AI>(obj, RFDScriptName);
}
#endif
diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
index 7fa68b2771a..3f1ed9792ff 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
@@ -52,7 +52,7 @@ public:
{
npc_willixAI(Creature* creature) : npc_escortAI(creature) { }
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER)
{
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
index 77a7144f0bc..bb6e986a71e 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
@@ -16,6 +16,7 @@
*/
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "Map.h"
@@ -283,18 +284,26 @@ class go_ossirian_crystal : public GameObjectScript
public:
go_ossirian_crystal() : GameObjectScript("go_ossirian_crystal") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_ossirian_crystalAI : public GameObjectAI
{
- InstanceScript* Instance = player->GetInstanceScript();
- if (!Instance)
- return false;
+ go_ossirian_crystalAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- Creature* Ossirian = player->FindNearestCreature(NPC_OSSIRIAN, 30.0f);
- if (!Ossirian || Instance->GetBossState(DATA_OSSIRIAN) != IN_PROGRESS)
- return false;
+ InstanceScript* instance;
- Ossirian->AI()->DoAction(ACTION_TRIGGER_WEAKNESS);
- return true;
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ Creature* ossirian = player->FindNearestCreature(NPC_OSSIRIAN, 30.0f);
+ if (!ossirian || instance->GetBossState(DATA_OSSIRIAN) != IN_PROGRESS)
+ return false;
+
+ ossirian->AI()->DoAction(ACTION_TRIGGER_WEAKNESS);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetAQ20AI<go_ossirian_crystalAI>(go);
}
};
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
index 03f50ff978a..e646a003b2b 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
@@ -60,10 +60,10 @@ enum AQRGameObjectIds
GO_OSSIRIAN_CRYSTAL = 180619
};
-template<typename AI>
-inline AI* GetAQ20AI(Creature* creature)
+template<class AI, class T>
+AI* GetAQ20AI(T* obj)
{
- return GetInstanceAI<AI>(creature, AQ20ScriptName);
+ return GetInstanceAI<AI>(obj, AQ20ScriptName);
}
#endif
diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
index d8fee227711..e3019c885bd 100644
--- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
+++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
@@ -80,60 +80,6 @@ class npc_disciple_of_naralex : public CreatureScript
public:
npc_disciple_of_naralex() : CreatureScript("npc_disciple_of_naralex") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetWailingCavernsAI<npc_disciple_of_naralexAI>(creature);
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- InstanceScript* instance = creature->GetInstanceScript();
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
- {
- CloseGossipMenuFor(player);
- if (instance)
- instance->SetData(TYPE_NARALEX_EVENT, IN_PROGRESS);
-
- creature->AI()->Talk(SAY_MAKE_PREPARATIONS);
-
- creature->SetFaction(250);
- creature->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
-
- ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID());
- ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false);
- ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- InstanceScript* instance = creature->GetInstanceScript();
-
- if (instance)
- {
- creature->CastSpell(player, SPELL_MARK_OF_THE_WILD_RANK_2, true);
- if ((instance->GetData(TYPE_LORD_COBRAHN) == DONE) && (instance->GetData(TYPE_LORD_PYTHAS) == DONE) &&
- (instance->GetData(TYPE_LADY_ANACONDRA) == DONE) && (instance->GetData(TYPE_LORD_SERPENTIS) == DONE))
- {
- AddGossipItemFor(player, GOSSIP_OPTION_LET_EVENT_BEGIN, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, NPC_TEXT_FANGLORDS_ARE_DEAD, creature->GetGUID());
-
- if (!instance->GetData(TYPE_NARALEX_YELLED))
- {
- creature->AI()->Talk(SAY_AT_LAST);
- instance->SetData(TYPE_NARALEX_YELLED, 1);
- }
- }
- else
- {
- SendGossipMenuFor(player, NPC_TEXT_NARALEX_SLEEPS_AGAIN, creature->GetGUID());
- }
- }
- return true;
- }
-
struct npc_disciple_of_naralexAI : public npc_escortAI
{
npc_disciple_of_naralexAI(Creature* creature) : npc_escortAI(creature)
@@ -370,8 +316,56 @@ public:
}
} else eventTimer -= diff;
}
+
+ 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 (instance)
+ instance->SetData(TYPE_NARALEX_EVENT, IN_PROGRESS);
+
+ Talk(SAY_MAKE_PREPARATIONS);
+
+ me->SetFaction(250);
+ me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
+
+ Start(false, false, player->GetGUID());
+ SetDespawnAtFar(false);
+ SetDespawnAtEnd(false);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ DoCast(player, SPELL_MARK_OF_THE_WILD_RANK_2, true);
+ if ((instance->GetData(TYPE_LORD_COBRAHN) == DONE) && (instance->GetData(TYPE_LORD_PYTHAS) == DONE) &&
+ (instance->GetData(TYPE_LADY_ANACONDRA) == DONE) && (instance->GetData(TYPE_LORD_SERPENTIS) == DONE))
+ {
+ AddGossipItemFor(player, GOSSIP_OPTION_LET_EVENT_BEGIN, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, NPC_TEXT_FANGLORDS_ARE_DEAD, me->GetGUID());
+
+ if (!instance->GetData(TYPE_NARALEX_YELLED))
+ {
+ Talk(SAY_AT_LAST);
+ instance->SetData(TYPE_NARALEX_YELLED, 1);
+ }
+ }
+ else
+ {
+ SendGossipMenuFor(player, NPC_TEXT_NARALEX_SLEEPS_AGAIN, me->GetGUID());
+ }
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetWailingCavernsAI<npc_disciple_of_naralexAI>(creature);
+ }
};
void AddSC_wailing_caverns()
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
index af4e5f4ec69..70689d7badf 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
@@ -35,6 +35,7 @@ EndContentData */
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
+#include "GameObjectAI.h"
#include "zulfarrak.h"
/*######
@@ -67,42 +68,6 @@ class npc_sergeant_bly : public CreatureScript
public:
npc_sergeant_bly() : CreatureScript("npc_sergeant_bly") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- CloseGossipMenuFor(player);
- ENSURE_AI(npc_sergeant_bly::npc_sergeant_blyAI, creature->AI())->PlayerGUID = player->GetGUID();
- creature->AI()->DoAction(0);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (InstanceScript* instance = creature->GetInstanceScript())
- {
- if (instance->GetData(EVENT_PYRAMID) == PYRAMID_KILLED_ALL_TROLLS)
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, 1517, creature->GetGUID());
- }
- else
- if (instance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED)
- SendGossipMenuFor(player, 1515, creature->GetGUID());
- else
- SendGossipMenuFor(player, 1516, creature->GetGUID());
- return true;
- }
- return false;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulFarrakAI<npc_sergeant_blyAI>(creature);
- }
-
struct npc_sergeant_blyAI : public ScriptedAI
{
npc_sergeant_blyAI(Creature* creature) : ScriptedAI(creature)
@@ -201,8 +166,40 @@ public:
if (crew->IsAlive())
crew->SetFaction(FACTION_HOSTILE);
}
+
+ 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);
+ PlayerGUID = player->GetGUID();
+ DoAction(0);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (instance->GetData(EVENT_PYRAMID) == PYRAMID_KILLED_ALL_TROLLS)
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BLY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, 1517, me->GetGUID());
+ }
+ else
+ if (instance->GetData(EVENT_PYRAMID) == PYRAMID_NOT_STARTED)
+ SendGossipMenuFor(player, 1515, me->GetGUID());
+ else
+ SendGossipMenuFor(player, 1516, me->GetGUID());
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetZulFarrakAI<npc_sergeant_blyAI>(creature);
+ }
};
/*######
@@ -214,32 +211,41 @@ class go_troll_cage : public GameObjectScript
public:
go_troll_cage() : GameObjectScript("go_troll_cage") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_troll_cageAI : public GameObjectAI
{
- if (InstanceScript* instance = go->GetInstanceScript())
+ go_troll_cageAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
instance->SetData(EVENT_PYRAMID, PYRAMID_CAGES_OPEN);
//set bly & co to aggressive & start moving to top of stairs
- initBlyCrewMember(instance, go, ENTRY_BLY, 1884.99f, 1263, 41.52f);
- initBlyCrewMember(instance, go, ENTRY_RAVEN, 1882.5f, 1263, 41.52f);
- initBlyCrewMember(instance, go, ENTRY_ORO, 1886.47f, 1270.68f, 41.68f);
- initBlyCrewMember(instance, go, ENTRY_WEEGLI, 1890, 1263, 41.52f);
- initBlyCrewMember(instance, go, ENTRY_MURTA, 1891.19f, 1272.03f, 41.60f);
+ initBlyCrewMember(ENTRY_BLY, 1884.99f, 1263, 41.52f);
+ initBlyCrewMember(ENTRY_RAVEN, 1882.5f, 1263, 41.52f);
+ initBlyCrewMember(ENTRY_ORO, 1886.47f, 1270.68f, 41.68f);
+ initBlyCrewMember(ENTRY_WEEGLI, 1890, 1263, 41.52f);
+ initBlyCrewMember(ENTRY_MURTA, 1891.19f, 1272.03f, 41.60f);
+ return false;
}
- return false;
- }
-private:
- void initBlyCrewMember(InstanceScript* instance, GameObject* go, uint32 entry, float x, float y, float z)
- {
- if (Creature* crew = ObjectAccessor::GetCreature(*go, instance->GetGuidData(entry)))
+ private:
+ void initBlyCrewMember(uint32 entry, float x, float y, float z)
{
- crew->SetReactState(REACT_AGGRESSIVE);
- crew->SetWalk(true);
- crew->SetHomePosition(x, y, z, 0);
- crew->GetMotionMaster()->MovePoint(1, x, y, z);
- crew->SetFaction(FACTION_FREED);
+ if (Creature* crew = instance->instance->GetCreature(instance->GetGuidData(entry)))
+ {
+ crew->SetReactState(REACT_AGGRESSIVE);
+ crew->SetWalk(true);
+ crew->SetHomePosition(x, y, z, 0);
+ crew->GetMotionMaster()->MovePoint(1, x, y, z);
+ crew->SetFaction(FACTION_FREED);
+ }
}
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetZulFarrakAI<go_troll_cageAI>(go);
}
};
@@ -268,44 +274,6 @@ class npc_weegli_blastfuse : public CreatureScript
public:
npc_weegli_blastfuse() : CreatureScript("npc_weegli_blastfuse") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- CloseGossipMenuFor(player);
- //here we make him run to door, set the charge and run away off to nowhere
- creature->AI()->DoAction(0);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (InstanceScript* instance = creature->GetInstanceScript())
- {
- switch (instance->GetData(EVENT_PYRAMID))
- {
- case PYRAMID_KILLED_ALL_TROLLS:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, 1514, creature->GetGUID()); //if event can proceed to end
- break;
- case PYRAMID_NOT_STARTED:
- SendGossipMenuFor(player, 1511, creature->GetGUID()); //if event not started
- break;
- default:
- SendGossipMenuFor(player, 1513, creature->GetGUID()); //if event are in progress
- }
- return true;
- }
- return false;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulFarrakAI<npc_weegli_blastfuseAI>(creature);
- }
-
struct npc_weegli_blastfuseAI : public ScriptedAI
{
npc_weegli_blastfuseAI(Creature* creature) : ScriptedAI(creature)
@@ -378,11 +346,6 @@ public:
};
}
- void DoAction(int32 /*param*/) override
- {
- DestroyDoor();
- }
-
void DestroyDoor()
{
if (me->IsAlive())
@@ -394,8 +357,42 @@ public:
destroyingDoor=true;
}
}
+
+ 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);
+ //here we make him run to door, set the charge and run away off to nowhere
+ DestroyDoor();
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ switch (instance->GetData(EVENT_PYRAMID))
+ {
+ case PYRAMID_KILLED_ALL_TROLLS:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEEGLI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, 1514, me->GetGUID()); //if event can proceed to end
+ break;
+ case PYRAMID_NOT_STARTED:
+ SendGossipMenuFor(player, 1511, me->GetGUID()); //if event not started
+ break;
+ default:
+ SendGossipMenuFor(player, 1513, me->GetGUID()); //if event are in progress
+ }
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetZulFarrakAI<npc_weegli_blastfuseAI>(creature);
+ }
};
/*######
@@ -415,20 +412,30 @@ class go_shallow_grave : public GameObjectScript
public:
go_shallow_grave() : GameObjectScript("go_shallow_grave") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_shallow_graveAI : public GameObjectAI
{
- // randomly summon a zombie or dead hero the first time a grave is used
- if (go->GetUseCount() == 0)
+ go_shallow_graveAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
- uint32 randomchance = urand(0, 100);
- if (randomchance < CHANCE_ZOMBIE)
- go->SummonCreature(NPC_ZOMBIE, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
- else
- if ((randomchance - CHANCE_ZOMBIE) < CHANCE_DEAD_HERO)
- go->SummonCreature(NPC_DEAD_HERO, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+ // randomly summon a zombie or dead hero the first time a grave is used
+ if (me->GetUseCount() == 0)
+ {
+ uint32 randomchance = urand(0, 100);
+ if (randomchance < CHANCE_ZOMBIE)
+ me->SummonCreature(NPC_ZOMBIE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+ else
+ if ((randomchance - CHANCE_ZOMBIE) < CHANCE_DEAD_HERO)
+ me->SummonCreature(NPC_DEAD_HERO, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000);
+ }
+ me->AddUse();
+ return false;
}
- go->AddUse();
- return false;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_shallow_graveAI(go);
}
};
diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
index 46ae0d0ef9b..00563114c00 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
@@ -56,10 +56,10 @@ enum ZFPyramidPhases
PYRAMID_KILLED_ALL_TROLLS,
};
-template<typename AI>
-inline AI* GetZulFarrakAI(Creature* creature)
+template<class AI, class T>
+inline AI* GetZulFarrakAI(T* obj)
{
- return GetInstanceAI<AI>(creature, ZFScriptName);
+ return GetInstanceAI<AI>(obj, ZFScriptName);
}
#endif
diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
index af7ca599b3f..854e5322667 100644
--- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp
+++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
@@ -27,6 +27,7 @@ npc_ruul_snowhoof
EndContentData */
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "GameObject.h"
#include "Player.h"
#include "ScriptedEscortAI.h"
@@ -79,7 +80,7 @@ public:
summoned->AI()->AttackStart(me);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_FREEDOM_TO_RUUL)
{
@@ -221,7 +222,7 @@ public:
summoned->AI()->AttackStart(me);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_VORSHA)
{
@@ -328,20 +329,30 @@ class go_naga_brazier : public GameObjectScript
public:
go_naga_brazier() : GameObjectScript("go_naga_brazier") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_naga_brazierAI : public GameObjectAI
{
- if (Creature* creature = GetClosestCreatureWithEntry(go, NPC_MUGLASH, INTERACTION_DISTANCE*2))
+ go_naga_brazierAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
- if (npc_muglash::npc_muglashAI* pEscortAI = CAST_AI(npc_muglash::npc_muglashAI, creature->AI()))
+ if (Creature* creature = GetClosestCreatureWithEntry(me, NPC_MUGLASH, INTERACTION_DISTANCE * 2))
{
- creature->AI()->Talk(SAY_MUG_BRAZIER_WAIT);
+ if (npc_muglash::npc_muglashAI* pEscortAI = CAST_AI(npc_muglash::npc_muglashAI, creature->AI()))
+ {
+ creature->AI()->Talk(SAY_MUG_BRAZIER_WAIT);
- pEscortAI->_isBrazierExtinguished = true;
- return false;
+ pEscortAI->_isBrazierExtinguished = true;
+ return false;
+ }
}
+
+ return true;
}
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_naga_brazierAI(go);
}
};
diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
index 2e15e2d2118..b834317359b 100644
--- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
@@ -32,6 +32,7 @@ npc_death_ravager
EndContentData */
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "CellImpl.h"
#include "GridNotifiersImpl.h"
#include "Log.h"
@@ -229,11 +230,12 @@ public:
Talk(ATTACK_YELL, who);
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
CloseGossipMenuFor(player);
me->SetFaction(FACTION_HOSTILE);
me->Attack(player, true);
+ return false;
}
void UpdateAI(uint32 diff) override
@@ -360,7 +362,7 @@ public:
Talk(SAY_AGGRO, who);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_A_CRY_FOR_HELP)
{
@@ -632,19 +634,29 @@ class go_ravager_cage : public GameObjectScript
public:
go_ravager_cage() : GameObjectScript("go_ravager_cage") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_ravager_cageAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE)
+ go_ravager_cageAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- if (Creature* ravager = go->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true))
+ me->UseDoorOrButton();
+ if (player->GetQuestStatus(QUEST_STRENGTH_ONE) == QUEST_STATUS_INCOMPLETE)
{
- ravager->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- ravager->SetReactState(REACT_AGGRESSIVE);
- ravager->AI()->AttackStart(player);
+ if (Creature* ravager = me->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true))
+ {
+ ravager->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+ ravager->SetReactState(REACT_AGGRESSIVE);
+ ravager->AI()->AttackStart(player);
+ }
}
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_ravager_cageAI(go);
}
};
@@ -802,19 +814,29 @@ class go_bristlelimb_cage : public GameObjectScript
public:
go_bristlelimb_cage() : GameObjectScript("go_bristlelimb_cage") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_bristlelimb_cageAI : public GameObjectAI
{
- go->SetGoState(GO_STATE_READY);
- if (player->GetQuestStatus(QUEST_THE_PROPHECY_OF_AKIDA) == QUEST_STATUS_INCOMPLETE)
+ go_bristlelimb_cageAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- if (Creature* capitive = go->FindNearestCreature(NPC_STILLPINE_CAPITIVE, 5.0f, true))
+ me->SetGoState(GO_STATE_READY);
+ if (player->GetQuestStatus(QUEST_THE_PROPHECY_OF_AKIDA) == QUEST_STATUS_INCOMPLETE)
{
- go->ResetDoorOrButton();
- ENSURE_AI(npc_stillpine_capitive::npc_stillpine_capitiveAI, capitive->AI())->StartMoving(player);
- return false;
+ if (Creature* capitive = me->FindNearestCreature(NPC_STILLPINE_CAPITIVE, 5.0f, true))
+ {
+ me->ResetDoorOrButton();
+ ENSURE_AI(npc_stillpine_capitive::npc_stillpine_capitiveAI, capitive->AI())->StartMoving(player);
+ return false;
+ }
}
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_bristlelimb_cageAI(go);
}
};
diff --git a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
index 4b29440786b..adfc20062a6 100644
--- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
@@ -363,7 +363,7 @@ public:
_moveTimer = 0;
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_ENDING_THEIR_WORLD)
{
diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp
index 3ba3873837d..4f79ed6a510 100644
--- a/src/server/scripts/Kalimdor/zone_desolace.cpp
+++ b/src/server/scripts/Kalimdor/zone_desolace.cpp
@@ -28,6 +28,7 @@ go_demon_portal
EndContentData */
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "MotionMaster.h"
#include "Player.h"
#include "ScriptedEscortAI.h"
@@ -101,19 +102,19 @@ public:
me->DespawnOrUnsummon(60000);
}
}
- };
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && creature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
+ bool GossipHello(Player* player) override
{
- player->TalkedToCreature(creature->GetEntry(), ObjectGuid::Empty);
- player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF);
- }
+ if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && me->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
+ {
+ player->TalkedToCreature(me->GetEntry(), ObjectGuid::Empty);
+ player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF);
+ }
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
index 5c2f4299068..99cc3ce925c 100644
--- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
+++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
@@ -49,31 +49,41 @@ class npc_nat_pagle : public CreatureScript
public:
npc_nat_pagle() : CreatureScript("npc_nat_pagle") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
+ struct npc_nat_pagleAI : public ScriptedAI
{
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
+ npc_nat_pagleAI(Creature* creature) : ScriptedAI(creature) { }
- return true;
- }
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_TRADE)
+ player->GetSession()->SendListInventory(me->GetGUID());
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ return true;
+ }
- if (creature->IsVendor() && player->GetQuestRewardStatus(QUEST_NATS_MEASURING_TAPE))
+ bool GossipHello(Player* player) override
{
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- SendGossipMenuFor(player, 7640, creature->GetGUID());
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (me->IsVendor() && player->GetQuestRewardStatus(QUEST_NATS_MEASURING_TAPE))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ SendGossipMenuFor(player, 7640, me->GetGUID());
+ }
+ else
+ SendGossipMenuFor(player, 7638, me->GetGUID());
+
+ return true;
}
- else
- SendGossipMenuFor(player, 7638, creature->GetGUID());
+ };
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_nat_pagleAI(creature);
}
-
};
/*######
@@ -102,19 +112,6 @@ class npc_private_hendel : public CreatureScript
public:
npc_private_hendel() : CreatureScript("npc_private_hendel") { }
- bool OnQuestAccept(Player* /*player*/, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT16)
- creature->SetFaction(FACTION_HOSTILE);
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_private_hendelAI(creature);
- }
-
struct npc_private_hendelAI : public ScriptedAI
{
npc_private_hendelAI(Creature* creature) : ScriptedAI(creature) { }
@@ -148,8 +145,18 @@ public:
EnterEvadeMode();
}
}
+
+ void QuestAccept(Player* /*player*/, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT16)
+ me->SetFaction(FACTION_HOSTILE);
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_private_hendelAI(creature);
+ }
};
/*######
diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index 2df4806adac..bf1dc96d5e4 100644
--- a/src/server/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
@@ -35,6 +35,7 @@ go_wind_stone
EndContentData */
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "CreatureAIImpl.h"
#include "GameObject.h"
#include "Group.h"
@@ -963,60 +964,68 @@ class go_crystalline_tear : public GameObjectScript
public:
go_crystalline_tear() : GameObjectScript("go_crystalline_tear") { }
- bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest) override
+ struct go_crystalline_tearAI : GameObjectAI
{
- if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD)
+ go_crystalline_tearAI(GameObject* go) : GameObjectAI(go) { }
+
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (Creature* trigger = go->FindNearestCreature(ANACHRONOS_QUEST_TRIGGER_INVISIBLE, 100))
+ if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD)
{
- Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
- Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
- Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
- /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
- Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
-
- if (Merithra)
+ if (Creature* trigger = me->FindNearestCreature(ANACHRONOS_QUEST_TRIGGER_INVISIBLE, 100))
{
- Merithra->SetNpcFlags(UNIT_NPC_FLAG_NONE);
- Merithra->SetStandState(UNIT_STAND_STATE_STAND);
- Merithra->SetDisplayId(MERITHRA_NIGHT_ELF_FORM);
- Merithra->SetFaction(35);
- }
+ Unit* Merithra = trigger->SummonCreature(NPC_MERITHRA_OF_THE_DREAM, -8034.535f, 1535.14f, 2.61f, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
+ Unit* Caelestrasz = trigger->SummonCreature(NPC_CAELESTRASZ, -8032.767f, 1533.148f, 2.61f, 1.5f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
+ Unit* Arygos = trigger->SummonCreature(NPC_ARYGOS, -8034.52f, 1537.843f, 2.61f, 5.7f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
+ /* Unit* Fandral = */ trigger->SummonCreature(NPC_FANDRAL_STAGHELM, -8028.462f, 1535.843f, 2.61f, 3.141592f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
+ Creature* Anachronos = trigger->SummonCreature(NPC_ANACHRONOS, -8028.75f, 1538.795f, 2.61f, 4, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 220000);
- if (Caelestrasz)
- {
- Caelestrasz->SetNpcFlags(UNIT_NPC_FLAG_NONE);
- Caelestrasz->SetStandState(UNIT_STAND_STATE_STAND);
- Caelestrasz->SetDisplayId(CAELESTRASZ_NIGHT_ELF_FORM);
- Caelestrasz->SetFaction(35);
- }
+ if (Merithra)
+ {
+ Merithra->SetNpcFlags(UNIT_NPC_FLAG_NONE);
+ Merithra->SetStandState(UNIT_STAND_STATE_STAND);
+ Merithra->SetDisplayId(MERITHRA_NIGHT_ELF_FORM);
+ Merithra->SetFaction(35);
+ }
- if (Arygos)
- {
- Arygos->SetNpcFlags(UNIT_NPC_FLAG_NONE);
- Arygos->SetStandState(UNIT_STAND_STATE_STAND);
- Arygos->SetDisplayId(ARYGOS_GNOME_FORM);
- Arygos->SetFaction(35);
- }
+ if (Caelestrasz)
+ {
+ Caelestrasz->SetNpcFlags(UNIT_NPC_FLAG_NONE);
+ Caelestrasz->SetStandState(UNIT_STAND_STATE_STAND);
+ Caelestrasz->SetDisplayId(CAELESTRASZ_NIGHT_ELF_FORM);
+ Caelestrasz->SetFaction(35);
+ }
- if (Anachronos)
- {
- if (npc_anachronos_the_ancient::npc_anachronos_the_ancientAI* anachronosAI = CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI()))
- anachronosAI->PlayerGUID = player->GetGUID();
+ if (Arygos)
+ {
+ Arygos->SetNpcFlags(UNIT_NPC_FLAG_NONE);
+ Arygos->SetStandState(UNIT_STAND_STATE_STAND);
+ Arygos->SetDisplayId(ARYGOS_GNOME_FORM);
+ Arygos->SetFaction(35);
+ }
- if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI()))
+ if (Anachronos)
{
- triggerAI->Failed = false;
- triggerAI->PlayerGUID = player->GetGUID();
- triggerAI->EventStarted = true;
- triggerAI->Announced = true;
+ if (npc_anachronos_the_ancient::npc_anachronos_the_ancientAI* anachronosAI = CAST_AI(npc_anachronos_the_ancient::npc_anachronos_the_ancientAI, Anachronos->AI()))
+ anachronosAI->PlayerGUID = player->GetGUID();
+
+ if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, trigger->AI()))
+ {
+ triggerAI->Failed = false;
+ triggerAI->PlayerGUID = player->GetGUID();
+ triggerAI->EventStarted = true;
+ triggerAI->Announced = true;
+ }
}
}
}
}
- return true;
- }
+ };
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_crystalline_tearAI(go);
+ }
};
/*###
@@ -1131,241 +1140,252 @@ class go_wind_stone : public GameObjectScript
public:
go_wind_stone() : GameObjectScript("go_wind_stone") { }
- private:
- uint8 GetPlayerRank(Player* player) // For random summoning
- {
- bool setAura = player->HasAura(AURA_TWILIGHT_SET);
- bool medallionAura = player->HasAura(AURA_MEDALLION);
- bool ringAura = player->HasAura(AURA_RING);
-
- if (setAura && medallionAura && ringAura)
- return 3;
- else if (setAura && medallionAura)
- return 2;
- else if (setAura)
- return 1;
- else
- return 0;
- }
-
- uint8 GetItems(Player* player, WS type)
+ struct go_wind_stoneAI : public GameObjectAI
{
- uint8 result = 0x0;
+ go_wind_stoneAI(GameObject* go) : GameObjectAI(go) { }
- switch (type)
- {
- case TEMPLAR:
- {
- if (player->HasItemCount(ITEM_TEMPLAR_FIRE))
- result |= FIRE;
- if (player->HasItemCount(ITEM_TEMPLAR_WATER))
- result |= WATER;
- if (player->HasItemCount(ITEM_TEMPLAR_EARTH))
- result |= EARTH;
- if (player->HasItemCount(ITEM_TEMPLAR_AIR))
- result |= AIR;
- break;
- }
- case DUKE:
- {
- if (player->HasItemCount(ITEM_DUKE_FIRE))
- result |= FIRE;
- if (player->HasItemCount(ITEM_DUKE_WATER))
- result |= WATER;
- if (player->HasItemCount(ITEM_DUKE_EARTH))
- result |= EARTH;
- if (player->HasItemCount(ITEM_DUKE_AIR))
- result |= AIR;
- break;
- }
- case ROYAL:
+ private:
+ uint8 GetPlayerRank(Player* player) // For random summoning
{
- if (player->HasItemCount(ITEM_ROYAL_FIRE))
- result |= FIRE;
- if (player->HasItemCount(ITEM_ROYAL_WATER))
- result |= WATER;
- if (player->HasItemCount(ITEM_ROYAL_EARTH))
- result |= EARTH;
- if (player->HasItemCount(ITEM_ROYAL_AIR))
- result |= AIR;
- break;
+ bool setAura = player->HasAura(AURA_TWILIGHT_SET);
+ bool medallionAura = player->HasAura(AURA_MEDALLION);
+ bool ringAura = player->HasAura(AURA_RING);
+
+ if (setAura && medallionAura && ringAura)
+ return 3;
+ else if (setAura && medallionAura)
+ return 2;
+ else if (setAura)
+ return 1;
+ else
+ return 0;
}
- default:
- break;
- }
- return result;
- }
- void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell)
- {
- go->CastSpell(player, spell);
- TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - float(M_PI), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000);
- summons->CastSpell(summons, SPELL_SPAWN_IN, false);
- switch (summons->GetEntry())
- {
- case NPC_TEMPLAR_FIRE:
- case NPC_TEMPLAR_WATER:
- case NPC_TEMPLAR_AIR:
- case NPC_TEMPLAR_EARTH:
- summons->AI()->Talk(SAY_TEMPLAR_AGGRO, player);
- break;
-
- case NPC_DUKE_FIRE:
- case NPC_DUKE_WATER:
- case NPC_DUKE_EARTH:
- case NPC_DUKE_AIR:
- summons->AI()->Talk(SAY_DUKE_AGGRO);
- break;
- case NPC_ROYAL_FIRE:
- case NPC_ROYAL_AIR:
- case NPC_ROYAL_EARTH:
- case NPC_ROYAL_WATER:
- summons->AI()->Talk(YELL_ROYAL_AGGRO);
- break;
- }
- summons->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- summons->SendMeleeAttackStart(player);
- summons->CombatStart(player);
- }
-
- public:
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- uint8 rank = GetPlayerRank(player);
-
- uint32 gossipId = go->GetGOInfo()->GetGossipMenuId();
- switch (gossipId)
- {
- case GOSSIP_ID_LESSER_WS:
+ uint8 GetItems(Player* player, WS type)
{
- if (rank >= 1) // 1 or 2 or 3
- AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- else
+ uint8 result = 0x0;
+
+ switch (type)
{
- go->CastSpell(player, SPELL_PUNISHMENT);
- break;
+ case TEMPLAR:
+ {
+ if (player->HasItemCount(ITEM_TEMPLAR_FIRE))
+ result |= FIRE;
+ if (player->HasItemCount(ITEM_TEMPLAR_WATER))
+ result |= WATER;
+ if (player->HasItemCount(ITEM_TEMPLAR_EARTH))
+ result |= EARTH;
+ if (player->HasItemCount(ITEM_TEMPLAR_AIR))
+ result |= AIR;
+ break;
+ }
+ case DUKE:
+ {
+ if (player->HasItemCount(ITEM_DUKE_FIRE))
+ result |= FIRE;
+ if (player->HasItemCount(ITEM_DUKE_WATER))
+ result |= WATER;
+ if (player->HasItemCount(ITEM_DUKE_EARTH))
+ result |= EARTH;
+ if (player->HasItemCount(ITEM_DUKE_AIR))
+ result |= AIR;
+ break;
+ }
+ case ROYAL:
+ {
+ if (player->HasItemCount(ITEM_ROYAL_FIRE))
+ result |= FIRE;
+ if (player->HasItemCount(ITEM_ROYAL_WATER))
+ result |= WATER;
+ if (player->HasItemCount(ITEM_ROYAL_EARTH))
+ result |= EARTH;
+ if (player->HasItemCount(ITEM_ROYAL_AIR))
+ result |= AIR;
+ break;
+ }
+ default:
+ break;
}
-
- uint8 item = GetItems(player, TEMPLAR);
- if (item & FIRE)
- AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_1_CRIMSON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- if (item & WATER)
- AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_2_AZURE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- if (item & EARTH)
- AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_3_EARTHEN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- if (item & AIR)
- AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_4_HOARY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
- break;
+ return result;
}
- case GOSSIP_ID_WIND_STONE:
+
+ void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell)
{
- if (rank >= 2) // 2 or 3
- AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
- else
+ go->CastSpell(player, spell);
+ TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - float(M_PI), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000);
+ summons->CastSpell(summons, SPELL_SPAWN_IN, false);
+ switch (summons->GetEntry())
{
- go->CastSpell(player, SPELL_PUNISHMENT);
+ case NPC_TEMPLAR_FIRE:
+ case NPC_TEMPLAR_WATER:
+ case NPC_TEMPLAR_AIR:
+ case NPC_TEMPLAR_EARTH:
+ summons->AI()->Talk(SAY_TEMPLAR_AGGRO, player);
+ break;
+
+ case NPC_DUKE_FIRE:
+ case NPC_DUKE_WATER:
+ case NPC_DUKE_EARTH:
+ case NPC_DUKE_AIR:
+ summons->AI()->Talk(SAY_DUKE_AGGRO);
+ break;
+ case NPC_ROYAL_FIRE:
+ case NPC_ROYAL_AIR:
+ case NPC_ROYAL_EARTH:
+ case NPC_ROYAL_WATER:
+ summons->AI()->Talk(YELL_ROYAL_AGGRO);
break;
}
-
- uint8 item = GetItems(player, DUKE);
- if (item & FIRE)
- AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_1_CYNDERS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
- if (item & WATER)
- AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_2_FATHOMS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8);
- if (item & EARTH)
- AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_3_SHARDS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
- if (item & AIR)
- AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_4_ZEPHYRS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
- break;
+ summons->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+ summons->SendMeleeAttackStart(player);
+ summons->CombatStart(player);
}
- case GOSSIP_ID_GREATER_WS:
+
+ public:
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- if (rank == 3) // 3
- AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
- else
+ uint8 rank = GetPlayerRank(player);
+
+ uint32 gossipId = me->GetGOInfo()->GetGossipMenuId();
+ switch (gossipId)
{
- go->CastSpell(player, SPELL_PUNISHMENT);
- break;
- }
+ case GOSSIP_ID_LESSER_WS:
+ {
+ if (rank >= 1) // 1 or 2 or 3
+ AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ else
+ {
+ me->CastSpell(player, SPELL_PUNISHMENT);
+ break;
+ }
- uint8 item = GetItems(player, ROYAL);
- if (item & FIRE)
- AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_1_SKALDRENOX, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12);
- if (item & WATER)
- AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_2_SKWOL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13);
- if (item & EARTH)
- AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_3_KAZUM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14);
- if (item & AIR)
- AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_4_WHIRLAXIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15);
- break;
- }
- default:
- break;
- }
+ uint8 item = GetItems(player, TEMPLAR);
+ if (item & FIRE)
+ AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_1_CRIMSON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ if (item & WATER)
+ AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_2_AZURE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ if (item & EARTH)
+ AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_3_EARTHEN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ if (item & AIR)
+ AddGossipItemFor(player, GOSSIP_ID_LESSER_WS, OPTION_ID_4_HOARY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ break;
+ }
+ case GOSSIP_ID_WIND_STONE:
+ {
+ if (rank >= 2) // 2 or 3
+ AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
+ else
+ {
+ me->CastSpell(player, SPELL_PUNISHMENT);
+ break;
+ }
- SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID());
- return true;
- }
+ uint8 item = GetItems(player, DUKE);
+ if (item & FIRE)
+ AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_1_CYNDERS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
+ if (item & WATER)
+ AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_2_FATHOMS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8);
+ if (item & EARTH)
+ AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_3_SHARDS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
+ if (item & AIR)
+ AddGossipItemFor(player, GOSSIP_ID_WIND_STONE, OPTION_ID_4_ZEPHYRS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
+ break;
+ }
+ case GOSSIP_ID_GREATER_WS:
+ {
+ if (rank == 3) // 3
+ AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
+ else
+ {
+ me->CastSpell(player, SPELL_PUNISHMENT);
+ break;
+ }
- bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- player->PlayerTalkClass->SendCloseGossip();
+ uint8 item = GetItems(player, ROYAL);
+ if (item & FIRE)
+ AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_1_SKALDRENOX, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12);
+ if (item & WATER)
+ AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_2_SKWOL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13);
+ if (item & EARTH)
+ AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_3_KAZUM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14);
+ if (item & AIR)
+ AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_4_WHIRLAXIS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15);
+ break;
+ }
+ default:
+ break;
+ }
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1:
- SummonNPC(go, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM);
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- SummonNPC(go, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE);
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- SummonNPC(go, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER);
- break;
- case GOSSIP_ACTION_INFO_DEF + 4:
- SummonNPC(go, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH);
- break;
- case GOSSIP_ACTION_INFO_DEF + 5:
- SummonNPC(go, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR);
- break;
+ SendGossipMenuFor(player, player->GetGossipTextId(gossipId, me), me->GetGUID());
+ return true;
+ }
- case GOSSIP_ACTION_INFO_DEF + 6:
- SummonNPC(go, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM);
- break;
- case GOSSIP_ACTION_INFO_DEF + 7:
- SummonNPC(go, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE);
- break;
- case GOSSIP_ACTION_INFO_DEF + 8:
- SummonNPC(go, player, NPC_DUKE_WATER, SPELL_DUKE_WATER);
- break;
- case GOSSIP_ACTION_INFO_DEF + 9:
- SummonNPC(go, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH);
- break;
- case GOSSIP_ACTION_INFO_DEF + 10:
- SummonNPC(go, player, NPC_DUKE_AIR, SPELL_DUKE_AIR);
- break;
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ player->PlayerTalkClass->SendCloseGossip();
- case GOSSIP_ACTION_INFO_DEF + 11:
- SummonNPC(go, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM);
- break;
- case GOSSIP_ACTION_INFO_DEF + 12:
- SummonNPC(go, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE);
- break;
- case GOSSIP_ACTION_INFO_DEF + 13:
- SummonNPC(go, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER);
- break;
- case GOSSIP_ACTION_INFO_DEF + 14:
- SummonNPC(go, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH);
- break;
- case GOSSIP_ACTION_INFO_DEF + 15:
- SummonNPC(go, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR);
- break;
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ SummonNPC(me, player, RAND(NPC_TEMPLAR_WATER, NPC_TEMPLAR_FIRE, NPC_TEMPLAR_EARTH, NPC_TEMPLAR_AIR), SPELL_TEMPLAR_RANDOM);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ SummonNPC(me, player, NPC_TEMPLAR_FIRE, SPELL_TEMPLAR_FIRE);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ SummonNPC(me, player, NPC_TEMPLAR_WATER, SPELL_TEMPLAR_WATER);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ SummonNPC(me, player, NPC_TEMPLAR_EARTH, SPELL_TEMPLAR_EARTH);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ SummonNPC(me, player, NPC_TEMPLAR_AIR, SPELL_TEMPLAR_AIR);
+ break;
+
+ case GOSSIP_ACTION_INFO_DEF + 6:
+ SummonNPC(me, player, RAND(NPC_DUKE_FIRE, NPC_DUKE_WATER, NPC_DUKE_EARTH, NPC_DUKE_AIR), SPELL_DUKE_RANDOM);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 7:
+ SummonNPC(me, player, NPC_DUKE_FIRE, SPELL_DUKE_FIRE);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 8:
+ SummonNPC(me, player, NPC_DUKE_WATER, SPELL_DUKE_WATER);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 9:
+ SummonNPC(me, player, NPC_DUKE_EARTH, SPELL_DUKE_EARTH);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 10:
+ SummonNPC(me, player, NPC_DUKE_AIR, SPELL_DUKE_AIR);
+ break;
+
+ case GOSSIP_ACTION_INFO_DEF + 11:
+ SummonNPC(me, player, RAND(NPC_ROYAL_FIRE, NPC_ROYAL_AIR, NPC_ROYAL_EARTH, NPC_ROYAL_WATER), SPELL_ROYAL_RANDOM);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 12:
+ SummonNPC(me, player, NPC_ROYAL_FIRE, SPELL_ROYAL_FIRE);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 13:
+ SummonNPC(me, player, NPC_ROYAL_WATER, SPELL_ROYAL_WATER);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 14:
+ SummonNPC(me, player, NPC_ROYAL_EARTH, SPELL_ROYAL_EARTH);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 15:
+ SummonNPC(me, player, NPC_ROYAL_AIR, SPELL_ROYAL_AIR);
+ break;
+
+ default:
+ break;
+ }
+ return true;
+ }
+ };
- default:
- break;
- }
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_wind_stoneAI(go);
}
};
diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp
index 2d5ad0bc50b..78d64e4d21a 100644
--- a/src/server/scripts/Kalimdor/zone_tanaris.cpp
+++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp
@@ -314,27 +314,6 @@ class npc_OOX17 : public CreatureScript
public:
npc_OOX17() : CreatureScript("npc_OOX17") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == Q_OOX17)
- {
- creature->SetFaction(113);
- creature->SetFullHealth();
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- creature->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
- creature->AI()->Talk(SAY_OOX_START);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_OOX17::npc_OOX17AI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_OOX17AI(creature);
- }
-
struct npc_OOX17AI : public npc_escortAI
{
npc_OOX17AI(Creature* creature) : npc_escortAI(creature) { }
@@ -378,7 +357,26 @@ public:
{
summoned->AI()->AttackStart(me);
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == Q_OOX17)
+ {
+ me->SetFaction(113);
+ me->SetFullHealth();
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
+ Talk(SAY_OOX_START);
+
+ Start(true, false, player->GetGUID());
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_OOX17AI(creature);
+ }
};
/*####
@@ -409,22 +407,6 @@ class npc_tooga : public CreatureScript
public:
npc_tooga() : CreatureScript("npc_tooga") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_TOOGA)
- {
- if (npc_toogaAI* pToogaAI = CAST_AI(npc_tooga::npc_toogaAI, creature->AI()))
- pToogaAI->StartFollow(player, FACTION_TOOG_ESCORTEE, quest);
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_toogaAI(creature);
- }
-
struct npc_toogaAI : public FollowerAI
{
npc_toogaAI(Creature* creature) : FollowerAI(creature)
@@ -547,8 +529,18 @@ public:
DoMeleeAttackIfReady();
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_TOOGA)
+ StartFollow(player, FACTION_TOOG_ESCORTEE, quest);
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_toogaAI(creature);
+ }
};
void AddSC_tanaris()
diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
index 2ac0c1dc8dd..fd602f78a6d 100644
--- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
@@ -52,17 +52,16 @@ class npc_beaten_corpse : public CreatureScript
struct npc_beaten_corpseAI : public ScriptedAI
{
- npc_beaten_corpseAI(Creature* creature) : ScriptedAI(creature)
- {
- }
+ npc_beaten_corpseAI(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_MENU_OPTION_INSPECT_BODY && gossipListId == GOSSIP_OPTION_ID_BEATEN_CORPSE)
{
CloseGossipMenuFor(player);
player->TalkedToCreature(me->GetEntry(), me->GetGUID());
}
+ return false;
}
};
@@ -97,26 +96,6 @@ class npc_gilthares : public CreatureScript
public:
npc_gilthares() : CreatureScript("npc_gilthares") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_FREE_FROM_HOLD)
- {
- creature->SetFaction(FACTION_ESCORTEE);
- creature->SetStandState(UNIT_STAND_STATE_STAND);
-
- creature->AI()->Talk(SAY_GIL_START, player);
-
- if (npc_giltharesAI* pEscortAI = CAST_AI(npc_gilthares::npc_giltharesAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_giltharesAI(creature);
- }
-
struct npc_giltharesAI : public npc_escortAI
{
npc_giltharesAI(Creature* creature) : npc_escortAI(creature) { }
@@ -166,8 +145,24 @@ public:
Talk(SAY_GIL_AGGRO, who);
}
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_FREE_FROM_HOLD)
+ {
+ me->SetFaction(FACTION_ESCORTEE);
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+
+ Talk(SAY_GIL_START, player);
+ Start(false, false, player->GetGUID(), quest);
+ }
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_giltharesAI(creature);
+ }
};
/*######
@@ -647,19 +642,17 @@ public:
DoMeleeAttackIfReady();
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCAPE)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- creature->SetFaction(FACTION_RATCHET);
- creature->AI()->Talk(SAY_START);
- if (npc_escortAI* pEscortAI = CAST_AI(npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
+ if (quest->GetQuestId() == QUEST_ESCAPE)
+ {
+ me->SetFaction(FACTION_RATCHET);
+ Talk(SAY_START);
+ Start(true, false, player->GetGUID());
+ }
}
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
index 3e868068267..f40675abda1 100644
--- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
+++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
@@ -47,11 +47,6 @@ class npc_cairne_bloodhoof : public CreatureScript
public:
npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_cairne_bloodhoofAI (creature);
- }
-
struct npc_cairne_bloodhoofAI : public ScriptedAI
{
npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature)
@@ -119,8 +114,37 @@ public:
DoMeleeAttackIfReady();
}
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_SENDER_INFO)
+ {
+ player->CastSpell(player, 23123, false);
+ SendGossipMenuFor(player, 7014, me->GetGUID());
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (player->GetQuestStatus(925) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HCB, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO);
+
+ SendGossipMenuFor(player, 7013, me->GetGUID());
+
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_cairne_bloodhoofAI(creature);
+ }
};
void AddSC_thunder_bluff()
diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp
index c0d5b422cb9..d29175c8985 100644
--- a/src/server/scripts/Kalimdor/zone_winterspring.cpp
+++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp
@@ -29,6 +29,7 @@ go_elune_fire
EndContentData */
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "GameObject.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
@@ -47,26 +48,36 @@ class npc_rivern_frostwind : public CreatureScript
public:
npc_rivern_frostwind() : CreatureScript("npc_rivern_frostwind") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
+ struct npc_rivern_frostwindAI : public ScriptedAI
{
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
+ npc_rivern_frostwindAI(Creature* creature) : ScriptedAI(creature) { }
- return true;
- }
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_TRADE)
+ player->GetSession()->SendListInventory(me->GetGUID());
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ return true;
+ }
- if (creature->IsVendor() && player->GetReputationRank(589) == REP_EXALTED)
- 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());
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ if (me->IsVendor() && player->GetReputationRank(589) == REP_EXALTED)
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- return true;
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_rivern_frostwindAI(creature);
}
};
@@ -294,30 +305,10 @@ class npc_ranshalla : public CreatureScript
{
public:
npc_ranshalla() : CreatureScript("npc_ranshalla") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_GUARDIANS_ALTAR)
- {
- creature->AI()->Talk(SAY_QUEST_START);
- creature->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE);
-
- if (npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshallaAI*>(creature->AI()))
- escortAI->Start(false, false, player->GetGUID(), quest);
-
- return true;
- }
-
- return false;
- }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_ranshallaAI(creature);
- }
struct npc_ranshallaAI : public npc_escortAI, private DialogueHelper
{
- npc_ranshallaAI(Creature* creature) : npc_escortAI(creature),
- DialogueHelper(introDialogue)
+ npc_ranshallaAI(Creature* creature) : npc_escortAI(creature), DialogueHelper(introDialogue)
{
Initialize();
}
@@ -590,9 +581,26 @@ public:
npc_escortAI::UpdateEscortAI(diff);
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_GUARDIANS_ALTAR)
+ {
+ Talk(SAY_QUEST_START);
+ me->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE);
+
+ Start(false, false, player->GetGUID(), quest);
+ }
+ }
+
private:
EventMap events;
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_ranshallaAI(creature);
+ }
};
/*#####
@@ -603,22 +611,32 @@ class go_elune_fire : public GameObjectScript
{
public:
go_elune_fire() : GameObjectScript("go_elune_fire") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
- {
- // Check if we are using the torches or the altar
- bool isAltar = false;
- if (go->GetEntry() == GO_ELUNE_ALTAR)
- isAltar = true;
+ struct go_elune_fireAI : public GameObjectAI
+ {
+ go_elune_fireAI(GameObject* go) : GameObjectAI(go) { }
- if (Creature* ranshalla = GetClosestCreatureWithEntry(go, NPC_RANSHALLA, 10.0f))
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
- if (npc_ranshalla::npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshalla::npc_ranshallaAI*>(ranshalla->AI()))
- escortAI->DoContinueEscort(isAltar);
+ // Check if we are using the torches or the altar
+ bool isAltar = false;
+
+ if (me->GetEntry() == GO_ELUNE_ALTAR)
+ isAltar = true;
+
+ if (Creature* ranshalla = GetClosestCreatureWithEntry(me, NPC_RANSHALLA, 10.0f))
+ {
+ if (npc_ranshalla::npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshalla::npc_ranshallaAI*>(ranshalla->AI()))
+ escortAI->DoContinueEscort(isAltar);
+ }
+ me->AddFlag(GO_FLAG_NOT_SELECTABLE);
+ return false;
}
- go->AddFlag(GO_FLAG_NOT_SELECTABLE);
+ };
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_elune_fireAI(go);
}
};