aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Outland
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-05-01 18:19:36 -0300
committerariel- <ariel-@users.noreply.github.com>2017-05-01 18:19:36 -0300
commitf913f3bb8977c127d200d5d4a608ab434b21bbcd (patch)
treebb2d18ad5c0c23667271ca98bd6754cc745256a8 /src/server/scripts/Outland
parente4481c016a86fe7db0b83a434ea08eb7ba50174f (diff)
Core/Scripts: unified scripted gossip/quest api
- Changed self-accessor on GameObjectAI to "me", like UnitAI - Moved all related functions to AI, now Unit and GameObject have the same function names with identical behaviour - Remove "OnUpdate" from CreatureScript/GameObjectScript, was never used and we already have AI Update method - Quest methods no longer return a bool, the return value was used to call the AI version if the ScriptMgr one returned false - Implemented GameObjectAI::Destroyed hook (was never called), implemented Damaged method - Rename OnStateChanged to OnLootStateChanged to reflect when it's really called, and created a new hook OnStateChanged that only gets called on GOState change - Since the functions are now only getting called from AI, made GetAI methods full virtual. (CanSpawn method is anyways going to be used on creatures with AI)
Diffstat (limited to 'src/server/scripts/Outland')
-rw-r--r--src/server/scripts/Outland/BlackTemple/black_temple.h6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp3
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp3
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp24
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp26
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp21
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp30
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h6
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp34
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h6
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp22
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp25
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp129
-rw-r--r--src/server/scripts/Outland/zone_hellfire_peninsula.cpp39
-rw-r--r--src/server/scripts/Outland/zone_nagrand.cpp194
-rw-r--r--src/server/scripts/Outland/zone_netherstorm.cpp78
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp62
-rw-r--r--src/server/scripts/Outland/zone_shattrath_city.cpp238
-rw-r--r--src/server/scripts/Outland/zone_terokkar_forest.cpp234
-rw-r--r--src/server/scripts/Outland/zone_zangarmarsh.cpp267
20 files changed, 821 insertions, 626 deletions
diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h
index 745038961b9..8fa768fe47a 100644
--- a/src/server/scripts/Outland/BlackTemple/black_temple.h
+++ b/src/server/scripts/Outland/BlackTemple/black_temple.h
@@ -139,10 +139,10 @@ enum BlackTempleMisc
ACTION_OPEN_DOOR = 4
};
-template<class AI>
-AI* GetBlackTempleAI(Creature* creature)
+template<class AI, class T>
+AI* GetBlackTempleAI(T* obj)
{
- return GetInstanceAI<AI>(creature, BTScriptName);
+ return GetInstanceAI<AI>(obj, BTScriptName);
}
#endif // BLACK_TEMPLE_H_
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index 93c5d495c68..e95dde28a5f 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -1055,7 +1055,7 @@ public:
_isTeleportToMinions = false;
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
if (gossipListId == GOSSIP_START_INTRO)
{
@@ -1074,6 +1074,7 @@ public:
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
CloseGossipMenuFor(player);
}
+ return false;
}
bool CanAIAttack(Unit const* who) const override
diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
index 8fc8c2e2f1b..5979d2ea47f 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
@@ -545,13 +545,14 @@ public:
shade->AI()->EnterEvadeMode(EVADE_REASON_OTHER);
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
if (gossipListId == 0)
{
CloseGossipMenuFor(player);
_events.ScheduleEvent(EVENT_SHADE_START, Milliseconds(500));
}
+ return false;
}
private:
diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
index bd389da60b3..9ddf3d82cb8 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "black_temple.h"
#include "Player.h"
#include "SpellInfo.h"
@@ -172,16 +173,29 @@ class go_najentus_spine : public GameObjectScript
public:
go_najentus_spine() : GameObjectScript("go_najentus_spine") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_najentus_spineAI : public GameObjectAI
{
- if (InstanceScript* instance = go->GetInstanceScript())
+ go_najentus_spineAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
if (Creature* najentus = instance->GetCreature(DATA_HIGH_WARLORD_NAJENTUS))
+ {
if (ENSURE_AI(boss_najentus::boss_najentusAI, najentus->AI())->RemoveImpalingSpine())
{
- go->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);
- go->Delete();
+ me->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);
+ me->Delete();
}
- return true;
+ }
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetBlackTempleAI<go_najentus_spineAI>(go);
}
};
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index 0d766785627..7532f5b93f2 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "serpent_shrine.h"
#include "Spell.h"
#include "Player.h"
@@ -434,21 +435,32 @@ class go_strange_pool : public GameObjectScript
public:
go_strange_pool() : GameObjectScript("go_strange_pool") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_strange_poolAI : public GameObjectAI
{
- // 25%
- if (InstanceScript* instanceScript = go->GetInstanceScript())
+ go_strange_poolAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ // 25%
if (!urand(0, 3))
{
- if (instanceScript->GetData(DATA_STRANGE_POOL) == NOT_STARTED)
+ if (instance->GetData(DATA_STRANGE_POOL) == NOT_STARTED)
{
- go->CastSpell(player, 54587);
- instanceScript->SetData(DATA_STRANGE_POOL, IN_PROGRESS);
+ me->CastSpell(player, 54587);
+ instance->SetData(DATA_STRANGE_POOL, IN_PROGRESS);
}
return true;
}
- return false;
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_strange_poolAI>(go);
}
};
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
index 46622d25dd0..f1dc7ecac20 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
@@ -28,6 +28,7 @@ EndScriptData */
#include "serpent_shrine.h"
#include "Player.h"
#include "TemporarySummon.h"
+#include "GameObjectAI.h"
#define MAX_ENCOUNTER 6
@@ -64,17 +65,23 @@ class go_bridge_console : public GameObjectScript
public:
go_bridge_console() : GameObjectScript("go_bridge_console") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_bridge_consoleAI : public GameObjectAI
{
- InstanceScript* instance = go->GetInstanceScript();
+ go_bridge_consoleAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- if (!instance)
- return false;
+ InstanceScript* instance;
- if (instance)
- instance->SetData(DATA_CONTROL_CONSOLE, DONE);
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ if (instance)
+ instance->SetData(DATA_CONTROL_CONSOLE, DONE);
+ return true;
+ }
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_bridge_consoleAI>(go);
}
};
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
index 30ea7ab41fe..a7f959c020b 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
@@ -16,6 +16,7 @@
*/
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "InstanceScript.h"
#include "steam_vault.h"
@@ -24,22 +25,29 @@ class go_main_chambers_access_panel : public GameObjectScript
public:
go_main_chambers_access_panel() : GameObjectScript("go_main_chambers_access_panel") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_main_chambers_access_panelAI : public GameObjectAI
{
- InstanceScript* instance = go->GetInstanceScript();
- if (!instance)
- return false;
+ go_main_chambers_access_panelAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- if (go->GetEntry() == GO_ACCESS_PANEL_HYDRO && (instance->GetBossState(DATA_HYDROMANCER_THESPIA) == DONE || instance->GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL))
- instance->SetBossState(DATA_HYDROMANCER_THESPIA, SPECIAL);
+ InstanceScript* instance;
- if (go->GetEntry() == GO_ACCESS_PANEL_MEK && (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == DONE || instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL))
- instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, SPECIAL);
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ if (me->GetEntry() == GO_ACCESS_PANEL_HYDRO && (instance->GetBossState(DATA_HYDROMANCER_THESPIA) == DONE || instance->GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL))
+ instance->SetBossState(DATA_HYDROMANCER_THESPIA, SPECIAL);
+
+ if (me->GetEntry() == GO_ACCESS_PANEL_MEK && (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == DONE || instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL))
+ instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, SPECIAL);
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SetGoState(GO_STATE_ACTIVE);
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->SetGoState(GO_STATE_ACTIVE);
+ return true;
+ }
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetSteamVaultAI<go_main_chambers_access_panelAI>(go);
}
};
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
index 30f9f34a5da..ceed2eaaa14 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
@@ -49,10 +49,10 @@ enum SVGameObjectIds
GO_ACCESS_PANEL_MEK = 184126
};
-template<class AI>
-AI* GetSteamVaultAI(Creature* creature)
+template<class AI, class T>
+AI* GetSteamVaultAI(T* obj)
{
- return GetInstanceAI<AI>(creature, SteamVaultScriptName);
+ return GetInstanceAI<AI>(obj, SteamVaultScriptName);
}
#endif
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
index 702496500ec..ab57571c0a7 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp
@@ -19,6 +19,7 @@
#include "LFGMgr.h"
#include "ScriptedGossip.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "ScriptMgr.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
@@ -646,25 +647,32 @@ class go_ahune_ice_stone : public GameObjectScript
public:
go_ahune_ice_stone() : GameObjectScript("go_ahune_ice_stone") { }
- bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/)
+ struct go_ahune_ice_stoneAI : public GameObjectAI
{
- InstanceScript* instance = go->GetInstanceScript();
- if (!instance)
- return false;
+ go_ahune_ice_stoneAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- ClearGossipMenuFor(player);
+ InstanceScript* instance;
- if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_AHUNE_BUNNY)))
+ bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/)
{
- ahuneBunny->AI()->DoAction(ACTION_START_EVENT);
- ahuneBunny->SetInCombatWithZone();
+ ClearGossipMenuFor(player);
+
+ if (Creature* ahuneBunny = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AHUNE_BUNNY)))
+ {
+ ahuneBunny->AI()->DoAction(ACTION_START_EVENT);
+ ahuneBunny->SetInCombatWithZone();
+ }
+ if (Creature* luma = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_LUMA_SKYMOTHER)))
+ luma->CastSpell(player, SPELL_SUMMONING_RHYME_AURA, true);
+ CloseGossipMenuFor(player);
+ me->Delete();
+ return true;
}
- if (Creature* luma = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_LUMA_SKYMOTHER)))
- luma->CastSpell(player, SPELL_SUMMONING_RHYME_AURA, true);
- CloseGossipMenuFor(player);
- go->Delete();
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_ahune_ice_stoneAI>(go);
}
};
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
index 4c05bde00cb..942f6fa9e6a 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
@@ -80,10 +80,10 @@ enum BFActionIds
ACTION_PREPARE_BROGGOK = 3
};
-template<class AI>
-AI* GetBloodFurnaceAI(Creature* creature)
+template<class AI, class T>
+AI* GetBloodFurnaceAI(T* obj)
{
- return GetInstanceAI<AI>(creature, BFScriptName);
+ return GetInstanceAI<AI>(obj, BFScriptName);
}
#endif // BLOOD_FURNACE_H_
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index 190b41134d3..02d4e7e7e35 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "blood_furnace.h"
@@ -127,18 +128,29 @@ class go_broggok_lever : public GameObjectScript
public:
go_broggok_lever() : GameObjectScript("go_broggok_lever") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_broggok_leverAI : public GameObjectAI
{
- if (InstanceScript* instance = go->GetInstanceScript())
+ go_broggok_leverAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS)
{
instance->SetBossState(DATA_BROGGOK, IN_PROGRESS);
- if (Creature* broggok = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_BROGGOK)))
+ if (Creature* broggok = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BROGGOK)))
broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK);
}
- go->UseDoorOrButton();
- return false;
+ me->UseDoorOrButton();
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetBloodFurnaceAI<go_broggok_leverAI>(go);
}
};
diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
index fee33645646..ac9399ee6ad 100644
--- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
@@ -23,6 +23,7 @@
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "PassiveAI.h"
+#include "GameObjectAI.h"
enum Yells
{
@@ -463,16 +464,26 @@ class go_manticron_cube : public GameObjectScript
public:
go_manticron_cube() : GameObjectScript("go_manticron_cube") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_manticron_cubeAI : public GameObjectAI
{
- if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP))
- return true;
+ go_manticron_cubeAI(GameObject* go) : GameObjectAI(go) { }
- if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f))
- trigger->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP_VISUAL);
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP))
+ return true;
- player->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP, true);
- return true;
+ if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f))
+ trigger->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP_VISUAL);
+
+ player->CastSpell((Unit*)nullptr, SPELL_SHADOW_GRASP, true);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_manticron_cubeAI(go);
}
};
diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index 6a116d89d7a..5c1475ae894 100644
--- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
@@ -31,6 +31,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "ScriptedGossip.h"
#include "GridNotifiers.h"
#include "GridNotifiersImpl.h"
@@ -297,42 +298,52 @@ class go_legion_obelisk : public GameObjectScript
public:
go_legion_obelisk() : GameObjectScript("go_legion_obelisk") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_legion_obeliskAI : public GameObjectAI
{
- if (player->GetQuestStatus(QUEST_YOURE_FIRED) == QUEST_STATUS_INCOMPLETE)
+ go_legion_obeliskAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- switch (go->GetEntry())
+ if (player->GetQuestStatus(QUEST_YOURE_FIRED) == QUEST_STATUS_INCOMPLETE)
{
- case GO_LEGION_OBELISK_ONE:
- obelisk_one = true;
- break;
- case GO_LEGION_OBELISK_TWO:
- obelisk_two = true;
- break;
- case GO_LEGION_OBELISK_THREE:
- obelisk_three = true;
- break;
- case GO_LEGION_OBELISK_FOUR:
- obelisk_four = true;
- break;
- case GO_LEGION_OBELISK_FIVE:
- obelisk_five = true;
- break;
- }
+ switch (me->GetEntry())
+ {
+ case GO_LEGION_OBELISK_ONE:
+ obelisk_one = true;
+ break;
+ case GO_LEGION_OBELISK_TWO:
+ obelisk_two = true;
+ break;
+ case GO_LEGION_OBELISK_THREE:
+ obelisk_three = true;
+ break;
+ case GO_LEGION_OBELISK_FOUR:
+ obelisk_four = true;
+ break;
+ case GO_LEGION_OBELISK_FIVE:
+ obelisk_five = true;
+ break;
+ }
- if (obelisk_one == true && obelisk_two == true && obelisk_three == true && obelisk_four == true && obelisk_five == true)
- {
- go->SummonCreature(NPC_DOOMCRYER, 2943.40f, 4778.20f, 284.49f, 0.94f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- //reset global var
- obelisk_one = false;
- obelisk_two = false;
- obelisk_three = false;
- obelisk_four = false;
- obelisk_five = false;
+ if (obelisk_one == true && obelisk_two == true && obelisk_three == true && obelisk_four == true && obelisk_five == true)
+ {
+ me->SummonCreature(NPC_DOOMCRYER, 2943.40f, 4778.20f, 284.49f, 0.94f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
+ //reset global var
+ obelisk_one = false;
+ obelisk_two = false;
+ obelisk_three = false;
+ obelisk_four = false;
+ obelisk_five = false;
+ }
}
+
+ return true;
}
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_legion_obeliskAI(go);
}
};
@@ -874,14 +885,24 @@ class go_simon_cluster : public GameObjectScript
public:
go_simon_cluster() : GameObjectScript("go_simon_cluster") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_simon_clusterAI : public GameObjectAI
{
- if (Creature* bunny = go->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true))
- bunny->AI()->SetData(go->GetEntry(), 0);
+ go_simon_clusterAI(GameObject* go) : GameObjectAI(go) { }
- player->CastSpell(player, go->GetGOInfo()->goober.spellId, true);
- go->AddUse();
- return true;
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (Creature* bunny = me->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true))
+ bunny->AI()->SetData(me->GetEntry(), 0);
+
+ player->CastSpell(player, me->GetGOInfo()->goober.spellId, true);
+ me->AddUse();
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_simon_clusterAI(go);
}
};
@@ -900,27 +921,37 @@ class go_apexis_relic : public GameObjectScript
public:
go_apexis_relic() : GameObjectScript("go_apexis_relic") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_apexis_relicAI : public GameObjectAI
{
- player->PrepareGossipMenu(go, go->GetGOInfo()->questgiver.gossipID);
- player->SendPreparedGossip(go);
- return true;
- }
+ go_apexis_relicAI(GameObject* go) : GameObjectAI(go) { }
- bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/) override
- {
- CloseGossipMenuFor(player);
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ player->PrepareGossipMenu(me, me->GetGOInfo()->questgiver.gossipID);
+ player->SendPreparedGossip(me);
+ return true;
+ }
- bool large = (go->GetEntry() == GO_APEXIS_MONUMENT);
- if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1))
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
- player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false);
+ CloseGossipMenuFor(player);
+
+ bool large = (me->GetEntry() == GO_APEXIS_MONUMENT);
+ if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1))
+ {
+ player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false);
+
+ if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()))
+ bunny->AI()->SetGUID(player->GetGUID(), large);
+ }
- if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()))
- bunny->AI()->SetGUID(player->GetGUID(), large);
+ return true;
}
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_apexis_relicAI(go);
}
};
diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
index a3fc6ecb8d7..bc5f8741b27 100644
--- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
+++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
@@ -276,7 +276,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_ROAD_TO_FALCON_WATCH)
{
@@ -516,15 +516,6 @@ class npc_colonel_jules : public CreatureScript
public:
npc_colonel_jules() : CreatureScript("npc_colonel_jules") { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (ENSURE_AI(npc_colonel_jules::npc_colonel_julesAI, creature->AI())->success)
- player->KilledMonsterCredit(NPC_COLONEL_JULES, ObjectGuid::Empty);
-
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
struct npc_colonel_julesAI : public ScriptedAI
{
npc_colonel_julesAI(Creature* creature) : ScriptedAI(creature), summons(me)
@@ -640,6 +631,15 @@ public:
}
}
+ bool GossipHello(Player* player) override
+ {
+ if (success)
+ player->KilledMonsterCredit(NPC_COLONEL_JULES, ObjectGuid::Empty);
+
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
+
private:
EventMap events;
SummonList summons;
@@ -685,7 +685,7 @@ public:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
ClearGossipMenuFor(player);
switch (gossipListId)
@@ -698,6 +698,7 @@ public:
default:
break;
}
+ return false;
}
void DoAction(int32 action) override
@@ -941,14 +942,6 @@ class npc_magister_aledis : public CreatureScript
public:
npc_magister_aledis() : CreatureScript("npc_magister_aledis") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override
- {
- CloseGossipMenuFor(player);
- creature->StopMoving();
- ENSURE_AI(npc_magister_aledis::npc_magister_aledisAI, creature->AI())->StartFight(player);
- return true;
- }
-
struct npc_magister_aledisAI : public ScriptedAI
{
npc_magister_aledisAI(Creature* creature) : ScriptedAI(creature) { }
@@ -1028,6 +1021,14 @@ public:
DoMeleeAttackIfReady();
}
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ {
+ CloseGossipMenuFor(player);
+ me->StopMoving();
+ StartFight(player);
+ return true;
+ }
+
private:
EventMap _events;
ObjectGuid _playerGUID;
diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp
index 98c3433cbd5..010516e90a9 100644
--- a/src/server/scripts/Outland/zone_nagrand.cpp
+++ b/src/server/scripts/Outland/zone_nagrand.cpp
@@ -31,6 +31,7 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
#include "SpellInfo.h"
@@ -69,30 +70,6 @@ class npc_maghar_captive : public CreatureScript
public:
npc_maghar_captive() : CreatureScript("npc_maghar_captive") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H)
- {
- if (npc_maghar_captiveAI* EscortAI = dynamic_cast<npc_maghar_captiveAI*>(creature->AI()))
- {
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- creature->SetFaction(232);
- EscortAI->Start(true, false, player->GetGUID(), quest);
- creature->AI()->Talk(SAY_MAG_START);
-
- creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0]+2.5f, m_afAmbushA[1]-2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- creature->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0]-2.5f, m_afAmbushA[1]+2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- creature->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- }
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_maghar_captiveAI(creature);
- }
-
struct npc_maghar_captiveAI : public npc_escortAI
{
npc_maghar_captiveAI(Creature* creature) : npc_escortAI(creature) { Reset(); }
@@ -214,7 +191,28 @@ public:
DoMeleeAttackIfReady();
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_H)
+ {
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ me->SetFaction(232);
+ Start(true, false, player->GetGUID(), quest);
+ Talk(SAY_MAG_START);
+
+ me->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0] + 2.5f, m_afAmbushA[1] - 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
+ me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0] - 2.5f, m_afAmbushA[1] + 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
+ me->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_maghar_captiveAI(creature);
+ }
+
};
/*######
@@ -288,42 +286,52 @@ enum CorkiData
class go_corkis_prison : public GameObjectScript
{
public:
- go_corkis_prison() : GameObjectScript("go_corkis_prison") { }
+ go_corkis_prison() : GameObjectScript("go_corkis_prison") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- go->SetGoState(GO_STATE_READY);
- if (go->GetEntry() == GO_CORKIS_PRISON)
- {
- if (Creature* corki = go->FindNearestCreature(NPC_CORKI, 25, true))
- {
- corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ());
- if (player)
- player->KilledMonsterCredit(NPC_CORKI_CREDIT_1);
- }
- }
+ struct go_corkis_prisonAI : public GameObjectAI
+ {
+ go_corkis_prisonAI(GameObject* go) : GameObjectAI(go) { }
- if (go->GetEntry() == GO_CORKIS_PRISON_2)
- {
- if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true))
- {
- corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()-5, go->GetPositionY(), go->GetPositionZ());
- if (player)
- player->KilledMonsterCredit(NPC_CORKI_2);
- }
- }
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ me->SetGoState(GO_STATE_READY);
+ if (me->GetEntry() == GO_CORKIS_PRISON)
+ {
+ if (Creature* corki = me->FindNearestCreature(NPC_CORKI, 25, true))
+ {
+ corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ());
+ if (player)
+ player->KilledMonsterCredit(NPC_CORKI_CREDIT_1);
+ }
+ }
- if (go->GetEntry() == GO_CORKIS_PRISON_3)
- {
- if (Creature* corki = go->FindNearestCreature(NPC_CORKI_3, 25, true))
- {
- corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+4, go->GetPositionY(), go->GetPositionZ());
- if (player)
- player->KilledMonsterCredit(NPC_CORKI_CREDIT_3);
- }
- }
- return true;
- }
+ if (me->GetEntry() == GO_CORKIS_PRISON_2)
+ {
+ if (Creature* corki = me->FindNearestCreature(NPC_CORKI_2, 25, true))
+ {
+ corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() - 5, me->GetPositionY(), me->GetPositionZ());
+ if (player)
+ player->KilledMonsterCredit(NPC_CORKI_2);
+ }
+ }
+
+ if (me->GetEntry() == GO_CORKIS_PRISON_3)
+ {
+ if (Creature* corki = me->FindNearestCreature(NPC_CORKI_3, 25, true))
+ {
+ corki->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 4, me->GetPositionY(), me->GetPositionZ());
+ if (player)
+ player->KilledMonsterCredit(NPC_CORKI_CREDIT_3);
+ }
+ }
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_corkis_prisonAI(go);
+ }
};
class npc_corki : public CreatureScript
@@ -423,30 +431,6 @@ class npc_kurenai_captive : public CreatureScript
public:
npc_kurenai_captive() : CreatureScript("npc_kurenai_captive") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A)
- {
- if (npc_kurenai_captiveAI* EscortAI = dynamic_cast<npc_kurenai_captiveAI*>(creature->AI()))
- {
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- creature->SetFaction(231);
- EscortAI->Start(true, false, player->GetGUID(), quest);
- creature->AI()->Talk(SAY_KUR_START);
-
- creature->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0]+2.5f, kurenaiAmbushA[1]-2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- creature->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0]-2.5f, kurenaiAmbushA[1]+2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- creature->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushA[0], kurenaiAmbushA[1], kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
- }
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_kurenai_captiveAI(creature);
- }
-
struct npc_kurenai_captiveAI : public npc_escortAI
{
npc_kurenai_captiveAI(Creature* creature) : npc_escortAI(creature)
@@ -582,7 +566,27 @@ public:
DoMeleeAttackIfReady();
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_TOTEM_KARDASH_A)
+ {
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ me->SetFaction(231);
+ Start(true, false, player->GetGUID(), quest);
+ Talk(SAY_KUR_START);
+
+ me->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0] + 2.5f, kurenaiAmbushA[1] - 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
+ me->SummonCreature(NPC_KUR_MURK_BRUTE, kurenaiAmbushA[0] - 2.5f, kurenaiAmbushA[1] + 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
+ me->SummonCreature(NPC_KUR_MURK_SCAVENGER, kurenaiAmbushA[0], kurenaiAmbushA[1], kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_kurenai_captiveAI(creature);
+ }
};
/*######
@@ -602,20 +606,30 @@ class go_warmaul_prison : public GameObjectScript
public:
go_warmaul_prison() : GameObjectScript("go_warmaul_prison") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_warmaul_prisonAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE)
- return false;
+ go_warmaul_prisonAI(GameObject* go) : GameObjectAI(go) { }
- if (Creature* prisoner = go->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f))
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- player->KilledMonsterCredit(NPC_MAGHAR_PRISONER);
+ me->UseDoorOrButton();
+ if (player->GetQuestStatus(QUEST_FINDING_THE_SURVIVORS) != QUEST_STATUS_INCOMPLETE)
+ return false;
+
+ if (Creature* prisoner = me->FindNearestCreature(NPC_MAGHAR_PRISONER, 5.0f))
+ {
+ player->KilledMonsterCredit(NPC_MAGHAR_PRISONER);
- prisoner->AI()->Talk(SAY_FREE, player);
- prisoner->DespawnOrUnsummon(6000);
+ prisoner->AI()->Talk(SAY_FREE, player);
+ prisoner->DespawnOrUnsummon(6000);
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_warmaul_prisonAI(go);
}
};
diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp
index 82334302dad..9fb662f4252 100644
--- a/src/server/scripts/Outland/zone_netherstorm.cpp
+++ b/src/server/scripts/Outland/zone_netherstorm.cpp
@@ -34,6 +34,7 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
/*######
@@ -492,22 +493,6 @@ class npc_bessy : public CreatureScript
public:
npc_bessy() : CreatureScript("npc_bessy") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == Q_ALMABTRIEB)
- {
- creature->SetFaction(113);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_bessyAI(creature);
- }
-
struct npc_bessyAI : public npc_escortAI
{
npc_bessyAI(Creature* creature) : npc_escortAI(creature) { }
@@ -556,7 +541,22 @@ public:
{
me->RestoreFaction();
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == Q_ALMABTRIEB)
+ {
+ me->SetFaction(113);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ Start(true, false, player->GetGUID());
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_bessyAI(creature);
+ }
};
/*######
@@ -574,11 +574,6 @@ class npc_maxx_a_million_escort : public CreatureScript
public:
npc_maxx_a_million_escort() : CreatureScript("npc_maxx_a_million_escort") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_maxx_a_million_escortAI(creature);
- }
-
struct npc_maxx_a_million_escortAI : public npc_escortAI
{
npc_maxx_a_million_escortAI(Creature* creature) : npc_escortAI(creature)
@@ -654,19 +649,20 @@ public:
}
DoMeleeAttackIfReady();
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_MARK_V_IS_ALIVE)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (npc_maxx_a_million_escortAI* pEscortAI = CAST_AI(npc_maxx_a_million_escort::npc_maxx_a_million_escortAI, creature->AI()))
+ if (quest->GetQuestId() == QUEST_MARK_V_IS_ALIVE)
{
- creature->SetFaction(113);
- pEscortAI->Start(false, false, player->GetGUID());
+ me->SetFaction(113);
+ Start(false, false, player->GetGUID());
}
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_maxx_a_million_escortAI(creature);
}
};
@@ -685,16 +681,26 @@ class go_captain_tyralius_prison : public GameObjectScript
public:
go_captain_tyralius_prison() : GameObjectScript("go_captain_tyralius_prison") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_captain_tyralius_prisonAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (Creature* tyralius = go->FindNearestCreature(NPC_CAPTAIN_TYRALIUS, 1.0f))
+ go_captain_tyralius_prisonAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- player->KilledMonsterCredit(NPC_CAPTAIN_TYRALIUS);
- tyralius->AI()->Talk(SAY_FREE);
- tyralius->DespawnOrUnsummon(8000);
+ me->UseDoorOrButton();
+ if (Creature* tyralius = me->FindNearestCreature(NPC_CAPTAIN_TYRALIUS, 1.0f))
+ {
+ player->KilledMonsterCredit(NPC_CAPTAIN_TYRALIUS);
+ tyralius->AI()->Talk(SAY_FREE);
+ tyralius->DespawnOrUnsummon(8000);
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_captain_tyralius_prisonAI(go);
}
};
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index c4cec3f609e..45bb7c0d5b4 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -40,6 +40,7 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Group.h"
#include "SpellScript.h"
#include "Player.h"
@@ -593,24 +594,6 @@ class npc_earthmender_wilda : public CreatureScript
public:
npc_earthmender_wilda() : CreatureScript("npc_earthmender_wilda") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCAPE_COILSCAR)
- {
- creature->AI()->Talk(SAY_WIL_START, player);
- creature->SetFaction(FACTION_EARTHEN);
-
- if (npc_earthmender_wildaAI* pEscortAI = CAST_AI(npc_earthmender_wilda::npc_earthmender_wildaAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_earthmender_wildaAI(creature);
- }
-
struct npc_earthmender_wildaAI : public npc_escortAI
{
npc_earthmender_wildaAI(Creature* creature) : npc_escortAI(creature)
@@ -740,7 +723,24 @@ public:
m_uiHealingTimer -= uiDiff;
}
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_ESCAPE_COILSCAR)
+ {
+ Talk(SAY_WIL_START, player);
+ me->SetFaction(FACTION_EARTHEN);
+
+ Start(false, false, player->GetGUID(), quest);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_earthmender_wildaAI(creature);
+ }
+
};
/*#####
@@ -1347,20 +1347,28 @@ class go_crystal_prison : public GameObjectScript
public:
go_crystal_prison() : GameObjectScript("go_crystal_prison") { }
- bool OnQuestAccept(Player* player, GameObject* /*go*/, Quest const* quest) override
+ struct go_crystal_prisonAI : GameObjectAI
{
- if (quest->GetQuestId() == QUEST_BATTLE_OF_THE_CRIMSON_WATCH)
- {
- Creature* Illidan = player->FindNearestCreature(22083, 50);
+ go_crystal_prisonAI(GameObject* go) : GameObjectAI(go) { }
- if (Illidan && !ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted)
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_BATTLE_OF_THE_CRIMSON_WATCH)
{
- ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->PlayerGUID = player->GetGUID();
- ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->LiveCount = 0;
- ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted = true;
+ Creature* illidan = player->FindNearestCreature(22083, 50);
+ if (illidan && !ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, illidan->AI())->EventStarted)
+ {
+ ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, illidan->AI())->PlayerGUID = player->GetGUID();
+ ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, illidan->AI())->LiveCount = 0;
+ ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, illidan->AI())->EventStarted = true;
+ }
}
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_crystal_prisonAI(go);
}
};
diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp
index 01c88a427fe..4e812911348 100644
--- a/src/server/scripts/Outland/zone_shattrath_city.cpp
+++ b/src/server/scripts/Outland/zone_shattrath_city.cpp
@@ -58,39 +58,6 @@ class npc_raliq_the_drunk : public CreatureScript
public:
npc_raliq_the_drunk() : CreatureScript("npc_raliq_the_drunk") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- CloseGossipMenuFor(player);
- creature->SetFaction(FACTION_OGRE_HOSTILE);
- creature->AI()->Talk(SAY_RALIQ_ATTACK, player);
- creature->AI()->AttackStart(player);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE)
- {
- AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, NPC_TEXT_WUT_YOU_WANT, creature->GetGUID());
- }
- else
- {
- ClearGossipMenuFor(player);
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_raliq_the_drunkAI(creature);
- }
-
struct npc_raliq_the_drunkAI : public ScriptedAI
{
npc_raliq_the_drunkAI(Creature* creature) : ScriptedAI(creature)
@@ -124,7 +91,41 @@ public:
DoMeleeAttackIfReady();
}
+
+ 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);
+ me->SetFaction(FACTION_OGRE_HOSTILE);
+ Talk(SAY_RALIQ_ATTACK, player);
+ AttackStart(player);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE)
+ {
+ AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, NPC_TEXT_WUT_YOU_WANT, me->GetGUID());
+ }
+ else
+ {
+ ClearGossipMenuFor(player);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ }
+ return true;
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_raliq_the_drunkAI(creature);
+ }
};
/*######
@@ -148,40 +149,6 @@ class npc_salsalabim : public CreatureScript
public:
npc_salsalabim() : CreatureScript("npc_salsalabim") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- CloseGossipMenuFor(player);
- creature->SetFaction(FACTION_DEMON_HOSTILE);
- creature->AI()->Talk(SAY_DEMONIC_AGGRO, player);
- creature->AI()->AttackStart(player);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(PATIENCE_AND_UNDERSTANDING) == QUEST_STATUS_INCOMPLETE)
- {
- AddGossipItemFor(player, MENU_ID_ALTRUIS_SENT_ME, OPTION_ID_ALTRUIS_SENT_ME, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, NPC_TEXT_SAL_GROWLS_AT_YOU, creature->GetGUID());
- }
- else
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_salsalabimAI(creature);
- }
-
struct npc_salsalabimAI : public ScriptedAI
{
npc_salsalabimAI(Creature* creature) : ScriptedAI(creature)
@@ -225,7 +192,42 @@ public:
DoMeleeAttackIfReady();
}
+
+ 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);
+ me->SetFaction(FACTION_DEMON_HOSTILE);
+ Talk(SAY_DEMONIC_AGGRO, player);
+ AttackStart(player);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(PATIENCE_AND_UNDERSTANDING) == QUEST_STATUS_INCOMPLETE)
+ {
+ AddGossipItemFor(player, MENU_ID_ALTRUIS_SENT_ME, OPTION_ID_ALTRUIS_SENT_ME, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, NPC_TEXT_SAL_GROWLS_AT_YOU, me->GetGUID());
+ }
+ else
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ }
+ return true;
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_salsalabimAI(creature);
+ }
};
/*
@@ -257,46 +259,57 @@ class npc_shattrathflaskvendors : public CreatureScript
public:
npc_shattrathflaskvendors() : CreatureScript("npc_shattrathflaskvendors") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
+ struct npc_shattrathflaskvendorsAI : public ScriptedAI
{
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
+ npc_shattrathflaskvendorsAI(Creature* creature) : ScriptedAI(creature) { }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->GetEntry() == HALDOR_THE_COMPULSIVE)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- // Aldor vendor
- if (creature->IsVendor() && (player->GetReputationRank(ALDOR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(THE_SHA_TAR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(CENARION_EXPEDITION_REP) == REP_EXALTED))
- {
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- SendGossipMenuFor(player, NPC_TEXT_WELCOME_NAME, creature->GetGUID());
- }
- else
- {
- SendGossipMenuFor(player, NPC_TEXT_EXALTED_ALDOR, creature->GetGUID());
- }
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_TRADE)
+ player->GetSession()->SendListInventory(me->GetGUID());
+
+ return true;
}
- if (creature->GetEntry() == ARCANIST_XORITH)
+ bool GossipHello(Player* player) override
{
- // Scryers vendor
- if (creature->IsVendor() && (player->GetReputationRank(SCRYERS_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(THE_SHA_TAR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(CENARION_EXPEDITION_REP) == REP_EXALTED))
+ if (me->GetEntry() == HALDOR_THE_COMPULSIVE)
{
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- SendGossipMenuFor(player, NPC_TEXT_WELCOME_NAME, creature->GetGUID());
+ // Aldor vendor
+ if (me->IsVendor() && (player->GetReputationRank(ALDOR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(THE_SHA_TAR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(CENARION_EXPEDITION_REP) == REP_EXALTED))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ SendGossipMenuFor(player, NPC_TEXT_WELCOME_NAME, me->GetGUID());
+ }
+ else
+ {
+ SendGossipMenuFor(player, NPC_TEXT_EXALTED_ALDOR, me->GetGUID());
+ }
}
- else
+
+ if (me->GetEntry() == ARCANIST_XORITH)
{
- SendGossipMenuFor(player, NPC_TEXT_EXALTED_SCRYERS, creature->GetGUID());
+ // Scryers vendor
+ if (me->IsVendor() && (player->GetReputationRank(SCRYERS_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(THE_SHA_TAR_REPUTATION) == REP_EXALTED) && (player->GetReputationRank(CENARION_EXPEDITION_REP) == REP_EXALTED))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ SendGossipMenuFor(player, NPC_TEXT_WELCOME_NAME, me->GetGUID());
+ }
+ else
+ {
+ SendGossipMenuFor(player, NPC_TEXT_EXALTED_SCRYERS, me->GetGUID());
+ }
}
+
+ return true;
}
+ };
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_shattrathflaskvendorsAI(creature);
}
};
@@ -317,23 +330,34 @@ class npc_zephyr : public CreatureScript
public:
npc_zephyr() : CreatureScript("npc_zephyr") { }
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override
+ struct npc_zephyrAI : public ScriptedAI
{
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- player->CastSpell(player, TELEPORT_CAVERNS_OF_TIME, false);
+ npc_zephyrAI(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_INFO_DEF + 1)
+ player->CastSpell(player, TELEPORT_CAVERNS_OF_TIME, false);
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetReputationRank(KEEPERS_OF_TIME_REPUTATION) >= REP_REVERED)
- AddGossipItemFor(player, MENU_ID_TAKE_ME_TO_C_O_T, OPTION_ID_TAKE_ME_TO_C_O_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ return true;
+ }
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetReputationRank(KEEPERS_OF_TIME_REPUTATION) >= REP_REVERED)
+ AddGossipItemFor(player, MENU_ID_TAKE_ME_TO_C_O_T, OPTION_ID_TAKE_ME_TO_C_O_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- return true;
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_zephyrAI(creature);
}
};
diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp
index 9fccb9cb4f9..69e8608b7e0 100644
--- a/src/server/scripts/Outland/zone_terokkar_forest.cpp
+++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp
@@ -36,6 +36,7 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Group.h"
#include "Player.h"
#include "WorldSession.h"
@@ -328,38 +329,6 @@ class npc_floon : public CreatureScript
public:
npc_floon() : CreatureScript("npc_floon") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF)
- {
- AddGossipItemFor(player, MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, GOSSIP_HE_ALREADY_KILLED_ME, creature->GetGUID());
- }
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- CloseGossipMenuFor(player);
- creature->SetFaction(FACTION_HOSTILE_FLOON);
- creature->AI()->Talk(SAY_FLOON_ATTACK, player);
- creature->AI()->AttackStart(player);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
-
- SendGossipMenuFor(player, GOSSIP_FLOON_STRANGE_SOUNDS, creature->GetGUID());
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_floonAI(creature);
- }
-
struct npc_floonAI : public ScriptedAI
{
npc_floonAI(Creature* creature) : ScriptedAI(creature)
@@ -414,7 +383,40 @@ public:
DoMeleeAttackIfReady();
}
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF)
+ {
+ AddGossipItemFor(player, MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_HE_ALREADY_KILLED_ME, me->GetGUID());
+ }
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ {
+ CloseGossipMenuFor(player);
+ me->SetFaction(FACTION_HOSTILE_FLOON);
+ Talk(SAY_FLOON_ATTACK, player);
+ AttackStart(player);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+
+ SendGossipMenuFor(player, GOSSIP_FLOON_STRANGE_SOUNDS, me->GetGUID());
+ return true;
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_floonAI(creature);
+ }
};
/*######
@@ -497,17 +499,16 @@ public:
player->FailQuest(ESCAPE_FROM_FIREWING_POINT_H);
}
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
- creature->SetFaction(FACTION_ESCORTEE);
+ if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A)
+ {
+ Start(true, false, player->GetGUID());
+ me->SetFaction(FACTION_ESCORTEE);
+ }
}
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
@@ -538,47 +539,59 @@ class go_skull_pile : public GameObjectScript
public:
go_skull_pile() : GameObjectScript("go_skull_pile") { }
- bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action) override
+ struct go_skull_pileAI : public GameObjectAI
{
- ClearGossipMenuFor(player);
- switch (sender)
+ go_skull_pileAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_SENDER_MAIN: SendActionMenu(player, go, action); break;
+ uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (sender)
+ {
+ case GOSSIP_SENDER_MAIN: SendActionMenu(player, action); break;
+ }
+ return true;
}
- return true;
- }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD))
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- }
+ if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD))
+ {
+ AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ }
- SendGossipMenuFor(player, go->GetGOInfo()->questgiver.gossipID, go->GetGUID());
- return true;
- }
+ SendGossipMenuFor(player, me->GetGOInfo()->questgiver.gossipID, me->GetGUID());
+ return true;
+ }
- void SendActionMenu(Player* player, GameObject* /*go*/, uint32 action)
- {
- switch (action)
+ void SendActionMenu(Player* player, uint32 action)
{
- case GOSSIP_ACTION_INFO_DEF + 1:
- player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- player->CastSpell(player, SUMMON_KARROG, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 4:
- player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false);
- break;
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ player->CastSpell(player, SUMMON_KARROG, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false);
+ break;
+ }
}
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_skull_pileAI(go);
}
};
@@ -598,26 +611,37 @@ class npc_slim : public CreatureScript
public:
npc_slim() : CreatureScript("npc_slim") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
+ struct npc_slimAI : public ScriptedAI
{
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
+ npc_slimAI(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->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY)
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
{
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- SendGossipMenuFor(player, NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, creature->GetGUID());
+ if (me->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY)
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ SendGossipMenuFor(player, NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, me->GetGUID());
+ }
+ else
+ SendGossipMenuFor(player, NPC_TEXT_NEITHER_SLIM_NOR_SHADY, me->GetGUID());
+
+ return true;
}
- else
- SendGossipMenuFor(player, NPC_TEXT_NEITHER_SLIM_NOR_SHADY, creature->GetGUID());
+ };
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_slimAI(creature);
}
};
@@ -636,26 +660,6 @@ class npc_akuno : public CreatureScript
public:
npc_akuno() : CreatureScript("npc_akuno") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCAPING_THE_TOMB)
- {
- if (npc_akunoAI* pEscortAI = CAST_AI(npc_akuno::npc_akunoAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID());
-
- if (player->GetTeamId() == TEAM_ALLIANCE)
- creature->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE);
- else
- creature->SetFaction(FACTION_ESCORT_H_NEUTRAL_PASSIVE);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_akunoAI(creature);
- }
-
struct npc_akunoAI : public npc_escortAI
{
npc_akunoAI(Creature* creature) : npc_escortAI(creature) { }
@@ -683,7 +687,25 @@ public:
{
summon->AI()->AttackStart(me);
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_ESCAPING_THE_TOMB)
+ {
+ Start(false, false, player->GetGUID());
+
+ if (player->GetTeamId() == TEAM_ALLIANCE)
+ me->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE);
+ else
+ me->SetFaction(FACTION_ESCORT_H_NEUTRAL_PASSIVE);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_akunoAI(creature);
+ }
};
void AddSC_terokkar_forest()
diff --git a/src/server/scripts/Outland/zone_zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp
index f6cc09eba8e..846c8e01437 100644
--- a/src/server/scripts/Outland/zone_zangarmarsh.cpp
+++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp
@@ -65,87 +65,94 @@ class npcs_ashyen_and_keleth : public CreatureScript
public:
npcs_ashyen_and_keleth() : CreatureScript("npcs_ashyen_and_keleth") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npcs_ashyen_and_kelethAI : public ScriptedAI
{
- if (player->GetReputationRank(942) > REP_NEUTRAL)
+ npcs_ashyen_and_kelethAI(Creature* creature) : ScriptedAI(creature) { }
+
+ bool GossipHello(Player* player) override
{
- if (creature->GetEntry() == NPC_ASHYEN)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ if (player->GetReputationRank(942) > REP_NEUTRAL)
+ {
+ if (me->GetEntry() == NPC_ASHYEN)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_ASH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- if (creature->GetEntry() == NPC_KELETH)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- }
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ if (me->GetEntry() == NPC_KELETH)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_BLESS_KEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ }
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
- return true;
- }
+ return true;
+ }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- creature->setPowerType(POWER_MANA);
- creature->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case
- creature->SetPower(POWER_MANA, 200);
-
- if (creature->GetEntry() == NPC_ASHYEN) //check which Creature we are dealing with
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- uint32 spell = 0;
- switch (player->GetReputationRank(942))
- { //mark of lore
- case REP_FRIENDLY:
- spell = SPELL_BLESS_ASH_FRI;
- break;
- case REP_HONORED:
- spell = SPELL_BLESS_ASH_HON;
- break;
- case REP_REVERED:
- spell = SPELL_BLESS_ASH_REV;
- break;
- case REP_EXALTED:
- spell = SPELL_BLESS_ASH_EXA;
- break;
- default:
- break;
- }
+ me->setPowerType(POWER_MANA);
+ me->SetMaxPower(POWER_MANA, 200); //set a "fake" mana value, we can't depend on database doing it in this case
+ me->SetPower(POWER_MANA, 200);
- if (spell)
+ if (me->GetEntry() == NPC_ASHYEN) //check which Creature we are dealing with
{
- creature->CastSpell(player, spell, true);
- }
- }
+ uint32 spell = 0;
+ switch (player->GetReputationRank(942))
+ { //mark of lore
+ case REP_FRIENDLY:
+ spell = SPELL_BLESS_ASH_FRI;
+ break;
+ case REP_HONORED:
+ spell = SPELL_BLESS_ASH_HON;
+ break;
+ case REP_REVERED:
+ spell = SPELL_BLESS_ASH_REV;
+ break;
+ case REP_EXALTED:
+ spell = SPELL_BLESS_ASH_EXA;
+ break;
+ default:
+ break;
+ }
- if (creature->GetEntry() == NPC_KELETH)
- {
- uint32 spell = 0;
- switch (player->GetReputationRank(942)) //mark of war
- {
- case REP_FRIENDLY:
- spell = SPELL_BLESS_KEL_FRI;
- break;
- case REP_HONORED:
- spell = SPELL_BLESS_KEL_HON;
- break;
- case REP_REVERED:
- spell = SPELL_BLESS_KEL_REV;
- break;
- case REP_EXALTED:
- spell = SPELL_BLESS_KEL_EXA;
- break;
- default:
- break;
+ if (spell)
+ DoCast(player, spell, true);
}
- if (spell)
+ if (me->GetEntry() == NPC_KELETH)
{
- creature->CastSpell(player, spell, true);
+ uint32 spell = 0;
+ switch (player->GetReputationRank(942)) //mark of war
+ {
+ case REP_FRIENDLY:
+ spell = SPELL_BLESS_KEL_FRI;
+ break;
+ case REP_HONORED:
+ spell = SPELL_BLESS_KEL_HON;
+ break;
+ case REP_REVERED:
+ spell = SPELL_BLESS_KEL_REV;
+ break;
+ case REP_EXALTED:
+ spell = SPELL_BLESS_KEL_EXA;
+ break;
+ default:
+ break;
+ }
+
+ if (spell)
+ DoCast(player, spell, true);
}
+ CloseGossipMenuFor(player);
+ player->TalkedToCreature(me->GetEntry(), me->GetGUID());
}
- CloseGossipMenuFor(player);
- player->TalkedToCreature(creature->GetEntry(), creature->GetGUID());
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npcs_ashyen_and_kelethAI(creature);
}
};
@@ -205,32 +212,33 @@ public:
DoMeleeAttackIfReady();
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_cooshcooshAI(creature);
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_COOSH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_COOSH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, 9441, creature->GetGUID());
- return true;
- }
+ SendGossipMenuFor(player, 9441, me->GetGUID());
+ return true;
+ }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- CloseGossipMenuFor(player);
- creature->SetFaction(FACTION_HOSTILE_CO);
- creature->AI()->AttackStart(player);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF)
+ {
+ CloseGossipMenuFor(player);
+ me->SetFaction(FACTION_HOSTILE_CO);
+ AttackStart(player);
+ }
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_cooshcooshAI(creature);
}
};
@@ -247,48 +255,58 @@ class npc_elder_kuruti : public CreatureScript
public:
npc_elder_kuruti() : CreatureScript("npc_elder_kuruti") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_elder_kurutiAI : public ScriptedAI
{
- if (player->GetQuestStatus(9803) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ npc_elder_kurutiAI(Creature* creature) : ScriptedAI(creature) { }
- SendGossipMenuFor(player, 9226, creature->GetGUID());
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(9803) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- return true;
- }
+ SendGossipMenuFor(player, 9226, me->GetGUID());
+ return true;
+ }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_ACTION_INFO_DEF:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, 9227, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- SendGossipMenuFor(player, 9229, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
{
- if (!player->HasItemCount(24573))
+ case GOSSIP_ACTION_INFO_DEF:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, 9227, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KUR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, 9229, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
{
- ItemPosCountVec dest;
- uint32 itemId = 24573;
- InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, NULL);
- if (msg == EQUIP_ERR_OK)
+ if (!player->HasItemCount(24573))
{
- player->StoreNewItem(dest, itemId, true);
+ ItemPosCountVec dest;
+ uint32 itemId = 24573;
+ InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, 1, NULL);
+ if (msg == EQUIP_ERR_OK)
+ {
+ player->StoreNewItem(dest, itemId, true);
+ }
+ else
+ player->SendEquipError(msg, NULL, NULL, itemId);
}
- else
- player->SendEquipError(msg, NULL, NULL, itemId);
+ SendGossipMenuFor(player, 9231, me->GetGUID());
+ break;
}
- SendGossipMenuFor(player, 9231, creature->GetGUID());
- break;
}
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_elder_kurutiAI(creature);
}
};
@@ -350,19 +368,16 @@ public:
break;
}
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCAPE_FROM)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- creature->AI()->Talk(SAY_START, player);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_kayra_longmane::npc_kayra_longmaneAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID());
+ if (quest->GetQuestId() == QUEST_ESCAPE_FROM)
+ {
+ Talk(SAY_START, player);
+ Start(false, false, player->GetGUID());
+ }
}
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{