aboutsummaryrefslogtreecommitdiff
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
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)
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.h30
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.h28
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp43
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h23
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp12
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h8
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp17
-rw-r--r--src/server/game/Entities/Player/Player.cpp11
-rw-r--r--src/server/game/Events/GameEventMgr.cpp2
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp12
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp4
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp13
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp181
-rw-r--r--src/server/game/Scripting/ScriptMgr.h78
-rw-r--r--src/server/game/Spells/SpellEffects.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp180
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp145
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp36
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp40
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp92
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp91
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp113
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp21
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp64
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp48
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h6
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp17
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp55
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp62
-rw-r--r--src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp27
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp39
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp40
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h6
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp27
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp27
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp51
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp23
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h6
-rw-r--r--src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp58
-rw-r--r--src/server/scripts/EasternKingdoms/zone_ghostlands.cpp17
-rw-r--r--src/server/scripts/EasternKingdoms/zone_hinterlands.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp52
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp51
-rw-r--r--src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp102
-rw-r--r--src/server/scripts/EasternKingdoms/zone_undercity.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp109
-rw-r--r--src/server/scripts/EasternKingdoms/zone_wetlands.cpp30
-rw-r--r--src/server/scripts/Events/childrens_week.cpp2
-rw-r--r--src/server/scripts/Events/fireworks_show.cpp8
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp60
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp374
-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/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/WailingCaverns/wailing_caverns.cpp102
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp223
-rw-r--r--src/server/scripts/Kalimdor/zone_ashenvale.cpp29
-rw-r--r--src/server/scripts/Kalimdor/zone_azshara.cpp21
-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_darkshore.cpp73
-rw-r--r--src/server/scripts/Kalimdor/zone_desolace.cpp55
-rw-r--r--src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp67
-rw-r--r--src/server/scripts/Kalimdor/zone_feralas.cpp48
-rw-r--r--src/server/scripts/Kalimdor/zone_orgrimmar.cpp136
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp526
-rw-r--r--src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp20
-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_thousand_needles.cpp119
-rw-r--r--src/server/scripts/Kalimdor/zone_thunder_bluff.cpp58
-rw-r--r--src/server/scripts/Kalimdor/zone_ungoro_crater.cpp68
-rw-r--r--src/server/scripts/Kalimdor/zone_winterspring.cpp110
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h6
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp51
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp69
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp16
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp139
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp6
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp60
-rw-r--r--src/server/scripts/Northrend/Gundrak/gundrak.h6
-rw-r--r--src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp20
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp6
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp9
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp3
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp21
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp8
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp30
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp11
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp47
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp29
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp61
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp32
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp65
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp5
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp22
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h6
-rw-r--r--src/server/scripts/Northrend/VioletHold/violet_hold.cpp65
-rw-r--r--src/server/scripts/Northrend/VioletHold/violet_hold.h6
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp337
-rw-r--r--src/server/scripts/Northrend/zone_dragonblight.cpp55
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp29
-rw-r--r--src/server/scripts/Northrend/zone_howling_fjord.cpp119
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp227
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp83
-rw-r--r--src/server/scripts/Northrend/zone_wintergrasp.cpp264
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp50
-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
-rw-r--r--src/server/scripts/World/go_scripts.cpp1048
-rw-r--r--src/server/scripts/World/npc_innkeeper.cpp131
-rw-r--r--src/server/scripts/World/npc_professions.cpp1196
-rw-r--r--src/server/scripts/World/npcs_special.cpp438
148 files changed, 6030 insertions, 5211 deletions
diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h
index 7e149a89962..64b790c0d68 100644
--- a/src/server/game/AI/CoreAI/GameObjectAI.h
+++ b/src/server/game/AI/CoreAI/GameObjectAI.h
@@ -29,9 +29,9 @@
class TC_GAME_API GameObjectAI
{
protected:
- GameObject* const go;
+ GameObject* const me;
public:
- explicit GameObjectAI(GameObject* g) : go(g) { }
+ explicit GameObjectAI(GameObject* g) : me(g) { }
virtual ~GameObjectAI() { }
virtual void UpdateAI(uint32 /*diff*/) { }
@@ -47,19 +47,35 @@ class TC_GAME_API GameObjectAI
static int Permissible(GameObject const* go);
+ // Called when a player opens a gossip dialog with the gameobject.
virtual bool GossipHello(Player* /*player*/, bool /*reportUse*/) { return false; }
- virtual bool GossipSelect(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/) { return false; }
- virtual bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, char const* /*code*/) { return false; }
- virtual bool QuestAccept(Player* /*player*/, Quest const* /*quest*/) { return false; }
- virtual bool QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; }
+
+ // Called when a player selects a gossip item in the gameobject's gossip menu.
+ virtual bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { return false; }
+
+ // Called when a player selects a gossip with a code in the gameobject's gossip menu.
+ virtual bool GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, char const* /*code*/) { return false; }
+
+ // Called when a player accepts a quest from the gameobject.
+ virtual void QuestAccept(Player* /*player*/, Quest const* /*quest*/) { }
+
+ // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0
+ virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { }
+
+ // Called when the dialog status between a player and the gameobject is requested.
virtual uint32 GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; }
+
virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) { }
+ virtual void Damaged(Player* /*player*/, uint32 /*eventId*/) { }
+
virtual uint32 GetData(uint32 /*id*/) const { return 0; }
virtual void SetData64(uint32 /*id*/, uint64 /*value*/) { }
virtual uint64 GetData64(uint32 /*id*/) const { return 0; }
virtual void SetData(uint32 /*id*/, uint32 /*value*/) { }
+
virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { }
- virtual void OnStateChanged(uint32 /*state*/, Unit* /*unit*/) { }
+ virtual void OnLootStateChanged(uint32 /*state*/, Unit* /*unit*/) { }
+ virtual void OnStateChanged(uint32 /*state*/) { }
virtual void EventInform(uint32 /*eventId*/) { }
virtual void SpellHit(Unit* /*unit*/, const SpellInfo* /*spellInfo*/) { }
};
diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h
index f940eca3799..b70a1613a25 100644
--- a/src/server/game/AI/CoreAI/UnitAI.h
+++ b/src/server/game/AI/CoreAI/UnitAI.h
@@ -298,13 +298,27 @@ class TC_GAME_API UnitAI
static AISpellInfoType* AISpellInfo;
static void FillAISpellInfo();
- virtual void sGossipHello(Player* /*player*/) { }
- virtual void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { }
- virtual void sGossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, char const* /*code*/) { }
- virtual void sQuestAccept(Player* /*player*/, Quest const* /*quest*/) { }
- virtual void sQuestSelect(Player* /*player*/, Quest const* /*quest*/) { }
- virtual void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { }
- virtual void sOnGameEvent(bool /*start*/, uint16 /*eventId*/) { }
+ // Called when a player opens a gossip dialog with the creature.
+ virtual bool GossipHello(Player* /*player*/) { return false; }
+
+ // Called when a player selects a gossip item in the creature's gossip menu.
+ virtual bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) { return false; }
+
+ // Called when a player selects a gossip with a code in the creature's gossip menu.
+ virtual bool GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) { return false; }
+
+ // Called when a player accepts a quest from the creature.
+ virtual void QuestAccept(Player* /*player*/, Quest const* /*quest*/) { }
+
+ // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0
+ virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { }
+
+ // Called when a game event starts or ends
+ virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { }
+
+ // Called when the dialog status between a player and the creature is requested.
+ virtual uint32 GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; }
+
private:
UnitAI(UnitAI const& right) = delete;
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 6b6cfe58254..62678e10eef 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -807,24 +807,29 @@ void SmartAI::SetEvadeDisabled(bool disable)
mEvadeDisabled = disable;
}
-void SmartAI::sGossipHello(Player* player)
+bool SmartAI::GossipHello(Player* player)
{
GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player);
+ return false;
}
-void SmartAI::sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId)
+bool SmartAI::GossipSelect(Player* player, uint32 menuId, uint32 gossipListId)
{
GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, menuId, gossipListId);
+ return false;
}
-void SmartAI::sGossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/) { }
+bool SmartAI::GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/)
+{
+ return false;
+}
-void SmartAI::sQuestAccept(Player* player, Quest const* quest)
+void SmartAI::QuestAccept(Player* player, Quest const* quest)
{
GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId());
}
-void SmartAI::sQuestReward(Player* player, Quest const* quest, uint32 opt)
+void SmartAI::QuestReward(Player* player, Quest const* quest, uint32 opt)
{
GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt);
}
@@ -914,7 +919,7 @@ void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker)
GetScript()->SetScript9(e, entry);
}
-void SmartAI::sOnGameEvent(bool start, uint16 eventId)
+void SmartAI::OnGameEvent(bool start, uint16 eventId)
{
GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, nullptr, eventId);
}
@@ -970,10 +975,10 @@ void SmartGameObjectAI::UpdateAI(uint32 diff)
void SmartGameObjectAI::InitializeAI()
{
- GetScript()->OnInitialize(go);
+ GetScript()->OnInitialize(me);
// do not call respawn event if go is not spawned
- if (go->isSpawned())
+ if (me->isSpawned())
GetScript()->ProcessEventsFor(SMART_EVENT_RESPAWN);
//Reset();
}
@@ -990,41 +995,39 @@ void SmartGameObjectAI::Reset()
bool SmartGameObjectAI::GossipHello(Player* player, bool reportUse)
{
TC_LOG_DEBUG("scripts.ai", "SmartGameObjectAI::GossipHello");
- GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player, uint32(reportUse), 0, false, nullptr, go);
+ GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_HELLO, player, uint32(reportUse), 0, false, nullptr, me);
return false;
}
// Called when a player selects a gossip item in the gameobject's gossip menu.
bool SmartGameObjectAI::GossipSelect(Player* player, uint32 sender, uint32 action)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action, false, nullptr, go);
+ GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action, false, nullptr, me);
return false;
}
// Called when a player selects a gossip with a code in the gameobject's gossip menu.
-bool SmartGameObjectAI::GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/)
+bool SmartGameObjectAI::GossipSelectCode(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/, const char* /*code*/)
{
return false;
}
// Called when a player accepts a quest from the gameobject.
-bool SmartGameObjectAI::QuestAccept(Player* player, Quest const* quest)
+void SmartGameObjectAI::QuestAccept(Player* player, Quest const* quest)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId(), 0, false, nullptr, go);
- return false;
+ GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId(), 0, false, nullptr, me);
}
// Called when a player selects a quest reward.
-bool SmartGameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 opt)
+void SmartGameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 opt)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt, false, nullptr, go);
- return false;
+ GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt, false, nullptr, me);
}
// Called when the gameobject is destroyed (destructible buildings only).
void SmartGameObjectAI::Destroyed(Player* player, uint32 eventId)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, player, eventId, 0, false, nullptr, go);
+ GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, player, eventId, 0, false, nullptr, me);
}
void SmartGameObjectAI::SetData(uint32 id, uint32 value)
@@ -1044,9 +1047,9 @@ void SmartGameObjectAI::OnGameEvent(bool start, uint16 eventId)
GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, nullptr, eventId);
}
-void SmartGameObjectAI::OnStateChanged(uint32 state, Unit* unit)
+void SmartGameObjectAI::OnLootStateChanged(uint32 state, Unit* unit)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_GO_STATE_CHANGED, unit, state);
+ GetScript()->ProcessEventsFor(SMART_EVENT_GO_LOOT_STATE_CHANGED, unit, state);
}
void SmartGameObjectAI::EventInform(uint32 eventId)
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index 978711a7f98..faeb7e2e8d3 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -178,13 +178,12 @@ class TC_GAME_API SmartAI : public CreatureAI
void SetInvincibilityHpLevel(uint32 level) { mInvincibilityHpLevel = level; }
- void sGossipHello(Player* player) override;
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override;
- void sGossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override;
- void sQuestAccept(Player* player, Quest const* quest) override;
- //void sQuestSelect(Player* player, Quest const* quest) override;
- void sQuestReward(Player* player, Quest const* quest, uint32 opt) override;
- void sOnGameEvent(bool start, uint16 eventId) override;
+ bool GossipHello(Player* player) override;
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override;
+ bool GossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override;
+ void QuestAccept(Player* player, Quest const* quest) override;
+ void QuestReward(Player* player, Quest const* quest, uint32 opt) override;
+ void OnGameEvent(bool start, uint16 eventId) override;
uint32 mEscortQuestID;
@@ -256,15 +255,15 @@ class TC_GAME_API SmartGameObjectAI : public GameObjectAI
static int Permissible(const GameObject* g);
bool GossipHello(Player* player, bool reportUse) override;
- bool GossipSelect(Player* player, uint32 sender, uint32 action) override;
- bool GossipSelectCode(Player* /*player*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) override;
- bool QuestAccept(Player* player, Quest const* quest) override;
- bool QuestReward(Player* player, Quest const* quest, uint32 opt) override;
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override;
+ bool GossipSelectCode(Player* player, uint32 menuId, uint32 gossipListId, const char* code) override;
+ void QuestAccept(Player* player, Quest const* quest) override;
+ void QuestReward(Player* player, Quest const* quest, uint32 opt) override;
void Destroyed(Player* player, uint32 eventId) override;
void SetData(uint32 id, uint32 value) override;
void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker);
void OnGameEvent(bool start, uint16 eventId) override;
- void OnStateChanged(uint32 state, Unit* unit) override;
+ void OnLootStateChanged(uint32 state, Unit* unit) override;
void EventInform(uint32 eventId) override;
void SpellHit(Unit* unit, const SpellInfo* spellInfo) override;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 4aa768b4b20..a10766162e4 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2685,16 +2685,16 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e)
if (!go)
return;
//store hostage as id1
- AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0);
+ AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0);
//store invoker as id2
- AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
+ AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0);
//signal hostage
- AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0);
+ AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0);
//when hostage raeched end point, give credit to invoker
if (e.action.installTtemplate.param2)
AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0);
else
- AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0);
+ AddEvent(SMART_EVENT_GO_LOOT_STATE_CHANGED, 0, GO_ACTIVATED, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0);
break;
}
case SMARTAI_TEMPLATE_BASIC:
@@ -3533,9 +3533,9 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
ProcessAction(e, nullptr, var0);
break;
}
- case SMART_EVENT_GO_STATE_CHANGED:
+ case SMART_EVENT_GO_LOOT_STATE_CHANGED:
{
- if (e.event.goStateChanged.state != var0)
+ if (e.event.goLootStateChanged.lootState != var0)
return;
ProcessAction(e, unit, var0, var1);
break;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 04a07490680..068ec95b6c9 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -791,7 +791,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
}
break;
case SMART_EVENT_LINK:
- case SMART_EVENT_GO_STATE_CHANGED:
+ case SMART_EVENT_GO_LOOT_STATE_CHANGED:
case SMART_EVENT_GO_EVENT_INFORM:
case SMART_EVENT_TIMED_EVENT_TRIGGERED:
case SMART_EVENT_INSTANCE_PLAYER_ENTER:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 617820086eb..61f006aea86 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -181,7 +181,7 @@ enum SMART_EVENT
SMART_EVENT_IS_BEHIND_TARGET = 67, // cooldownMin, CooldownMax
SMART_EVENT_GAME_EVENT_START = 68, // game_event.Entry
SMART_EVENT_GAME_EVENT_END = 69, // game_event.Entry
- SMART_EVENT_GO_STATE_CHANGED = 70, // go state
+ SMART_EVENT_GO_LOOT_STATE_CHANGED = 70, // go LootState
SMART_EVENT_GO_EVENT_INFORM = 71, // eventId
SMART_EVENT_ACTION_DONE = 72, // eventId (SharedDefines.EventId)
SMART_EVENT_ON_SPELLCLICK = 73, // clicker (unit)
@@ -399,8 +399,8 @@ struct SmartEvent
struct
{
- uint32 state;
- } goStateChanged;
+ uint32 lootState;
+ } goLootStateChanged;
struct
{
@@ -1443,7 +1443,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_GAME_EVENT_START, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_GAME_EVENT_END, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
- {SMART_EVENT_GO_STATE_CHANGED, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
+ {SMART_EVENT_GO_LOOT_STATE_CHANGED, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_GO_EVENT_INFORM, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_ACTION_DONE, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_ON_SPELLCLICK, SMART_SCRIPT_TYPE_MASK_CREATURE },
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 360fe1151c9..b6c0d27f0ad 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -774,8 +774,6 @@ void Creature::Update(uint32 diff)
default:
break;
}
-
- sScriptMgr->OnCreatureUpdate(this, diff);
}
void Creature::Regenerate(Powers power)
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index b5621918295..ea9dfcde47c 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -33,6 +33,7 @@
#include "UpdateFieldFlags.h"
#include "World.h"
#include "Transport.h"
+#include "GossipDef.h"
#include "Packets/QueryPackets.h"
@@ -750,7 +751,6 @@ void GameObject::Update(uint32 diff)
break;
}
}
- sScriptMgr->OnGameObjectUpdate(this, diff);
}
void GameObject::Refresh()
@@ -1252,9 +1252,7 @@ void GameObject::Use(Unit* user)
if (Player* playerUser = user->ToPlayer())
{
- if (sScriptMgr->OnGossipHello(playerUser, this))
- return;
-
+ playerUser->PlayerTalkClass->ClearMenus();
if (AI()->GossipHello(playerUser, false))
return;
}
@@ -2081,7 +2079,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player*
case GO_DESTRUCTIBLE_DAMAGED:
{
EventInform(m_goInfo->building.damagedEvent, eventInvoker);
- sScriptMgr->OnGameObjectDamaged(this, eventInvoker);
+ AI()->Damaged(eventInvoker, m_goInfo->building.damagedEvent);
RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
@@ -2105,8 +2103,9 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player*
}
case GO_DESTRUCTIBLE_DESTROYED:
{
- sScriptMgr->OnGameObjectDestroyed(this, eventInvoker);
EventInform(m_goInfo->building.destroyedEvent, eventInvoker);
+ AI()->Destroyed(eventInvoker, m_goInfo->building.destroyedEvent);
+
if (eventInvoker)
if (Battleground* bg = eventInvoker->GetBattleground())
bg->DestroyGate(eventInvoker, this);
@@ -2159,8 +2158,7 @@ void GameObject::SetLootState(LootState state, Unit* unit)
else
m_lootStateUnitGUID.Clear();
- AI()->OnStateChanged(state, unit);
- sScriptMgr->OnGameObjectLootStateChanged(this, state, unit);
+ AI()->OnLootStateChanged(state, unit);
if (GetGoType() == GAMEOBJECT_TYPE_DOOR) // only set collision for doors on SetGoState
return;
@@ -2179,7 +2177,8 @@ void GameObject::SetLootState(LootState state, Unit* unit)
void GameObject::SetGoState(GOState state)
{
SetByteValue(GAMEOBJECT_BYTES_1, 0, state);
- sScriptMgr->OnGameObjectStateChanged(this, state);
+ if (AI())
+ AI()->OnStateChanged(state);
if (m_model && !IsTransport())
{
if (!IsInWorld())
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 42f9d055323..eca6f44681f 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -14942,8 +14942,8 @@ void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver)
switch (questGiver->GetTypeId())
{
case TYPEID_UNIT:
- sScriptMgr->OnQuestAccept(this, questGiver->ToCreature(), quest);
- questGiver->ToCreature()->AI()->sQuestAccept(this, quest);
+ PlayerTalkClass->ClearMenus();
+ questGiver->ToCreature()->AI()->QuestAccept(this, quest);
break;
case TYPEID_ITEM:
case TYPEID_CONTAINER:
@@ -14968,7 +14968,7 @@ void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver)
break;
}
case TYPEID_GAMEOBJECT:
- sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest);
+ PlayerTalkClass->ClearMenus();
questGiver->ToGameObject()->AI()->QuestAccept(this, quest);
break;
default:
@@ -16022,11 +16022,12 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver)
QuestRelationBounds qr;
QuestRelationBounds qir;
+ PlayerTalkClass->ClearMenus();
switch (questgiver->GetTypeId())
{
case TYPEID_GAMEOBJECT:
{
- QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject()));
+ QuestGiverStatus questStatus = QuestGiverStatus(questgiver->ToGameObject()->AI()->GetDialogStatus(this));
if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
return questStatus;
qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry());
@@ -16035,7 +16036,7 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver)
}
case TYPEID_UNIT:
{
- QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature()));
+ QuestGiverStatus questStatus = QuestGiverStatus(questgiver->ToCreature()->AI()->GetDialogStatus(this));
if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
return questStatus;
qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry());
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index 0d59f6731af..b126eb9c644 100644
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -1635,7 +1635,7 @@ public:
{
for (auto const& p : creatureMap)
if (p.second->IsInWorld() && p.second->IsAIEnabled)
- p.second->AI()->sOnGameEvent(_activate, _eventId);
+ p.second->AI()->OnGameEvent(_activate, _eventId);
}
void Visit(std::unordered_map<ObjectGuid, GameObject*>& gameObjectMap)
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index e360493cd89..2e18f843a8d 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -146,14 +146,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket& recvData)
{
if (unit)
{
- unit->AI()->sGossipSelectCode(_player, menuId, gossipListId, code.c_str());
- if (!sScriptMgr->OnGossipSelectCode(_player, unit, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId), code.c_str()))
+ if (!unit->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str()))
_player->OnGossipSelect(unit, gossipListId, menuId);
}
else
{
- go->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str());
- if (!sScriptMgr->OnGossipSelectCode(_player, go, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId), code.c_str()))
+ if (!go->AI()->GossipSelectCode(_player, menuId, gossipListId, code.c_str()))
_player->OnGossipSelect(go, gossipListId, menuId);
}
}
@@ -161,14 +159,12 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPacket& recvData)
{
if (unit)
{
- unit->AI()->sGossipSelect(_player, menuId, gossipListId);
- if (!sScriptMgr->OnGossipSelect(_player, unit, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId)))
+ if (!unit->AI()->GossipSelect(_player, menuId, gossipListId))
_player->OnGossipSelect(unit, gossipListId, menuId);
}
else
{
- go->AI()->GossipSelect(_player, menuId, gossipListId);
- if (!sScriptMgr->OnGossipSelect(_player, go, _player->PlayerTalkClass->GetGossipOptionSender(gossipListId), _player->PlayerTalkClass->GetGossipOptionAction(gossipListId)))
+ if (!go->AI()->GossipSelect(_player, menuId, gossipListId))
_player->OnGossipSelect(go, gossipListId, menuId);
}
}
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index d5e8f8c1e7c..beca093a6a9 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -337,13 +337,13 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket& recvData)
}
}
- if (!sScriptMgr->OnGossipHello(_player, unit))
+ _player->PlayerTalkClass->ClearMenus();
+ if (!unit->AI()->GossipHello(_player))
{
// _player->TalkedToCreature(unit->GetEntry(), unit->GetGUID());
_player->PrepareGossipMenu(unit, unit->GetCreatureTemplate()->GossipMenuId, true);
_player->SendPreparedGossip(unit);
}
- unit->AI()->sGossipHello(_player);
}
void WorldSession::HandleSpiritHealerActivateOpcode(WorldPacket& recvData)
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 85254d068b7..24f2a442998 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -91,13 +91,12 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket& recvData)
// Stop the npc if moving
creature->StopMoving();
- if (sScriptMgr->OnGossipHello(_player, creature))
+ _player->PlayerTalkClass->ClearMenus();
+ if (creature->AI()->GossipHello(_player))
return;
_player->PrepareGossipMenu(creature, creature->GetCreatureTemplate()->GossipMenuId, true);
_player->SendPreparedGossip(creature);
-
- creature->AI()->sGossipHello(_player);
}
void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recvData)
@@ -316,8 +315,8 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData)
}
}
- if (!sScriptMgr->OnQuestReward(_player, questgiver, quest, reward))
- questgiver->AI()->sQuestReward(_player, quest, reward);
+ _player->PlayerTalkClass->ClearMenus();
+ questgiver->AI()->QuestReward(_player, quest, reward);
break;
}
case TYPEID_GAMEOBJECT:
@@ -336,8 +335,8 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData)
}
}
- if (!sScriptMgr->OnQuestReward(_player, questGiver, quest, reward))
- questGiver->AI()->QuestReward(_player, quest, reward);
+ _player->PlayerTalkClass->ClearMenus();
+ questGiver->AI()->QuestReward(_player, quest, reward);
break;
}
default:
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 1ed163745d3..276054b1567 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -1561,78 +1561,6 @@ bool ScriptMgr::OnCastItemCombatSpell(Player* player, Unit* victim, SpellInfo co
return tmpscript->OnCastItemCombatSpell(player, victim, spellInfo, item);
}
-bool ScriptMgr::OnGossipHello(Player* player, Creature* creature)
-{
- ASSERT(player);
- ASSERT(creature);
-
- GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->OnGossipHello(player, creature);
-}
-
-bool ScriptMgr::OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)
-{
- ASSERT(player);
- ASSERT(creature);
-
- GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
- return tmpscript->OnGossipSelect(player, creature, sender, action);
-}
-
-bool ScriptMgr::OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code)
-{
- ASSERT(player);
- ASSERT(creature);
- ASSERT(code);
-
- GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
- return tmpscript->OnGossipSelectCode(player, creature, sender, action, code);
-}
-
-bool ScriptMgr::OnQuestAccept(Player* player, Creature* creature, Quest const* quest)
-{
- ASSERT(player);
- ASSERT(creature);
- ASSERT(quest);
-
- GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->OnQuestAccept(player, creature, quest);
-}
-
-bool ScriptMgr::OnQuestSelect(Player* player, Creature* creature, Quest const* quest)
-{
- ASSERT(player);
- ASSERT(creature);
- ASSERT(quest);
-
- GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->OnQuestSelect(player, creature, quest);
-}
-
-bool ScriptMgr::OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt)
-{
- ASSERT(player);
- ASSERT(creature);
- ASSERT(quest);
-
- GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, false);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->OnQuestReward(player, creature, quest, opt);
-}
-
-uint32 ScriptMgr::GetDialogStatus(Player* player, Creature* creature)
-{
- ASSERT(player);
- ASSERT(creature);
-
- GET_SCRIPT_RET(CreatureScript, creature->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->GetDialogStatus(player, creature);
-}
-
bool ScriptMgr::CanSpawn(ObjectGuid::LowType spawnId, uint32 entry, CreatureTemplate const* actTemplate, CreatureData const* cData, Map const* map)
{
ASSERT(actTemplate);
@@ -1660,115 +1588,6 @@ GameObjectAI* ScriptMgr::GetGameObjectAI(GameObject* gameobject)
return tmpscript->GetAI(gameobject);
}
-void ScriptMgr::OnCreatureUpdate(Creature* creature, uint32 diff)
-{
- ASSERT(creature);
-
- GET_SCRIPT(CreatureScript, creature->GetScriptId(), tmpscript);
- tmpscript->OnUpdate(creature, diff);
-}
-
-bool ScriptMgr::OnGossipHello(Player* player, GameObject* go)
-{
- ASSERT(player);
- ASSERT(go);
-
- GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->OnGossipHello(player, go);
-}
-
-bool ScriptMgr::OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action)
-{
- ASSERT(player);
- ASSERT(go);
-
- GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
- return tmpscript->OnGossipSelect(player, go, sender, action);
-}
-
-bool ScriptMgr::OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code)
-{
- ASSERT(player);
- ASSERT(go);
- ASSERT(code);
-
- GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
- return tmpscript->OnGossipSelectCode(player, go, sender, action, code);
-}
-
-bool ScriptMgr::OnQuestAccept(Player* player, GameObject* go, Quest const* quest)
-{
- ASSERT(player);
- ASSERT(go);
- ASSERT(quest);
-
- GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->OnQuestAccept(player, go, quest);
-}
-
-bool ScriptMgr::OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt)
-{
- ASSERT(player);
- ASSERT(go);
- ASSERT(quest);
-
- GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, false);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->OnQuestReward(player, go, quest, opt);
-}
-
-uint32 ScriptMgr::GetDialogStatus(Player* player, GameObject* go)
-{
- ASSERT(player);
- ASSERT(go);
-
- GET_SCRIPT_RET(GameObjectScript, go->GetScriptId(), tmpscript, DIALOG_STATUS_SCRIPTED_NO_STATUS);
- player->PlayerTalkClass->ClearMenus();
- return tmpscript->GetDialogStatus(player, go);
-}
-
-void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player)
-{
- ASSERT(go);
-
- GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
- tmpscript->OnDestroyed(go, player);
-}
-
-void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player)
-{
- ASSERT(go);
-
- GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
- tmpscript->OnDamaged(go, player);
-}
-
-void ScriptMgr::OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit)
-{
- ASSERT(go);
-
- GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
- tmpscript->OnLootStateChanged(go, state, unit);
-}
-
-void ScriptMgr::OnGameObjectStateChanged(GameObject* go, uint32 state)
-{
- ASSERT(go);
-
- GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
- tmpscript->OnGameObjectStateChanged(go, state);
-}
-
-void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff)
-{
- ASSERT(go);
-
- GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
- tmpscript->OnUpdate(go, diff);
-}
-
bool ScriptMgr::OnAreaTrigger(Player* player, AreaTriggerEntry const* trigger)
{
ASSERT(player);
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index e053a8b4c63..1f553989253 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -404,7 +404,7 @@ class TC_GAME_API UnitScript : public ScriptObject
virtual void ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/) { }
};
-class TC_GAME_API CreatureScript : public UnitScript, public UpdatableScript<Creature>
+class TC_GAME_API CreatureScript : public UnitScript
{
protected:
@@ -412,35 +412,14 @@ class TC_GAME_API CreatureScript : public UnitScript, public UpdatableScript<Cre
public:
- // Called when a player opens a gossip dialog with the creature.
- virtual bool OnGossipHello(Player* /*player*/, Creature* /*creature*/) { return false; }
-
- // Called when a player selects a gossip item in the creature's gossip menu.
- virtual bool OnGossipSelect(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) { return false; }
-
- // Called when a player selects a gossip with a code in the creature's gossip menu.
- virtual bool OnGossipSelectCode(Player* /*player*/, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; }
-
- // Called when a player accepts a quest from the creature.
- virtual bool OnQuestAccept(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/) { return false; }
-
- // Called when a player selects a quest in the creature's quest menu.
- virtual bool OnQuestSelect(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/) { return false; }
-
- // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0
- virtual bool OnQuestReward(Player* /*player*/, Creature* /*creature*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; }
-
- // Called when the dialog status between a player and the creature is requested.
- virtual uint32 GetDialogStatus(Player* /*player*/, Creature* /*creature*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; }
-
// Called when the creature tries to spawn. Return false to block spawn and re-evaluate on next tick.
virtual bool CanSpawn(ObjectGuid::LowType /*spawnId*/, uint32 /*entry*/, CreatureTemplate const* /*baseTemplate*/, CreatureTemplate const* /*actTemplate*/, CreatureData const* /*cData*/, Map const* /*map*/) const { return true; }
// Called when a CreatureAI object is needed for the creature.
- virtual CreatureAI* GetAI(Creature* /*creature*/) const { return NULL; }
+ virtual CreatureAI* GetAI(Creature* /*creature*/) const = 0;
};
-class TC_GAME_API GameObjectScript : public ScriptObject, public UpdatableScript<GameObject>
+class TC_GAME_API GameObjectScript : public ScriptObject
{
protected:
@@ -448,38 +427,8 @@ class TC_GAME_API GameObjectScript : public ScriptObject, public UpdatableScript
public:
- // Called when a player opens a gossip dialog with the gameobject.
- virtual bool OnGossipHello(Player* /*player*/, GameObject* /*go*/) { return false; }
-
- // Called when a player selects a gossip item in the gameobject's gossip menu.
- virtual bool OnGossipSelect(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) { return false; }
-
- // Called when a player selects a gossip with a code in the gameobject's gossip menu.
- virtual bool OnGossipSelectCode(Player* /*player*/, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/, const char* /*code*/) { return false; }
-
- // Called when a player accepts a quest from the gameobject.
- virtual bool OnQuestAccept(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/) { return false; }
-
- // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0
- virtual bool OnQuestReward(Player* /*player*/, GameObject* /*go*/, Quest const* /*quest*/, uint32 /*opt*/) { return false; }
-
- // Called when the dialog status between a player and the gameobject is requested.
- virtual uint32 GetDialogStatus(Player* /*player*/, GameObject* /*go*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; }
-
- // Called when the game object is destroyed (destructible buildings only).
- virtual void OnDestroyed(GameObject* /*go*/, Player* /*player*/) { }
-
- // Called when the game object is damaged (destructible buildings only).
- virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/) { }
-
- // Called when the game object loot state is changed.
- virtual void OnLootStateChanged(GameObject* /*go*/, uint32 /*state*/, Unit* /*unit*/) { }
-
- // Called when the game object state is changed.
- virtual void OnGameObjectStateChanged(GameObject* /*go*/, uint32 /*state*/) { }
-
// Called when a GameObjectAI object is needed for the gameobject.
- virtual GameObjectAI* GetAI(GameObject* /*go*/) const { return NULL; }
+ virtual GameObjectAI* GetAI(GameObject* /*go*/) const = 0;
};
class TC_GAME_API AreaTriggerScript : public ScriptObject
@@ -953,30 +902,11 @@ class TC_GAME_API ScriptMgr
public: /* CreatureScript */
- bool OnGossipHello(Player* player, Creature* creature);
- bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action);
- bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code);
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest);
- bool OnQuestSelect(Player* player, Creature* creature, Quest const* quest);
- bool OnQuestReward(Player* player, Creature* creature, Quest const* quest, uint32 opt);
- uint32 GetDialogStatus(Player* player, Creature* creature);
bool CanSpawn(ObjectGuid::LowType spawnId, uint32 entry, CreatureTemplate const* actTemplate, CreatureData const* cData, Map const* map);
CreatureAI* GetCreatureAI(Creature* creature);
- void OnCreatureUpdate(Creature* creature, uint32 diff);
public: /* GameObjectScript */
- bool OnGossipHello(Player* player, GameObject* go);
- bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action);
- bool OnGossipSelectCode(Player* player, GameObject* go, uint32 sender, uint32 action, const char* code);
- bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest);
- bool OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt);
- uint32 GetDialogStatus(Player* player, GameObject* go);
- void OnGameObjectDestroyed(GameObject* go, Player* player);
- void OnGameObjectDamaged(GameObject* go, Player* player);
- void OnGameObjectLootStateChanged(GameObject* go, uint32 state, Unit* unit);
- void OnGameObjectStateChanged(GameObject* go, uint32 state);
- void OnGameObjectUpdate(GameObject* go, uint32 diff);
GameObjectAI* GetGameObjectAI(GameObject* go);
public: /* AreaTriggerScript */
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 7a831edac08..00dfce66db2 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1859,9 +1859,7 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype)
return;
}
- if (sScriptMgr->OnGossipHello(player, gameObjTarget))
- return;
-
+ player->PlayerTalkClass->ClearMenus();
if (gameObjTarget->AI()->GossipHello(player, false))
return;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
index 9b29d8c29b0..d6e4408e478 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
@@ -19,6 +19,7 @@
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "ScriptedGossip.h"
+#include "GameObjectAI.h"
#include "blackrock_depths.h"
#include "Player.h"
#include "WorldSession.h"
@@ -26,25 +27,35 @@
//go_shadowforge_brazier
class go_shadowforge_brazier : public GameObjectScript
{
-public:
- go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { }
+ public:
+ go_shadowforge_brazier() : GameObjectScript("go_shadowforge_brazier") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
+ struct go_shadowforge_brazierAI : public GameObjectAI
{
- if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS)
- instance->SetData(TYPE_LYCEUM, DONE);
- else
- instance->SetData(TYPE_LYCEUM, IN_PROGRESS);
- // If used brazier open linked doors (North or South)
- if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N))
- instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true);
- else if (go->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S))
- instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true);
+ go_shadowforge_brazierAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ if (instance->GetData(TYPE_LYCEUM) == IN_PROGRESS)
+ instance->SetData(TYPE_LYCEUM, DONE);
+ else
+ instance->SetData(TYPE_LYCEUM, IN_PROGRESS);
+ // If used brazier open linked doors (North or South)
+ if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_N))
+ instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_N), true);
+ else if (me->GetGUID() == instance->GetGuidData(DATA_SF_BRAZIER_S))
+ instance->HandleGameObject(instance->GetGuidData(DATA_GOLEM_DOOR_S), true);
+
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_shadowforge_brazierAI>(go);
}
- return false;
- }
};
// npc_grimstone
@@ -429,45 +440,57 @@ enum Lokhtos
class npc_lokhtos_darkbargainer : public CreatureScript
{
-public:
- npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { }
+ public:
+ npc_lokhtos_darkbargainer() : CreatureScript("npc_lokhtos_darkbargainer") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ struct npc_lokhtos_darkbargainerAI : public ScriptedAI
{
- CloseGossipMenuFor(player);
- player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false);
- }
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
+ npc_lokhtos_darkbargainerAI(Creature* creature) : ScriptedAI(creature) { }
- return true;
- }
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ {
+ CloseGossipMenuFor(player);
+ player->CastSpell(player, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false);
+ }
+ if (action == GOSSIP_ACTION_TRADE)
+ player->GetSession()->SendListInventory(me->GetGUID());
- if (creature->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY)
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ return true;
+ }
- if (player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 &&
- !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) &&
- player->HasItemCount(ITEM_SULFURON_INGOT))
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- }
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- if (player->GetReputationRank(59) < REP_FRIENDLY)
- SendGossipMenuFor(player, 3673, creature->GetGUID());
- else
- SendGossipMenuFor(player, 3677, creature->GetGUID());
+ if (me->IsVendor() && player->GetReputationRank(59) >= REP_FRIENDLY)
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- return true;
- }
+ if (!player->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) &&
+ !player->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) &&
+ player->HasItemCount(ITEM_SULFURON_INGOT))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ }
+
+ if (player->GetReputationRank(59) < REP_FRIENDLY)
+ SendGossipMenuFor(player, 3673, me->GetGUID());
+ else
+ SendGossipMenuFor(player, 3677, me->GetGUID());
+
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_lokhtos_darkbargainerAI(creature);
+ }
};
// npc_rocknot
@@ -483,41 +506,6 @@ class npc_rocknot : public CreatureScript
public:
npc_rocknot() : CreatureScript("npc_rocknot") { }
- bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*item*/) override
- {
- InstanceScript* instance = creature->GetInstanceScript();
- if (!instance)
- return true;
-
- if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL)
- return true;
-
- if (quest->GetQuestId() == QUEST_ALE)
- {
- if (instance->GetData(TYPE_BAR) != IN_PROGRESS)
- instance->SetData(TYPE_BAR, IN_PROGRESS);
-
- instance->SetData(TYPE_BAR, SPECIAL);
-
- //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress
- if (instance->GetData(TYPE_BAR) == SPECIAL)
- {
- creature->AI()->Talk(SAY_GOT_BEER);
- creature->CastSpell(creature, SPELL_DRUNKEN_RAGE, false);
-
- if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, creature->AI()))
- escortAI->Start(false, false);
- }
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_rocknotAI>(creature);
- }
-
struct npc_rocknotAI : public npc_escortAI
{
npc_rocknotAI(Creature* creature) : npc_escortAI(creature)
@@ -607,7 +595,35 @@ public:
npc_escortAI::UpdateAI(diff);
}
+
+ void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*item*/) override
+ {
+ if (instance->GetData(TYPE_BAR) == DONE || instance->GetData(TYPE_BAR) == SPECIAL)
+ return;
+
+ if (quest->GetQuestId() == QUEST_ALE)
+ {
+ if (instance->GetData(TYPE_BAR) != IN_PROGRESS)
+ instance->SetData(TYPE_BAR, IN_PROGRESS);
+
+ instance->SetData(TYPE_BAR, SPECIAL);
+
+ //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress
+ if (instance->GetData(TYPE_BAR) == SPECIAL)
+ {
+ Talk(SAY_GOT_BEER);
+ DoCastSelf(SPELL_DRUNKEN_RAGE, false);
+
+ Start(false, false);
+ }
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<npc_rocknotAI>(creature);
+ }
};
void AddSC_blackrock_depths()
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
index b9e9e6186b4..4c4bb437f54 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_coren_direbrew.cpp
@@ -121,10 +121,10 @@ public:
{
boss_coren_direbrewAI(Creature* creature) : BossAI(creature, DATA_COREN) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId != GOSSIP_ID)
- return;
+ return false;
if (gossipListId == GOSSIP_OPTION_FIGHT)
{
@@ -133,6 +133,8 @@ public:
}
else if (gossipListId == GOSSIP_OPTION_APOLOGIZE)
CloseGossipMenuFor(player);
+
+ return false;
}
void Reset() override
@@ -427,16 +429,16 @@ public:
void Reset() override
{
- go->SetLootState(GO_READY);
+ me->SetLootState(GO_READY);
_scheduler
.Schedule(Seconds(1), [this](TaskContext /*context*/)
{
- go->UseDoorOrButton(8);
- go->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true);
+ me->UseDoorOrButton(8);
+ me->CastSpell((Unit*)nullptr, SPELL_MOLE_MACHINE_EMERGE, true);
})
.Schedule(Seconds(4), [this](TaskContext /*context*/)
{
- if (GameObject* trap = go->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f))
+ if (GameObject* trap = me->FindNearestGameObject(GO_MOLE_MACHINE_TRAP, 3.0f))
{
trap->SetLootState(GO_ACTIVATED);
trap->UseDoorOrButton();
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
index 86ae8fdccee..b0ea64b47e6 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
@@ -51,49 +51,59 @@ enum Phases
class boss_gloomrel : public CreatureScript
{
-public:
- boss_gloomrel() : CreatureScript("boss_gloomrel") { }
+ public:
+ boss_gloomrel() : CreatureScript("boss_gloomrel") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ struct boss_gloomrelAI : public ScriptedAI
{
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
- SendGossipMenuFor(player, 2606, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+11:
- CloseGossipMenuFor(player);
- player->CastSpell(player, SPELL_LEARN_SMELT, false);
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22);
- SendGossipMenuFor(player, 2604, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+22:
- CloseGossipMenuFor(player);
- if (InstanceScript* instance = creature->GetInstanceScript())
+ boss_gloomrelAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
{
- //are 5 minutes expected? go template may have data to despawn when used at quest
- instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE*5);
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
+ SendGossipMenuFor(player, 2606, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 11:
+ CloseGossipMenuFor(player);
+ player->CastSpell(player, SPELL_LEARN_SMELT, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22);
+ SendGossipMenuFor(player, 2604, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 22:
+ CloseGossipMenuFor(player);
+ //are 5 minutes expected? go template may have data to despawn when used at quest
+ instance->DoRespawnGameObject(instance->GetGuidData(DATA_GO_CHALICE), MINUTE * 5);
+ break;
}
- break;
- }
- return true;
- }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 1 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN && !player->HasSpell(SPELL_SMELT_DARK_IRON))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TEACH_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- if (player->GetQuestRewardStatus(QUEST_SPECTRAL_CHALICE) == 0 && player->GetSkillValue(SKILL_MINING) >= DATA_SKILLPOINT_MIN)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_TRIBUTE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
+ };
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<boss_gloomrelAI>(creature);
+ }
};
enum DoomrelSpells
@@ -122,37 +132,6 @@ class boss_doomrel : public CreatureScript
public:
boss_doomrel() : CreatureScript("boss_doomrel") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- SendGossipMenuFor(player, 2605, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- CloseGossipMenuFor(player);
- //start event here
- creature->SetFaction(FACTION_HOSTILE);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- creature->AI()->AttackStart(player);
- InstanceScript* instance = creature->GetInstanceScript();
- if (instance)
- instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID());
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, 2601, creature->GetGUID());
-
- return true;
- }
-
struct boss_doomrelAI : public ScriptedAI
{
boss_doomrelAI(Creature* creature) : ScriptedAI(creature)
@@ -246,6 +225,38 @@ class boss_doomrel : public CreatureScript
DoMeleeAttackIfReady();
}
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_SELECT_DOOMREL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, 2605, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ CloseGossipMenuFor(player);
+ //start event here
+ me->SetFaction(FACTION_HOSTILE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ me->AI()->AttackStart(player);
+
+ _instance->SetGuidData(DATA_EVENSTARTER, player->GetGUID());
+ break;
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_CHALLENGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, 2601, me->GetGUID());
+
+ return true;
+ }
+
private:
InstanceScript* _instance;
EventMap _events;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
index ad9dfd240f9..7984f688dc2 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
@@ -371,7 +371,7 @@ public:
}
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID)
{
@@ -379,6 +379,7 @@ public:
Talk(SAY_GAMESBEGIN_1);
BeginEvent(player);
}
+ return false;
}
private:
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
index 56b6731da84..8cfd63f975d 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
@@ -19,6 +19,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
+#include "GameObjectAI.h"
#include "blackwing_lair.h"
#include "Player.h"
@@ -174,20 +175,33 @@ public:
class go_orb_of_domination : public GameObjectScript
{
-public:
- go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { }
+ public:
+ go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
- if (instance->GetData(DATA_EGG_EVENT) != DONE)
- if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED))
+ struct go_orb_of_dominationAI : public GameObjectAI
+ {
+ go_orb_of_dominationAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (instance->GetData(DATA_EGG_EVENT) != DONE)
{
- razorgore->Attack(player, true);
- player->CastSpell(razorgore, SPELL_MINDCONTROL);
+ if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED))
+ {
+ razorgore->Attack(player, true);
+ player->CastSpell(razorgore, SPELL_MINDCONTROL);
+ }
}
- return true;
- }
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_orb_of_dominationAI>(go);
+ }
};
class spell_egg_event : public SpellScriptLoader
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
index ffee18f54cf..55c048f50e8 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
@@ -222,13 +222,14 @@ public:
DoMeleeAttackIfReady();
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_ID && gossipListId == 0)
{
CloseGossipMenuFor(player);
BeginSpeech(player);
}
+ return false;
}
private:
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
index c061ae2a429..2949bbeb37e 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
@@ -196,13 +196,14 @@ class boss_majordomo : public CreatureScript
}
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == MENU_OPTION_YOU_CHALLENGED_US && gossipListId == OPTION_ID_YOU_CHALLENGED_US)
{
CloseGossipMenuFor(player);
DoAction(ACTION_START_RAGNAROS);
}
+ return false;
}
};
diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
index d6bbed40e9e..bf781c171e5 100644
--- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp
@@ -121,7 +121,7 @@ public:
}
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
if (gossipListId == 0)
{
@@ -132,6 +132,7 @@ public:
player->PlayerTalkClass->SendCloseGossip();
}
+ return false;
}
void NextStep(uint32 uiTimerStep, bool bNextStep = true, uint8 uiPhaseStep = 0)
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
index c40def9a5c6..7e4308c685f 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "karazhan.h"
@@ -415,25 +416,36 @@ class spell_rain_of_bones : public SpellScriptLoader
class go_blackened_urn : public GameObjectScript
{
-public:
- go_blackened_urn() : GameObjectScript("go_blackened_urn") { }
+ public:
+ go_blackened_urn() : GameObjectScript("go_blackened_urn") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
- {
- if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE))
- return false;
+ struct go_blackened_urnAI : GameObjectAI
+ {
+ go_blackened_urnAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- InstanceScript* instance = go->GetInstanceScript();
- if (!instance || instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS)
- return false;
+ InstanceScript* instance;
- if (Creature* nightbane = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_NIGHTBANE)))
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE))
+ return false;
+
+ if (instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS)
+ return false;
+
+ if (Creature* nightbane = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_NIGHTBANE)))
+ {
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
+ nightbane->AI()->DoAction(ACTION_SUMMON);
+ }
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
{
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
- nightbane->AI()->DoAction(ACTION_SUMMON);
+ return GetKarazhanAI<go_blackened_urnAI>(go);
}
- return false;
- }
};
void AddSC_boss_nightbane()
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
index 3a13da90857..55bbbbc0e03 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
@@ -816,7 +816,7 @@ class npc_grandmother : public CreatureScript
{
npc_grandmotherAI(Creature* creature) : ScriptedAI(creature) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == OPTION_WHAT_PHAT_LEWTS_YOU_HAVE && gossipListId == 0)
{
@@ -827,6 +827,7 @@ class npc_grandmother : public CreatureScript
me->DespawnOrUnsummon();
}
+ return false;
}
};
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index 264a21d880f..09dff7b6f0f 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -335,46 +335,43 @@ public:
}
}
}
- };
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- npc_barnesAI* pBarnesAI = ENSURE_AI(npc_barnes::npc_barnesAI, creature->AI());
- switch (action)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, 8971, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- CloseGossipMenuFor(player);
- pBarnesAI->StartEvent();
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- CloseGossipMenuFor(player);
- pBarnesAI->m_uiEventId = EVENT_OZ;
- TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- CloseGossipMenuFor(player);
- pBarnesAI->m_uiEventId = EVENT_HOOD;
- TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- CloseGossipMenuFor(player);
- pBarnesAI->m_uiEventId = EVENT_RAJ;
- TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str());
- break;
- }
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
- return true;
- }
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, OZ_GOSSIP2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, 8971, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ CloseGossipMenuFor(player);
+ StartEvent();
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ CloseGossipMenuFor(player);
+ m_uiEventId = EVENT_OZ;
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ CloseGossipMenuFor(player);
+ m_uiEventId = EVENT_HOOD;
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ CloseGossipMenuFor(player);
+ m_uiEventId = EVENT_RAJ;
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str());
+ break;
+ }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (InstanceScript* instance = creature->GetInstanceScript())
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
{
// Check for death of Moroes and if opera event is not done already
if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE)
@@ -388,25 +385,22 @@ public:
AddGossipItemFor(player, GOSSIP_ICON_DOT, OZ_GM_GOSSIP3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
}
- if (npc_barnesAI* pBarnesAI = CAST_AI(npc_barnes::npc_barnesAI, creature->AI()))
- {
- if (!pBarnesAI->RaidWiped)
- SendGossipMenuFor(player, 8970, creature->GetGUID());
- else
- SendGossipMenuFor(player, 8975, creature->GetGUID());
+ if (!RaidWiped)
+ SendGossipMenuFor(player, 8970, me->GetGUID());
+ else
+ SendGossipMenuFor(player, 8975, me->GetGUID());
- return true;
- }
+ return true;
}
- }
- SendGossipMenuFor(player, 8978, creature->GetGUID());
- return true;
- }
+ SendGossipMenuFor(player, 8978, me->GetGUID());
+ return true;
+ }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<npc_barnesAI>(creature);
+ return GetKarazhanAI<npc_barnesAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
index 9792ea0cfba..21e90d9a24d 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp
@@ -68,51 +68,6 @@ class npc_kalecgos : public CreatureScript
public:
npc_kalecgos() : CreatureScript("npc_kalecgos") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, 12500, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- SendGossipMenuFor(player, 12502, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- SendGossipMenuFor(player, 12606, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- SendGossipMenuFor(player, 12607, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- SendGossipMenuFor(player, 12608, creature->GetGUID());
- break;
- }
-
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, 12498, creature->GetGUID());
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_kalecgosAI(creature);
- }
-
struct npc_kalecgosAI : public ScriptedAI
{
npc_kalecgosAI(Creature* creature) : ScriptedAI(creature) { }
@@ -153,9 +108,55 @@ public:
}
}
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, 12500, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, 12502, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ SendGossipMenuFor(player, 12606, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ SendGossipMenuFor(player, 12607, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ SendGossipMenuFor(player, 12608, me->GetGUID());
+ break;
+ }
+
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAEL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, 12498, me->GetGUID());
+
+ return true;
+ }
+
private:
EventMap events;
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_kalecgosAI(creature);
+ }
};
void AddSC_magisters_terrace()
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index d4a17aca5be..8421c1658ab 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -23,6 +23,7 @@
#include "ScriptedEscortAI.h"
#include "CombatAI.h"
#include "PassiveAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
#include "SpellInfo.h"
#include "CreatureTextMgr.h"
@@ -319,19 +320,28 @@ public:
class go_acherus_soul_prison : public GameObjectScript
{
-public:
- go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { }
+ public:
+ go_acherus_soul_prison() : GameObjectScript("go_acherus_soul_prison") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (Creature* anchor = go->FindNearestCreature(29521, 15))
- if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID())
- if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID))
- ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player);
+ struct go_acherus_soul_prisonAI : public GameObjectAI
+ {
+ go_acherus_soul_prisonAI(GameObject* go) : GameObjectAI(go) { }
- return false;
- }
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (Creature* anchor = me->FindNearestCreature(29521, 15))
+ if (ObjectGuid prisonerGUID = anchor->AI()->GetGUID())
+ if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID))
+ ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player);
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_acherus_soul_prisonAI(go);
+ }
};
/*######
@@ -474,47 +484,6 @@ class npc_death_knight_initiate : public CreatureScript
public:
npc_death_knight_initiate() : CreatureScript("npc_death_knight_initiate") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF)
- {
- CloseGossipMenuFor(player);
-
- if (player->IsInCombat() || creature->IsInCombat())
- return true;
-
- if (npc_death_knight_initiateAI* pInitiateAI = CAST_AI(npc_death_knight_initiate::npc_death_knight_initiateAI, creature->AI()))
- {
- if (pInitiateAI->m_bIsDuelInProgress)
- return true;
- }
-
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15);
-
- player->CastSpell(creature, SPELL_DUEL, false);
- player->CastSpell(player, SPELL_DUEL_FLAG, true);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && creature->IsFullHealth())
- {
- if (player->HealthBelowPct(10))
- return true;
-
- if (player->IsInCombat() || creature->IsInCombat())
- return true;
-
- AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- }
- return true;
- }
-
struct npc_death_knight_initiateAI : public CombatAI
{
npc_death_knight_initiateAI(Creature* creature) : CombatAI(creature)
@@ -617,6 +586,45 @@ public:
CombatAI::UpdateAI(uiDiff);
}
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF)
+ {
+ CloseGossipMenuFor(player);
+
+ if (player->IsInCombat() || me->IsInCombat())
+ return true;
+
+ if (m_bIsDuelInProgress)
+ return true;
+
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15);
+
+ player->CastSpell(me, SPELL_DUEL, false);
+ player->CastSpell(player, SPELL_DUEL_FLAG, true);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_DEATH_CHALLENGE) == QUEST_STATUS_INCOMPLETE && me->IsFullHealth())
+ {
+ if (player->HealthBelowPct(10))
+ return true;
+
+ if (player->IsInCombat() || me->IsInCombat())
+ return true;
+
+ AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ }
+ return true;
+ }
};
CreatureAI* GetAI(Creature* creature) const override
@@ -750,13 +758,14 @@ public:
{
npc_salanar_the_horsemanAI(Creature* creature) : ScriptedAI(creature) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_SALANAR_MENU && gossipListId == GOSSIP_SALANAR_OPTION)
{
player->CastSpell(player, SPELL_REALM_OF_SHADOWS, true);
player->PlayerTalkClass->SendCloseGossip();
}
+ return false;
}
void SpellHit(Unit* caster, const SpellInfo* spell) override
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
index 59f510ded28..1ad704b2495 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
@@ -199,18 +199,6 @@ class npc_koltira_deathweaver : public CreatureScript
public:
npc_koltira_deathweaver() : CreatureScript("npc_koltira_deathweaver") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_BREAKOUT)
- {
- creature->SetStandState(UNIT_STAND_STATE_STAND);
-
- if (npc_escortAI* escortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI()))
- escortAI->Start(false, false, player->GetGUID());
- }
- return true;
- }
-
struct npc_koltira_deathweaverAI : public npc_escortAI
{
npc_koltira_deathweaverAI(Creature* creature) : npc_escortAI(creature)
@@ -354,6 +342,15 @@ public:
}
}
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_BREAKOUT)
+ {
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ Start(false, false, player->GetGUID());
+ }
+ }
+
private:
uint8 wave;
uint32 waveTimer;
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
index 396d5fb2fa1..24ead674f2b 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
@@ -270,38 +270,6 @@ class npc_highlord_darion_mograine : public CreatureScript
public:
npc_highlord_darion_mograine() : CreatureScript("npc_highlord_darion_mograine") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- CloseGossipMenuFor(player);
- ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->uiStep = 1;
- ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->Start(true, false, player->GetGUID());
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_highlord_darion_mograineAI(creature);
- }
-
struct npc_highlord_darion_mograineAI : public npc_escortAI
{
npc_highlord_darion_mograineAI(Creature* creature) : npc_escortAI(creature)
@@ -1636,8 +1604,40 @@ public:
temp->KillSelf();
}
}
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ CloseGossipMenuFor(player);
+ uiStep = 1;
+ Start(true, false, player->GetGUID());
+ break;
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (player->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, 0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_highlord_darion_mograineAI(creature);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index 3102b7461d5..c1b3bbd8aec 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellMgr.h"
#include "scarlet_monastery.h"
#include "LFGMgr.h"
@@ -876,32 +877,41 @@ enum LooselyTurnedSoil
class go_loosely_turned_soil : public GameObjectScript
{
-public:
- go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { }
+ public:
+ go_loosely_turned_soil() : GameObjectScript("go_loosely_turned_soil") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
- {
- if (InstanceScript* instance = player->GetInstanceScript())
- if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE)
- return true;
+ struct go_loosely_turned_soilAI : public GameObjectAI
+ {
+ go_loosely_turned_soilAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- return false;
- }
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS || player->GetQuestStatus(QUEST_CALL_THE_HEADLESS_HORSEMAN) != QUEST_STATUS_COMPLETE)
+ return true;
- bool OnQuestReward(Player* player, GameObject* go, Quest const* /*quest*/, uint32 /*opt*/) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
- if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS)
return false;
+ }
- player->AreaExploredOrEventHappens(11405);
- if (Creature* horseman = go->SummonCreature(HH_MOUNTED, FlightPoint[20].x, FlightPoint[20].y, FlightPoint[20].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0))
+ void QuestReward(Player* player, Quest const* /*quest*/, uint32 /*opt*/) override
+ {
+ if (instance->GetBossState(DATA_HORSEMAN_EVENT) == IN_PROGRESS)
+ return;
+
+ player->AreaExploredOrEventHappens(11405);
+ if (Creature* horseman = me->SummonCreature(HH_MOUNTED, FlightPoint[20].x, FlightPoint[20].y, FlightPoint[20].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0))
+ {
+ ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID();
+ ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode();
+ }
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
{
- ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID();
- ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode();
+ return GetScarletMonasteryAI<go_loosely_turned_soilAI>(go);
}
- return true;
- }
};
void npc_head::npc_headAI::Disappear()
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
index fede79df5d3..94db224f4ce 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/scarlet_monastery.h
@@ -60,10 +60,10 @@ enum SMGameObjectIds
GO_PUMPKIN_SHRINE = 186267
};
-template<class AI>
-inline AI* GetScarletMonasteryAI(Creature* creature)
+template<class AI, class T>
+inline AI* GetScarletMonasteryAI(T* obj)
{
- return GetInstanceAI<AI>(creature, SMScriptName);
+ return GetInstanceAI<AI>(obj, SMScriptName);
}
#endif // SCARLET_M_
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
index acb90732940..d2306164846 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
@@ -280,12 +280,22 @@ class go_brazier_of_the_herald : public GameObjectScript
public:
go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_brazier_of_the_heraldAI : public GameObjectAI
{
- go->UseDoorOrButton();
- go->PlayDirectSound(SOUND_SCREECH, 0);
- player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000);
- return true;
+ go_brazier_of_the_heraldAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ me->UseDoorOrButton();
+ me->PlayDirectSound(SOUND_SCREECH, 0);
+ player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 900000);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_brazier_of_the_heraldAI>(go);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp
index 1ca23799f83..485c7b3d6a5 100644
--- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/boss_apothecary_hummel.cpp
@@ -99,7 +99,7 @@ class boss_apothecary_hummel : public CreatureScript
{
boss_apothecary_hummelAI(Creature* creature) : BossAI(creature, DATA_APOTHECARY_HUMMEL), _deadCount(0), _isDead(false) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_MENU_HUMMEL && gossipListId == GOSSIP_OPTION_START)
{
@@ -107,6 +107,7 @@ class boss_apothecary_hummel : public CreatureScript
CloseGossipMenuFor(player);
DoAction(ACTION_START_EVENT);
}
+ return false;
}
void Reset() override
@@ -261,6 +262,12 @@ class boss_apothecary_hummel : public CreatureScript
DoMeleeAttackIfReady();
}
+ void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override
+ {
+ if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED)
+ DoAction(ACTION_START_EVENT);
+ }
+
private:
uint8 _deadCount;
bool _isDead;
@@ -270,14 +277,6 @@ class boss_apothecary_hummel : public CreatureScript
{
return GetInstanceAI<boss_apothecary_hummelAI>(creature);
}
-
- bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override
- {
- if (quest->GetQuestId() == QUEST_YOUVE_BEEN_SERVED)
- creature->AI()->DoAction(ACTION_START_EVENT);
-
- return true;
- }
};
struct npc_apothecary_genericAI : public ScriptedAI
diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
index f1cc7223d27..077a5664b93 100644
--- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
@@ -67,36 +67,6 @@ class npc_shadowfang_prisoner : public CreatureScript
public:
npc_shadowfang_prisoner() : CreatureScript("npc_shadowfang_prisoner") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_shadowfang_prisonerAI>(creature);
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- CloseGossipMenuFor(player);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_shadowfang_prisoner::npc_shadowfang_prisonerAI, creature->AI()))
- pEscortAI->Start(false, false);
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- InstanceScript* instance = creature->GetInstanceScript();
-
- if (instance && instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE)
- AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
-
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-
struct npc_shadowfang_prisonerAI : public npc_escortAI
{
npc_shadowfang_prisonerAI(Creature* creature) : npc_escortAI(creature)
@@ -143,8 +113,33 @@ public:
void Reset() override { }
void EnterCombat(Unit* /*who*/) override { }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ {
+ CloseGossipMenuFor(player);
+ Start(false, false);
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE)
+ AddGossipItemFor(player, Player::GetDefaultGossipMenuForSource(me), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<npc_shadowfang_prisonerAI>(creature);
+ }
};
class npc_arugal_voidwalker : public CreatureScript
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
index 3ccf0e3dd19..c67a1c2b4bb 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp
@@ -32,6 +32,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "stratholme.h"
#include "Group.h"
#include "Player.h"
@@ -43,41 +44,48 @@ EndContentData */
class go_gauntlet_gate : public GameObjectScript
{
-public:
- go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { }
-
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- InstanceScript* instance = go->GetInstanceScript();
+ public:
+ go_gauntlet_gate() : GameObjectScript("go_gauntlet_gate") { }
- if (!instance)
- return false;
+ struct go_gauntlet_gateAI : public GameObjectAI
+ {
+ go_gauntlet_gateAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED)
- return false;
+ InstanceScript* instance;
- if (Group* group = player->GetGroup())
- {
- for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- Player* pGroupie = itr->GetSource();
- if (!pGroupie || !pGroupie->IsInMap(player))
- continue;
-
- if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
- !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) &&
- pGroupie->GetMap() == go->GetMap())
- pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true);
- }
- } else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
+ if (instance->GetData(TYPE_BARON_RUN) != NOT_STARTED)
+ return false;
+
+ if (Group* group = player->GetGroup())
+ {
+ for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ {
+ Player* pGroupie = itr->GetSource();
+ if (!pGroupie || !pGroupie->IsInMap(player))
+ continue;
+
+ if (pGroupie->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
+ !pGroupie->HasAura(SPELL_BARON_ULTIMATUM) &&
+ pGroupie->GetMap() == me->GetMap())
+ pGroupie->CastSpell(pGroupie, SPELL_BARON_ULTIMATUM, true);
+ }
+ }
+ else if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE &&
!player->HasAura(SPELL_BARON_ULTIMATUM) &&
- player->GetMap() == go->GetMap())
+ player->GetMap() == me->GetMap())
player->CastSpell(player, SPELL_BARON_ULTIMATUM, true);
- instance->SetData(TYPE_BARON_RUN, IN_PROGRESS);
- return false;
- }
+ instance->SetData(TYPE_BARON_RUN, IN_PROGRESS);
+ return false;
+ }
+ };
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_gauntlet_gateAI>(go);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
index e6be567052d..581c5b3afbd 100644
--- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
+++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
@@ -29,6 +29,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "sunken_temple.h"
#include "Player.h"
@@ -63,16 +64,26 @@ class at_malfurion_stormrage : public AreaTriggerScript
class go_atalai_statue : public GameObjectScript
{
-public:
- go_atalai_statue() : GameObjectScript("go_atalai_statue") { }
+ public:
+ go_atalai_statue() : GameObjectScript("go_atalai_statue") { }
+
+ struct go_atalai_statueAI : public GameObjectAI
+ {
+ go_atalai_statueAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (InstanceScript* instance = player->GetInstanceScript())
- instance->SetData(EVENT_STATE, go->GetEntry());
- return false;
- }
+ InstanceScript* instance;
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ instance->SetData(EVENT_STATE, me->GetEntry());
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_atalai_statueAI>(go);
+ }
};
void AddSC_sunken_temple()
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 34289a5a414..89a1de21f31 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "sunwell_plateau.h"
#include "Player.h"
#include "WorldSession.h"
@@ -536,27 +537,35 @@ class kalecgos_teleporter : public GameObjectScript
public:
kalecgos_teleporter() : GameObjectScript("kalecgos_teleporter") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct kalecgos_teleporterAI : public GameObjectAI
{
-#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0
- uint8 SpectralPlayers = 0;
- Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers();
- for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
- {
- if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5)
- ++SpectralPlayers;
- }
+ kalecgos_teleporterAI(GameObject* go) : GameObjectAI(go) { }
- if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM)
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
+#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0
+ uint8 SpectralPlayers = 0;
+ Map::PlayerList const &PlayerList = go->GetMap()->GetPlayers();
+ for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ {
+ if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5)
+ ++SpectralPlayers;
+ }
+
+ if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM)
+ {
+ return true;
+ }
+#endif
+
+ player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true);
return true;
}
-#else
- (void)go;
-#endif
+ };
- player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true);
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetSunwellPlateauAI<kalecgos_teleporterAI>(go);
}
};
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index 8ad5f24b639..557e566fb2f 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -26,6 +26,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "sunwell_plateau.h"
#include <math.h>
#include "Player.h"
@@ -359,25 +360,36 @@ public:
class go_orb_of_the_blue_flight : public GameObjectScript
{
-public:
- go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { }
+ public:
+ go_orb_of_the_blue_flight() : GameObjectScript("go_orb_of_the_blue_flight") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (go->GetFaction() == 35)
+ struct go_orb_of_the_blue_flightAI : public GameObjectAI
{
- InstanceScript* instance = go->GetInstanceScript();
- player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
- player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false);
- go->SetFaction(0);
+ go_orb_of_the_blue_flightAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (me->GetFaction() == 35)
+ {
+ player->SummonCreature(NPC_POWER_OF_THE_BLUE_DRAGONFLIGHT, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000);
+ player->CastSpell(player, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, false);
+ me->SetFaction(0);
- if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ)))
- ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames();
+ if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_KALECGOS_KJ)))
+ ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames();
- go->Refresh();
+ me->Refresh();
+ }
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetSunwellPlateauAI<go_orb_of_the_blue_flightAI>(go);
}
- return true;
- }
};
//AI for Kil'jaeden Event Controller
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
index eb99ba3ebae..f843f011ff2 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
@@ -112,10 +112,10 @@ enum SWPGameObjectIds
GO_MURUS_GATE_2 = 188118
};
-template<class AI>
-AI* GetSunwellPlateauAI(Creature* creature)
+template<class AI, class T>
+AI* GetSunwellPlateauAI(T* obj)
{
- return GetInstanceAI<AI>(creature, SunwellPlateauScriptName);
+ return GetInstanceAI<AI>(obj, SunwellPlateauScriptName);
}
#endif // SUNWELL_PLATEAU_H
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
index eae2d3a0470..e3b658e76d9 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
@@ -28,6 +28,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "uldaman.h"
#include "Player.h"
@@ -394,22 +395,26 @@ EndScriptData */
class go_altar_of_archaedas : public GameObjectScript
{
public:
+ go_altar_of_archaedas() : GameObjectScript("go_altar_of_archaedas") { }
- go_altar_of_archaedas()
- : GameObjectScript("go_altar_of_archaedas")
+ struct go_altar_of_archaedasAI : public GameObjectAI
{
- }
+ go_altar_of_archaedasAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
- {
- InstanceScript* instance = player->GetInstanceScript();
- if (!instance)
- return false;
+ InstanceScript* instance;
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ player->CastSpell(player, SPELL_BOSS_OBJECT_VISUAL, false);
- player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false);
+ instance->SetGuidData(0, player->GetGUID()); // activate archaedas
+ return false;
+ }
+ };
- instance->SetGuidData(0, player->GetGUID()); // activate archaedas
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_altar_of_archaedasAI>(go);
}
};
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
index 0d36c1e3aa1..f2571748332 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
@@ -31,6 +31,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "uldaman.h"
#include "Player.h"
@@ -116,16 +117,26 @@ class npc_jadespine_basilisk : public CreatureScript
class go_keystone_chamber : public GameObjectScript
{
-public:
- go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { }
+ public:
+ go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { }
+
+ struct go_keystone_chamberAI : public GameObjectAI
+ {
+ go_keystone_chamberAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
- instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state.
+ InstanceScript* instance;
- return false;
- }
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ instance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state.
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<go_keystone_chamberAI>(go);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
index f23a9fab812..affb1ab9406 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
@@ -136,42 +136,52 @@ class npc_zulaman_hostage : public CreatureScript
public:
npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_zulaman_hostageAI : public ScriptedAI
{
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
+ npc_zulaman_hostageAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
- CloseGossipMenuFor(player);
+ InstanceScript* instance;
- if (!creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
+ bool GossipHello(Player* player) override
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
return true;
+ }
- creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
-
- if (InstanceScript* instance = creature->GetInstanceScript())
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ CloseGossipMenuFor(player);
+
+ if (!me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
+ return true;
+
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+
//uint8 progress = instance->GetData(DATA_CHESTLOOTED);
instance->SetData(DATA_CHESTLOOTED, 0);
float x, y, z;
- creature->GetPosition(x, y, z);
- uint32 entry = creature->GetEntry();
+ me->GetPosition(x, y, z);
+ uint32 entry = me->GetEntry();
for (uint8 i = 0; i < 4; ++i)
{
if (HostageEntry[i] == entry)
{
- creature->SummonGameObject(ChestEntry[i], Position(x - 2, y, z, 0.f), G3D::Quat(), 0);
+ me->SummonGameObject(ChestEntry[i], Position(x - 2, y, z, 0.f), G3D::Quat(), 0);
break;
}
}
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetZulAmanAI<npc_zulaman_hostageAI>(creature);
}
};
@@ -268,7 +278,7 @@ class npc_harrison_jones : public CreatureScript
void EnterCombat(Unit* /*who*/) override { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId)
{
@@ -279,6 +289,7 @@ class npc_harrison_jones : public CreatureScript
_gongEvent = GONG_EVENT_1;
_gongTimer = 4000;
}
+ return false;
}
void SpellHit(Unit*, const SpellInfo* spell) override
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 6a2435e2147..9110ac28069 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
@@ -26,6 +26,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellInfo.h"
#include "zulgurub.h"
@@ -440,17 +441,25 @@ Position const PosSummonArlokk[1] =
class go_gong_of_bethekk : public GameObjectScript
{
- public: go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { }
+ public:
+ go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_gong_of_bethekkAI : public GameObjectAI
{
- if (go->GetInstanceScript())
+ go_gong_of_bethekkAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SendCustomAnim(0);
- go->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000);
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->SendCustomAnim(0);
+ me->SummonCreature(NPC_ARLOKK, PosSummonArlokk[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 600000);
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetZulGurubAI<go_gong_of_bethekkAI>(go);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 9359f37206a..4148b4d9e08 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -67,10 +67,10 @@ enum ZGGameObjectIds
GO_GONG_OF_BETHEKK = 180526 // Arlokk Event
};
-template<class AI>
-AI* GetZulGurubAI(Creature* creature)
+template<class AI, class T>
+AI* GetZulGurubAI(T* obj)
{
- return GetInstanceAI<AI>(creature, ZGScriptName);
+ return GetInstanceAI<AI>(obj, ZGScriptName);
}
#endif
diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
index 43c5dbdc584..dd2b3d32f83 100644
--- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
@@ -114,7 +114,7 @@ class npc_professor_phizzlethorpe : public CreatureScript
Talk(SAY_AGGRO);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
index 892f9929968..e6170d0e65e 100644
--- a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
@@ -45,47 +45,47 @@ enum RaggedJohn
class npc_ragged_john : public CreatureScript
{
-public:
- npc_ragged_john() : CreatureScript("npc_ragged_john") { }
+ public:
+ npc_ragged_john() : CreatureScript("npc_ragged_john") { }
- struct npc_ragged_johnAI : public ScriptedAI
- {
- npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) { }
+ struct npc_ragged_johnAI : public ScriptedAI
+ {
+ npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) { }
- void Reset() override { }
+ void Reset() override { }
- void MoveInLineOfSight(Unit* who) override
- {
- if (who->HasAura(SPELL_MOTHERS_MILK))
+ void MoveInLineOfSight(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me))
+ if (who->HasAura(SPELL_MOTHERS_MILK))
{
- DoCast(who, SPELL_WICKED_MILKING);
- if (Player* player = who->ToPlayer())
- player->AreaExploredOrEventHappens(QUEST_MOTHERS_MILK);
+ if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me))
+ {
+ DoCast(who, SPELL_WICKED_MILKING);
+ if (Player* player = who->ToPlayer())
+ player->AreaExploredOrEventHappens(QUEST_MOTHERS_MILK);
+ }
}
+
+ ScriptedAI::MoveInLineOfSight(who);
}
- ScriptedAI::MoveInLineOfSight(who);
- }
+ void EnterCombat(Unit* /*who*/) override { }
- void EnterCombat(Unit* /*who*/) override { }
- };
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ {
+ player->PrepareQuestMenu(me->GetGUID());
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ }
+ return true;
+ }
+ };
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
+ CreatureAI* GetAI(Creature* creature) const override
{
- player->PrepareQuestMenu(creature->GetGUID());
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ return new npc_ragged_johnAI(creature);
}
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_ragged_johnAI(creature);
- }
};
void AddSC_burning_steppes()
diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
index 2156b772e75..d562b95370d 100644
--- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
@@ -126,19 +126,16 @@ public:
if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20))
Cage->SetGoState(GO_STATE_READY);
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- creature->SetFaction(FACTION_QUEST_ESCAPE);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_ranger_lilatha::npc_ranger_lilathaAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
+ if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS)
+ {
+ me->SetFaction(FACTION_QUEST_ESCAPE);
+ Start(true, false, player->GetGUID());
+ }
}
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
index 66e999ec85a..b2610a82038 100644
--- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
@@ -75,7 +75,7 @@ public:
summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_RESQUE_OOX_09)
{
@@ -235,7 +235,7 @@ public:
summoned->GetMotionMaster()->MovePoint(0, AmbushMoveTo[spawnId]);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_RINJI_TRAPPED)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
index df55de6f35f..e5545231083 100644
--- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
@@ -63,7 +63,7 @@ public:
Initialize();
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_MISSING_IN_ACTION)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index 9e71280a2a8..c194b700830 100644
--- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
@@ -114,20 +114,16 @@ public:
{
Talk(SAY_AGGRO, who);
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCORTING)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- creature->AI()->Talk(SAY_QUESTACCEPT, player);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_deathstalker_erland::npc_deathstalker_erlandAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
+ if (quest->GetQuestId() == QUEST_ESCORTING)
+ {
+ Talk(SAY_QUESTACCEPT, player);
+ Start(true, false, player->GetGUID());
+ }
}
-
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
@@ -176,24 +172,6 @@ class pyrewood_ambush : public CreatureScript
public:
pyrewood_ambush() : CreatureScript("pyrewood_ambush") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest *quest) override
- {
- if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress)
- {
- ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true;
- ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0;
- ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0;
- ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID();
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new pyrewood_ambushAI(creature);
- }
-
struct pyrewood_ambushAI : public ScriptedAI
{
pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me)
@@ -331,7 +309,23 @@ public:
}
++Phase; //prepare next phase
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !QuestInProgress)
+ {
+ QuestInProgress = true;
+ Phase = 0;
+ KillCount = 0;
+ PlayerGUID = player->GetGUID();
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new pyrewood_ambushAI(creature);
+ }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index 704253f2cfc..6b1652a0acc 100644
--- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
@@ -52,21 +52,6 @@ class npc_bartleby : public CreatureScript
public:
npc_bartleby() : CreatureScript("npc_bartleby") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_BEAT)
- {
- creature->SetFaction(FACTION_ENEMY);
- creature->AI()->AttackStart(player);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_bartlebyAI(creature);
- }
-
struct npc_bartlebyAI : public ScriptedAI
{
npc_bartlebyAI(Creature* creature) : ScriptedAI(creature)
@@ -105,7 +90,21 @@ public:
EnterEvadeMode();
}
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_BEAT)
+ {
+ me->SetFaction(FACTION_ENEMY);
+ AttackStart(player);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_bartlebyAI(creature);
+ }
};
/*######
@@ -541,18 +540,26 @@ class npc_tyrion : public CreatureScript
public:
npc_tyrion() : CreatureScript("npc_tyrion") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
+ struct npc_tyrionAI : ScriptedAI
{
- if (quest->GetQuestId() == QUEST_THE_ATTACK)
+ npc_tyrionAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true))
+ if (quest->GetQuestId() == QUEST_THE_ATTACK)
{
- ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID());
- ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f);
+ if (Creature* spybot = me->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true))
+ {
+ ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, spybot->AI())->Start(false, false, player->GetGUID());
+ ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, spybot->AI())->SetMaxPlayerDistance(200.0f);
+ }
}
- return true;
}
- return false;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_tyrionAI(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
index 0aabe071a0d..5cd85585a9d 100644
--- a/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
@@ -61,7 +61,7 @@ public:
Talk(SAY_ATTACKED, who);
}
- void sQuestAccept(Player* player, Quest const* quest) override
+ void QuestAccept(Player* player, Quest const* quest) override
{
if (quest->GetQuestId() == QUEST_GALENS_ESCAPE)
{
diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
index 6d54c9f0f88..37be4a844cc 100644
--- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
@@ -31,6 +31,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "Player.h"
/*######
@@ -50,22 +51,6 @@ class npc_calvin_montague : public CreatureScript
public:
npc_calvin_montague() : CreatureScript("npc_calvin_montague") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_590)
- {
- creature->SetFaction(FACTION_HOSTILE);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- ENSURE_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_calvin_montagueAI(creature);
- }
-
struct npc_calvin_montagueAI : public ScriptedAI
{
npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature)
@@ -159,7 +144,22 @@ public:
DoMeleeAttackIfReady();
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_590)
+ {
+ me->SetFaction(FACTION_HOSTILE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ AttackStart(player);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_calvin_montagueAI(creature);
+ }
};
/*######
@@ -177,45 +177,65 @@ enum Mausoleum
class go_mausoleum_door : public GameObjectScript
{
-public:
- go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { }
+ public:
+ go_mausoleum_door() : GameObjectScript("go_mausoleum_door") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
- {
- if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
- return false;
+ struct go_mausoleum_doorAI : public GameObjectAI
+ {
+ go_mausoleum_doorAI(GameObject* go) : GameObjectAI(go) { }
- if (!player->FindNearestCreature(NPC_ULAG, 50.0f))
- if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f))
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- pTrigger->SetGoState(GO_STATE_READY);
- player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
+ if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
+ return false;
+
+ if (!player->FindNearestCreature(NPC_ULAG, 50.0f))
+ {
+ if (GameObject* pTrigger = player->FindNearestGameObject(GO_TRIGGER, 30.0f))
+ {
+ pTrigger->SetGoState(GO_STATE_READY);
+ player->SummonCreature(NPC_ULAG, 2390.26f, 336.47f, 40.01f, 2.26f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 300000);
+ return false;
+ }
+ }
return false;
}
+ };
- return false;
- }
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_mausoleum_doorAI(go);
+ }
};
class go_mausoleum_trigger : public GameObjectScript
{
-public:
- go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { }
+ public:
+ go_mausoleum_trigger() : GameObjectScript("go_mausoleum_trigger") { }
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
- return false;
+ struct go_mausoleum_triggerAI : public GameObjectAI
+ {
+ go_mausoleum_triggerAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE)
+ return false;
+
+ if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f))
+ {
+ me->SetGoState(GO_STATE_ACTIVE);
+ pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ return true;
+ }
+ return false;
+ }
+ };
- if (GameObject* pDoor = player->FindNearestGameObject(GO_DOOR, 30.0f))
+ GameObjectAI* GetAI(GameObject* go) const override
{
- go->SetGoState(GO_STATE_ACTIVE);
- pDoor->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- return true;
+ return new go_mausoleum_triggerAI(go);
}
-
- return false;
- }
};
void AddSC_tirisfal_glades()
diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
index 3245a4e147e..e8bb32bf3a9 100644
--- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
@@ -96,14 +96,6 @@ class npc_lady_sylvanas_windrunner : public CreatureScript
public:
npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { }
- bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override
- {
- if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY)
- creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER);
-
- return true;
- }
-
struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI
{
npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature)
@@ -238,6 +230,12 @@ public:
DoMeleeAttackIfReady();
}
+ void QuestReward(Player* player, Quest const* quest, uint32 /*opt*/) override
+ {
+ if (quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY)
+ SetGUID(player->GetGUID(), GUID_EVENT_INVOKER);
+ }
+
private:
EventMap _events;
bool LamentEvent;
diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index 11857b038cb..5839d40c15f 100644
--- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
@@ -59,62 +59,73 @@ enum DithersAndArbington
class npcs_dithers_and_arbington : public CreatureScript
{
-public:
- npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { }
+ public:
+ npcs_dithers_and_arbington() : CreatureScript("npcs_dithers_and_arbington") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ struct npcs_dithers_and_arbingtonAI : public ScriptedAI
{
- case GOSSIP_ACTION_TRADE:
- player->GetSession()->SendListInventory(creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, NPC_TEXT_OSSEOUS_AGITATORS, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_1, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_2, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, NPC_TEXT_ECTOPLASMIC_RESONATORS, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- CloseGossipMenuFor(player);
- creature->CastSpell(player, CREATE_ITEM_VITREOUS_FOCUSER, false);
- break;
- }
- return true;
- }
+ npcs_dithers_and_arbingtonAI(Creature* creature) : ScriptedAI(creature) { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_TRADE:
+ player->GetSession()->SendListInventory(me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, NPC_TEXT_OSSEOUS_AGITATORS, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_1, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, NPC_TEXT_SOMATIC_INTENSIFIERS_2, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ AddGossipItemFor(player, GOSSIP_MENU_ID_VITREOUS_FOCUSER, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, NPC_TEXT_ECTOPLASMIC_RESONATORS, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ CloseGossipMenuFor(player);
+ DoCast(player, CREATE_ITEM_VITREOUS_FOCUSER, false);
+ break;
+ }
+ return true;
+ }
- if (creature->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (me->IsVendor())
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+
+ if (player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_H) || player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_A))
+ {
+ AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_FELSTONE_FIELD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_DALSON_S_TEARS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_WRITHING_HAUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_GAHRRON_S_WITH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ SendGossipMenuFor(player, NPC_TEXT_LET_S_GET_TO_WORK, me->GetGUID());
+ }
+ else
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+
+ return true;
+ }
+ };
- if (player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_H) || player->GetQuestRewardStatus(QUEST_MISSION_ACCOMPLISHED_A))
+ CreatureAI* GetAI(Creature* creature) const override
{
- AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_FELSTONE_FIELD, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_DALSON_S_TEARS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_WRITHING_HAUNT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- AddGossipItemFor(player, GOSSIP_MENU_ID_LETS_GET_TO_WORK, GOSSIP_ITEM_ID_GAHRRON_S_WITH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- SendGossipMenuFor(player, NPC_TEXT_LET_S_GET_TO_WORK, creature->GetGUID());
+ return new npcs_dithers_and_arbingtonAI(creature);
}
- else
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
};
/*######
diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
index c5fd05924da..ecc4e805595 100644
--- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
@@ -149,22 +149,30 @@ class npc_mikhail : public CreatureScript
public:
npc_mikhail() : CreatureScript("npc_mikhail") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
+ struct npc_mikhailAI : public ScriptedAI
{
- if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11)
- {
- Creature* pSlim = creature->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f);
+ npc_mikhailAI(Creature* creature) : ScriptedAI(creature) { }
- if (!pSlim)
- return false;
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_MISSING_DIPLO_PT11)
+ {
+ Creature* slim = me->FindNearestCreature(NPC_TAPOKE_SLIM_JAHN, 25.0f);
+ if (!slim)
+ return;
- if (!pSlim->HasStealthAura())
- pSlim->CastSpell(pSlim, SPELL_STEALTH, true);
+ if (!slim->HasStealthAura())
+ slim->CastSpell(slim, SPELL_STEALTH, true);
- if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* pEscortAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, pSlim->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
+ if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* slimAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, slim->AI()))
+ slimAI->Start(false, false, player->GetGUID(), quest);
+ }
}
- return false;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_mikhailAI(creature);
}
};
diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp
index 11877f3e372..cc38aed2964 100644
--- a/src/server/scripts/Events/childrens_week.cpp
+++ b/src/server/scripts/Events/childrens_week.cpp
@@ -674,7 +674,7 @@ class npc_the_etymidian : public CreatureScript
Initialize();
}
- void sQuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override
+ void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override
{
if (quest->GetQuestId() != QUEST_THE_ACTIVATION_RUNE)
return;
diff --git a/src/server/scripts/Events/fireworks_show.cpp b/src/server/scripts/Events/fireworks_show.cpp
index 97c0e33b944..b6b9cacf053 100644
--- a/src/server/scripts/Events/fireworks_show.cpp
+++ b/src/server/scripts/Events/fireworks_show.cpp
@@ -843,12 +843,12 @@ public:
{
case EVENT_CHEER:
{
- go->PlayDistanceSound(CheerPicker());
+ me->PlayDistanceSound(CheerPicker());
break;
}
case EVENT_FIRE:
{
- auto it = pos.find(go->GetZoneId());
+ auto it = pos.find(me->GetZoneId());
if (it != pos.end())
{
Position const& rndpos = Trinity::Containers::SelectRandomContainerElement(it->second);
@@ -857,7 +857,7 @@ public:
if (_big)
{
- if (GameObject* firework = go->SummonGameObject(FireworksBIGOnlyPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300))
+ if (GameObject* firework = me->SummonGameObject(FireworksBIGOnlyPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300))
{
firework->SetRespawnTime(0);
firework->Delete();
@@ -865,7 +865,7 @@ public:
}
else
{
- if (GameObject* firework = go->SummonGameObject(FireworksPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300))
+ if (GameObject* firework = me->SummonGameObject(FireworksPicker(), rndpos, G3D::Quat(0.f, 0.f, rndrot, rndrot2), 300))
{
firework->SetRespawnTime(0);
firework->Delete();
diff --git a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
index 333780d2b7d..0313a58f8d5 100644
--- a/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
@@ -20,6 +20,7 @@
#include "ScriptedGossip.h"
#include "blackfathom_deeps.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
enum Spells
@@ -35,35 +36,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 GetInstanceAI<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->SetFlag(GAMEOBJECT_FLAGS, 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->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- instance->SetData(DATA_FIRE, instance->GetData(DATA_FIRE) + 1);
- return true;
+ return GetInstanceAI<go_blackfathom_fireAI>(go);
}
- return false;
- }
};
class npc_blackfathom_deeps_event : public CreatureScript
@@ -226,9 +243,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/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
index 231d2ccb818..83cb6d7d91c 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
@@ -50,208 +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
+ {
+ 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
{
- 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 GetInstanceAI<npc_jaina_proudmooreAI>(creature);
}
- 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 (!creature->GetInstanceScript())
- return NULL;
-
- hyjalAI* ai = new hyjalAI(creature);
-
- 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;
- }
-
};
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)
+ public:
+ npc_thrall() : CreatureScript("npc_thrall") { }
+
+ struct npc_thrallAI : 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 AnetheronEvent = ai->GetInstanceData(DATA_ANETHERONEVENT);
- // Only let them start the Horde phases if Anetheron is dead.
- if (AnetheronEvent == DONE && ai->GetInstanceData(DATA_ALLIANCE_RETREAT))
+ 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
{
- 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);
+ return GetInstanceAI<npc_thrallAI>(creature);
}
-
- 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 (!creature->GetInstanceScript())
- return NULL;
-
- hyjalAI* ai = new hyjalAI(creature);
-
- 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;
- }
-
};
class npc_tyrande_whisperwind : public CreatureScript
{
-public:
- npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- if (!creature->GetInstanceScript())
- return NULL;
-
- hyjalAI* ai = new hyjalAI(creature);
- ai->Reset();
- ai->EnterEvadeMode();
- return ai;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- 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);
+ public:
+ npc_tyrande_whisperwind() : CreatureScript("npc_tyrande_whisperwind") { }
- SendGossipMenuFor(player, 907, creature->GetGUID());
+ struct npc_tyrande_whisperwindAI : public hyjalAI
+ {
+ 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
+ {
+ return GetInstanceAI<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 41bb7971635..da1080c5d27 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -254,98 +254,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->RemoveFlag(UNIT_NPC_FLAGS, 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 GetInstanceAI<npc_arthasAI>(creature);
- }
-
struct npc_arthasAI : public npc_escortAI
{
npc_arthasAI(Creature* creature) : npc_escortAI(creature)
@@ -1231,8 +1139,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->RemoveFlag(UNIT_NPC_FLAGS, 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 GetInstanceAI<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 f3b302497da..380971d6aa5 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
@@ -27,6 +27,7 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "old_hillsbrad.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
/*######
## go_barrel_old_hillsbrad
@@ -37,19 +38,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 GetInstanceAI<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 0095a727c87..2a4d13d1634 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
@@ -56,41 +56,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 GetInstanceAI<npc_erozionAI>(creature);
}
};
@@ -185,93 +195,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 GetInstanceAI<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->GetGUID());
- }
-
- 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)
@@ -542,8 +465,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->GetGUID());
+ }
+
+ 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 GetInstanceAI<npc_thrall_old_hillsbradAI>(creature);
+ }
};
/*######
@@ -563,48 +562,6 @@ class npc_taretha : public CreatureScript
public:
npc_taretha() : CreatureScript("npc_taretha") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<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)
@@ -634,8 +591,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 GetInstanceAI<npc_tarethaAI>(creature);
+ }
};
/*######
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
index bf1b0a45984..19a289485fc 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
@@ -29,6 +29,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "ScriptedGossip.h"
#include "razorfen_downs.h"
#include "Player.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 2501b399d11..fa78d8518c1 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
@@ -61,10 +61,10 @@ enum RFDGameObjectIds
GO_BELNISTRASZS_BRAZIER = 152097
};
-template<class AI>
-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 07f9afcd5cd..88a3b2b51fb 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
@@ -51,7 +51,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 14ccca00ca1..66a6c3b42e6 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "ruins_of_ahnqiraj.h"
#include "Player.h"
#include "SpellInfo.h"
@@ -278,18 +279,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 GetInstanceAI<go_ossirian_crystalAI>(go);
}
};
diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
index bd77e4c9546..fcbdfd547a6 100644
--- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
+++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp
@@ -79,60 +79,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 GetInstanceAI<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->RemoveFlag(UNIT_FIELD_FLAGS, 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)
@@ -369,8 +315,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->RemoveFlag(UNIT_FIELD_FLAGS, 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 GetInstanceAI<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 51bc5b7a945..9e014f7f6d9 100644
--- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp
@@ -31,6 +31,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
+#include "GameObjectAI.h"
#include "zulfarrak.h"
#include "Player.h"
@@ -64,42 +65,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 GetInstanceAI<npc_sergeant_blyAI>(creature);
- }
-
struct npc_sergeant_blyAI : public ScriptedAI
{
npc_sergeant_blyAI(Creature* creature) : ScriptedAI(creature)
@@ -198,8 +163,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 GetInstanceAI<npc_sergeant_blyAI>(creature);
+ }
};
/*######
@@ -211,32 +208,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, ENTRY_BLY, 1884.99f, 1263, 41.52f);
- initBlyCrewMember(instance, ENTRY_RAVEN, 1882.5f, 1263, 41.52f);
- initBlyCrewMember(instance, ENTRY_ORO, 1886.47f, 1270.68f, 41.68f);
- initBlyCrewMember(instance, ENTRY_WEEGLI, 1890, 1263, 41.52f);
- initBlyCrewMember(instance, 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, uint32 entry, float x, float y, float z)
- {
- if (Creature* crew = instance->instance->GetCreature(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 GetInstanceAI<go_troll_cageAI>(go);
}
};
@@ -265,44 +271,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 GetInstanceAI<npc_weegli_blastfuseAI>(creature);
- }
-
struct npc_weegli_blastfuseAI : public ScriptedAI
{
npc_weegli_blastfuseAI(Creature* creature) : ScriptedAI(creature)
@@ -375,11 +343,6 @@ public:
};
}
- void DoAction(int32 /*param*/) override
- {
- DestroyDoor();
- }
-
void DestroyDoor()
{
if (me->IsAlive())
@@ -391,8 +354,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 GetInstanceAI<npc_weegli_blastfuseAI>(creature);
+ }
};
/*######
@@ -412,20 +409,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/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
index ecd1f2e4d60..2b8f0550dd0 100644
--- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp
+++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
@@ -30,6 +30,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
#include "SpellScript.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_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp
index 32f2d04efac..86ae2468a35 100644
--- a/src/server/scripts/Kalimdor/zone_azshara.cpp
+++ b/src/server/scripts/Kalimdor/zone_azshara.cpp
@@ -259,12 +259,13 @@ public:
}
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
CloseGossipMenuFor(player);
me->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true);
MustDieTimer = 3000;
MustDie = true;
+ return false;
}
void MovementInform(uint32 type, uint32 id) override
@@ -366,6 +367,15 @@ public:
} else CheckTimer -= diff;
}
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE)
+ return true;
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, 10811, me->GetGUID());
+ return true;
+ }
+
private:
ObjectGuid PlayerGUID;
uint32 SpellEscapeTimer;
@@ -380,15 +390,6 @@ public:
bool Reached;
};
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE)
- return true;
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_GET_MOONSTONE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, 10811, creature->GetGUID());
- return true;
- }
-
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_rizzle_sprysprocketAI(creature);
diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
index 811db4a8ac1..0a3f57ace8e 100644
--- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
@@ -37,6 +37,7 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "ScriptedGossip.h"
+#include "GameObjectAI.h"
#include "Cell.h"
#include "CellImpl.h"
#include "GridNotifiersImpl.h"
@@ -230,11 +231,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
@@ -361,7 +363,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)
{
@@ -633,19 +635,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->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- ravager->SetReactState(REACT_AGGRESSIVE);
- ravager->AI()->AttackStart(player);
+ if (Creature* ravager = me->FindNearestCreature(NPC_DEATH_RAVAGER, 5.0f, true))
+ {
+ ravager->RemoveFlag(UNIT_FIELD_FLAGS, 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);
}
};
@@ -803,19 +815,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 9ebf92874d6..ed9a3d11a59 100644
--- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
@@ -361,7 +361,7 @@ public:
Initialize();
}
- 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_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp
index c5506593799..95790c11a15 100644
--- a/src/server/scripts/Kalimdor/zone_darkshore.cpp
+++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp
@@ -155,22 +155,17 @@ public:
DoMeleeAttackIfReady();
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_SLEEPER_AWAKENED)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (npc_kerlonianAI* pKerlonianAI = CAST_AI(npc_kerlonian::npc_kerlonianAI, creature->AI()))
+ if (quest->GetQuestId() == QUEST_SLEEPER_AWAKENED)
{
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- creature->AI()->Talk(SAY_KER_START, player);
- pKerlonianAI->StartFollow(player, FACTION_KER_ESCORTEE, quest);
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ Talk(SAY_KER_START, player);
+ StartFollow(player, FACTION_KER_ESCORTEE, quest);
}
}
-
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
@@ -288,20 +283,16 @@ public:
}
}
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (npc_escortAI* pEscortAI = CAST_AI(npc_prospector_remtravel::npc_prospector_remtravelAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID());
-
- creature->SetFaction(FACTION_ESCORTEE);
+ if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2)
+ {
+ Start(false, false, player->GetGUID());
+ me->SetFaction(FACTION_ESCORTEE);
+ }
}
-
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
@@ -359,33 +350,31 @@ public:
SetFollowComplete(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
{
- CloseGossipMenuFor(player);
-
- if (npc_threshwackonatorAI* pThreshAI = CAST_AI(npc_threshwackonator::npc_threshwackonatorAI, creature->AI()))
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
{
- creature->AI()->Talk(EMOTE_START);
- pThreshAI->StartFollow(player);
+ CloseGossipMenuFor(player);
+
+ Talk(EMOTE_START);
+ StartFollow(player);
}
- }
- return true;
- }
+ return true;
+ }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_GYROMAST_REV) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_INSERT_KEY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- 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_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp
index c61239f5145..3f31487885a 100644
--- a/src/server/scripts/Kalimdor/zone_desolace.cpp
+++ b/src/server/scripts/Kalimdor/zone_desolace.cpp
@@ -34,6 +34,7 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
#include "SpellInfo.h"
@@ -104,19 +105,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
{
@@ -141,12 +142,22 @@ class go_iruxos : public GameObjectScript
public:
go_iruxos() : GameObjectScript("go_iruxos") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_iruxosAI : public GameObjectAI
{
- if (player->GetQuestStatus(QUEST_HAND_IRUXOS) == QUEST_STATUS_INCOMPLETE && !go->FindNearestCreature(NPC_DEMON_SPIRIT, 25.0f, true))
- player->SummonCreature(NPC_DEMON_SPIRIT, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
+ go_iruxosAI(GameObject* go) : GameObjectAI(go) { }
- return true;
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->GetQuestStatus(QUEST_HAND_IRUXOS) == QUEST_STATUS_INCOMPLETE && !me->FindNearestCreature(NPC_DEMON_SPIRIT, 25.0f, true))
+ player->SummonCreature(NPC_DEMON_SPIRIT, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
+
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_iruxosAI(go);
}
};
@@ -204,20 +215,16 @@ public:
DoMeleeAttackIfReady();
}
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_RETURN_TO_VAHLARRIEL)
- {
- if (npc_escortAI* escortAI = CAST_AI(npc_dalinda::npc_dalindaAI, creature->AI()))
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_RETURN_TO_VAHLARRIEL)
{
- escortAI->Start(true, false, player->GetGUID());
- creature->SetFaction(113);
+ Start(true, false, player->GetGUID());
+ me->SetFaction(113);
}
}
- 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 92d8ce43156..f6718dfe919 100644
--- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
+++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
@@ -51,31 +51,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);
}
-
};
/*######
@@ -104,19 +114,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) { }
@@ -150,8 +147,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_feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp
index 676d285e37f..f8617314334 100644
--- a/src/server/scripts/Kalimdor/zone_feralas.cpp
+++ b/src/server/scripts/Kalimdor/zone_feralas.cpp
@@ -64,32 +64,6 @@ class npc_oox22fe : public CreatureScript
public:
npc_oox22fe() : CreatureScript("npc_oox22fe") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_RESCUE_OOX22FE)
- {
- creature->AI()->Talk(SAY_OOX_START);
- //change that the npc is not lying dead on the ground
- creature->SetStandState(UNIT_STAND_STATE_STAND);
-
- if (player->GetTeam() == ALLIANCE)
- creature->SetFaction(FACTION_ESCORTEE_A);
-
- if (player->GetTeam() == HORDE)
- creature->SetFaction(FACTION_ESCORTEE_H);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_oox22fe::npc_oox22feAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
-
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_oox22feAI(creature);
- }
-
struct npc_oox22feAI : public npc_escortAI
{
npc_oox22feAI(Creature* creature) : npc_escortAI(creature) { }
@@ -146,8 +120,30 @@ public:
{
summoned->AI()->AttackStart(me);
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_RESCUE_OOX22FE)
+ {
+ Talk(SAY_OOX_START);
+ //change that the npc is not lying dead on the ground
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+
+ if (player->GetTeam() == ALLIANCE)
+ me->SetFaction(FACTION_ESCORTEE_A);
+
+ if (player->GetTeam() == HORDE)
+ me->SetFaction(FACTION_ESCORTEE_H);
+
+ Start(true, false, player->GetGUID());
+ }
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_oox22feAI(creature);
+ }
};
/*######
diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
index 0ecbb19c1af..b36d1d8df12 100644
--- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
+++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
@@ -51,21 +51,6 @@ class npc_shenthul : public CreatureScript
public:
npc_shenthul() : CreatureScript("npc_shenthul") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE)
- {
- ENSURE_AI(npc_shenthul::npc_shenthulAI, creature->AI())->CanTalk = true;
- ENSURE_AI(npc_shenthul::npc_shenthulAI, creature->AI())->PlayerGUID = player->GetGUID();
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_shenthulAI(creature);
- }
-
struct npc_shenthulAI : public ScriptedAI
{
npc_shenthulAI(Creature* creature) : ScriptedAI(creature)
@@ -137,8 +122,21 @@ public:
}
}
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE)
+ {
+ CanTalk = true;
+ PlayerGUID = player->GetGUID();
+ }
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_shenthulAI(creature);
+ }
};
/*######
@@ -177,60 +175,6 @@ class npc_thrall_warchief : public CreatureScript
public:
npc_thrall_warchief() : CreatureScript("npc_thrall_warchief") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, OPTION_WHAT_DISCOVERIES, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_THE_SHATTERED_HAND, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, OPTION_USURPER, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- SendGossipMenuFor(player, GOSSIP_IT_WOULD_APPEAR_AS, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- AddGossipItemFor(player, OPTION_WITH_ALL_DUE_RESPECT, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- SendGossipMenuFor(player, GOSSIP_THE_BROOD_MOTHER, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- AddGossipItemFor(player, OPTION_I_I_DID_NOT_THINK_OF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- SendGossipMenuFor(player, GOSSIP_SO_MUCH_TO_LEARN, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- AddGossipItemFor(player, OPTION_I_LIVE_ONLY_TO_SERVE, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
- SendGossipMenuFor(player, GOSSIP_I_DO_NOT_FAULT_YOU, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- AddGossipItemFor(player, OPTION_OF_COURSE_WARCHIEF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7);
- SendGossipMenuFor(player, GOSSIP_NOW_PAY_ATTENTION, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+7:
- CloseGossipMenuFor(player);
- player->AreaExploredOrEventHappens(QUEST_WHAT_THE_WIND_CARRIES);
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(QUEST_WHAT_THE_WIND_CARRIES) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, OPTION_PLEASE_SHARE_YOUR, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- SendGossipMenuFor(player, GOSSIP_MEMBERS_OF_THE_HORDE, creature->GetGUID());
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_thrall_warchiefAI(creature);
- }
-
struct npc_thrall_warchiefAI : public ScriptedAI
{
npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature)
@@ -273,8 +217,62 @@ 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 + 1:
+ AddGossipItemFor(player, OPTION_WHAT_DISCOVERIES, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_THE_SHATTERED_HAND, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, OPTION_USURPER, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ SendGossipMenuFor(player, GOSSIP_IT_WOULD_APPEAR_AS, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ AddGossipItemFor(player, OPTION_WITH_ALL_DUE_RESPECT, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ SendGossipMenuFor(player, GOSSIP_THE_BROOD_MOTHER, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ AddGossipItemFor(player, OPTION_I_I_DID_NOT_THINK_OF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, GOSSIP_SO_MUCH_TO_LEARN, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ AddGossipItemFor(player, OPTION_I_LIVE_ONLY_TO_SERVE, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
+ SendGossipMenuFor(player, GOSSIP_I_DO_NOT_FAULT_YOU, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 6:
+ AddGossipItemFor(player, OPTION_OF_COURSE_WARCHIEF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
+ SendGossipMenuFor(player, GOSSIP_NOW_PAY_ATTENTION, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 7:
+ CloseGossipMenuFor(player);
+ player->AreaExploredOrEventHappens(QUEST_WHAT_THE_WIND_CARRIES);
+ break;
+ }
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (player->GetQuestStatus(QUEST_WHAT_THE_WIND_CARRIES) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, OPTION_PLEASE_SHARE_YOUR, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+
+ SendGossipMenuFor(player, GOSSIP_MEMBERS_OF_THE_HORDE, me->GetGUID());
+ return true;
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_thrall_warchiefAI(creature);
+ }
};
/* --------- Herald of War ------------- */
diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index d9b5cc82b1b..d0233e7d85e 100644
--- a/src/server/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
@@ -38,6 +38,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
+#include "GameObjectAI.h"
#include "Group.h"
#include "Player.h"
@@ -960,60 +961,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->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
- Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, 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->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
- Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, CAELESTRASZ_NIGHT_ELF_FORM);
- Caelestrasz->SetFaction(35);
- }
+ if (Merithra)
+ {
+ Merithra->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
+ Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID, MERITHRA_NIGHT_ELF_FORM);
+ Merithra->SetFaction(35);
+ }
- if (Arygos)
- {
- Arygos->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
- Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, ARYGOS_GNOME_FORM);
- Arygos->SetFaction(35);
- }
+ if (Caelestrasz)
+ {
+ Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
+ Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID, 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->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
+ Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID, 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);
+ }
};
/*###
@@ -1128,241 +1137,252 @@ class go_wind_stone : public GameObjectScript
public:
go_wind_stone() : GameObjectScript("go_wind_stone") { }
- private:
- uint8 GetPlayerRank(Player* player) // For random summoning
+ struct go_wind_stoneAI : public GameObjectAI
{
- 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)
- {
- 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:
+ private:
+ uint8 GetPlayerRank(Player* player) // For random summoning
{
- 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;
+ 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->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- summons->SendMeleeAttackStart(player);
- summons->CombatStart(player);
- }
+ uint8 GetItems(Player* player, WS type)
+ {
+ uint8 result = 0x0;
- public:
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- uint8 rank = GetPlayerRank(player);
+ 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:
+ {
+ 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;
+ }
+ return result;
+ }
- uint32 gossipId = go->GetGOInfo()->GetGossipMenuId();
- switch (gossipId)
- {
- case GOSSIP_ID_LESSER_WS:
+ void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell)
{
- 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
+ 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);
- break;
+ 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, 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;
+ summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ summons->SendMeleeAttackStart(player);
+ summons->CombatStart(player);
}
- case GOSSIP_ID_WIND_STONE:
+
+ public:
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- 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
+ 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, 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;
+ }
+
+ 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;
+ }
+
+ 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, 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;
+ SendGossipMenuFor(player, player->GetGossipTextId(gossipId, me), me->GetGUID());
+ return true;
}
- case GOSSIP_ID_GREATER_WS:
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- if (rank == 3) // 3
- AddGossipItemFor(player, GOSSIP_ID_GREATER_WS, OPTION_ID_WS_RANDOM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
- else
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ player->PlayerTalkClass->SendCloseGossip();
+
+ switch (action)
{
- go->CastSpell(player, SPELL_PUNISHMENT);
- break;
+ 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;
}
-
- 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;
+ return true;
}
- default:
- break;
- }
-
- SendGossipMenuFor(player, player->GetGossipTextId(gossipId, go), go->GetGUID());
- return true;
- }
+ };
- bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override
+ GameObjectAI* GetAI(GameObject* go) const override
{
- ClearGossipMenuFor(player);
- player->PlayerTalkClass->SendCloseGossip();
-
- 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;
-
- 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;
-
- 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;
-
- default:
- break;
- }
- return true;
+ return new go_wind_stoneAI(go);
}
};
diff --git a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
index 4363917b9a3..1fcefb7403f 100644
--- a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
+++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
@@ -78,21 +78,19 @@ public:
}
void Reset() override { }
- };
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_PROTECT_KAYA)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (npc_escortAI* pEscortAI = CAST_AI(npc_kaya_flathoof::npc_kaya_flathoofAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
+ if (quest->GetQuestId() == QUEST_PROTECT_KAYA)
+ {
+ Start(true, false, player->GetGUID());
- creature->AI()->Talk(SAY_START);
- creature->SetFaction(113);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ Talk(SAY_START);
+ me->SetFaction(113);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ }
}
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp
index 92558f73269..b8922038170 100644
--- a/src/server/scripts/Kalimdor/zone_tanaris.cpp
+++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp
@@ -318,27 +318,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->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- creature->RemoveFlag(UNIT_FIELD_FLAGS, 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) { }
@@ -382,7 +361,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->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, 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);
+ }
};
/*####
@@ -413,22 +411,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)
@@ -552,8 +534,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 93927f0d074..cf425fc804e 100644
--- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
@@ -56,17 +56,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;
}
};
@@ -101,26 +100,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) { }
@@ -170,8 +149,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);
+ }
};
/*######
@@ -651,19 +646,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_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
index 6170ddb2e53..f13a0fc31ce 100644
--- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
+++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
@@ -35,6 +35,7 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
/*#####
@@ -55,20 +56,6 @@ class npc_kanati : public CreatureScript
public:
npc_kanati() : CreatureScript("npc_kanati") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_PROTECT_KANATI)
- if (npc_kanatiAI* pEscortAI = CAST_AI(npc_kanati::npc_kanatiAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest, true);
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_kanatiAI(creature);
- }
-
struct npc_kanatiAI : public npc_escortAI
{
npc_kanatiAI(Creature* creature) : npc_escortAI(creature) { }
@@ -100,8 +87,18 @@ public:
{
summoned->AI()->AttackStart(me);
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_PROTECT_KANATI)
+ Start(false, false, player->GetGUID(), quest, true);
+ }
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_kanatiAI(creature);
+ }
};
/*######
@@ -140,24 +137,6 @@ class npc_lakota_windsong : public CreatureScript
public:
npc_lakota_windsong() : CreatureScript("npc_lakota_windsong") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_FREE_AT_LAST)
- {
- creature->AI()->Talk(SAY_LAKO_START, player);
- creature->SetFaction(FACTION_ESCORTEE_LAKO);
-
- if (npc_lakota_windsongAI* pEscortAI = CAST_AI(npc_lakota_windsong::npc_lakota_windsongAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_lakota_windsongAI(creature);
- }
-
struct npc_lakota_windsongAI : public npc_escortAI
{
npc_lakota_windsongAI(Creature* creature) : npc_escortAI(creature) { }
@@ -193,7 +172,23 @@ public:
for (int i = 0; i < 2; ++i)
me->SummonCreature(NPC_GRIM_BANDIT, BanditLoc[i+AmbushId], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_FREE_AT_LAST)
+ {
+ Talk(SAY_LAKO_START, player);
+ me->SetFaction(FACTION_ESCORTEE_LAKO);
+
+ Start(false, false, player->GetGUID(), quest);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_lakota_windsongAI(creature);
+ }
};
/*######
@@ -223,24 +218,6 @@ class npc_paoka_swiftmountain : public CreatureScript
public:
npc_paoka_swiftmountain() : CreatureScript("npc_paoka_swiftmountain") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_HOMEWARD)
- {
- creature->AI()->Talk(SAY_START, player);
- creature->SetFaction(FACTION_ESCORTEE);
-
- if (npc_paoka_swiftmountainAI* pEscortAI = CAST_AI(npc_paoka_swiftmountain::npc_paoka_swiftmountainAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID(), quest);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_paoka_swiftmountainAI(creature);
- }
-
struct npc_paoka_swiftmountainAI : public npc_escortAI
{
npc_paoka_swiftmountainAI(Creature* creature) : npc_escortAI(creature) { }
@@ -270,7 +247,23 @@ public:
for (int i = 0; i < 3; ++i)
me->SummonCreature(NPC_WYVERN, WyvernLoc[i], TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_HOMEWARD)
+ {
+ Talk(SAY_START, player);
+ me->SetFaction(FACTION_ESCORTEE);
+
+ Start(false, false, player->GetGUID(), quest);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_paoka_swiftmountainAI(creature);
+ }
};
enum PantherCage
@@ -284,20 +277,30 @@ class go_panther_cage : public GameObjectScript
public:
go_panther_cage() : GameObjectScript("go_panther_cage") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_panther_cageAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (player->GetQuestStatus(QUEST_HYPERCAPACITOR_GIZMO) == QUEST_STATUS_INCOMPLETE)
+ go_panther_cageAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- if (Creature* panther = go->FindNearestCreature(ENRAGED_PANTHER, 5, true))
+ me->UseDoorOrButton();
+ if (player->GetQuestStatus(QUEST_HYPERCAPACITOR_GIZMO) == QUEST_STATUS_INCOMPLETE)
{
- panther->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- panther->SetReactState(REACT_AGGRESSIVE);
- panther->AI()->AttackStart(player);
+ if (Creature* panther = me->FindNearestCreature(ENRAGED_PANTHER, 5, true))
+ {
+ panther->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ panther->SetReactState(REACT_AGGRESSIVE);
+ panther->AI()->AttackStart(player);
+ }
}
+
+ return true;
}
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_panther_cageAI(go);
}
};
diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
index 027a182f386..0f894631345 100644
--- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
+++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
@@ -48,35 +48,6 @@ class npc_cairne_bloodhoof : public CreatureScript
public:
npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_SENDER_INFO)
- {
- player->CastSpell(player, 23123, false);
- SendGossipMenuFor(player, 7014, creature->GetGUID());
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(925) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HCB, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO);
-
- SendGossipMenuFor(player, 7013, creature->GetGUID());
-
- return true;
- }
-
- 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)
@@ -144,8 +115,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_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
index fa6ef602da4..07babc1f079 100644
--- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
+++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
@@ -57,24 +57,6 @@ class npc_ame : public CreatureScript
public:
npc_ame() : CreatureScript("npc_ame") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_CHASING_AME)
- {
- ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID());
- creature->AI()->Talk(SAY_READY, player);
- creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
- // Change faction so mobs attack
- creature->SetFaction(113);
- }
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_ameAI(creature);
- }
-
struct npc_ameAI : public npc_escortAI
{
npc_ameAI(Creature* creature) : npc_escortAI(creature)
@@ -146,7 +128,24 @@ public:
DemoralizingShoutTimer = 70000;
} else DemoralizingShoutTimer -= diff;
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_CHASING_AME)
+ {
+ Start(false, false, player->GetGUID());
+ Talk(SAY_READY, player);
+ me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
+ // Change faction so mobs attack
+ me->SetFaction(113);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_ameAI(creature);
+ }
};
/*####
@@ -181,25 +180,6 @@ class npc_ringo : public CreatureScript
public:
npc_ringo() : CreatureScript("npc_ringo") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_A_LITTLE_HELP)
- {
- if (npc_ringoAI* ringoAI = CAST_AI(npc_ringo::npc_ringoAI, creature->AI()))
- {
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- ringoAI->StartFollow(player, FACTION_ESCORTEE, quest);
- }
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_ringoAI(creature);
- }
-
struct npc_ringoAI : public FollowerAI
{
npc_ringoAI(Creature* creature) : FollowerAI(creature)
@@ -355,7 +335,21 @@ public:
DoMeleeAttackIfReady();
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_A_LITTLE_HELP)
+ {
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ StartFollow(player, FACTION_ESCORTEE, quest);
+ }
+ }
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_ringoAI(creature);
+ }
};
void AddSC_ungoro_crater()
diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp
index e16fb9bd0a7..a2c3e9a8715 100644
--- a/src/server/scripts/Kalimdor/zone_winterspring.cpp
+++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp
@@ -33,6 +33,7 @@ EndContentData */
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
#include "WorldSession.h"
@@ -45,26 +46,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);
}
};
@@ -292,30 +303,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();
}
@@ -588,9 +579,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);
+ }
};
/*#####
@@ -601,22 +609,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->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ return false;
}
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ };
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_elune_fireAI(go);
}
};
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
index 970a64e1fd8..c1bf139c070 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
@@ -80,10 +80,10 @@ enum AKGameObjectIds
GO_SPHERE_2 = 193094
};
-template<class AI>
-AI* GetAhnKahetAI(Creature* creature)
+template<class AI, class T>
+AI* GetAhnKahetAI(T* obj)
{
- return GetInstanceAI<AI>(creature, AhnKahetScriptName);
+ return GetInstanceAI<AI>(obj, AhnKahetScriptName);
}
#endif // AHNKAHET_H_
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
index 32e296a508a..a261febcd6d 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellScript.h"
#include "Player.h"
#include "ahnkahet.h"
@@ -380,33 +381,41 @@ class go_prince_taldaram_sphere : public GameObjectScript
public:
go_prince_taldaram_sphere() : GameObjectScript("go_prince_taldaram_sphere") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_prince_taldaram_sphereAI : public GameObjectAI
{
- InstanceScript* instance = go->GetInstanceScript();
- if (!instance)
- return false;
+ go_prince_taldaram_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_PRINCE_TALDARAM));
- if (PrinceTaldaram && PrinceTaldaram->IsAlive())
- {
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SetGoState(GO_STATE_ACTIVE);
+ InstanceScript* instance;
- switch (go->GetEntry())
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ Creature* princeTaldaram = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PRINCE_TALDARAM));
+ if (princeTaldaram && princeTaldaram->IsAlive())
{
- case GO_SPHERE_1:
- instance->SetData(DATA_SPHERE_1, IN_PROGRESS);
- PrinceTaldaram->AI()->Talk(SAY_1);
- break;
- case GO_SPHERE_2:
- instance->SetData(DATA_SPHERE_2, IN_PROGRESS);
- PrinceTaldaram->AI()->Talk(SAY_1);
- break;
- }
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->SetGoState(GO_STATE_ACTIVE);
- ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, PrinceTaldaram->AI())->CheckSpheres();
+ switch (me->GetEntry())
+ {
+ case GO_SPHERE_1:
+ instance->SetData(DATA_SPHERE_1, IN_PROGRESS);
+ princeTaldaram->AI()->Talk(SAY_1);
+ break;
+ case GO_SPHERE_2:
+ instance->SetData(DATA_SPHERE_2, IN_PROGRESS);
+ princeTaldaram->AI()->Talk(SAY_1);
+ break;
+ }
+
+ ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, princeTaldaram->AI())->CheckSpheres();
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetAhnKahetAI<go_prince_taldaram_sphereAI>(go);
}
};
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index c1045aaee74..0b179b1e252 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -1379,7 +1379,7 @@ class go_twilight_portal : public GameObjectScript
if (!_deleted)
{
_deleted = true;
- go->Delete();
+ me->Delete();
}
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
index 839488cff86..f31010c9676 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
@@ -446,48 +446,43 @@ public:
break;
}
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_announcer_toc5AI>(creature);
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- InstanceScript* instance = creature->GetInstanceScript();
-
- if (instance &&
- ((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE &&
- instance->GetData(BOSS_BLACK_KNIGHT) == DONE &&
- instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) ||
- instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE))
- return false;
-
- if (instance &&
- instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED &&
- instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED &&
- instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED &&
- instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- else if (instance)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
+ bool GossipHello(Player* player) override
+ {
+ if (((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE &&
+ instance->GetData(BOSS_BLACK_KNIGHT) == DONE &&
+ instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) ||
+ instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE))
+ return false;
+
+ if (instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED &&
+ instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED &&
+ instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED &&
+ instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ else if (instance)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ 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
{
- CloseGossipMenuFor(player);
- ENSURE_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter();
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ {
+ CloseGossipMenuFor(player);
+ StartEncounter();
+ }
+ return true;
}
+ };
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<npc_announcer_toc5AI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
index 5c9be579132..a2046ca0b44 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -514,20 +514,20 @@ class npc_essence_of_twin : public CreatureScript
return spellReturned;
}
+
+ bool GossipHello(Player* player) override
+ {
+ player->RemoveAurasDueToSpell(GetData(ESSENCE_REMOVE));
+ player->CastSpell(player, GetData(ESSENCE_APPLY), true);
+ CloseGossipMenuFor(player);
+ return true;
+ }
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_essence_of_twinAI(creature);
};
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- player->RemoveAurasDueToSpell(creature->GetAI()->GetData(ESSENCE_REMOVE));
- player->CastSpell(player, creature->GetAI()->GetData(ESSENCE_APPLY), true);
- CloseGossipMenuFor(player);
- return true;
- }
};
struct npc_unleashed_ballAI : public ScriptedAI
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index 711be2c5772..084ce0b614d 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
@@ -111,7 +111,9 @@ class npc_announcer_toc10 : public CreatureScript
struct npc_announcer_toc10AI : public ScriptedAI
{
- npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature) { }
+ npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
+
+ InstanceScript* instance;
void Reset() override
{
@@ -123,95 +125,88 @@ class npc_announcer_toc10 : public CreatureScript
}
void AttackStart(Unit* /*who*/) override { }
- };
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- InstanceScript* instance = creature->GetInstanceScript();
- if (!instance)
- return true;
+ bool GossipHello(Player* player) override
+ {
+ char const* _message = "We are ready!";
- char const* _message = "We are ready!";
+ if (player->IsInCombat() || instance->IsEncounterInProgress())
+ return true;
- if (player->IsInCombat() || instance->IsEncounterInProgress())
- return true;
-
- uint8 i = 0;
- for (; i < NUM_MESSAGES; ++i)
- {
- if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE)
- || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE))
+ uint8 i = 0;
+ for (; i < NUM_MESSAGES; ++i)
{
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id);
- break;
+ if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE)
+ || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id);
+ break;
+ }
}
- }
-
- if (i >= NUM_MESSAGES)
- return false;
- SendGossipMenuFor(player, _GossipMessage[i].msgnum, creature->GetGUID());
- return true;
- }
+ if (i >= NUM_MESSAGES)
+ return false;
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override
- {
- ClearGossipMenuFor(player);
- CloseGossipMenuFor(player);
- InstanceScript* instance = creature->GetInstanceScript();
- if (!instance)
+ SendGossipMenuFor(player, _GossipMessage[i].msgnum, me->GetGUID());
return true;
-
- if (instance->GetBossState(BOSS_BEASTS) != DONE)
- {
- instance->SetData(TYPE_EVENT, 110);
- instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED);
- instance->SetBossState(BOSS_BEASTS, NOT_STARTED);
}
- else if (instance->GetBossState(BOSS_JARAXXUS) != DONE)
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
- // if Jaraxxus is spawned, but the raid wiped
- if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS)))
+ ClearGossipMenuFor(player);
+ CloseGossipMenuFor(player);
+
+ if (instance->GetBossState(BOSS_BEASTS) != DONE)
{
- jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS);
- jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
- jaraxxus->SetReactState(REACT_DEFENSIVE);
- jaraxxus->SetInCombatWithZone();
+ instance->SetData(TYPE_EVENT, 110);
+ instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED);
+ instance->SetBossState(BOSS_BEASTS, NOT_STARTED);
}
- else
+ else if (instance->GetBossState(BOSS_JARAXXUS) != DONE)
{
- instance->SetData(TYPE_EVENT, 1010);
- instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED);
+ // if Jaraxxus is spawned, but the raid wiped
+ if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS)))
+ {
+ jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS);
+ jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
+ jaraxxus->SetReactState(REACT_DEFENSIVE);
+ jaraxxus->SetInCombatWithZone();
+ }
+ else
+ {
+ instance->SetData(TYPE_EVENT, 1010);
+ instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED);
+ }
}
+ else if (instance->GetBossState(BOSS_CRUSADERS) != DONE)
+ {
+ if (player->GetTeam() == ALLIANCE)
+ instance->SetData(TYPE_EVENT, 3000);
+ else
+ instance->SetData(TYPE_EVENT, 3001);
+ instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED);
+ }
+ else if (instance->GetBossState(BOSS_VALKIRIES) != DONE)
+ {
+ instance->SetData(TYPE_EVENT, 4000);
+ instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED);
+ }
+ else if (instance->GetBossState(BOSS_LICH_KING) != DONE)
+ {
+ if (me->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE)
+ instance->SetData(TYPE_EVENT, 4020);
+ else
+ instance->SetData(TYPE_EVENT, 4030);
+ instance->SetBossState(BOSS_LICH_KING, NOT_STARTED);
+ }
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ return true;
}
- else if (instance->GetBossState(BOSS_CRUSADERS) != DONE)
- {
- if (player->GetTeam() == ALLIANCE)
- instance->SetData(TYPE_EVENT, 3000);
- else
- instance->SetData(TYPE_EVENT, 3001);
- instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED);
- }
- else if (instance->GetBossState(BOSS_VALKIRIES) != DONE)
- {
- instance->SetData(TYPE_EVENT, 4000);
- instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED);
- }
- else if (instance->GetBossState(BOSS_LICH_KING) != DONE)
- {
- if (creature->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE)
- instance->SetData(TYPE_EVENT, 4020);
- else
- instance->SetData(TYPE_EVENT, 4030);
- instance->SetBossState(BOSS_LICH_KING, NOT_STARTED);
- }
- creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
- return new npc_announcer_toc10AI(creature);
+ return GetInstanceAI<npc_announcer_toc10AI>(creature);
}
};
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
index 4e11e4afdb9..7a2c01ce17c 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
@@ -99,7 +99,7 @@ public:
Initialize();
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == MENU_ID_SYLVANAS && gossipListId == GOSSIP_OPTION_ID)
{
@@ -109,6 +109,7 @@ public:
events.Reset();
events.ScheduleEvent(EVENT_INTRO_1, 1000);
}
+ return false;
}
void UpdateAI(uint32 diff) override
@@ -196,7 +197,7 @@ public:
Initialize();
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == MENU_ID_JAINA && gossipListId == GOSSIP_OPTION_ID)
{
@@ -206,6 +207,7 @@ public:
events.Reset();
events.ScheduleEvent(EVENT_INTRO_1, 1000);
}
+ return false;
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 9bda4b0ae0a..af4e20ccb06 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -343,28 +343,27 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript
public:
npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI
{
- // override default gossip
- if (InstanceScript* instance = creature->GetInstanceScript())
- if (instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL)
+ npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ // override default gossip
+ if (_instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || _instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL)
{
ClearGossipMenuFor(player);
return true;
}
- // load default gossip
- return false;
- }
-
- struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI
- {
- npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature)
- {
- _instance = me->GetInstanceScript();
+ // load default gossip
+ return false;
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
ClearGossipMenuFor(player);
@@ -383,6 +382,7 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript
default:
break;
}
+ return false;
}
void Reset() override
@@ -790,21 +790,6 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
public:
npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- // override default gossip
- if (InstanceScript* instance = creature->GetInstanceScript())
- if (instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE)
- {
- player->PrepareGossipMenu(creature, creature->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true);
- player->SendPreparedGossip(creature);
- return true;
- }
-
- // load default gossip
- return false;
- }
-
struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI
{
npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature),
@@ -858,7 +843,21 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
}
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ bool GossipHello(Player* player) override
+ {
+ // override default gossip
+ if (_instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE)
+ {
+ player->PrepareGossipMenu(me, me->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true);
+ player->SendPreparedGossip(me);
+ return true;
+ }
+
+ // load default gossip
+ return false;
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
ClearGossipMenuFor(player);
@@ -872,6 +871,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
default:
break;
}
+ return false;
}
void DestroyIceWall()
diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h
index 68de4c716c9..44f160e36b7 100644
--- a/src/server/scripts/Northrend/Gundrak/gundrak.h
+++ b/src/server/scripts/Northrend/Gundrak/gundrak.h
@@ -91,10 +91,10 @@ enum GDInstanceMisc
TIMER_STATUE_ACTIVATION = 3500
};
-template<class AI>
-inline AI* GetGundrakAI(Creature* creature)
+template<class AI, class T>
+inline AI* GetGundrakAI(T* obj)
{
- return GetInstanceAI<AI>(creature, GundrakScriptName);
+ return GetInstanceAI<AI>(obj, GundrakScriptName);
}
#endif // GUNDRAK_H_
diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
index b35b4f7696d..aed28522faf 100644
--- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
@@ -18,6 +18,7 @@
#include "InstanceScript.h"
#include "Player.h"
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "gundrak.h"
#include "EventMap.h"
@@ -350,18 +351,25 @@ class go_gundrak_altar : public GameObjectScript
public:
go_gundrak_altar() : GameObjectScript("go_gundrak_altar") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_gundrak_altarAI : public GameObjectAI
{
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SetGoState(GO_STATE_ACTIVE);
+ go_gundrak_altarAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- if (InstanceScript* instance = go->GetInstanceScript())
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
- instance->SetData(DATA_STATUE_ACTIVATE, go->GetEntry());
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->SetGoState(GO_STATE_ACTIVE);
+
+ instance->SetData(DATA_STATUE_ACTIVATE, me->GetEntry());
return true;
}
+ };
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetGundrakAI<go_gundrak_altarAI>(go);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index ebf246affc2..db69da91e75 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -636,13 +636,14 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
_events.Reset();
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override
{
if (menuId == GOSSIP_MENU_HIGH_OVERLORD_SAURFANG)
{
player->PlayerTalkClass->SendCloseGossip();
DoAction(ACTION_START_EVENT);
}
+ return false;
}
void DoAction(int32 action) override
@@ -832,13 +833,14 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
_events.Reset();
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override
{
if (menuId == GOSSIP_MENU_MURADIN_BRONZEBEARD)
{
player->PlayerTalkClass->SendCloseGossip();
DoAction(ACTION_START_EVENT);
}
+ return false;
}
void DoAction(int32 action) override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
index 647ea054263..974ae333746 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
@@ -962,7 +962,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript
}
}
- void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
me->GetTransport()->EnableMovement(true);
@@ -972,6 +972,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript
_events.ScheduleEvent(EVENT_INTRO_SUMMON_SKYBREAKER, 24600, 0, PHASE_INTRO);
_events.ScheduleEvent(EVENT_INTRO_H_3, 29600, 0, PHASE_INTRO);
_events.ScheduleEvent(EVENT_INTRO_H_4, 39200, 0, PHASE_INTRO);
+ return false;
}
void DamageTaken(Unit* , uint32& damage) override
@@ -1230,7 +1231,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript
}
}
- void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
me->GetTransport()->EnableMovement(true);
@@ -1241,6 +1242,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript
_events.ScheduleEvent(EVENT_INTRO_A_3, 33000, 0, PHASE_INTRO);
_events.ScheduleEvent(EVENT_INTRO_A_4, 39000, 0, PHASE_INTRO);
_events.ScheduleEvent(EVENT_INTRO_A_5, 45000, 0, PHASE_INTRO);
+ return false;
}
void DamageTaken(Unit* , uint32& damage) override
@@ -1395,10 +1397,11 @@ class npc_zafod_boombox : public CreatureScript
me->SetReactState(REACT_PASSIVE);
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
player->AddItem(ITEM_GOBLIN_ROCKET_PACK, 1);
player->PlayerTalkClass->SendCloseGossip();
+ return false;
}
void UpdateAI(uint32 /*diff*/) override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index 34b505ae106..030a64d8a97 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -1222,7 +1222,7 @@ class npc_tirion_fordring_tft : public CreatureScript
me->LoadEquipment(1); // remove glow on ashbringer
}
- void sGossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override
{
if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId)
{
@@ -1231,6 +1231,7 @@ class npc_tirion_fordring_tft : public CreatureScript
me->SetWalk(true);
me->GetMotionMaster()->MovePoint(POINT_TIRION_INTRO, TirionIntro);
}
+ return false;
}
void JustReachedHome() override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 108eb862287..1648274d02e 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -115,7 +115,6 @@ enum ICCSpells
// Alchemist Adrianna
SPELL_HARVEST_BLIGHT_SPECIMEN = 72155,
- SPELL_HARVEST_BLIGHT_SPECIMEN25 = 72162,
// Crok Scourgebane
SPELL_ICEBOUND_ARMOR = 70714,
@@ -717,12 +716,22 @@ class npc_alchemist_adrianna : public CreatureScript
public:
npc_alchemist_adrianna() : CreatureScript("npc_alchemist_adrianna") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_alchemist_adriannaAI : public ScriptedAI
{
- if (!creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25))
- if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE))
- creature->CastSpell(creature, SPELL_HARVEST_BLIGHT_SPECIMEN, false);
- return false;
+ npc_alchemist_adriannaAI(Creature* creature) : ScriptedAI(creature) { }
+
+ bool GossipHello(Player* player) override
+ {
+ if (!me->FindCurrentSpellBySpellId(sSpellMgr->GetSpellIdForDifficulty(SPELL_HARVEST_BLIGHT_SPECIMEN, me)))
+ if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE))
+ DoCastSelf(SPELL_HARVEST_BLIGHT_SPECIMEN, false);
+ return false;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_alchemist_adriannaAI(creature);
}
};
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index 609ba3d1003..f0490e7d1d4 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -388,21 +388,21 @@ class go_sapphiron_birth : public GameObjectScript
{
go_sapphiron_birthAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- void OnStateChanged(uint32 state, Unit* who) override
+ void OnLootStateChanged(uint32 state, Unit* who) override
{
if (state == GO_ACTIVATED)
{
if (who)
{
- if (Creature* sapphiron = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_SAPPHIRON)))
+ if (Creature* sapphiron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SAPPHIRON)))
sapphiron->AI()->DoAction(ACTION_BIRTH);
instance->SetData(DATA_HAD_SAPPHIRON_BIRTH, 1u);
}
}
else if (state == GO_JUST_DEACTIVATED)
{ // prevent ourselves from going back to _READY and resetting the client anim
- go->SetRespawnTime(0);
- go->Delete();
+ me->SetRespawnTime(0);
+ me->Delete();
}
}
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
index 1a9216efda0..891e4af0732 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "Player.h"
@@ -224,22 +225,31 @@ class containment_sphere : public GameObjectScript
public:
containment_sphere() : GameObjectScript("containment_sphere") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct containment_sphereAI : public GameObjectAI
{
- InstanceScript* instance = go->GetInstanceScript();
+ containment_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- Creature* pKeristrasza = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_KERISTRASZA));
- if (pKeristrasza && pKeristrasza->IsAlive())
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
- // maybe these are hacks :(
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- go->SetGoState(GO_STATE_ACTIVE);
+ Creature* keristrasza = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KERISTRASZA));
+ if (keristrasza && keristrasza->IsAlive())
+ {
+ // maybe these are hacks :(
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ me->SetGoState(GO_STATE_ACTIVE);
- ENSURE_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true);
+ ENSURE_AI(boss_keristrasza::boss_keristraszaAI, keristrasza->AI())->CheckContainmentSpheres(true);
+ }
+ return true;
}
- return true;
- }
+ };
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetInstanceAI<containment_sphereAI>(go);
+ }
};
class spell_intense_cold : public SpellScriptLoader
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index 66095046f66..4aa0cf0d76e 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -141,7 +141,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript
player->DestroyItemCount(itemId, 1, true, false);
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
switch (menuId)
{
@@ -156,7 +156,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript
StoreEssence(player, ITEM_EMERALD_ESSENCE);
break;
}
- return;
+ return false;
case GOSSIP_MENU_ETERNOS:
if (gossipListId >= 1 && gossipListId <= 3)
{
@@ -168,7 +168,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript
StoreEssence(player, ITEM_AMBER_ESSENCE);
break;
}
- return;
+ return false;
case GOSSIP_MENU_BELGARISTRASZ:
if (gossipListId <= 2)
{
@@ -180,11 +180,12 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript
StoreEssence(player, ITEM_RUBY_ESSENCE);
break;
}
- return;
+ return false;
default:
- return;
+ return false;
}
player->PlayerTalkClass->SendCloseGossip();
+ return false;
}
void MovementInform(uint32 /*type*/, uint32 id) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
index fdb0b539804..9937f4d6fc7 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
@@ -269,29 +269,6 @@ class npc_brann_hos : public CreatureScript
public:
npc_brann_hos() : CreatureScript("npc_brann_hos") { }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1 || action == GOSSIP_ACTION_INFO_DEF+2)
- {
- CloseGossipMenuFor(player);
- ENSURE_AI(npc_brann_hos::npc_brann_hosAI, creature->AI())->StartWP();
- }
-
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, TEXT_ID_START, creature->GetGUID());
-
- return true;
- }
-
struct npc_brann_hosAI : public npc_escortAI
{
npc_brann_hosAI(Creature* creature) : npc_escortAI(creature)
@@ -705,6 +682,30 @@ 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 || action == GOSSIP_ACTION_INFO_DEF + 2)
+ {
+ CloseGossipMenuFor(player);
+ StartWP();
+ }
+
+ return true;
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, TEXT_ID_START, me->GetGUID());
+
+ return true;
+ }
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index 07dd5d6bc24..3e92fb5c2ea 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
@@ -976,17 +976,17 @@ class go_celestial_planetarium_access : public GameObjectScript
struct go_celestial_planetarium_accessAI : public GameObjectAI
{
- go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go)
- {
- }
+ go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
bool GossipHello(Player* player, bool /*reportUse*/) override
{
- if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE))
+ if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE))
return true;
bool hasKey = true;
- if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId))
+ if (LockEntry const* lock = sLockStore.LookupEntry(me->GetGOInfo()->goober.lockId))
{
hasKey = false;
for (uint32 i = 0; i < MAX_LOCK_CASE; ++i)
@@ -1006,20 +1006,17 @@ class go_celestial_planetarium_access : public GameObjectScript
return false;
// Start Algalon event
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
_events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000);
- if (Creature* brann = go->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos))
+ if (Creature* brann = me->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos))
brann->AI()->DoAction(ACTION_START_INTRO);
- if (InstanceScript* instance = go->GetInstanceScript())
- {
- instance->SetData(DATA_ALGALON_SUMMON_STATE, 1);
- if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_01)))
- sigil->SetGoState(GO_STATE_ACTIVE);
+ instance->SetData(DATA_ALGALON_SUMMON_STATE, 1);
+ if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_01)))
+ sigil->SetGoState(GO_STATE_ACTIVE);
- if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_02)))
- sigil->SetGoState(GO_STATE_ACTIVE);
- }
+ if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_02)))
+ sigil->SetGoState(GO_STATE_ACTIVE);
return false;
}
@@ -1036,7 +1033,7 @@ class go_celestial_planetarium_access : public GameObjectScript
switch (eventId)
{
case EVENT_DESPAWN_CONSOLE:
- go->Delete();
+ me->Delete();
break;
}
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index 87129eefd9a..e78dc7f8ac5 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -26,6 +26,7 @@
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Cell.h"
#include "CellImpl.h"
#include "GridNotifiers.h"
@@ -1185,7 +1186,7 @@ class npc_brann_bronzebeard_ulduar_intro : public CreatureScript
_instance = creature->GetInstanceScript();
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_MENU_BRANN_BRONZEBEARD && gossipListId == GOSSIP_OPTION_BRANN_BRONZEBEARD)
{
@@ -1194,6 +1195,7 @@ class npc_brann_bronzebeard_ulduar_intro : public CreatureScript
if (Creature* loreKeeper = _instance->GetCreature(DATA_LORE_KEEPER_OF_NORGANNON))
loreKeeper->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
+ return false;
}
private:
@@ -1238,7 +1240,7 @@ class npc_lorekeeper : public CreatureScript
}
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_MENU_LORE_KEEPER && gossipListId == GOSSIP_OPTION_LORE_KEEPER)
{
@@ -1262,6 +1264,7 @@ class npc_lorekeeper : public CreatureScript
}
}
}
+ return false;
}
private:
@@ -1279,30 +1282,38 @@ class go_ulduar_tower : public GameObjectScript
public:
go_ulduar_tower() : GameObjectScript("go_ulduar_tower") { }
- void OnDestroyed(GameObject* go, Player* /*player*/) override
+ struct go_ulduar_towerAI : public GameObjectAI
+ {
+ go_ulduar_towerAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ void Destroyed(Player* /*player*/, uint32 /*eventId*/) override
+ {
+ switch (me->GetEntry())
+ {
+ case GO_TOWER_OF_STORMS:
+ instance->ProcessEvent(me, EVENT_TOWER_OF_STORM_DESTROYED);
+ break;
+ case GO_TOWER_OF_FLAMES:
+ instance->ProcessEvent(me, EVENT_TOWER_OF_FLAMES_DESTROYED);
+ break;
+ case GO_TOWER_OF_FROST:
+ instance->ProcessEvent(me, EVENT_TOWER_OF_FROST_DESTROYED);
+ break;
+ case GO_TOWER_OF_LIFE:
+ instance->ProcessEvent(me, EVENT_TOWER_OF_LIFE_DESTROYED);
+ break;
+ }
+
+ if (Creature* trigger = me->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true))
+ trigger->DisappearAndDie();
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
{
- InstanceScript* instance = go->GetInstanceScript();
- if (!instance)
- return;
-
- switch (go->GetEntry())
- {
- case GO_TOWER_OF_STORMS:
- instance->ProcessEvent(go, EVENT_TOWER_OF_STORM_DESTROYED);
- break;
- case GO_TOWER_OF_FLAMES:
- instance->ProcessEvent(go, EVENT_TOWER_OF_FLAMES_DESTROYED);
- break;
- case GO_TOWER_OF_FROST:
- instance->ProcessEvent(go, EVENT_TOWER_OF_FROST_DESTROYED);
- break;
- case GO_TOWER_OF_LIFE:
- instance->ProcessEvent(go, EVENT_TOWER_OF_LIFE_DESTROYED);
- break;
- }
-
- if (Creature* trigger = go->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true))
- trigger->DisappearAndDie();
+ return GetUlduarAI<go_ulduar_towerAI>(go);
}
};
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
index 8152183231c..5742d607e41 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
@@ -23,6 +23,7 @@
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
+#include "GameObjectAI.h"
#include "ulduar.h"
#include "Vehicle.h"
@@ -1645,20 +1646,29 @@ class go_mimiron_hardmode_button : public GameObjectScript
public:
go_mimiron_hardmode_button() : GameObjectScript("go_mimiron_hardmode_button") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_mimiron_hardmode_buttonAI : public GameObjectAI
{
- if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE))
- return true;
+ go_mimiron_hardmode_buttonAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE))
+ return true;
- InstanceScript* instance = go->GetInstanceScript();
- if (!instance)
- return false;
+ if (Creature* computer = instance->GetCreature(DATA_COMPUTER))
+ computer->AI()->DoAction(DO_ACTIVATE_COMPUTER);
- if (Creature* computer = instance->GetCreature(DATA_COMPUTER))
- computer->AI()->DoAction(DO_ACTIVATE_COMPUTER);
- go->SetGoState(GO_STATE_ACTIVE);
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- return true;
+ me->SetGoState(GO_STATE_ACTIVE);
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetUlduarAI<go_mimiron_hardmode_buttonAI>(go);
}
};
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index e6aa2654d54..67f603fc9fe 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -20,6 +20,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
+#include "GameObjectAI.h"
#include "SpellScript.h"
#include "ulduar.h"
#include "SpellInfo.h"
@@ -316,12 +317,23 @@ class go_razorscale_harpoon : public GameObjectScript
public:
go_razorscale_harpoon() : GameObjectScript("go_razorscale_harpoon") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_razorscale_harpoonAI : public GameObjectAI
{
- if (InstanceScript* instance = go->GetInstanceScript())
+ go_razorscale_harpoonAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
if (instance->GetCreature(BOSS_RAZORSCALE))
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- return false;
+ me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetUlduarAI<go_razorscale_harpoonAI>(go);
}
};
@@ -734,36 +746,37 @@ class npc_expedition_commander : public CreatureScript
else
AttackStartTimer -= Diff;
}
- };
- 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:
- CloseGossipMenuFor(player);
- ENSURE_AI(npc_expedition_commanderAI, creature->AI())->Phase = 1;
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF:
+ CloseGossipMenuFor(player);
+ Phase = 1;
+ break;
+ }
+ return true;
}
- return true;
- }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- InstanceScript* instance = creature->GetInstanceScript();
- if (instance && instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED)
+ bool GossipHello(Player* player) override
{
- player->PrepareGossipMenu(creature);
+ if (instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED)
+ {
+ player->PrepareGossipMenu(me);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, 13853, creature->GetGUID());
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, 13853, me->GetGUID());
+ }
+ else
+ SendGossipMenuFor(player, 13910, me->GetGUID());
+
+ return true;
}
- else
- SendGossipMenuFor(player, 13910, creature->GetGUID());
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
index 69404eacbad..be7b317c9d9 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
@@ -1523,10 +1523,10 @@ class npc_observation_ring_keeper : public CreatureScript
DoCast(SPELL_KEEPER_ACTIVE);
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override
{
if (menuId != 10333)
- return;
+ return false;
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
me->DespawnOrUnsummon(2000);
@@ -1549,6 +1549,7 @@ class npc_observation_ring_keeper : public CreatureScript
me->SummonCreature(NPC_MIMIRON_YS, YSKeepersPos[3]);
break;
}
+ return false;
}
void UpdateAI(uint32 /*diff*/) override { }
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index d39608cb53f..07699fed87d 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "utgarde_pinnacle.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
@@ -555,19 +556,30 @@ class go_palehoof_sphere : public GameObjectScript
public:
go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_palehoof_sphereAI : public GameObjectAI
{
- if (InstanceScript* instance = go->GetInstanceScript())
+ go_palehoof_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
+
+ InstanceScript* instance;
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
{
if (Creature* palehoof = instance->GetCreature(DATA_GORTOK_PALEHOOF))
+ {
if (palehoof->IsAlive() && instance->GetBossState(DATA_GORTOK_PALEHOOF) != DONE)
{
- 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);
palehoof->AI()->DoAction(ACTION_START_ENCOUNTER);
}
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetUtgardePinnacleAI<go_palehoof_sphereAI>(go);
}
};
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
index a2d5004c6e8..f4d217c74f3 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
@@ -95,10 +95,10 @@ enum UPGameObjectIds
GO_KING_YMIRON_DOOR = 192174
};
-template<class AI>
-AI* GetUtgardePinnacleAI(Creature* creature)
+template<class AI, class T>
+AI* GetUtgardePinnacleAI(T* obj)
{
- return GetInstanceAI<AI>(creature, UPScriptName);
+ return GetInstanceAI<AI>(obj, UPScriptName);
}
#endif // UTGARDE_PINNACLE_H_
diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
index b2061ea6369..e6dd7bd218c 100644
--- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
@@ -18,6 +18,7 @@
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
#include "SpellAuraEffects.h"
@@ -317,30 +318,6 @@ class npc_sinclari_vh : public CreatureScript
public:
npc_sinclari_vh() : CreatureScript("npc_sinclari_vh") { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- // override default gossip
- if (InstanceScript* instance = creature->GetInstanceScript())
- {
- switch (instance->GetData(DATA_MAIN_EVENT_STATE))
- {
- case IN_PROGRESS:
- player->PrepareGossipMenu(creature, GOSSIP_MENU_SEND_ME_IN, true);
- player->SendPreparedGossip(creature);
- return true;
- case DONE:
- return true; // NYI
- case NOT_STARTED:
- case FAIL:
- default:
- break;
- }
- }
-
- // load default gossip
- return false;
- }
-
struct npc_sinclariAI : public ScriptedAI
{
npc_sinclariAI(Creature* creature) : ScriptedAI(creature), _summons(creature)
@@ -369,7 +346,28 @@ class npc_sinclari_vh : public CreatureScript
}
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipHello(Player* player) override
+ {
+ // override default gossip
+ switch (_instance->GetData(DATA_MAIN_EVENT_STATE))
+ {
+ case IN_PROGRESS:
+ player->PrepareGossipMenu(me, GOSSIP_MENU_SEND_ME_IN, true);
+ player->SendPreparedGossip(me);
+ return true;
+ case DONE:
+ return true; // NYI
+ case NOT_STARTED:
+ case FAIL:
+ default:
+ break;
+ }
+
+ // load default gossip
+ return false;
+ }
+
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_MENU_START_ENCOUNTER && gossipListId == 0)
{
@@ -383,6 +381,7 @@ class npc_sinclari_vh : public CreatureScript
me->CastSpell(player, SPELL_TELEPORT_PLAYER, true);
player->PlayerTalkClass->SendCloseGossip();
}
+ return false;
}
void DoAction(int32 actionId) override
@@ -1309,10 +1308,20 @@ class go_activation_crystal : public GameObjectScript
public:
go_activation_crystal() : GameObjectScript("go_activation_crystal") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_activation_crystalAI : public GameObjectAI
+ {
+ go_activation_crystalAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true);
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
{
- player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true);
- return false;
+ return GetVioletHoldAI<go_activation_crystalAI>(go);
}
};
diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h
index 537c5d51b1e..4238634d8c1 100644
--- a/src/server/scripts/Northrend/VioletHold/violet_hold.h
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h
@@ -151,10 +151,10 @@ enum VHInstanceMisc
POINT_INTRO = 1
};
-template<class AI>
-inline AI* GetVioletHoldAI(Creature* creature)
+template<class AI, class T>
+inline AI* GetVioletHoldAI(T* obj)
{
- return GetInstanceAI<AI>(creature, VioletHoldScriptName);
+ return GetInstanceAI<AI>(obj, VioletHoldScriptName);
}
#endif // VIOLET_HOLD_H_
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index e00d2489de8..595e53ea9d5 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -241,31 +241,40 @@ class npc_corastrasza : public CreatureScript
public:
npc_corastrasza() : CreatureScript("npc_corastrasza") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_corastraszaAI : public ScriptedAI
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ npc_corastraszaAI(Creature* creature) : ScriptedAI(creature) { }
- if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests.
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests.
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- CloseGossipMenuFor(player);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
- player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true);
- player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, 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);
+ player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true);
+ player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true);
+ }
+ return true;
}
+ };
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_corastraszaAI(creature);
}
};
@@ -287,27 +296,38 @@ class npc_iruk : public CreatureScript
public:
npc_iruk() : CreatureScript("npc_iruk") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_irukAI : public ScriptedAI
{
- if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ npc_irukAI(Creature* creature) : ScriptedAI(creature) { }
- player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, creature->GetGUID());
- return true;
- }
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, me->GetGUID());
+ return true;
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_ACTION_INFO_DEF+1:
- player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true);
- CloseGossipMenuFor(player);
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true);
+ CloseGossipMenuFor(player);
+ break;
+ }
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_irukAI(creature);
}
};
@@ -643,41 +663,37 @@ public:
if (!UpdateVictim())
return;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_lurgglbrAI(creature);
- }
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (GameObject* go = creature->FindNearestGameObject(GO_CAGE, 5.0f))
+ if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS)
{
- go->SetRespawnTime(0);
- go->SetGoType(GAMEOBJECT_TYPE_BUTTON);
- go->UseDoorOrButton(20);
- }
+ if (GameObject* go = me->FindNearestGameObject(GO_CAGE, 5.0f))
+ {
+ go->SetRespawnTime(0);
+ go->SetGoType(GAMEOBJECT_TYPE_BUTTON);
+ go->UseDoorOrButton(20);
+ }
- if (npc_escortAI* pEscortAI = CAST_AI(npc_lurgglbr::npc_lurgglbrAI, creature->AI()))
- pEscortAI->Start(true, false, player->GetGUID());
+ Start(true, false, player->GetGUID());
- switch (player->GetTeam())
- {
- case ALLIANCE:
- creature->SetFaction(FACTION_ESCORTEE_A);
- break;
- default:
- case HORDE:
- creature->SetFaction(FACTION_ESCORTEE_H);
- break;
+ switch (player->GetTeam())
+ {
+ case ALLIANCE:
+ me->SetFaction(FACTION_ESCORTEE_A);
+ break;
+ default:
+ case HORDE:
+ me->SetFaction(FACTION_ESCORTEE_H);
+ break;
+ }
}
-
- return true;
}
- return false;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_lurgglbrAI(creature);
}
};
@@ -1046,33 +1062,33 @@ public:
if (Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID))
arthas->RemoveFromWorld();
}
- };
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
- if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && creature->GetAreaId() == 4128)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && me->GetAreaId() == 4128)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- return true;
- }
+ SendGossipMenuFor(player, player->GetGossipTextId(me), 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+1:
- ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
- ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(200.0f);
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ Start(true, false, player->GetGUID());
+ SetMaxPlayerDistance(200.0f);
+ break;
+ }
+ return true;
}
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
@@ -1621,26 +1637,6 @@ class npc_mootoo_the_younger : public CreatureScript
public:
npc_mootoo_the_younger() : CreatureScript("npc_mootoo_the_younger") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST)
- {
- switch (player->GetTeam())
- {
- case ALLIANCE:
- creature->SetFaction(FACTION_ESCORTEE_A);
- break;
- case HORDE:
- creature->SetFaction(FACTION_ESCORTEE_H);
- break;
- }
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- creature->AI()->Talk(SAY_1, player);
- ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
- }
- return true;
- }
-
struct npc_mootoo_the_youngerAI : public npc_escortAI
{
npc_mootoo_the_youngerAI(Creature* creature) : npc_escortAI(creature) { }
@@ -1685,6 +1681,25 @@ public:
break;
}
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST)
+ {
+ switch (player->GetTeam())
+ {
+ case ALLIANCE:
+ me->SetFaction(FACTION_ESCORTEE_A);
+ break;
+ case HORDE:
+ me->SetFaction(FACTION_ESCORTEE_H);
+ break;
+ }
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ Talk(SAY_1, player);
+ Start(true, false, player->GetGUID());
+ }
+ }
};
CreatureAI* GetAI(Creature* creature) const override
@@ -1711,17 +1726,6 @@ class npc_bonker_togglevolt : public CreatureScript
public:
npc_bonker_togglevolt() : CreatureScript("npc_bonker_togglevolt") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE)
- {
- creature->SetStandState(UNIT_STAND_STATE_STAND);
- creature->AI()->Talk(SAY_BONKER_2, player);
- ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID());
- }
- return true;
- }
-
struct npc_bonker_togglevoltAI : public npc_escortAI
{
npc_bonker_togglevoltAI(Creature* creature) : npc_escortAI(creature)
@@ -1775,6 +1779,16 @@ public:
break;
}
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE)
+ {
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ Talk(SAY_BONKER_2, player);
+ Start(true, true, player->GetGUID());
+ }
+ }
};
CreatureAI* GetAI(Creature* creature) const override
@@ -2209,11 +2223,6 @@ public:
uiEventPhase = 1;
}
- void SetGUID(ObjectGuid uiGuid, int32 /*iId*/) override
- {
- uiPlayerGUID = uiGuid;
- }
-
void AttackPlayer()
{
me->SetFaction(14);
@@ -2280,65 +2289,65 @@ public:
DoMeleeAttackIfReady();
}
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_hidden_cultistAI(creature);
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- uint32 uiGossipText = 0;
- const char* charGossipItem;
- switch (creature->GetEntry())
+ bool GossipHello(Player* player) override
{
- case NPC_TOM_HEGGER:
- uiGossipText = GOSSIP_TEXT_TOM_HEGGER;
- charGossipItem = GOSSIP_ITEM_TOM_HEGGER;
- break;
- case NPC_SALTY_JOHN_THORPE:
- uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE;
- charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE;
- break;
- case NPC_GUARD_MITCHELLS:
- uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS;
- charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS;
- break;
- default:
- charGossipItem = "";
- return false;
- }
+ uint32 uiGossipText = 0;
+ const char* charGossipItem;
- if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ switch (me->GetEntry())
+ {
+ case NPC_TOM_HEGGER:
+ uiGossipText = GOSSIP_TEXT_TOM_HEGGER;
+ charGossipItem = GOSSIP_ITEM_TOM_HEGGER;
+ break;
+ case NPC_SALTY_JOHN_THORPE:
+ uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE;
+ charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE;
+ break;
+ case NPC_GUARD_MITCHELLS:
+ uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS;
+ charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS;
+ break;
+ default:
+ charGossipItem = "";
+ return false;
+ }
- if (creature->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, uiGossipText, creature->GetGUID());
+ if (me->IsVendor())
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- return true;
- }
+ SendGossipMenuFor(player, uiGossipText, me->GetGUID());
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
+ return true;
+ }
- if (action == GOSSIP_ACTION_INFO_DEF+1)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- CloseGossipMenuFor(player);
- creature->AI()->SetGUID(player->GetGUID());
- creature->AI()->DoAction(1);
- }
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ {
+ CloseGossipMenuFor(player);
+ uiPlayerGUID = player->GetGUID();
+ DoAction(1);
+ }
- return true;
- }
+ if (action == GOSSIP_ACTION_TRADE)
+ player->GetSession()->SendListInventory(me->GetGUID());
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_hidden_cultistAI(creature);
+ }
};
enum WindsoulTotemAura
diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp
index de8633283cc..219e6514b1e 100644
--- a/src/server/scripts/Northrend/zone_dragonblight.cpp
+++ b/src/server/scripts/Northrend/zone_dragonblight.cpp
@@ -494,33 +494,6 @@ class npc_wyrmrest_defender : public CreatureScript
public:
npc_wyrmrest_defender() : CreatureScript("npc_wyrmrest_defender") { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(QUEST_DEFENDING_WYRMREST_TEMPLE) == QUEST_STATUS_INCOMPLETE)
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, GOSSIP_TEXTID_DEF1, creature->GetGUID());
- }
- else
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF+1)
- {
- SendGossipMenuFor(player, GOSSIP_TEXTID_DEF2, creature->GetGUID());
- // Makes player cast trigger spell for 49207 on self
- player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true);
- // The gossip should not auto close
- }
-
- return true;
- }
-
struct npc_wyrmrest_defenderAI : public VehicleAI
{
npc_wyrmrest_defenderAI(Creature* creature) : VehicleAI(creature)
@@ -592,6 +565,34 @@ class npc_wyrmrest_defender : public CreatureScript
break;
}
}
+
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_DEFENDING_WYRMREST_TEMPLE) == QUEST_STATUS_INCOMPLETE)
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_TEXTID_DEF1, me->GetGUID());
+ }
+ else
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+
+ 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)
+ {
+ SendGossipMenuFor(player, GOSSIP_TEXTID_DEF2, me->GetGUID());
+ // Makes player cast trigger spell for 49207 on self
+ player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true);
+ // The gossip should not auto close
+ }
+
+ return true;
+ }
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
index e71a92b3e0c..ec3dd5fb5af 100644
--- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
@@ -185,25 +185,23 @@ public:
_RavenousworgGUID.Clear();
}
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE)
+ {
+ Talk(SAY_QUEST_ACCEPT);
+ if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 180.0f))
+ Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
+
+ Start(true, false, player->GetGUID());
+ }
+ }
+
private:
ObjectGuid _RavenousworgGUID;
ObjectGuid _mrfloppyGUID;
};
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE)
- {
- creature->AI()->Talk(SAY_QUEST_ACCEPT);
- if (Creature* Mrfloppy = GetClosestCreatureWithEntry(creature, NPC_MRFLOPPY, 180.0f))
- Mrfloppy->GetMotionMaster()->MoveFollow(creature, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
-
- if (npc_escortAI* pEscortAI = CAST_AI(npc_emily::npc_emilyAI, (creature->AI())))
- pEscortAI->Start(true, false, player->GetGUID());
- }
- return true;
- }
-
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_emilyAI(creature);
@@ -763,9 +761,10 @@ public:
}
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
DoCast(player, SPELL_SUMMON_ASHWOOD_BRAND);
+ return false;
}
private:
diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp
index 4061d69d021..7abe719ef71 100644
--- a/src/server/scripts/Northrend/zone_howling_fjord.cpp
+++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp
@@ -79,15 +79,6 @@ class npc_apothecary_hanes : public CreatureScript
public:
npc_apothecary_hanes() : CreatureScript("npc_apothecary_hanes") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE)
- {
- ENSURE_AI(npc_Apothecary_HanesAI, (creature->AI()))->StartEscort(player);
- }
- return true;
- }
-
struct npc_Apothecary_HanesAI : public npc_escortAI
{
npc_Apothecary_HanesAI(Creature* creature) : npc_escortAI(creature)
@@ -252,6 +243,12 @@ public:
break;
}
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE)
+ StartEscort(player);
+ }
};
CreatureAI* GetAI(Creature* creature) const override
@@ -332,50 +329,63 @@ class npc_razael_and_lyana : public CreatureScript
public:
npc_razael_and_lyana() : CreatureScript("npc_razael_and_lyana") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_razael_and_lyanaAI : public ScriptedAI
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ npc_razael_and_lyanaAI(Creature* creature) : ScriptedAI(creature) { }
- if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE)
- switch (creature->GetEntry())
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE)
{
- case NPC_RAZAEL:
- if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL))
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, creature->GetGUID());
- return true;
- }
- break;
- case NPC_LYANA:
- if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA))
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, creature->GetGUID());
- return true;
- }
- break;
+ switch (me->GetEntry())
+ {
+ case NPC_RAZAEL:
+ if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, me->GetGUID());
+ return true;
+ }
+ break;
+ case NPC_LYANA:
+ if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, me->GetGUID());
+ return true;
+ }
+ break;
+ }
}
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ SendGossipMenuFor(player, player->GetGossipTextId(me), 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 + 1:
- SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL2, creature->GetGUID());
- player->TalkedToCreature(NPC_RAZAEL, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA2, creature->GetGUID());
- player->TalkedToCreature(NPC_LYANA, creature->GetGUID());
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL2, me->GetGUID());
+ player->TalkedToCreature(NPC_RAZAEL, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA2, me->GetGUID());
+ player->TalkedToCreature(NPC_LYANA, me->GetGUID());
+ break;
+ }
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_razael_and_lyanaAI(creature);
}
};
@@ -405,17 +415,6 @@ class npc_daegarn : public CreatureScript
public:
npc_daegarn() : CreatureScript("npc_daegarn") { }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING)
- {
- if (npc_daegarnAI* pDaegarnAI = CAST_AI(npc_daegarn::npc_daegarnAI, creature->AI()))
- pDaegarnAI->StartEvent(player->GetGUID());
- }
-
- return true;
- }
-
/// @todo make prisoners help (unclear if summoned or using npc's from surrounding cages (summon inside small cages?))
struct npc_daegarnAI : public ScriptedAI
{
@@ -484,6 +483,12 @@ public:
SummonGladiator(uiEntry);
}
+
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING)
+ StartEvent(player->GetGUID());
+ }
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index 7b9cd56c6a9..6bcdc9cbe3f 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -62,40 +62,51 @@ class npc_vekjik : public CreatureScript
public:
npc_vekjik() : CreatureScript("npc_vekjik") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_vekjikAI : public ScriptedAI
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ npc_vekjikAI(Creature* creature) : ScriptedAI(creature) { }
- if (player->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE)
+ bool GossipHello(Player* player) override
{
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK1, creature->GetGUID());
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (player->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE)
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK1, me->GetGUID());
+ return true;
+ }
+
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
return true;
}
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->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+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK2, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- CloseGossipMenuFor(player);
- creature->AI()->Talk(SAY_TEXTID_VEKJIK1, player);
- player->AreaExploredOrEventHappens(QUEST_MAKING_PEACE);
- creature->CastSpell(player, SPELL_FREANZYHEARTS_FURY, false);
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK2, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ CloseGossipMenuFor(player);
+ Talk(SAY_TEXTID_VEKJIK1, player);
+ player->AreaExploredOrEventHappens(QUEST_MAKING_PEACE);
+ DoCast(player, SPELL_FREANZYHEARTS_FURY, false);
+ break;
+ }
+
+ return true;
}
+ };
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_vekjikAI(creature);
}
};
@@ -123,37 +134,48 @@ class npc_avatar_of_freya : public CreatureScript
public:
npc_avatar_of_freya() : CreatureScript("npc_avatar_of_freya") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_avatar_of_freyaAI : public ScriptedAI
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ npc_avatar_of_freyaAI(Creature* creature) : ScriptedAI(creature) { }
- if (player->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR1, creature->GetGUID());
- return true;
- }
+ if (player->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR1, me->GetGUID());
+ return true;
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_ACTION_INFO_DEF+1:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR2, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR3, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->CastSpell(player, SPELL_FREYA_CONVERSATION, true);
- CloseGossipMenuFor(player);
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR2, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR3, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ player->CastSpell(player, SPELL_FREYA_CONVERSATION, true);
+ CloseGossipMenuFor(player);
+ break;
+ }
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_avatar_of_freyaAI(creature);
}
};
@@ -308,27 +330,23 @@ public:
m_uiChatTimer -= uiDiff;
}
}
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_engineer_heliceAI(creature);
- }
- bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override
- {
- if (quest->GetQuestId() == QUEST_DISASTER)
+ void QuestAccept(Player* player, Quest const* quest) override
{
- if (npc_engineer_heliceAI* pEscortAI = CAST_AI(npc_engineer_helice::npc_engineer_heliceAI, creature->AI()))
+ if (quest->GetQuestId() == QUEST_DISASTER)
{
- creature->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f);
- creature->SetFaction(113);
+ me->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f);
+ me->SetFaction(113);
- pEscortAI->Start(false, false, player->GetGUID());
- creature->AI()->Talk(SAY_WP_1);
+ Start(false, false, player->GetGUID());
+ Talk(SAY_WP_1);
}
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_engineer_heliceAI(creature);
}
};
@@ -564,55 +582,56 @@ public:
{
Talk(SAY_DWARF_OUCH);
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_adventurous_dwarfAI(creature);
- }
+ bool GossipHello(Player* player) override
+ {
+ if (player->GetQuestStatus(QUEST_12634) != QUEST_STATUS_INCOMPLETE)
+ return false;
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (player->GetQuestStatus(QUEST_12634) != QUEST_STATUS_INCOMPLETE)
- return false;
+ if (player->GetItemCount(ITEM_ORANGE) < 1)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_ORANGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- if (player->GetItemCount(ITEM_ORANGE) < 1)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_ORANGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ if (player->GetItemCount(ITEM_BANANAS) < 2)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_BANANAS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- if (player->GetItemCount(ITEM_BANANAS) < 2)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_BANANAS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ if (player->GetItemCount(ITEM_PAPAYA) < 1)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_PAPAYA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- if (player->GetItemCount(ITEM_PAPAYA) < 1)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_PAPAYA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ player->PlayerTalkClass->SendGossipMenu(GOSSIP_MENU_DWARF, me->GetGUID());
+ return true;
+ }
- player->PlayerTalkClass->SendGossipMenu(GOSSIP_MENU_DWARF, creature->GetGUID());
- return true;
- }
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ uint32 spellId = 0;
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- uint32 spellId = 0;
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ spellId = SPELL_ADD_ORANGE;
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ spellId = SPELL_ADD_BANANAS;
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ spellId = SPELL_ADD_PAPAYA;
+ break;
+ }
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1:
- spellId = SPELL_ADD_ORANGE;
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- spellId = SPELL_ADD_BANANAS;
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- spellId = SPELL_ADD_PAPAYA;
- break;
- }
+ if (spellId)
+ player->CastSpell(player, spellId, true);
- if (spellId)
- player->CastSpell(player, spellId, true);
+ Talk(SAY_DWARF_HELP);
+ me->DespawnOrUnsummon();
+ return true;
+ }
+ };
- creature->AI()->Talk(SAY_DWARF_HELP);
- creature->DespawnOrUnsummon();
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_adventurous_dwarfAI(creature);
}
};
diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index e18670a1d9c..9e605ce6f1f 100644
--- a/src/server/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
@@ -77,7 +77,7 @@ public:
player->FailQuest(QUEST_BITTER_DEPARTURE);
}
- void UpdateAI(uint32 uiDiff) override
+ void UpdateAI(uint32 uiDiff) override
{
npc_escortAI::UpdateAI(uiDiff);
if (!UpdateVictim())
@@ -85,7 +85,7 @@ public:
DoMeleeAttackIfReady();
}
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID)
{
@@ -93,6 +93,13 @@ public:
me->SetFaction(113);
Start(true, true, player->GetGUID());
}
+ return false;
+ }
+
+ void QuestAccept(Player* /*player*/, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE)
+ Talk(SAY_QUEST_ACCEPT);
}
};
@@ -100,14 +107,6 @@ public:
{
return new npc_injured_goblinAI(creature);
}
-
- bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE)
- creature->AI()->Talk(SAY_QUEST_ACCEPT);
-
- return false;
- }
};
/*######
@@ -125,38 +124,49 @@ class npc_roxi_ramrocket : public CreatureScript
public:
npc_roxi_ramrocket() : CreatureScript("npc_roxi_ramrocket") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_roxi_ramrocketAI : public ScriptedAI
{
- //Quest Menu
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ npc_roxi_ramrocketAI(Creature* creature) : ScriptedAI(creature) { }
- //Trainer Menu
- if ( creature->IsTrainer() )
- AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+ bool GossipHello(Player* player) override
+ {
+ //Quest Menu
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- //Vendor Menu
- if ( creature->IsVendor() )
- if (player->HasSpell(SPELL_MECHANO_HOG) || player->HasSpell(SPELL_MEKGINEERS_CHOPPER))
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ //Trainer Menu
+ if (me->IsTrainer())
+ AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ //Vendor Menu
+ if (me->IsVendor())
+ if (player->HasSpell(SPELL_MECHANO_HOG) || player->HasSpell(SPELL_MEKGINEERS_CHOPPER))
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_ACTION_TRAIN:
- player->GetSession()->SendTrainerList(creature->GetGUID());
- break;
- case GOSSIP_ACTION_TRADE:
- player->GetSession()->SendListInventory(creature->GetGUID());
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_TRAIN:
+ player->GetSession()->SendTrainerList(me->GetGUID());
+ break;
+ case GOSSIP_ACTION_TRADE:
+ player->GetSession()->SendListInventory(me->GetGUID());
+ break;
+ }
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_roxi_ramrocketAI(creature);
}
};
@@ -477,11 +487,12 @@ public:
objectCounter = 0;
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
CloseGossipMenuFor(player);
playerGUID = player->GetGUID();
events.ScheduleEvent(EVENT_SCRIPT_1, 100);
+ return false;
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp
index 49e4f5d3dee..5f8148dcfa9 100644
--- a/src/server/scripts/Northrend/zone_wintergrasp.cpp
+++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp
@@ -115,69 +115,80 @@ class npc_wg_demolisher_engineer : public CreatureScript
public:
npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_wg_demolisher_engineerAI : public ScriptedAI
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ npc_wg_demolisher_engineerAI(Creature* creature) : ScriptedAI(creature) { }
- if (CanBuild(creature))
+ bool GossipHello(Player* player) override
{
- if (player->HasAura(SPELL_CORPORAL))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- else if (player->HasAura(SPELL_LIEUTENANT))
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (CanBuild())
{
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ if (player->HasAura(SPELL_CORPORAL))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ else if (player->HasAura(SPELL_LIEUTENANT))
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ }
}
- }
- else
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
-
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ else
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- CloseGossipMenuFor(player);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
- if (CanBuild(creature))
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- switch (action - GOSSIP_ACTION_INFO_DEF)
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ CloseGossipMenuFor(player);
+
+ if (CanBuild())
{
- case 0:
- creature->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true);
- break;
- case 1:
- creature->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true);
- break;
- case 2:
- creature->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true);
- break;
+ switch (action - GOSSIP_ACTION_INFO_DEF)
+ {
+ case 0:
+ DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true);
+ break;
+ case 1:
+ DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true);
+ break;
+ case 2:
+ DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true);
+ break;
+ }
+ if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true))
+ DoCast(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true);
}
- if (Creature* controlArms = creature->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true))
- creature->CastSpell(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true);
+ return true;
}
- return true;
- }
- private:
- bool CanBuild(Creature* creature)
- {
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
- if (!wintergrasp)
- return false;
-
- switch (creature->GetEntry())
+ private:
+ bool CanBuild() const
{
- case NPC_GOBLIN_MECHANIC:
- return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H));
- case NPC_GNOMISH_ENGINEER:
- return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A));
- default:
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!wintergrasp)
return false;
+
+ switch (me->GetEntry())
+ {
+ case NPC_GOBLIN_MECHANIC:
+ return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H));
+ case NPC_GNOMISH_ENGINEER:
+ return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A));
+ default:
+ return false;
+ }
}
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_wg_demolisher_engineerAI(creature);
}
};
@@ -186,48 +197,49 @@ class npc_wg_spirit_guide : public CreatureScript
public:
npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_wg_spirit_guideAI : public ScriptedAI
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { }
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
- if (!wintergrasp)
- return true;
+ void UpdateAI(uint32 /*diff*/) override
+ {
+ if (!me->HasUnitState(UNIT_STATE_CASTING))
+ DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL);
+ }
- GraveyardVect graveyard = wintergrasp->GetGraveyardVector();
- for (uint8 i = 0; i < graveyard.size(); i++)
- if (graveyard[i]->GetControlTeamId() == player->GetTeamId())
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i);
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!wintergrasp)
+ return true;
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override
- {
- CloseGossipMenuFor(player);
+ GraveyardVect graveyard = wintergrasp->GetGraveyardVector();
+ for (uint8 i = 0; i < graveyard.size(); i++)
+ if (graveyard[i]->GetControlTeamId() == player->GetTeamId())
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i);
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
- if (wintergrasp)
- {
- GraveyardVect gy = wintergrasp->GetGraveyardVector();
- for (uint8 i = 0; i < gy.size(); i++)
- if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId())
- if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId()))
- player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
}
- return true;
- }
-
- struct npc_wg_spirit_guideAI : public ScriptedAI
- {
- npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { }
- void UpdateAI(uint32 /*diff*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- if (!me->HasUnitState(UNIT_STATE_CASTING))
- DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ CloseGossipMenuFor(player);
+
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (wintergrasp)
+ {
+ GraveyardVect gy = wintergrasp->GetGraveyardVector();
+ for (uint8 i = 0; i < gy.size(); i++)
+ if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId())
+ if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId()))
+ player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0);
+ }
+ return true;
}
};
@@ -274,59 +286,59 @@ class npc_wg_queue : public CreatureScript
DoMeleeAttackIfReady();
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_wg_queueAI(creature);
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
- if (!wintergrasp)
- return true;
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!wintergrasp)
+ return true;
- if (wintergrasp->IsWarTime())
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID());
- }
- else
- {
- uint32 timer = wintergrasp->GetTimer() / 1000;
- player->SendUpdateWorldState(4354, time(NULL) + timer);
- if (timer < 15 * MINUTE)
+ if (wintergrasp->IsWarTime())
{
AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID());
+ SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID());
}
else
- SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID());
+ {
+ uint32 timer = wintergrasp->GetTimer() / 1000;
+ player->SendUpdateWorldState(4354, time(NULL) + timer);
+ if (timer < 15 * MINUTE)
+ {
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID());
+ }
+ else
+ SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID());
+ }
+ return true;
}
- return true;
- }
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) override
- {
- CloseGossipMenuFor(player);
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ {
+ CloseGossipMenuFor(player);
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
- if (!wintergrasp)
- return true;
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!wintergrasp)
+ return true;
- if (wintergrasp->IsWarTime())
- wintergrasp->InvitePlayerToWar(player);
- else
- {
- uint32 timer = wintergrasp->GetTimer() / 1000;
- if (timer < 15 * MINUTE)
- wintergrasp->InvitePlayerToQueue(player);
+ if (wintergrasp->IsWarTime())
+ wintergrasp->InvitePlayerToWar(player);
+ else
+ {
+ uint32 timer = wintergrasp->GetTimer() / 1000;
+ if (timer < 15 * MINUTE)
+ wintergrasp->InvitePlayerToQueue(player);
+ }
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_wg_queueAI(creature);
}
};
@@ -341,8 +353,8 @@ class go_wg_vehicle_teleporter : public GameObjectScript
bool IsFriendly(Unit* passenger)
{
- return ((go->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) ||
- (go->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE));
+ return ((me->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) ||
+ (me->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE));
}
Creature* GetValidVehicle(Creature* cVeh)
@@ -351,7 +363,7 @@ class go_wg_vehicle_teleporter : public GameObjectScript
if (Vehicle* vehicle = cVeh->GetVehicleKit())
if (Unit* passenger = vehicle->GetPassenger(0))
if (IsFriendly(passenger))
- if (Creature* teleportTrigger = passenger->SummonTrigger(go->GetPositionX()-60.0f, go->GetPositionY(), go->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1000))
+ if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX()-60.0f, me->GetPositionY(), me->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1000))
return teleportTrigger;
return nullptr;
@@ -363,7 +375,7 @@ class go_wg_vehicle_teleporter : public GameObjectScript
if (_checkTimer >= 1000)
{
for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++)
- if (Creature* vehicleCreature = go->FindNearestCreature(vehiclesList[i], 3.0f, true))
+ if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true))
if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature))
teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true);
diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index 26da2249623..199788903a6 100644
--- a/src/server/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
@@ -19,6 +19,7 @@
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
+#include "GameObjectAI.h"
#include "Player.h"
#include "SpellInfo.h"
#include "SpellScript.h"
@@ -267,12 +268,13 @@ public:
return;
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
_events.ScheduleEvent(EVENT_RECRUIT_1, 100);
CloseGossipMenuFor(player);
me->CastSpell(player, SPELL_QUEST_CREDIT, true);
me->SetFacingToObject(player);
+ return false;
}
private:
@@ -303,20 +305,29 @@ class go_scourge_enclosure : public GameObjectScript
public:
go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_scourge_enclosureAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE)
+ go_scourge_enclosureAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- Creature* gymerDummy = go->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f);
- if (gymerDummy)
+ me->UseDoorOrButton();
+ if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE)
{
- player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID());
- gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true);
- gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS);
+ if (Creature* gymerDummy = me->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f))
+ {
+ player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID());
+ gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true);
+ gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS);
+ }
}
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_scourge_enclosureAI(go);
}
};
@@ -552,13 +563,14 @@ public:
}
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
CloseGossipMenuFor(player);
DoCast(player, SPELL_ALCHEMIST_APPRENTICE_INVISBUFF);
_playerGUID = player->GetGUID();
_getingredienttry = 1;
_events.ScheduleEvent(EVENT_EASY_123, 100);
+ return false;
}
private:
@@ -578,10 +590,20 @@ class go_finklesteins_cauldron : public GameObjectScript
public:
go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_finklesteins_cauldronAI : public GameObjectAI
+ {
+ go_finklesteins_cauldronAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ player->CastSpell(player, SPELL_POT_CHECK);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
{
- player->CastSpell(player, SPELL_POT_CHECK);
- return true;
+ return new go_finklesteins_cauldronAI(go);
}
};
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
{
diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index 4c70439f421..0e0641932f2 100644
--- a/src/server/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
@@ -69,10 +69,20 @@ class go_cat_figurine : public GameObjectScript
public:
go_cat_figurine() : GameObjectScript("go_cat_figurine") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_cat_figurineAI : public GameObjectAI
{
- player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true);
- return false;
+ go_cat_figurineAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true);
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_cat_figurineAI(go);
}
};
@@ -85,12 +95,22 @@ class go_barov_journal : public GameObjectScript
public:
go_barov_journal() : GameObjectScript("go_barov_journal") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_barov_journalAI : public GameObjectAI
{
- if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086))
- player->CastSpell(player, 26095, false);
+ go_barov_journalAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086))
+ player->CastSpell(player, 26095, false);
+
+ return true;
+ }
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_barov_journalAI(go);
}
};
@@ -109,17 +129,27 @@ class go_gilded_brazier : public GameObjectScript
public:
go_gilded_brazier() : GameObjectScript("go_gilded_brazier") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_gilded_brazierAI : public GameObjectAI
{
- if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
+ go_gilded_brazierAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE)
+ if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
{
- if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000))
- Stillblade->AI()->AttackStart(player);
+ if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE)
+ {
+ if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000))
+ Stillblade->AI()->AttackStart(player);
+ }
}
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_gilded_brazierAI(go);
}
};
@@ -132,12 +162,22 @@ class go_orb_of_command : public GameObjectScript
public:
go_orb_of_command() : GameObjectScript("go_orb_of_command") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_orb_of_commandAI : public GameObjectAI
{
- if (player->GetQuestRewardStatus(7761))
- player->CastSpell(player, 23460, true);
+ go_orb_of_commandAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->GetQuestRewardStatus(7761))
+ player->CastSpell(player, 23460, true);
- return true;
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_orb_of_commandAI(go);
}
};
@@ -150,12 +190,22 @@ class go_tablet_of_madness : public GameObjectScript
public:
go_tablet_of_madness() : GameObjectScript("go_tablet_of_madness") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_tablet_of_madnessAI : public GameObjectAI
{
- if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266))
- player->CastSpell(player, 24267, false);
+ go_tablet_of_madnessAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266))
+ player->CastSpell(player, 24267, false);
+
+ return true;
+ }
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_tablet_of_madnessAI(go);
}
};
@@ -168,16 +218,26 @@ class go_tablet_of_the_seven : public GameObjectScript
public:
go_tablet_of_the_seven() : GameObjectScript("go_tablet_of_the_seven") { }
- /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support.
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_tablet_of_the_sevenAI : public GameObjectAI
{
- if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
- return true;
+ go_tablet_of_the_sevenAI(GameObject* go) : GameObjectAI(go) { }
+
+ /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support.
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (me->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
+ return true;
+
+ if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE)
+ player->CastSpell(player, 15065, false);
- if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE)
- player->CastSpell(player, 15065, false);
+ return true;
+ }
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_tablet_of_the_sevenAI(go);
}
};
@@ -190,12 +250,22 @@ class go_jump_a_tron : public GameObjectScript
public:
go_jump_a_tron() : GameObjectScript("go_jump_a_tron") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_jump_a_tronAI : public GameObjectAI
{
- if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE)
- player->CastSpell(player, 33382, true);
+ go_jump_a_tronAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE)
+ player->CastSpell(player, 33382, true);
+
+ return true;
+ }
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_jump_a_tronAI(go);
}
};
@@ -224,39 +294,49 @@ class go_ethereum_prison : public GameObjectScript
public:
go_ethereum_prison() : GameObjectScript("go_ethereum_prison") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_ethereum_prisonAI : public GameObjectAI
{
- go->UseDoorOrButton();
- int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32));
+ go_ethereum_prisonAI(GameObject* go) : GameObjectAI(go) { }
- if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player),
- TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- if (!creature->IsHostileTo(player))
+ me->UseDoorOrButton();
+ int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32));
+
+ if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player),
+ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
{
- if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry())
+ if (!creature->IsHostileTo(player))
{
- uint32 Spell = 0;
-
- switch (pFaction->faction)
+ if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry())
{
- case 1011: Spell = SPELL_REP_LC; break;
- case 935: Spell = SPELL_REP_SHAT; break;
- case 942: Spell = SPELL_REP_CE; break;
- case 933: Spell = SPELL_REP_CON; break;
- case 989: Spell = SPELL_REP_KT; break;
- case 970: Spell = SPELL_REP_SPOR; break;
- }
+ uint32 Spell = 0;
- if (Spell)
- creature->CastSpell(player, Spell, false);
- else
- TC_LOG_ERROR("scripts", "go_ethereum_prison summoned Creature (entry %u) but faction (%u) are not expected by script.", creature->GetEntry(), creature->GetFaction());
+ switch (pFaction->faction)
+ {
+ case 1011: Spell = SPELL_REP_LC; break;
+ case 935: Spell = SPELL_REP_SHAT; break;
+ case 942: Spell = SPELL_REP_CE; break;
+ case 933: Spell = SPELL_REP_CON; break;
+ case 989: Spell = SPELL_REP_KT; break;
+ case 970: Spell = SPELL_REP_SPOR; break;
+ }
+
+ if (Spell)
+ creature->CastSpell(player, Spell, false);
+ else
+ TC_LOG_ERROR("scripts", "go_ethereum_prison summoned Creature (entry %u) but faction (%u) are not expected by script.", creature->GetEntry(), creature->GetFaction());
+ }
}
}
+
+ return false;
}
+ };
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_ethereum_prisonAI(go);
}
};
@@ -274,15 +354,25 @@ class go_ethereum_stasis : public GameObjectScript
public:
go_ethereum_stasis() : GameObjectScript("go_ethereum_stasis") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_ethereum_stasisAI : public GameObjectAI
{
- go->UseDoorOrButton();
- int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32));
+ go_ethereum_stasisAI(GameObject* go) : GameObjectAI(go) { }
- player->SummonCreature(NpcStasisEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player),
- TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ me->UseDoorOrButton();
+ int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32));
+
+ player->SummonCreature(NpcStasisEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player),
+ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
+
+ return false;
+ }
+ };
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_ethereum_stasisAI(go);
}
};
@@ -300,12 +390,22 @@ class go_resonite_cask : public GameObjectScript
public:
go_resonite_cask() : GameObjectScript("go_resonite_cask") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_resonite_caskAI : public GameObjectAI
{
- if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
- go->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000);
+ go_resonite_caskAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
+ me->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000);
- return false;
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_resonite_caskAI(go);
}
};
@@ -323,12 +423,22 @@ class go_sacred_fire_of_life : public GameObjectScript
public:
go_sacred_fire_of_life() : GameObjectScript("go_sacred_fire_of_life") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_sacred_fire_of_lifeAI : public GameObjectAI
{
- if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
- player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
+ go_sacred_fire_of_lifeAI(GameObject* go) : GameObjectAI(go) { }
- return true;
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
+ player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
+
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_sacred_fire_of_lifeAI(go);
}
};
@@ -351,30 +461,40 @@ class go_shrine_of_the_birds : public GameObjectScript
public:
go_shrine_of_the_birds() : GameObjectScript("go_shrine_of_the_birds") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_shrine_of_the_birdsAI : public GameObjectAI
{
- uint32 BirdEntry = 0;
-
- float fX, fY, fZ;
- go->GetClosePoint(fX, fY, fZ, go->GetCombatReach(), INTERACTION_DISTANCE);
+ go_shrine_of_the_birdsAI(GameObject* go) : GameObjectAI(go) { }
- switch (go->GetEntry())
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- case GO_SHRINE_HAWK:
- BirdEntry = NPC_HAWK_GUARD;
- break;
- case GO_SHRINE_EAGLE:
- BirdEntry = NPC_EAGLE_GUARD;
- break;
- case GO_SHRINE_FALCON:
- BirdEntry = NPC_FALCON_GUARD;
- break;
- }
+ uint32 BirdEntry = 0;
+
+ float fX, fY, fZ;
+ me->GetClosePoint(fX, fY, fZ, me->GetCombatReach(), INTERACTION_DISTANCE);
+
+ switch (me->GetEntry())
+ {
+ case GO_SHRINE_HAWK:
+ BirdEntry = NPC_HAWK_GUARD;
+ break;
+ case GO_SHRINE_EAGLE:
+ BirdEntry = NPC_EAGLE_GUARD;
+ break;
+ case GO_SHRINE_FALCON:
+ BirdEntry = NPC_FALCON_GUARD;
+ break;
+ }
- if (BirdEntry)
- player->SummonCreature(BirdEntry, fX, fY, fZ, go->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
+ if (BirdEntry)
+ player->SummonCreature(BirdEntry, fX, fY, fZ, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000);
- return false;
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_shrine_of_the_birdsAI(go);
}
};
@@ -394,15 +514,25 @@ class go_southfury_moonstone : public GameObjectScript
public:
go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_southfury_moonstoneAI : public GameObjectAI
{
- //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose
- //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false);
+ go_southfury_moonstoneAI(GameObject* go) : GameObjectAI(go) { }
- if (Creature* creature = player->SummonCreature(NPC_RIZZLE, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0))
- creature->CastSpell(player, SPELL_BLACKJACK, false);
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose
+ //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false);
+
+ if (Creature* creature = player->SummonCreature(NPC_RIZZLE, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0))
+ creature->CastSpell(player, SPELL_BLACKJACK, false);
+
+ return false;
+ }
+ };
- return false;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_southfury_moonstoneAI(go);
}
};
@@ -423,14 +553,23 @@ class go_tele_to_dalaran_crystal : public GameObjectScript
public:
go_tele_to_dalaran_crystal() : GameObjectScript("go_tele_to_dalaran_crystal") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_tele_to_dalaran_crystalAI : public GameObjectAI
{
- if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG))
- return false;
+ go_tele_to_dalaran_crystalAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG))
+ return false;
- player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED);
+ player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED);
+ return true;
+ }
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_tele_to_dalaran_crystalAI(go);
}
};
@@ -443,12 +582,22 @@ class go_tele_to_violet_stand : public GameObjectScript
public:
go_tele_to_violet_stand() : GameObjectScript("go_tele_to_violet_stand") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_tele_to_violet_standAI : public GameObjectAI
{
- if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE)
- return false;
+ go_tele_to_violet_standAI(GameObject* go) : GameObjectAI(go) { }
- return true;
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE)
+ return false;
+
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_tele_to_violet_standAI(go);
}
};
@@ -473,41 +622,52 @@ class go_fel_crystalforge : public GameObjectScript
public:
go_fel_crystalforge() : GameObjectScript("go_fel_crystalforge") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_fel_crystalforgeAI : public GameObjectAI
{
- if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */
- player->PrepareQuestMenu(go->GetGUID()); /* return true*/
+ go_fel_crystalforgeAI(GameObject* go) : GameObjectAI(go) { }
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */
+ player->PrepareQuestMenu(me->GetGUID()); /* return true*/
- SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID());
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- return true;
- }
+ SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID());
- bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ return true;
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_ACTION_INFO_DEF:
- player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 1:
- player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID());
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF:
+ player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID());
+ break;
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_fel_crystalforgeAI(go);
}
};
@@ -532,41 +692,52 @@ class go_bashir_crystalforge : public GameObjectScript
public:
go_bashir_crystalforge() : GameObjectScript("go_bashir_crystalforge") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_bashir_crystalforgeAI : public GameObjectAI
{
- if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */
- player->PrepareQuestMenu(go->GetGUID()); /* return true*/
+ go_bashir_crystalforgeAI(GameObject* go) : GameObjectAI(go) { }
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */
+ player->PrepareQuestMenu(me->GetGUID()); /* return true*/
- SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID());
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- return true;
- }
+ SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID());
- bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (action)
+ return true;
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_ACTION_INFO_DEF:
- player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 1:
- player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID());
- break;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF:
+ player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID());
+ break;
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_bashir_crystalforgeAI(go);
}
};
@@ -596,42 +767,52 @@ class go_matrix_punchograph : public GameObjectScript
public:
go_matrix_punchograph() : GameObjectScript("go_matrix_punchograph") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_matrix_punchographAI : public GameObjectAI
{
- switch (go->GetEntry())
+ go_matrix_punchographAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- case MATRIX_PUNCHOGRAPH_3005_A:
- if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD))
- {
- player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true);
- player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true);
- }
- break;
- case MATRIX_PUNCHOGRAPH_3005_B:
- if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD))
- {
- player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true);
- player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true);
- }
- break;
- case MATRIX_PUNCHOGRAPH_3005_C:
- if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD))
- {
- player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true);
- player->CastSpell(player, SPELL_RED_PUNCH_CARD, true);
- }
- break;
- case MATRIX_PUNCHOGRAPH_3005_D:
- if (player->HasItemCount(ITEM_RED_PUNCH_CARD))
- {
- player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true);
- player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true);
- }
- break;
- default:
- break;
+ switch (me->GetEntry())
+ {
+ case MATRIX_PUNCHOGRAPH_3005_A:
+ if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD))
+ {
+ player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true);
+ player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true);
+ }
+ break;
+ case MATRIX_PUNCHOGRAPH_3005_B:
+ if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD))
+ {
+ player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true);
+ player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true);
+ }
+ break;
+ case MATRIX_PUNCHOGRAPH_3005_C:
+ if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD))
+ {
+ player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true);
+ player->CastSpell(player, SPELL_RED_PUNCH_CARD, true);
+ }
+ break;
+ case MATRIX_PUNCHOGRAPH_3005_D:
+ if (player->HasItemCount(ITEM_RED_PUNCH_CARD))
+ {
+ player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true);
+ player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true);
+ }
+ break;
+ default:
+ break;
+ }
+ return false;
}
- return false;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_matrix_punchographAI(go);
}
};
@@ -649,16 +830,26 @@ class go_scourge_cage : public GameObjectScript
public:
go_scourge_cage() : GameObjectScript("go_scourge_cage") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_scourge_cageAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (Creature* pNearestPrisoner = go->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true))
+ go_scourge_cageAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID());
- pNearestPrisoner->DisappearAndDie();
+ me->UseDoorOrButton();
+ if (Creature* pNearestPrisoner = me->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true))
+ {
+ player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID());
+ pNearestPrisoner->DisappearAndDie();
+ }
+
+ return true;
}
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_scourge_cageAI(go);
}
};
@@ -677,15 +868,25 @@ class go_arcane_prison : public GameObjectScript
public:
go_arcane_prison() : GameObjectScript("go_arcane_prison") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_arcane_prisonAI : public GameObjectAI
{
- if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE)
+ go_arcane_prisonAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- go->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000);
- player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true);
- return true;
+ if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE)
+ {
+ me->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000);
+ player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true);
+ return true;
+ }
+ return false;
}
- return false;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_arcane_prisonAI(go);
}
};
@@ -704,12 +905,22 @@ class go_blood_filled_orb : public GameObjectScript
public:
go_blood_filled_orb() : GameObjectScript("go_blood_filled_orb") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_blood_filled_orbAI : public GameObjectAI
{
- if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
- player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
+ go_blood_filled_orbAI(GameObject* go) : GameObjectAI(go) { }
- return true;
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
+ player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
+
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_blood_filled_orbAI(go);
}
};
@@ -735,41 +946,51 @@ class go_jotunheim_cage : public GameObjectScript
public:
go_jotunheim_cage() : GameObjectScript("go_jotunheim_cage") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_jotunheim_cageAI : public GameObjectAI
{
- go->UseDoorOrButton();
- Creature* pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true);
- if (!pPrisoner)
+ go_jotunheim_cageAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true);
+ me->UseDoorOrButton();
+ Creature* pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true);
if (!pPrisoner)
{
- pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true);
+ pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true);
if (!pPrisoner)
- pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true);
+ {
+ pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true);
+ if (!pPrisoner)
+ pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true);
+ }
}
- }
- if (!pPrisoner || !pPrisoner->IsAlive())
- return false;
+ if (!pPrisoner || !pPrisoner->IsAlive())
+ return false;
- pPrisoner->DisappearAndDie();
- player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN);
- switch (pPrisoner->GetEntry())
- {
- case NPC_EBON_BLADE_PRISONER_HUMAN:
- player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_H, true);
- break;
- case NPC_EBON_BLADE_PRISONER_NE:
- player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_NE, true);
- break;
- case NPC_EBON_BLADE_PRISONER_TROLL:
- player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_TROLL, true);
- break;
- case NPC_EBON_BLADE_PRISONER_ORC:
- player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_ORC, true);
- break;
+ pPrisoner->DisappearAndDie();
+ player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN);
+ switch (pPrisoner->GetEntry())
+ {
+ case NPC_EBON_BLADE_PRISONER_HUMAN:
+ player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_H, true);
+ break;
+ case NPC_EBON_BLADE_PRISONER_NE:
+ player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_NE, true);
+ break;
+ case NPC_EBON_BLADE_PRISONER_TROLL:
+ player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_TROLL, true);
+ break;
+ case NPC_EBON_BLADE_PRISONER_ORC:
+ player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_ORC, true);
+ break;
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_jotunheim_cageAI(go);
}
};
@@ -785,14 +1006,23 @@ class go_table_theka : public GameObjectScript
public:
go_table_theka() : GameObjectScript("go_table_theka") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_table_thekaAI : public GameObjectAI
{
- if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE)
- player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD);
+ go_table_thekaAI(GameObject* go) : GameObjectAI(go) { }
- SendGossipMenuFor(player, GOSSIP_TABLE_THEKA, go->GetGUID());
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE)
+ player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD);
- return true;
+ SendGossipMenuFor(player, GOSSIP_TABLE_THEKA, me->GetGUID());
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_table_thekaAI(go);
}
};
@@ -811,14 +1041,23 @@ class go_inconspicuous_landmark : public GameObjectScript
public:
go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") { }
- bool OnGossipHello(Player* player, GameObject* /*go*/) override
+ struct go_inconspicuous_landmarkAI : public GameObjectAI
{
- if (player->HasItemCount(ITEM_CUERGOS_KEY))
- return false;
+ go_inconspicuous_landmarkAI(GameObject* go) : GameObjectAI(go) { }
- player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true);
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ if (player->HasItemCount(ITEM_CUERGOS_KEY))
+ return false;
+
+ player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true);
+ return true;
+ }
+ };
- return true;
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_inconspicuous_landmarkAI(go);
}
};
@@ -893,7 +1132,7 @@ class go_soulwell : public GameObjectScript
/// on the well. We have to find how to segregate REPORT_USE and USE.
bool GossipHello(Player* player, bool /*reportUse*/) override
{
- Unit* owner = go->GetOwner();
+ Unit* owner = me->GetOwner();
if (_stoneSpell == 0 || _stoneId == 0)
return true;
@@ -911,7 +1150,7 @@ class go_soulwell : public GameObjectScript
owner->CastSpell(player, _stoneSpell, true);
// Item has to actually be created to remove a charge on the well.
if (player->HasItemCount(_stoneId))
- go->AddUse();
+ me->AddUse();
return false;
}
@@ -946,35 +1185,45 @@ class go_dragonflayer_cage : public GameObjectScript
public:
go_dragonflayer_cage() : GameObjectScript("go_dragonflayer_cage") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_dragonflayer_cageAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE)
- return true;
+ go_dragonflayer_cageAI(GameObject* go) : GameObjectAI(go) { }
- Creature* pPrisoner = go->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f);
- if (!pPrisoner)
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- pPrisoner = go->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f);
+ me->UseDoorOrButton();
+ if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE)
+ return true;
+
+ Creature* pPrisoner = me->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f);
if (!pPrisoner)
{
- pPrisoner = go->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f);
+ pPrisoner = me->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f);
if (!pPrisoner)
- pPrisoner = go->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f);
+ {
+ pPrisoner = me->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f);
+ if (!pPrisoner)
+ pPrisoner = me->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f);
+ }
}
- }
- if (!pPrisoner || !pPrisoner->IsAlive())
- return true;
+ if (!pPrisoner || !pPrisoner->IsAlive())
+ return true;
- Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL);
- if (qInfo)
- {
- /// @todo prisoner should help player for a short period of time
- player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]);
- pPrisoner->DisappearAndDie();
+ Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL);
+ if (qInfo)
+ {
+ /// @todo prisoner should help player for a short period of time
+ player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]);
+ pPrisoner->DisappearAndDie();
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_dragonflayer_cageAI(go);
}
};
@@ -994,20 +1243,30 @@ class go_tadpole_cage : public GameObjectScript
public:
go_tadpole_cage() : GameObjectScript("go_tadpole_cage") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_tadpole_cageAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE)
+ go_tadpole_cageAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- Creature* pTadpole = go->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f);
- if (pTadpole)
+ me->UseDoorOrButton();
+ if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE)
{
- pTadpole->DisappearAndDie();
- player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE);
- //FIX: Summon minion tadpole
+ Creature* pTadpole = me->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f);
+ if (pTadpole)
+ {
+ pTadpole->DisappearAndDie();
+ player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE);
+ //FIX: Summon minion tadpole
+ }
}
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_tadpole_cageAI(go);
}
};
@@ -1035,43 +1294,54 @@ class go_amberpine_outhouse : public GameObjectScript
public:
go_amberpine_outhouse() : GameObjectScript("go_amberpine_outhouse") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_amberpine_outhouseAI : public GameObjectAI
{
- QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY);
- if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED)
- {
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, GOSSIP_OUTHOUSE_VACANT, go->GetGUID());
- }
- else
- SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, go->GetGUID());
+ go_amberpine_outhouseAI(GameObject* go) : GameObjectAI(go) { }
- return true;
- }
-
- bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF +1)
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- CloseGossipMenuFor(player);
- Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f);
- if (target)
+ QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY);
+ if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED)
{
- target->AI()->SetData(1, player->getGender());
- go->CastSpell(target, SPELL_INDISPOSED_III);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_OUTHOUSE_VACANT, me->GetGUID());
}
- go->CastSpell(player, SPELL_INDISPOSED);
- if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER))
- go->CastSpell(player, SPELL_CREATE_AMBERSEEDS);
+ else
+ SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, me->GetGUID());
+
return true;
}
- else
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- CloseGossipMenuFor(player);
- player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND);
- return false;
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ {
+ CloseGossipMenuFor(player);
+ Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f);
+ if (target)
+ {
+ target->AI()->SetData(1, player->getGender());
+ me->CastSpell(target, SPELL_INDISPOSED_III);
+ }
+ me->CastSpell(player, SPELL_INDISPOSED);
+ if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER))
+ me->CastSpell(player, SPELL_CREATE_AMBERSEEDS);
+ return true;
+ }
+ else
+ {
+ CloseGossipMenuFor(player);
+ player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND);
+ return false;
+ }
}
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_amberpine_outhouseAI(go);
}
};
@@ -1091,12 +1361,22 @@ class go_hive_pod : public GameObjectScript
public:
go_hive_pod() : GameObjectScript("go_hive_pod") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_hive_podAI : public GameObjectAI
{
- player->SendLoot(go->GetGUID(), LOOT_CORPSE);
- go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX()+1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
- go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY()+1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
- return true;
+ go_hive_podAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ player->SendLoot(me->GetGUID(), LOOT_CORPSE);
+ me->SummonCreature(NPC_HIVE_AMBUSHER, me->GetPositionX() + 1, me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
+ me->SummonCreature(NPC_HIVE_AMBUSHER, me->GetPositionX(), me->GetPositionY() + 1, me->GetPositionZ(), me->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_hive_podAI(go);
}
};
@@ -1105,10 +1385,20 @@ class go_massive_seaforium_charge : public GameObjectScript
public:
go_massive_seaforium_charge() : GameObjectScript("go_massive_seaforium_charge") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) override
+ struct go_massive_seaforium_chargeAI : public GameObjectAI
{
- go->SetLootState(GO_JUST_DEACTIVATED);
- return true;
+ go_massive_seaforium_chargeAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* /*player*/, bool /*reportUse*/) override
+ {
+ me->SetLootState(GO_JUST_DEACTIVATED);
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_massive_seaforium_chargeAI(go);
}
};
@@ -1128,23 +1418,33 @@ class go_veil_skith_cage : public GameObjectScript
public:
go_veil_skith_cage() : GameObjectScript("go_veil_skith_cage") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_veil_skith_cageAI : public GameObjectAI
{
- go->UseDoorOrButton();
- if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE)
+ go_veil_skith_cageAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- std::list<Creature*> childrenList;
- GetCreatureListWithEntryInGrid(childrenList, go, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE);
- for (std::list<Creature*>::const_iterator itr = childrenList.begin(); itr != childrenList.end(); ++itr)
+ me->UseDoorOrButton();
+ if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE)
{
- player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID());
- (*itr)->DespawnOrUnsummon(5000);
- (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ());
- (*itr)->AI()->Talk(SAY_FREE_0);
- (*itr)->GetMotionMaster()->Clear();
+ std::vector<Creature*> childrenList;
+ GetCreatureListWithEntryInGrid(childrenList, me, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE);
+ for (Creature* creature : childrenList)
+ {
+ player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, creature->GetGUID());
+ creature->DespawnOrUnsummon(5000);
+ creature->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ());
+ creature->AI()->Talk(SAY_FREE_0);
+ creature->GetMotionMaster()->Clear();
+ }
}
+ return false;
}
- return false;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_veil_skith_cageAI(go);
}
};
@@ -1165,16 +1465,28 @@ class go_frostblade_shrine : public GameObjectScript
public:
go_frostblade_shrine() : GameObjectScript("go_frostblade_shrine") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_frostblade_shrineAI : public GameObjectAI
{
- go->UseDoorOrButton(10);
- if (!player->HasAura(SPELL_RECENT_MEDITATION))
- if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE)
+ go_frostblade_shrineAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
+ {
+ me->UseDoorOrButton(10);
+ if (!player->HasAura(SPELL_RECENT_MEDITATION))
{
- player->CastSpell(player, SPELL_CLEANSING_SOUL);
- player->SetStandState(UNIT_STAND_STATE_SIT);
+ if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE)
+ {
+ player->CastSpell(player, SPELL_CLEANSING_SOUL);
+ player->SetStandState(UNIT_STAND_STATE_SIT);
+ }
}
- return true;
+ return true;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_frostblade_shrineAI(go);
}
};
@@ -1192,11 +1504,21 @@ class go_midsummer_bonfire : public GameObjectScript
public:
go_midsummer_bonfire() : GameObjectScript("go_midsummer_bonfire") { }
- bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) override
+ struct go_midsummer_bonfireAI : public GameObjectAI
{
- player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true);
- CloseGossipMenuFor(player);
- return false;
+ go_midsummer_bonfireAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
+ {
+ player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true);
+ CloseGossipMenuFor(player);
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_midsummer_bonfireAI(go);
}
};
@@ -1213,14 +1535,24 @@ class go_midsummer_ribbon_pole : public GameObjectScript
public:
go_midsummer_ribbon_pole() : GameObjectScript("go_midsummer_ribbon_pole") { }
- bool OnGossipHello(Player* player, GameObject* go) override
+ struct go_midsummer_ribbon_poleAI : public GameObjectAI
{
- if (Creature* creature = go->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f))
+ go_midsummer_ribbon_poleAI(GameObject* go) : GameObjectAI(go) { }
+
+ bool GossipHello(Player* player, bool /*reportUse*/) override
{
- creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES);
- player->CastSpell(creature, SPELL_POLE_DANCE, true);
+ if (Creature* creature = me->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f))
+ {
+ creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES);
+ player->CastSpell(creature, SPELL_POLE_DANCE, true);
+ }
+ return true;
}
- return true;
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return new go_midsummer_ribbon_poleAI(go);
}
};
@@ -1244,7 +1576,7 @@ class go_toy_train_set : public GameObjectScript
_pulseTimer -= diff;
else
{
- go->CastSpell(nullptr, SPELL_TOY_TRAIN_PULSE, true);
+ me->CastSpell(nullptr, SPELL_TOY_TRAIN_PULSE, true);
_pulseTimer = 6 * IN_MILLISECONDS;
}
}
@@ -1252,7 +1584,7 @@ class go_toy_train_set : public GameObjectScript
// triggered on wrecker'd
void DoAction(int32 /*action*/) override
{
- go->Delete();
+ me->Delete();
}
private:
@@ -1344,39 +1676,39 @@ public:
if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active
break;
// Check if gob is correct area, play music, set time of music
- if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF || go->GetAreaId() == SHATTRATH)
+ if (me->GetAreaId() == SILVERMOON || me->GetAreaId() == UNDERCITY || me->GetAreaId() == ORGRIMMAR_1 || me->GetAreaId() == ORGRIMMAR_2 || me->GetAreaId() == THUNDERBLUFF || me->GetAreaId() == SHATTRATH)
{
if (rnd == 0)
{
- go->PlayDirectMusic(EVENT_BREWFESTGOBLIN01);
+ me->PlayDirectMusic(EVENT_BREWFESTGOBLIN01);
musicTime = EVENT_BREWFESTGOBLIN01_TIME;
}
else if (rnd == 1)
{
- go->PlayDirectMusic(EVENT_BREWFESTGOBLIN02);
+ me->PlayDirectMusic(EVENT_BREWFESTGOBLIN02);
musicTime = EVENT_BREWFESTGOBLIN02_TIME;
}
else
{
- go->PlayDirectMusic(EVENT_BREWFESTGOBLIN03);
+ me->PlayDirectMusic(EVENT_BREWFESTGOBLIN03);
musicTime = EVENT_BREWFESTGOBLIN03_TIME;
}
}
- if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS || go->GetAreaId() == SHATTRATH)
+ if (me->GetAreaId() == IRONFORGE_1 || me->GetAreaId() == IRONFORGE_2 || me->GetAreaId() == STORMWIND || me->GetAreaId() == EXODAR || me->GetAreaId() == DARNASSUS || me->GetAreaId() == SHATTRATH)
{
if (rnd == 0)
{
- go->PlayDirectMusic(EVENT_BREWFESTDWARF01);
+ me->PlayDirectMusic(EVENT_BREWFESTDWARF01);
musicTime = EVENT_BREWFESTDWARF01_TIME;
}
else if (rnd == 1)
{
- go->PlayDirectMusic(EVENT_BREWFESTDWARF02);
+ me->PlayDirectMusic(EVENT_BREWFESTDWARF02);
musicTime = EVENT_BREWFESTDWARF02_TIME;
}
else
{
- go->PlayDirectMusic(EVENT_BREWFESTDWARF03);
+ me->PlayDirectMusic(EVENT_BREWFESTDWARF03);
musicTime = EVENT_BREWFESTDWARF03_TIME;
}
}
@@ -1437,13 +1769,13 @@ public:
break;
std::vector<Player*> playersNearby;
- go->GetPlayerListInGrid(playersNearby, go->GetMap()->GetVisibilityRange());
+ me->GetPlayerListInGrid(playersNearby, me->GetMap()->GetVisibilityRange());
for (Player* player : playersNearby)
{
if (player->GetTeamId() == TEAM_HORDE)
- go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player);
+ me->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player);
else
- go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player);
+ me->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player);
}
_events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
break;
@@ -1499,7 +1831,7 @@ public:
case EVENT_DFM_START_MUSIC:
if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH))
break;
- go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC);
+ me->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC);
_events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
break;
default:
@@ -1553,7 +1885,7 @@ public:
case EVENT_PDM_START_MUSIC:
if (!IsHolidayActive(HOLIDAY_PIRATES_DAY))
break;
- go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC);
+ me->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC);
_events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value)
break;
default:
@@ -1619,16 +1951,16 @@ public:
void InitializeAI() override
{
- switch (go->GetEntry())
+ switch (me->GetEntry())
{
case GO_HORDE_BELL:
- _soundId = go->GetAreaId() == UNDERCITY_AREA ? BELLTOLLHORDE : BELLTOLLTRIBAL;
+ _soundId = me->GetAreaId() == UNDERCITY_AREA ? BELLTOLLHORDE : BELLTOLLTRIBAL;
break;
case GO_ALLIANCE_BELL:
{
- if (go->GetAreaId() == IRONFORGE_1_AREA || go->GetAreaId() == IRONFORGE_2_AREA)
+ if (me->GetAreaId() == IRONFORGE_1_AREA || me->GetAreaId() == IRONFORGE_2_AREA)
_soundId = BELLTOLLDWARFGNOME;
- else if (go->GetAreaId() == DARNASSUS_AREA || go->GetZoneId() == TELDRASSIL_ZONE)
+ else if (me->GetAreaId() == DARNASSUS_AREA || me->GetZoneId() == TELDRASSIL_ZONE)
_soundId = BELLTOLLNIGHTELF;
else
_soundId = BELLTOLLALLIANCE;
@@ -1664,7 +1996,7 @@ public:
switch (eventId)
{
case EVENT_RING_BELL:
- go->PlayDirectSound(_soundId);
+ me->PlayDirectSound(_soundId);
break;
default:
break;
diff --git a/src/server/scripts/World/npc_innkeeper.cpp b/src/server/scripts/World/npc_innkeeper.cpp
index 8c321c82664..d5cba9a7225 100644
--- a/src/server/scripts/World/npc_innkeeper.cpp
+++ b/src/server/scripts/World/npc_innkeeper.cpp
@@ -49,86 +49,97 @@ class npc_innkeeper : public CreatureScript
public:
npc_innkeeper() : CreatureScript("npc_innkeeper") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_innkeeperAI : public ScriptedAI
{
- if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED))
+ npc_innkeeperAI(Creature* creature) : ScriptedAI(creature) { }
+
+ bool GossipHello(Player* player) override
{
- const char* localizedEntry;
- switch (player->GetSession()->GetSessionDbcLocale())
+ if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED))
{
- case LOCALE_frFR: localizedEntry = LOCALE_TRICK_OR_TREAT_2; break;
- case LOCALE_deDE: localizedEntry = LOCALE_TRICK_OR_TREAT_3; break;
- case LOCALE_esES: localizedEntry = LOCALE_TRICK_OR_TREAT_6; break;
- case LOCALE_enUS: default: localizedEntry = LOCALE_TRICK_OR_TREAT_0;
+ const char* localizedEntry;
+ switch (player->GetSession()->GetSessionDbcLocale())
+ {
+ case LOCALE_frFR: localizedEntry = LOCALE_TRICK_OR_TREAT_2; break;
+ case LOCALE_deDE: localizedEntry = LOCALE_TRICK_OR_TREAT_3; break;
+ case LOCALE_esES: localizedEntry = LOCALE_TRICK_OR_TREAT_6; break;
+ case LOCALE_enUS: default: localizedEntry = LOCALE_TRICK_OR_TREAT_0;
+ }
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
}
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- }
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- if (creature->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ if (me->IsVendor())
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- if (creature->IsInnkeeper())
- {
- const char* localizedEntry;
- switch (player->GetSession()->GetSessionDbcLocale())
+ if (me->IsInnkeeper())
{
- case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break;
- case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0;
+ const char* localizedEntry;
+ switch (player->GetSession()->GetSessionDbcLocale())
+ {
+ case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break;
+ case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0;
+ }
+ AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN);
}
- AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN);
- }
- player->TalkedToCreature(creature->GetEntry(), creature->GetGUID());
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
+ player->TalkedToCreature(me->GetEntry(), me->GetGUID());
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF + 1 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED))
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- player->CastSpell(player, SPELL_TRICK_OR_TREATED, true);
-
- if (urand(0, 1))
- player->CastSpell(player, SPELL_TREAT, true);
- else
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED))
{
- uint32 trickspell = 0;
- switch (urand(0, 13))
+ player->CastSpell(player, SPELL_TRICK_OR_TREATED, true);
+
+ if (urand(0, 1))
+ player->CastSpell(player, SPELL_TREAT, true);
+ else
{
- case 0: trickspell = 24753; break; // cannot cast, random 30sec
- case 1: trickspell = 24713; break; // lepper gnome costume
- case 2: trickspell = 24735; break; // male ghost costume
- case 3: trickspell = 24736; break; // female ghostcostume
- case 4: trickspell = 24710; break; // male ninja costume
- case 5: trickspell = 24711; break; // female ninja costume
- case 6: trickspell = 24708; break; // male pirate costume
- case 7: trickspell = 24709; break; // female pirate costume
- case 8: trickspell = 24723; break; // skeleton costume
- case 9: trickspell = 24753; break; // Trick
- case 10: trickspell = 24924; break; // Hallow's End Candy
- case 11: trickspell = 24925; break; // Hallow's End Candy
- case 12: trickspell = 24926; break; // Hallow's End Candy
- case 13: trickspell = 24927; break; // Hallow's End Candy
+ uint32 trickspell = 0;
+ switch (urand(0, 13))
+ {
+ case 0: trickspell = 24753; break; // cannot cast, random 30sec
+ case 1: trickspell = 24713; break; // lepper gnome costume
+ case 2: trickspell = 24735; break; // male ghost costume
+ case 3: trickspell = 24736; break; // female ghostcostume
+ case 4: trickspell = 24710; break; // male ninja costume
+ case 5: trickspell = 24711; break; // female ninja costume
+ case 6: trickspell = 24708; break; // male pirate costume
+ case 7: trickspell = 24709; break; // female pirate costume
+ case 8: trickspell = 24723; break; // skeleton costume
+ case 9: trickspell = 24753; break; // Trick
+ case 10: trickspell = 24924; break; // Hallow's End Candy
+ case 11: trickspell = 24925; break; // Hallow's End Candy
+ case 12: trickspell = 24926; break; // Hallow's End Candy
+ case 13: trickspell = 24927; break; // Hallow's End Candy
+ }
+ player->CastSpell(player, trickspell, true);
}
- player->CastSpell(player, trickspell, true);
+ CloseGossipMenuFor(player);
+ return true;
}
+
CloseGossipMenuFor(player);
+
+ switch (action)
+ {
+ case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(me->GetGUID()); break;
+ case GOSSIP_ACTION_INN: player->SetBindPoint(me->GetGUID()); break;
+ }
return true;
}
+ };
- CloseGossipMenuFor(player);
-
- switch (action)
- {
- case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); break;
- case GOSSIP_ACTION_INN: player->SetBindPoint(creature->GetGUID()); break;
- }
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_innkeeperAI(creature);
}
};
diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp
index 61c49b77028..bfc8f19add0 100644
--- a/src/server/scripts/World/npc_professions.cpp
+++ b/src/server/scripts/World/npc_professions.cpp
@@ -446,159 +446,171 @@ class npc_prof_alchemy : public CreatureScript
public:
npc_prof_alchemy() : CreatureScript("npc_prof_alchemy") { }
- inline bool HasAlchemySpell(Player* player)
+ struct npc_prof_alchemyAI : public ScriptedAI
{
- return (player->HasSpell(S_TRANSMUTE) || player->HasSpell(S_ELIXIR) || player->HasSpell(S_POTION));
- }
+ npc_prof_alchemyAI(Creature* creature) : ScriptedAI(creature) { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ inline bool HasAlchemySpell(Player* player)
+ {
+ return (player->HasSpell(S_TRANSMUTE) || player->HasSpell(S_ELIXIR) || player->HasSpell(S_POTION));
+ }
- if (creature->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- if (creature->IsTrainer())
- AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+ if (me->IsVendor())
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- if (player->HasSkill(SKILL_ALCHEMY) && player->GetBaseSkillValue(SKILL_ALCHEMY) >= 350 && player->getLevel() > 67)
- {
- if (player->GetQuestRewardStatus(Q_MASTER_TRANSMUTE) || player->GetQuestRewardStatus(Q_MASTER_ELIXIR) || player->GetQuestRewardStatus(Q_MASTER_POTION))
+ if (me->IsTrainer())
+ AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+
+ if (player->HasSkill(SKILL_ALCHEMY) && player->GetBaseSkillValue(SKILL_ALCHEMY) >= 350 && player->getLevel() > 67)
{
- switch (creature->GetEntry())
+ if (player->GetQuestRewardStatus(Q_MASTER_TRANSMUTE) || player->GetQuestRewardStatus(Q_MASTER_ELIXIR) || player->GetQuestRewardStatus(Q_MASTER_POTION))
{
- case N_TRAINER_TRANSMUTE: //Zarevhi
- if (!HasAlchemySpell(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1);
- if (player->HasSpell(S_TRANSMUTE))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4);
- break;
- case N_TRAINER_ELIXIR: //Lorokeem
- if (!HasAlchemySpell(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2);
- if (player->HasSpell(S_ELIXIR))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5);
- break;
- case N_TRAINER_POTION: //Lauranna Thar'well
- if (!HasAlchemySpell(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3);
- if (player->HasSpell(S_POTION))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6);
- break;
+ switch (me->GetEntry())
+ {
+ case N_TRAINER_TRANSMUTE: //Zarevhi
+ if (!HasAlchemySpell(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1);
+ if (player->HasSpell(S_TRANSMUTE))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4);
+ break;
+ case N_TRAINER_ELIXIR: //Lorokeem
+ if (!HasAlchemySpell(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2);
+ if (player->HasSpell(S_ELIXIR))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5);
+ break;
+ case N_TRAINER_POTION: //Lauranna Thar'well
+ if (!HasAlchemySpell(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3);
+ if (player->HasSpell(S_POTION))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6);
+ break;
+ }
}
}
- }
-
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
- void SendActionMenu(Player* player, Creature* creature, uint32 action)
- {
- switch (action)
- {
- case GOSSIP_ACTION_TRADE:
- player->GetSession()->SendListInventory(creature->GetGUID());
- break;
- case GOSSIP_ACTION_TRAIN:
- player->GetSession()->SendTrainerList(creature->GetGUID());
- break;
- //Learn Alchemy
- case GOSSIP_ACTION_INFO_DEF + 1:
- ProcessCastaction(player, creature, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- ProcessCastaction(player, creature, S_ELIXIR, S_LEARN_ELIXIR, DoLearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- ProcessCastaction(player, creature, S_POTION, S_LEARN_POTION, DoLearnCost(player));
- break;
- //Unlearn Alchemy
- case GOSSIP_ACTION_INFO_DEF + 4:
- ProcessCastaction(player, creature, 0, S_UNLEARN_TRANSMUTE, DoHighUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 5:
- ProcessCastaction(player, creature, 0, S_UNLEARN_ELIXIR, DoHighUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 6:
- ProcessCastaction(player, creature, 0, S_UNLEARN_POTION, DoHighUnlearnCost(player));
- break;
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
}
- }
- void SendConfirmLearn(Player* player, Creature* creature, uint32 action)
- {
- if (action)
+ void SendActionMenu(Player* player, uint32 action)
{
- switch (creature->GetEntry())
+ switch (action)
{
- case N_TRAINER_TRANSMUTE:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ case GOSSIP_ACTION_TRADE:
+ player->GetSession()->SendListInventory(me->GetGUID());
+ break;
+ case GOSSIP_ACTION_TRAIN:
+ player->GetSession()->SendTrainerList(me->GetGUID());
+ break;
+ //Learn Alchemy
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ ProcessCastaction(player, me, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player));
break;
- case N_TRAINER_ELIXIR:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ ProcessCastaction(player, me, S_ELIXIR, S_LEARN_ELIXIR, DoLearnCost(player));
break;
- case N_TRAINER_POTION:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ ProcessCastaction(player, me, S_POTION, S_LEARN_POTION, DoLearnCost(player));
+ break;
+ //Unlearn Alchemy
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ ProcessCastaction(player, me, 0, S_UNLEARN_TRANSMUTE, DoHighUnlearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ ProcessCastaction(player, me, 0, S_UNLEARN_ELIXIR, DoHighUnlearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 6:
+ ProcessCastaction(player, me, 0, S_UNLEARN_POTION, DoHighUnlearnCost(player));
break;
}
}
- }
- void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action)
- {
- if (action)
+ void SendConfirmLearn(Player* player, uint32 action)
{
- switch (creature->GetEntry())
+ if (action)
{
- case N_TRAINER_TRANSMUTE:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
- case N_TRAINER_ELIXIR:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
- case N_TRAINER_POTION:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
+ switch (me->GetEntry())
+ {
+ case N_TRAINER_TRANSMUTE:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_ELIXIR:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_POTION:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ }
}
}
- }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override
- {
- ClearGossipMenuFor(player);
- switch (sender)
+ void SendConfirmUnlearn(Player* player, uint32 action)
+ {
+ if (action)
+ {
+ switch (me->GetEntry())
+ {
+ case N_TRAINER_TRANSMUTE:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_ELIXIR:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_POTION:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ }
+ }
+ }
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case GOSSIP_SENDER_MAIN:
- SendActionMenu(player, creature, 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;
- case GOSSIP_SENDER_LEARN:
- SendConfirmLearn(player, creature, action);
- break;
+ case GOSSIP_SENDER_LEARN:
+ SendConfirmLearn(player, action);
+ break;
- case GOSSIP_SENDER_UNLEARN:
- SendConfirmUnlearn(player, creature, action);
- break;
+ case GOSSIP_SENDER_UNLEARN:
+ SendConfirmUnlearn(player, action);
+ break;
- case GOSSIP_SENDER_CHECK:
- SendActionMenu(player, creature, action);
- break;
+ case GOSSIP_SENDER_CHECK:
+ SendActionMenu(player, action);
+ break;
+ }
+ return true;
}
- return true;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_prof_alchemyAI(creature);
}
};
@@ -611,224 +623,236 @@ class npc_prof_blacksmith : public CreatureScript
public:
npc_prof_blacksmith() : CreatureScript("npc_prof_blacksmith") { }
- inline bool HasWeaponSub(Player* player)
+ struct npc_prof_blacksmithAI : public ScriptedAI
{
- return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD));
- }
+ npc_prof_blacksmithAI(Creature* creature) : ScriptedAI(creature) { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ inline bool HasWeaponSub(Player* player)
+ {
+ return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD));
+ }
- if (creature->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
- if (creature->IsTrainer())
- AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+ if (me->IsVendor())
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- uint32 creatureId = creature->GetEntry();
- //WEAPONSMITH & ARMORSMITH
- if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225)
- {
- switch (creatureId)
+ if (me->IsTrainer())
+ AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+
+ uint32 creatureId = me->GetEntry();
+ //WEAPONSMITH & ARMORSMITH
+ if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225)
{
- case N_TRAINER_SMITHOMNI1:
- case N_TRAINER_SMITHOMNI2:
- if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- break;
- case N_TRAINER_WEAPON1:
- case N_TRAINER_WEAPON2:
- if (player->HasSpell(S_WEAPON))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3);
- break;
- case N_TRAINER_ARMOR1:
- case N_TRAINER_ARMOR2:
- if (player->HasSpell(S_ARMOR))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4);
- break;
+ switch (creatureId)
+ {
+ case N_TRAINER_SMITHOMNI1:
+ case N_TRAINER_SMITHOMNI2:
+ if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ break;
+ case N_TRAINER_WEAPON1:
+ case N_TRAINER_WEAPON2:
+ if (player->HasSpell(S_WEAPON))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3);
+ break;
+ case N_TRAINER_ARMOR1:
+ case N_TRAINER_ARMOR2:
+ if (player->HasSpell(S_ARMOR))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4);
+ break;
+ }
+ }
+ //WEAPONSMITH SPEC
+ if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250)
+ {
+ switch (creatureId)
+ {
+ case N_TRAINER_HAMMER:
+ if (!HasWeaponSub(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5);
+ if (player->HasSpell(S_HAMMER))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8);
+ break;
+ case N_TRAINER_AXE:
+ if (!HasWeaponSub(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6);
+ if (player->HasSpell(S_AXE))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9);
+ break;
+ case N_TRAINER_SWORD:
+ if (!HasWeaponSub(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7);
+ if (player->HasSpell(S_SWORD))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 10);
+ break;
+ }
}
+
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
}
- //WEAPONSMITH SPEC
- if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250)
+
+ void SendActionMenu(Player* player, uint32 action)
{
- switch (creatureId)
+ switch (action)
{
- case N_TRAINER_HAMMER:
- if (!HasWeaponSub(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5);
- if (player->HasSpell(S_HAMMER))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8);
+ case GOSSIP_ACTION_TRADE:
+ player->GetSession()->SendListInventory(me->GetGUID());
+ break;
+ case GOSSIP_ACTION_TRAIN:
+ player->GetSession()->SendTrainerList(me->GetGUID());
break;
- case N_TRAINER_AXE:
- if (!HasWeaponSub(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6);
- if (player->HasSpell(S_AXE))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9);
+ //Learn Armor/Weapon
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ if (!player->HasSpell(S_ARMOR))
+ {
+ player->CastSpell(player, S_LEARN_ARMOR, true);
+ //_Creature->CastSpell(player, S_REP_ARMOR, true);
+ }
+ CloseGossipMenuFor(player);
break;
- case N_TRAINER_SWORD:
- if (!HasWeaponSub(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7);
- if (player->HasSpell(S_SWORD))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 10);
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ if (!player->HasSpell(S_WEAPON))
+ {
+ player->CastSpell(player, S_LEARN_WEAPON, true);
+ //_Creature->CastSpell(player, S_REP_WEAPON, true);
+ }
+ CloseGossipMenuFor(player);
+ break;
+ //Unlearn Armor/Weapon
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ if (HasWeaponSub(player))
+ {
+ //unknown textID (TALK_MUST_UNLEARN_WEAPON)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ }
+ else
+ ProcessUnlearnAction(player, me, S_UNLEARN_WEAPON, S_REP_ARMOR, DoLowUnlearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ ProcessUnlearnAction(player, me, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player));
+ break;
+ //Learn Hammer/Axe/Sword
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ player->CastSpell(player, S_LEARN_HAMMER, true);
+ CloseGossipMenuFor(player);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 6:
+ player->CastSpell(player, S_LEARN_AXE, true);
+ CloseGossipMenuFor(player);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 7:
+ player->CastSpell(player, S_LEARN_SWORD, true);
+ CloseGossipMenuFor(player);
+ break;
+ //Unlearn Hammer/Axe/Sword
+ case GOSSIP_ACTION_INFO_DEF + 8:
+ ProcessUnlearnAction(player, me, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 9:
+ ProcessUnlearnAction(player, me, S_UNLEARN_AXE, 0, DoMedUnlearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 10:
+ ProcessUnlearnAction(player, me, S_UNLEARN_SWORD, 0, DoMedUnlearnCost(player));
break;
}
}
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- void SendActionMenu(Player* player, Creature* creature, uint32 action)
- {
- switch (action)
+ void SendConfirmLearn(Player* player, uint32 action)
{
- case GOSSIP_ACTION_TRADE:
- player->GetSession()->SendListInventory(creature->GetGUID());
- break;
- case GOSSIP_ACTION_TRAIN:
- player->GetSession()->SendTrainerList(creature->GetGUID());
- break;
- //Learn Armor/Weapon
- case GOSSIP_ACTION_INFO_DEF + 1:
- if (!player->HasSpell(S_ARMOR))
- {
- player->CastSpell(player, S_LEARN_ARMOR, true);
- //_Creature->CastSpell(player, S_REP_ARMOR, true);
- }
- CloseGossipMenuFor(player);
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- if (!player->HasSpell(S_WEAPON))
- {
- player->CastSpell(player, S_LEARN_WEAPON, true);
- //_Creature->CastSpell(player, S_REP_WEAPON, true);
- }
- CloseGossipMenuFor(player);
- break;
- //Unlearn Armor/Weapon
- case GOSSIP_ACTION_INFO_DEF + 3:
- if (HasWeaponSub(player))
+ if (action)
+ {
+ switch (me->GetEntry())
{
- //unknown textID (TALK_MUST_UNLEARN_WEAPON)
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ case N_TRAINER_HAMMER:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action);
+ //unknown textID (TALK_HAMMER_LEARN)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_AXE:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action);
+ //unknown textID (TALK_AXE_LEARN)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_SWORD:
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action);
+ //unknown textID (TALK_SWORD_LEARN)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
}
- else
- ProcessUnlearnAction(player, creature, S_UNLEARN_WEAPON, S_REP_ARMOR, DoLowUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 4:
- ProcessUnlearnAction(player, creature, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player));
- break;
- //Learn Hammer/Axe/Sword
- case GOSSIP_ACTION_INFO_DEF + 5:
- player->CastSpell(player, S_LEARN_HAMMER, true);
- CloseGossipMenuFor(player);
- break;
- case GOSSIP_ACTION_INFO_DEF + 6:
- player->CastSpell(player, S_LEARN_AXE, true);
- CloseGossipMenuFor(player);
- break;
- case GOSSIP_ACTION_INFO_DEF + 7:
- player->CastSpell(player, S_LEARN_SWORD, true);
- CloseGossipMenuFor(player);
- break;
- //Unlearn Hammer/Axe/Sword
- case GOSSIP_ACTION_INFO_DEF + 8:
- ProcessUnlearnAction(player, creature, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 9:
- ProcessUnlearnAction(player, creature, S_UNLEARN_AXE, 0, DoMedUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 10:
- ProcessUnlearnAction(player, creature, S_UNLEARN_SWORD, 0, DoMedUnlearnCost(player));
- break;
+ }
}
- }
- void SendConfirmLearn(Player* player, Creature* creature, uint32 action)
- {
- if (action)
+ void SendConfirmUnlearn(Player* player, uint32 action)
{
- switch (creature->GetEntry())
+ if (action)
{
- case N_TRAINER_HAMMER:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action);
- //unknown textID (TALK_HAMMER_LEARN)
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
- case N_TRAINER_AXE:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action);
- //unknown textID (TALK_AXE_LEARN)
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
- case N_TRAINER_SWORD:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action);
- //unknown textID (TALK_SWORD_LEARN)
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
+ switch (me->GetEntry())
+ {
+ case N_TRAINER_WEAPON1:
+ case N_TRAINER_WEAPON2:
+ case N_TRAINER_ARMOR1:
+ case N_TRAINER_ARMOR2:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false);
+ //unknown textID (TALK_UNLEARN_AXEORWEAPON)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+
+ case N_TRAINER_HAMMER:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
+ //unknown textID (TALK_HAMMER_UNLEARN)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_AXE:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
+ //unknown textID (TALK_AXE_UNLEARN)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_SWORD:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
+ //unknown textID (TALK_SWORD_UNLEARN)
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ }
}
}
- }
- void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action)
- {
- if (action)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- switch (creature->GetEntry())
+ uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (sender)
{
- case N_TRAINER_WEAPON1:
- case N_TRAINER_WEAPON2:
- case N_TRAINER_ARMOR1:
- case N_TRAINER_ARMOR2:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false);
- //unknown textID (TALK_UNLEARN_AXEORWEAPON)
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ case GOSSIP_SENDER_MAIN:
+ SendActionMenu(player, action);
break;
- case N_TRAINER_HAMMER:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
- //unknown textID (TALK_HAMMER_UNLEARN)
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ case GOSSIP_SENDER_LEARN:
+ SendConfirmLearn(player, action);
break;
- case N_TRAINER_AXE:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
- //unknown textID (TALK_AXE_UNLEARN)
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ case GOSSIP_SENDER_UNLEARN:
+ SendConfirmUnlearn(player, action);
break;
- case N_TRAINER_SWORD:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false);
- //unknown textID (TALK_SWORD_UNLEARN)
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ case GOSSIP_SENDER_CHECK:
+ SendActionMenu(player, action);
break;
}
+ return true;
}
- }
+ };
- bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- ClearGossipMenuFor(player);
- switch (sender)
- {
- case GOSSIP_SENDER_MAIN:
- SendActionMenu(player, creature, action);
- break;
-
- case GOSSIP_SENDER_LEARN:
- SendConfirmLearn(player, creature, action);
- break;
-
- case GOSSIP_SENDER_UNLEARN:
- SendConfirmUnlearn(player, creature, action);
- break;
-
- case GOSSIP_SENDER_CHECK:
- SendActionMenu(player, creature, action);
- break;
- }
- return true;
+ return new npc_prof_blacksmithAI(creature);
}
};
@@ -863,86 +887,98 @@ class npc_engineering_tele_trinket : public CreatureScript
public:
npc_engineering_tele_trinket() : CreatureScript("npc_engineering_tele_trinket") { }
- bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId)
+ struct npc_engineering_tele_trinketAI : public ScriptedAI
{
- bool res = false;
- npcTextId = textId;
- if (player->GetBaseSkillValue(SKILL_ENGINEERING) >= skillValue && player->HasSpell(reqSpellId))
+ npc_engineering_tele_trinketAI(Creature* creature) : ScriptedAI(creature) { }
+
+ bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId)
{
- if (!player->HasSpell(spellId))
- res = true;
- else
- npcTextId = altTextId;
+ bool res = false;
+ npcTextId = textId;
+ if (player->GetBaseSkillValue(SKILL_ENGINEERING) >= skillValue && player->HasSpell(reqSpellId))
+ {
+ if (!player->HasSpell(spellId))
+ res = true;
+ else
+ npcTextId = altTextId;
+ }
+ return res;
}
- return res;
- }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- uint32 npcTextId = 0;
- std::string gossipItem;
- bool canLearn = false;
+ bool GossipHello(Player* player) override
+ {
+ uint32 npcTextId = 0;
+ std::string gossipItem;
+ bool canLearn = false;
+
+ if (player->HasSkill(SKILL_ENGINEERING))
+ {
+ switch (me->GetEntry())
+ {
+ case NPC_ZAP:
+ canLearn = CanLearn(player, 6092, 0, 260, S_GOBLIN, SPELL_TO_EVERLOOK, npcTextId);
+ if (canLearn)
+ gossipItem = GOSSIP_ITEM_ZAP;
+ break;
+ case NPC_JHORDY:
+ canLearn = CanLearn(player, 7251, 7252, 260, S_GNOMISH, SPELL_TO_GADGET, npcTextId);
+ if (canLearn)
+ gossipItem = GOSSIP_ITEM_JHORDY;
+ break;
+ case NPC_KABLAM:
+ canLearn = CanLearn(player, 10365, 0, 350, S_GOBLIN, SPELL_TO_AREA52, npcTextId);
+ if (canLearn)
+ gossipItem = GOSSIP_ITEM_KABLAM;
+ break;
+ case NPC_SMILES:
+ canLearn = CanLearn(player, 10363, 0, 350, S_GNOMISH, SPELL_TO_TOSHLEY, npcTextId);
+ if (canLearn)
+ gossipItem = GOSSIP_ITEM_KABLAM;
+ break;
+ }
+ }
+
+ if (canLearn)
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipItem, me->GetEntry(), GOSSIP_ACTION_INFO_DEF + 1);
+
+ SendGossipMenuFor(player, npcTextId ? npcTextId : player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
- if (player->HasSkill(SKILL_ENGINEERING))
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- switch (creature->GetEntry())
+ uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ if (action == GOSSIP_ACTION_INFO_DEF + 1)
+ CloseGossipMenuFor(player);
+
+ if (sender != me->GetEntry())
+ return true;
+
+ switch (sender)
{
case NPC_ZAP:
- canLearn = CanLearn(player, 6092, 0, 260, S_GOBLIN, SPELL_TO_EVERLOOK, npcTextId);
- if (canLearn)
- gossipItem = GOSSIP_ITEM_ZAP;
+ player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false);
break;
case NPC_JHORDY:
- canLearn = CanLearn(player, 7251, 7252, 260, S_GNOMISH, SPELL_TO_GADGET, npcTextId);
- if (canLearn)
- gossipItem = GOSSIP_ITEM_JHORDY;
+ player->CastSpell(player, SPELL_LEARN_TO_GADGET, false);
break;
case NPC_KABLAM:
- canLearn = CanLearn(player, 10365, 0, 350, S_GOBLIN, SPELL_TO_AREA52, npcTextId);
- if (canLearn)
- gossipItem = GOSSIP_ITEM_KABLAM;
+ player->CastSpell(player, SPELL_LEARN_TO_AREA52, false);
break;
case NPC_SMILES:
- canLearn = CanLearn(player, 10363, 0, 350, S_GNOMISH, SPELL_TO_TOSHLEY, npcTextId);
- if (canLearn)
- gossipItem = GOSSIP_ITEM_KABLAM;
+ player->CastSpell(player, SPELL_LEARN_TO_TOSHLEY, false);
break;
}
- }
-
- if (canLearn)
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipItem, creature->GetEntry(), GOSSIP_ACTION_INFO_DEF + 1);
-
- SendGossipMenuFor(player, npcTextId ? npcTextId : player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
- bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override
- {
- ClearGossipMenuFor(player);
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
- CloseGossipMenuFor(player);
-
- if (sender != creature->GetEntry())
return true;
-
- switch (sender)
- {
- case NPC_ZAP:
- player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false);
- break;
- case NPC_JHORDY:
- player->CastSpell(player, SPELL_LEARN_TO_GADGET, false);
- break;
- case NPC_KABLAM:
- player->CastSpell(player, SPELL_LEARN_TO_AREA52, false);
- break;
- case NPC_SMILES:
- player->CastSpell(player, SPELL_LEARN_TO_TOSHLEY, false);
- break;
}
+ };
- return true;
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_engineering_tele_trinketAI(creature);
}
};
@@ -1025,112 +1061,124 @@ class npc_prof_leather : public CreatureScript
public:
npc_prof_leather() : CreatureScript("npc_prof_leather") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_prof_leatherAI : public ScriptedAI
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ npc_prof_leatherAI(Creature* creature) : ScriptedAI(creature) { }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (me->IsVendor())
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- if (creature->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ if (me->IsTrainer())
+ AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+
+ if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49)
+ {
+ switch (me->GetEntry())
+ {
+ case N_TRAINER_DRAGON1:
+ case N_TRAINER_DRAGON2:
+ if (player->HasSpell(S_DRAGON))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1);
+ break;
+ case N_TRAINER_ELEMENTAL1:
+ case N_TRAINER_ELEMENTAL2:
+ if (player->HasSpell(S_ELEMENTAL))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2);
+ break;
+ case N_TRAINER_TRIBAL1:
+ case N_TRAINER_TRIBAL2:
+ if (player->HasSpell(S_TRIBAL))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3);
+ break;
+ }
+ }
- if (creature->IsTrainer())
- AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
- if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49)
+ void SendActionMenu(Player* player, uint32 action)
{
- switch (creature->GetEntry())
+ switch (action)
{
- case N_TRAINER_DRAGON1:
- case N_TRAINER_DRAGON2:
- if (player->HasSpell(S_DRAGON))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1);
+ case GOSSIP_ACTION_TRADE:
+ player->GetSession()->SendListInventory(me->GetGUID());
+ break;
+ case GOSSIP_ACTION_TRAIN:
+ player->GetSession()->SendTrainerList(me->GetGUID());
+ break;
+ //Unlearn Leather
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ ProcessUnlearnAction(player, me, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player));
break;
- case N_TRAINER_ELEMENTAL1:
- case N_TRAINER_ELEMENTAL2:
- if (player->HasSpell(S_ELEMENTAL))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2);
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ ProcessUnlearnAction(player, me, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player));
break;
- case N_TRAINER_TRIBAL1:
- case N_TRAINER_TRIBAL2:
- if (player->HasSpell(S_TRIBAL))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3);
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ ProcessUnlearnAction(player, me, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player));
break;
}
}
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- void SendActionMenu(Player* player, Creature* creature, uint32 action)
- {
- switch (action)
+ void SendConfirmUnlearn(Player* player, uint32 action)
{
- case GOSSIP_ACTION_TRADE:
- player->GetSession()->SendListInventory(creature->GetGUID());
- break;
- case GOSSIP_ACTION_TRAIN:
- player->GetSession()->SendTrainerList(creature->GetGUID());
- break;
- //Unlearn Leather
- case GOSSIP_ACTION_INFO_DEF + 1:
- ProcessUnlearnAction(player, creature, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- ProcessUnlearnAction(player, creature, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- ProcessUnlearnAction(player, creature, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player));
- break;
+ if (action)
+ {
+ switch (me->GetEntry())
+ {
+ case N_TRAINER_DRAGON1:
+ case N_TRAINER_DRAGON2:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_ELEMENTAL1:
+ case N_TRAINER_ELEMENTAL2:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_TRIBAL1:
+ case N_TRAINER_TRIBAL2:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ }
+ }
}
- }
- void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action)
- {
- if (action)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- switch (creature->GetEntry())
+ uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (sender)
{
- case N_TRAINER_DRAGON1:
- case N_TRAINER_DRAGON2:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ case GOSSIP_SENDER_MAIN:
+ SendActionMenu(player, action);
break;
- case N_TRAINER_ELEMENTAL1:
- case N_TRAINER_ELEMENTAL2:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ case GOSSIP_SENDER_UNLEARN:
+ SendConfirmUnlearn(player, action);
break;
- case N_TRAINER_TRIBAL1:
- case N_TRAINER_TRIBAL2:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ case GOSSIP_SENDER_CHECK:
+ SendActionMenu(player, action);
break;
}
+ return true;
}
- }
+ };
- bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- ClearGossipMenuFor(player);
- switch (sender)
- {
- case GOSSIP_SENDER_MAIN:
- SendActionMenu(player, creature, action);
- break;
-
- case GOSSIP_SENDER_UNLEARN:
- SendConfirmUnlearn(player, creature, action);
- break;
-
- case GOSSIP_SENDER_CHECK:
- SendActionMenu(player, creature, action);
- break;
- }
- return true;
+ return new npc_prof_leatherAI(creature);
}
};
@@ -1143,160 +1191,172 @@ class npc_prof_tailor : public CreatureScript
public:
npc_prof_tailor() : CreatureScript("npc_prof_tailor") { }
- inline bool HasTailorSpell(Player* player)
+ struct npc_prof_tailorAI : public ScriptedAI
{
- return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE));
- }
+ npc_prof_tailorAI(Creature* creature) : ScriptedAI(creature) { }
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ inline bool HasTailorSpell(Player* player)
+ {
+ return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE));
+ }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (me->IsVendor())
+ AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+
+ if (me->IsTrainer())
+ AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+
+ //TAILORING SPEC
+ if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59)
+ {
+ if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833))
+ {
+ switch (me->GetEntry())
+ {
+ case N_TRAINER_SPELLFIRE:
+ if (!HasTailorSpell(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1);
+ if (player->HasSpell(S_SPELLFIRE))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4);
+ break;
+ case N_TRAINER_MOONCLOTH:
+ if (!HasTailorSpell(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2);
+ if (player->HasSpell(S_MOONCLOTH))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5);
+ break;
+ case N_TRAINER_SHADOWEAVE:
+ if (!HasTailorSpell(player))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3);
+ if (player->HasSpell(S_SHADOWEAVE))
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6);
+ break;
+ }
+ }
+ }
- if (creature->IsVendor())
- AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ return true;
+ }
- if (creature->IsTrainer())
- AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN);
+ void SendActionMenu(Player* player, uint32 action)
+ {
+ switch (action)
+ {
+ case GOSSIP_ACTION_TRADE:
+ player->GetSession()->SendListInventory(me->GetGUID());
+ break;
+ case GOSSIP_ACTION_TRAIN:
+ player->GetSession()->SendTrainerList(me->GetGUID());
+ break;
+ //Learn Tailor
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ ProcessCastaction(player, me, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ ProcessCastaction(player, me, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ ProcessCastaction(player, me, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player));
+ break;
+ //Unlearn Tailor
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ ProcessUnlearnAction(player, me, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ ProcessUnlearnAction(player, me, S_UNLEARN_MOONCLOTH, 0, DoHighUnlearnCost(player));
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 6:
+ ProcessUnlearnAction(player, me, S_UNLEARN_SHADOWEAVE, 0, DoHighUnlearnCost(player));
+ break;
+ }
+ }
- //TAILORING SPEC
- if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59)
+ void SendConfirmLearn(Player* player, uint32 action)
{
- if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833))
+ if (action)
{
- switch (creature->GetEntry())
+ switch (me->GetEntry())
{
case N_TRAINER_SPELLFIRE:
- if (!HasTailorSpell(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1);
- if (player->HasSpell(S_SPELLFIRE))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
break;
case N_TRAINER_MOONCLOTH:
- if (!HasTailorSpell(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2);
- if (player->HasSpell(S_MOONCLOTH))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
break;
case N_TRAINER_SHADOWEAVE:
- if (!HasTailorSpell(player))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3);
- if (player->HasSpell(S_SHADOWEAVE))
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6);
+ AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
break;
}
}
}
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- void SendActionMenu(Player* player, Creature* creature, uint32 action)
- {
- switch (action)
- {
- case GOSSIP_ACTION_TRADE:
- player->GetSession()->SendListInventory(creature->GetGUID());
- break;
- case GOSSIP_ACTION_TRAIN:
- player->GetSession()->SendTrainerList(creature->GetGUID());
- break;
- //Learn Tailor
- case GOSSIP_ACTION_INFO_DEF + 1:
- ProcessCastaction(player, creature, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- ProcessCastaction(player, creature, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- ProcessCastaction(player, creature, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player));
- break;
- //Unlearn Tailor
- case GOSSIP_ACTION_INFO_DEF + 4:
- ProcessUnlearnAction(player, creature, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 5:
- ProcessUnlearnAction(player, creature, S_UNLEARN_MOONCLOTH, 0, DoHighUnlearnCost(player));
- break;
- case GOSSIP_ACTION_INFO_DEF + 6:
- ProcessUnlearnAction(player, creature, S_UNLEARN_SHADOWEAVE, 0, DoHighUnlearnCost(player));
- break;
- }
- }
-
- void SendConfirmLearn(Player* player, Creature* creature, uint32 action)
- {
- if (action)
+ void SendConfirmUnlearn(Player* player, uint32 action)
{
- switch (creature->GetEntry())
+ if (action)
{
- case N_TRAINER_SPELLFIRE:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
- case N_TRAINER_MOONCLOTH:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
- case N_TRAINER_SHADOWEAVE:
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
- break;
+ switch (me->GetEntry())
+ {
+ case N_TRAINER_SPELLFIRE:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_MOONCLOTH:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ case N_TRAINER_SHADOWEAVE:
+ AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
+ //unknown textID ()
+ SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID());
+ break;
+ }
}
}
- }
- void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action)
- {
- if (action)
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- switch (creature->GetEntry())
+ uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ switch (sender)
{
- case N_TRAINER_SPELLFIRE:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+ case GOSSIP_SENDER_MAIN:
+ SendActionMenu(player, action);
break;
- case N_TRAINER_MOONCLOTH:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ case GOSSIP_SENDER_LEARN:
+ SendConfirmLearn(player, action);
+ break;
+
+ case GOSSIP_SENDER_UNLEARN:
+ SendConfirmUnlearn(player, action);
break;
- case N_TRAINER_SHADOWEAVE:
- AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false);
- //unknown textID ()
- SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ case GOSSIP_SENDER_CHECK:
+ SendActionMenu(player, action);
break;
}
+ return true;
}
- }
+ };
- bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- ClearGossipMenuFor(player);
- switch (sender)
- {
- case GOSSIP_SENDER_MAIN:
- SendActionMenu(player, creature, action);
- break;
-
- case GOSSIP_SENDER_LEARN:
- SendConfirmLearn(player, creature, action);
- break;
-
- case GOSSIP_SENDER_UNLEARN:
- SendConfirmUnlearn(player, creature, action);
- break;
-
- case GOSSIP_SENDER_CHECK:
- SendActionMenu(player, creature, action);
- break;
- }
- return true;
+ return new npc_prof_tailorAI(creature);
}
};
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index 268b4ff2c69..17f1649de4c 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -329,28 +329,24 @@ public:
break;
}
}
+
+ void QuestAccept(Player* /*player*/, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_CLUCK)
+ Reset();
+ }
+
+ void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override
+ {
+ if (quest->GetQuestId() == QUEST_CLUCK)
+ Reset();
+ }
};
CreatureAI* GetAI(Creature* creature) const override
{
return new npc_chicken_cluckAI(creature);
}
-
- bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_CLUCK)
- ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset();
-
- return true;
- }
-
- bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override
- {
- if (quest->GetQuestId() == QUEST_CLUCK)
- ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset();
-
- return true;
- }
};
/*######
@@ -819,15 +815,13 @@ public:
void UpdateAI(uint32 diff) override;
void EnterCombat(Unit* /*who*/) override { }
- };
-
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622))
- ENSURE_AI(npc_doctor::npc_doctorAI, creature->AI())->BeginEvent(player);
- return true;
- }
+ void QuestAccept(Player* player, Quest const* quest) override
+ {
+ if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622))
+ BeginEvent(player);
+ }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
@@ -1282,117 +1276,129 @@ class npc_sayge : public CreatureScript
public:
npc_sayge() : CreatureScript("npc_sayge") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_saygeAI : public ScriptedAI
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetSpellHistory()->HasCooldown(SPELL_STRENGTH) ||
- player->GetSpellHistory()->HasCooldown(SPELL_AGILITY) ||
- player->GetSpellHistory()->HasCooldown(SPELL_STAMINA) ||
- player->GetSpellHistory()->HasCooldown(SPELL_SPIRIT) ||
- player->GetSpellHistory()->HasCooldown(SPELL_INTELLECT) ||
- player->GetSpellHistory()->HasCooldown(SPELL_ARMOR) ||
- player->GetSpellHistory()->HasCooldown(SPELL_DAMAGE) ||
- player->GetSpellHistory()->HasCooldown(SPELL_RESISTANCE))
- SendGossipMenuFor(player, GOSSIP_MENU_CANT_GIVE_YOU_YOUR, creature->GetGUID());
- else
+ npc_saygeAI(Creature* creature) : ScriptedAI(creature) { }
+
+ bool GossipHello(Player* player) override
+ {
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
+
+ if (player->GetSpellHistory()->HasCooldown(SPELL_STRENGTH) ||
+ player->GetSpellHistory()->HasCooldown(SPELL_AGILITY) ||
+ player->GetSpellHistory()->HasCooldown(SPELL_STAMINA) ||
+ player->GetSpellHistory()->HasCooldown(SPELL_SPIRIT) ||
+ player->GetSpellHistory()->HasCooldown(SPELL_INTELLECT) ||
+ player->GetSpellHistory()->HasCooldown(SPELL_ARMOR) ||
+ player->GetSpellHistory()->HasCooldown(SPELL_DAMAGE) ||
+ player->GetSpellHistory()->HasCooldown(SPELL_RESISTANCE))
+ SendGossipMenuFor(player, GOSSIP_MENU_CANT_GIVE_YOU_YOUR, me->GetGUID());
+ else
+ {
+ AddGossipItemFor(player, GOSSIP_I_AM_READY_TO_DISCOVER, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, GOSSIP_MENU_I_HAVE_LONG_KNOWN, me->GetGUID());
+ }
+
+ return true;
+ }
+
+ void SendAction(Player* player, uint32 action)
{
- AddGossipItemFor(player, GOSSIP_I_AM_READY_TO_DISCOVER, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, GOSSIP_MENU_I_HAVE_LONG_KNOWN, creature->GetGUID());
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1:
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE1, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE2, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE3, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE4, GOSSIP_MENU_OPTION_ID_ANSWER_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ SendGossipMenuFor(player, GOSSIP_MENU_YOU_HAVE_BEEN_TASKED, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2:
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE5, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 1, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE6, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE7, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, GOSSIP_MENU_SWORN_EXECUTIONER, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3:
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE8, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE9, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE10, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, GOSSIP_MENU_DIPLOMATIC_MISSION, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4:
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE11, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 6, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE12, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 7, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE13, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 8, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, GOSSIP_MENU_YOUR_BROTHER_SEEKS, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5:
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE14, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE15, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF);
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE16, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF);
+ SendGossipMenuFor(player, GOSSIP_MENU_A_TERRIBLE_BEAST, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF:
+ AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE17, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
+ SendGossipMenuFor(player, GOSSIP_MENU_YOUR_FORTUNE_IS_CAST, me->GetGUID());
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 6:
+ DoCast(player, SPELL_FORTUNE, false);
+ SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, me->GetGUID());
+ break;
+ }
}
- return true;
- }
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId);
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+ uint32 spellId = 0;
+ switch (sender)
+ {
+ case GOSSIP_SENDER_MAIN:
+ SendAction(player, action);
+ break;
+ case GOSSIP_SENDER_MAIN + 1:
+ spellId = SPELL_DAMAGE;
+ break;
+ case GOSSIP_SENDER_MAIN + 2:
+ spellId = SPELL_RESISTANCE;
+ break;
+ case GOSSIP_SENDER_MAIN + 3:
+ spellId = SPELL_ARMOR;
+ break;
+ case GOSSIP_SENDER_MAIN + 4:
+ spellId = SPELL_SPIRIT;
+ break;
+ case GOSSIP_SENDER_MAIN + 5:
+ spellId = SPELL_INTELLECT;
+ break;
+ case GOSSIP_SENDER_MAIN + 6:
+ spellId = SPELL_STAMINA;
+ break;
+ case GOSSIP_SENDER_MAIN + 7:
+ spellId = SPELL_STRENGTH;
+ break;
+ case GOSSIP_SENDER_MAIN + 8:
+ spellId = SPELL_AGILITY;
+ break;
+ }
- void SendAction(Player* player, Creature* creature, uint32 action)
- {
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1:
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE1, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE2, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE3, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE4, GOSSIP_MENU_OPTION_ID_ANSWER_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
- SendGossipMenuFor(player, GOSSIP_MENU_YOU_HAVE_BEEN_TASKED, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 2:
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE5, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 1, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE6, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE7, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, GOSSIP_MENU_SWORN_EXECUTIONER, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE8, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE9, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE10,GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, GOSSIP_MENU_DIPLOMATIC_MISSION, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 4:
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE11, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 6, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE12, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 7, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE13, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 8, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, GOSSIP_MENU_YOUR_BROTHER_SEEKS, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 5:
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE14, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE15, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF);
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE16, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, GOSSIP_MENU_A_TERRIBLE_BEAST, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF:
- AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE17, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
- SendGossipMenuFor(player, GOSSIP_MENU_YOUR_FORTUNE_IS_CAST, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF + 6:
- creature->CastSpell(player, SPELL_FORTUNE, false);
- SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, creature->GetGUID());
- break;
+ if (spellId)
+ {
+ DoCast(player, spellId, false);
+ player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2));
+ SendAction(player, action);
+ }
+ return true;
}
- }
+ };
- bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- ClearGossipMenuFor(player);
- uint32 spellId = 0;
- switch (sender)
- {
- case GOSSIP_SENDER_MAIN:
- SendAction(player, creature, action);
- break;
- case GOSSIP_SENDER_MAIN + 1:
- spellId = SPELL_DAMAGE;
- break;
- case GOSSIP_SENDER_MAIN + 2:
- spellId = SPELL_RESISTANCE;
- break;
- case GOSSIP_SENDER_MAIN + 3:
- spellId = SPELL_ARMOR;
- break;
- case GOSSIP_SENDER_MAIN + 4:
- spellId = SPELL_SPIRIT;
- break;
- case GOSSIP_SENDER_MAIN + 5:
- spellId = SPELL_INTELLECT;
- break;
- case GOSSIP_SENDER_MAIN + 6:
- spellId = SPELL_STAMINA;
- break;
- case GOSSIP_SENDER_MAIN + 7:
- spellId = SPELL_STRENGTH;
- break;
- case GOSSIP_SENDER_MAIN + 8:
- spellId = SPELL_AGILITY;
- break;
- }
-
- if (spellId)
- {
- creature->CastSpell(player, spellId, false);
- player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2));
- SendAction(player, creature, action);
- }
- return true;
+ return new npc_saygeAI(creature);
}
};
@@ -1867,8 +1873,6 @@ public:
enum NPC_Wormhole
{
- DATA_SHOW_UNDERGROUND = 1, // -> Random 0 or 1
-
MENU_ID_WORMHOLE = 10668, // "This tear in the fabric of time and space looks ominous."
NPC_TEXT_WORMHOLE = 14785, // (not 907 "What brings you to this part of the world, $n?")
GOSSIP_OPTION_1 = 0, // "Borean Tundra"
@@ -1908,71 +1912,67 @@ class npc_wormhole : public CreatureScript
Initialize();
}
- uint32 GetData(uint32 type) const override
+ bool GossipHello(Player* player) override
{
- return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0;
- }
-
- private:
- bool _showUnderground;
- };
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsSummon())
- {
- if (player == creature->ToTempSummon()->GetSummoner())
+ if (me->IsSummon())
{
- AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
+ if (player == me->ToTempSummon()->GetSummoner())
+ {
+ AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
+ AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
+ AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
- if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND))
- AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
+ if (_showUnderground)
+ AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
- SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, creature->GetGUID());
+ SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, me->GetGUID());
+ }
}
+
+ return true;
}
- return true;
- }
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- ClearGossipMenuFor(player);
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra
+ CloseGossipMenuFor(player);
+ DoCast(player, SPELL_BOREAN_TUNDRA, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord
+ CloseGossipMenuFor(player);
+ DoCast(player, SPELL_HOWLING_FJORD, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin
+ CloseGossipMenuFor(player);
+ DoCast(player, SPELL_SHOLAZAR_BASIN, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown
+ CloseGossipMenuFor(player);
+ DoCast(player, SPELL_ICECROWN, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks
+ CloseGossipMenuFor(player);
+ DoCast(player, SPELL_STORM_PEAKS, false);
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 6: // Underground
+ CloseGossipMenuFor(player);
+ DoCast(player, SPELL_UNDERGROUND, false);
+ break;
+ }
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra
- CloseGossipMenuFor(player);
- creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord
- CloseGossipMenuFor(player);
- creature->CastSpell(player, SPELL_HOWLING_FJORD, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin
- CloseGossipMenuFor(player);
- creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown
- CloseGossipMenuFor(player);
- creature->CastSpell(player, SPELL_ICECROWN, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks
- CloseGossipMenuFor(player);
- creature->CastSpell(player, SPELL_STORM_PEAKS, false);
- break;
- case GOSSIP_ACTION_INFO_DEF + 6: // Underground
- CloseGossipMenuFor(player);
- creature->CastSpell(player, SPELL_UNDERGROUND, false);
- break;
+ return true;
}
- return true;
- }
+ private:
+ bool _showUnderground;
+ };
CreatureAI* GetAI(Creature* creature) const override
{
@@ -1999,13 +1999,14 @@ public:
{
npc_pet_trainerAI(Creature* creature) : ScriptedAI(creature) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (menuId == MENU_ID_PET_UNLEARN && gossipListId == OPTION_ID_PLEASE_DO)
{
player->ResetPetTalents();
CloseGossipMenuFor(player);
}
+ return false;
}
};
@@ -2032,36 +2033,47 @@ class npc_experience : public CreatureScript
public:
npc_experience() : CreatureScript("npc_experience") { }
- bool OnGossipHello(Player* player, Creature* creature) override
+ struct npc_experienceAI : public ScriptedAI
{
- if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP
+ npc_experienceAI(Creature* creature) : ScriptedAI(creature) { }
+
+ bool GossipHello(Player* player) override
{
- AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
- SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, creature->GetGUID());
+ if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP
+ {
+ AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
+ SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, me->GetGUID());
+ }
+ else // currently gaining XP
+ {
+ AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_OFF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
+ SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, me->GetGUID());
+ }
+ return true;
}
- else // currently gaining XP
+
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_OFF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, creature->GetGUID());
+ uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
+ ClearGossipMenuFor(player);
+
+ switch (action)
+ {
+ case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected
+ player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain
+ break;
+ case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected
+ player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain
+ break;
+ }
+ CloseGossipMenuFor(player);
+ return true;
}
- return true;
- }
+ };
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- ClearGossipMenuFor(player);
-
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected
- player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain
- break;
- case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected
- player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain
- break;
- }
- CloseGossipMenuFor(player);
- return true;
+ return new npc_experienceAI(creature);
}
};
@@ -2522,11 +2534,11 @@ class npc_stable_master : public CreatureScript
{
npc_stable_masterAI(Creature* creature) : SmartAI(creature) { }
- void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
- SmartAI::sGossipSelect(player, menuId, gossipListId);
+ SmartAI::GossipSelect(player, menuId, gossipListId);
if (menuId != STABLE_MASTER_GOSSIP_SUB_MENU)
- return;
+ return false;
switch (gossipListId)
{
@@ -2552,10 +2564,11 @@ class npc_stable_master : public CreatureScript
player->CastSpell(player, SPELL_WOLPERTINGER, false);
break;
default:
- return;
+ return false;
}
player->PlayerTalkClass->SendCloseGossip();
+ return false;
}
};
@@ -2776,7 +2789,7 @@ public:
});
}
- void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
switch (gossipListId)
{
@@ -2827,6 +2840,7 @@ public:
break;
}
player->PlayerTalkClass->SendCloseGossip();
+ return false;
}
void UpdateAI(uint32 diff) override