aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Northrend
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-05-01 18:19:36 -0300
committerfunjoker <funjoker109@gmail.com>2020-05-03 03:04:32 +0200
commit6604849716bc73d82a4cdbf8c66bb188086ceae4 (patch)
treebd293ee1fdac3baf8bef0a55aa854fe8bf793bc2 /src/server/scripts/Northrend
parente3489c48ee6929018618322571adbb8dc59e11b1 (diff)
Core/Scripts: unified scripted gossip/quest api
- Changed self-accessor on GameObjectAI to "me", like UnitAI - Moved all related functions to AI, now Unit and GameObject have the same function names with identical behaviour - Remove "OnUpdate" from CreatureScript/GameObjectScript, was never used and we already have AI Update method - Quest methods no longer return a bool, the return value was used to call the AI version if the ScriptMgr one returned false - Implemented GameObjectAI::Destroyed hook (was never called), implemented Damaged method - Rename OnStateChanged to OnLootStateChanged to reflect when it's really called, and created a new hook OnStateChanged that only gets called on GOState change - Since the functions are now only getting called from AI, made GetAI methods full virtual. (CanSpawn method is anyways going to be used on creatures with AI) (cherry picked from commit f913f3bb8977c127d200d5d4a608ab434b21bbcd)
Diffstat (limited to 'src/server/scripts/Northrend')
-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.cpp137
-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.cpp20
-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/Nexus/nexus.h4
-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.cpp208
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp50
36 files changed, 1040 insertions, 870 deletions
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
index 79672742b6c..e2e464bc196 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h
@@ -82,10 +82,10 @@ enum AKGameObjectIds
GO_SPHERE_2 = 193094
};
-template<typename AI>
-inline AI* GetAhnKahetAI(Creature* creature)
+template<class AI, class T>
+inline 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 299e955d2f5..9f432b27710 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
@@ -24,6 +24,7 @@
#include "ObjectAccessor.h"
#include "Player.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "Spell.h"
#include "SpellScript.h"
@@ -386,33 +387,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->AddFlag(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->AddFlag(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 e9ac9b94c82..edd9982f0ef 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -1388,7 +1388,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 2186fcf6f4c..00240b68cb7 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
@@ -452,48 +452,43 @@ public:
break;
}
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetTrialOfTheChampionAI<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 GetTrialOfTheChampionAI<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 f933b64a7fe..a70f313468d 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -507,20 +507,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 GetTrialOfTheCrusaderAI<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 0d2780511cd..e13492eb4f3 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
@@ -183,7 +183,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
{
@@ -195,91 +197,84 @@ 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->RemoveUnitFlag(UnitFlags(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->RemoveUnitFlag(UnitFlags(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->RemoveNpcFlag(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->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
- return true;
- }
+ };
CreatureAI* GetAI(Creature* creature) const override
{
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 ab70b10ea18..33feba58a2f 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
@@ -95,7 +95,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)
{
@@ -105,6 +105,7 @@ public:
events.Reset();
events.ScheduleEvent(EVENT_INTRO_1, 1000);
}
+ return false;
}
void UpdateAI(uint32 diff) override
@@ -189,7 +190,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)
{
@@ -199,6 +200,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 6983e745e5e..21f7e7ca9c1 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -355,28 +355,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);
@@ -395,6 +394,7 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript
default:
break;
}
+ return false;
}
void Reset() override
@@ -802,21 +802,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),
@@ -870,7 +855,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);
@@ -884,6 +883,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 d8a17646827..db08165451a 100644
--- a/src/server/scripts/Northrend/Gundrak/gundrak.h
+++ b/src/server/scripts/Northrend/Gundrak/gundrak.h
@@ -93,10 +93,10 @@ enum GDInstanceMisc
TIMER_STATUE_ACTIVATION = 3500
};
-template<typename 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 d6a06597478..224a6eb71d0 100644
--- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
@@ -16,6 +16,7 @@
*/
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "Creature.h"
#include "EventMap.h"
#include "GameObject.h"
@@ -352,18 +353,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->AddFlag(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->AddFlag(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 fbe2655cf84..d4976c75255 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -638,13 +638,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)
{
CloseGossipMenuFor(player);
DoAction(ACTION_START_EVENT);
}
+ return false;
}
void DoAction(int32 action) override
@@ -834,13 +835,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)
{
CloseGossipMenuFor(player);
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 a9ffaeb5871..d40e5b8beb8 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
@@ -963,7 +963,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->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
me->GetTransport()->EnableMovement(true);
@@ -973,6 +973,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
@@ -1231,7 +1232,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->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
me->GetTransport()->EnableMovement(true);
@@ -1242,6 +1243,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
@@ -1396,10 +1398,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);
CloseGossipMenuFor(player);
+ 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 7f6b970e42e..f8a771a8e06 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -1206,7 +1206,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)
{
@@ -1215,6 +1215,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 51d80c54123..1e857d6164c 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -722,12 +722,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(SPELL_HARVEST_BLIGHT_SPECIMEN) && !me->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25))
+ 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 8bdc34748b8..c9a5b19e090 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -392,21 +392,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 1a2847df0ac..c9c25237ab2 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
@@ -22,6 +22,7 @@
#include "ObjectAccessor.h"
#include "Player.h"
#include "ScriptedCreature.h"
+#include "GameObjectAI.h"
#include "SpellScript.h"
enum Spells
@@ -220,22 +221,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->AddFlag(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->AddFlag(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 GetNexusAI<containment_sphereAI>(go);
+ }
};
class spell_intense_cold : public SpellScriptLoader
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
index f44f514ac5e..e6f8dcb06b0 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
+++ b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
@@ -65,8 +65,8 @@ enum NEXGameObjectIds
GO_TELESTRAS_CONTAINMET_SPHERE = 188526
};
-template<typename AI>
-inline AI* GetNexusAI(Creature* obj)
+template <class AI, class T>
+inline AI* GetNexusAI(T* obj)
{
return GetInstanceAI<AI>(obj, NexusScriptName);
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index 91043c1c2b8..29962252e21 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -145,7 +145,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)
{
@@ -160,7 +160,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)
{
@@ -172,7 +172,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript
StoreEssence(player, ITEM_AMBER_ESSENCE);
break;
}
- return;
+ return false;
case GOSSIP_MENU_BELGARISTRASZ:
if (gossipListId <= 2)
{
@@ -184,11 +184,12 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript
StoreEssence(player, ITEM_RUBY_ESSENCE);
break;
}
- return;
+ return false;
default:
- return;
+ return false;
}
CloseGossipMenuFor(player);
+ 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 13f252d5add..0b3ac3fba57 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
@@ -271,29 +271,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)
@@ -707,6 +684,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 6ebe372fe25..3f622a72c83 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
@@ -983,17 +983,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(GO_FLAG_IN_USE))
+ if (me->HasFlag(GO_FLAG_IN_USE))
return true;
bool hasKey = true;
- if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->GetLockId()))
+ if (LockEntry const* lock = sLockStore.LookupEntry(me->GetGOInfo()->GetLockId()))
{
hasKey = false;
for (uint32 i = 0; i < MAX_LOCK_CASE; ++i)
@@ -1013,20 +1013,17 @@ class go_celestial_planetarium_access : public GameObjectScript
return false;
// Start Algalon event
- go->AddFlag(GO_FLAG_IN_USE);
+ me->AddFlag(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;
}
@@ -1043,7 +1040,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 c301d287a97..09240de5649 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -23,6 +23,7 @@
*/
#include "ScriptMgr.h"
+#include "GameObjectAI.h"
#include "CellImpl.h"
#include "CombatAI.h"
#include "GameObject.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->RemoveNpcFlag(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 940c5b4f52f..20fee82c3b5 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
@@ -25,6 +25,7 @@
#include "SpellAuraEffects.h"
#include "SpellScript.h"
#include "TemporarySummon.h"
+#include "GameObjectAI.h"
#include "ulduar.h"
#include "Vehicle.h"
@@ -1648,20 +1649,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(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(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->AddFlag(GO_FLAG_NOT_SELECTABLE);
- return true;
+ me->SetGoState(GO_STATE_ACTIVE);
+ me->AddFlag(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 3f56f4523cc..f6fa82bed61 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -25,6 +25,7 @@
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "SpellInfo.h"
+#include "GameObjectAI.h"
#include "SpellScript.h"
#include "TemporarySummon.h"
#include "ulduar.h"
@@ -320,12 +321,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->AddFlag(GO_FLAG_NOT_SELECTABLE);
- return false;
+ me->AddFlag(GO_FLAG_NOT_SELECTABLE);
+ return false;
+ }
+ };
+
+ GameObjectAI* GetAI(GameObject* go) const override
+ {
+ return GetUlduarAI<go_razorscale_harpoonAI>(go);
}
};
@@ -738,34 +750,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
{
- AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
- SendGossipMenuFor(player, 13853, creature->GetGUID());
+ 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, 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 e36e32fd882..2eb507db98c 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
@@ -1532,10 +1532,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->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
me->DespawnOrUnsummon(2000);
@@ -1558,6 +1558,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 2fcea70cf3c..2eefd7e4b22 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -22,6 +22,7 @@
#include "ObjectAccessor.h"
#include "ScriptedCreature.h"
#include "TemporarySummon.h"
+#include "GameObjectAI.h"
#include "utgarde_pinnacle.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
@@ -560,19 +561,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->SetFlags(GO_FLAG_NOT_SELECTABLE);
- go->SetGoState(GO_STATE_ACTIVE);
+ me->SetFlags(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 3013ac1b70c..8fbe9038e66 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
@@ -97,10 +97,10 @@ enum UPGameObjectIds
GO_KING_YMIRON_DOOR = 192174
};
-template<typename AI>
-inline AI* GetUtgardePinnacleAI(Creature* creature)
+template<class AI, class T>
+inline 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 05ea5bc0024..bd5e68d1fbb 100644
--- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
@@ -22,6 +22,7 @@
#include "Map.h"
#include "MotionMaster.h"
#include "Player.h"
+#include "GameObjectAI.h"
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
#include "SpellAuraEffects.h"
@@ -316,30 +317,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)
@@ -368,7 +345,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)
{
@@ -382,6 +380,7 @@ class npc_sinclari_vh : public CreatureScript
me->CastSpell(player, SPELL_TELEPORT_PLAYER, true);
player->PlayerTalkClass->SendCloseGossip();
}
+ return false;
}
void DoAction(int32 actionId) override
@@ -1301,10 +1300,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 35dea9e8029..5f0b55490c8 100644
--- a/src/server/scripts/Northrend/VioletHold/violet_hold.h
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h
@@ -155,10 +155,10 @@ enum VHInstanceMisc
POINT_INTRO = 1
};
-template<typename 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 1dcc2de11c2..b14038431ad 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -245,31 +245,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);
}
};
@@ -291,27 +300,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);
}
};
@@ -644,41 +664,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);
}
};
@@ -1047,33 +1063,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
{
@@ -1622,26 +1638,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) { }
@@ -1686,6 +1682,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
@@ -1712,17 +1727,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)
@@ -1776,6 +1780,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
@@ -2210,11 +2224,6 @@ public:
uiEventPhase = 1;
}
- void SetGUID(ObjectGuid uiGuid, int32 /*iId*/) override
- {
- uiPlayerGUID = uiGuid;
- }
-
void AttackPlayer()
{
me->SetFaction(14);
@@ -2281,65 +2290,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 05cb11fc414..5c7df86b6a4 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 a9495310e89..d5c06855cff 100644
--- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
@@ -183,25 +183,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);
@@ -761,9 +759,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 9f49df63596..cab2d03b29c 100644
--- a/src/server/scripts/Northrend/zone_howling_fjord.cpp
+++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp
@@ -81,15 +81,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)
@@ -253,6 +244,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
@@ -333,50 +330,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);
}
};
@@ -406,17 +416,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
{
@@ -485,6 +484,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 1c226c23528..acbbb2bc802 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -66,40 +66,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);
}
};
@@ -127,37 +138,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);
}
};
@@ -312,27 +334,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);
}
};
@@ -567,55 +585,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 6b3cc445c9d..117c21d197a 100644
--- a/src/server/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
@@ -80,7 +80,7 @@ public:
player->FailQuest(QUEST_BITTER_DEPARTURE);
}
- void UpdateAI(uint32 uiDiff) override
+ void UpdateAI(uint32 uiDiff) override
{
npc_escortAI::UpdateAI(uiDiff);
if (!UpdateVictim())
@@ -88,7 +88,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)
{
@@ -96,6 +96,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);
}
};
@@ -103,14 +110,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;
- }
};
/*######
@@ -129,38 +128,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, TRAINER_ID_ROXI_RAMROCKET);
- 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, TRAINER_ID_ROXI_RAMROCKET);
+ 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);
}
};
@@ -481,11 +491,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 7233bf3db61..7ac0b1f87f6 100644
--- a/src/server/scripts/Northrend/zone_wintergrasp.cpp
+++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp
@@ -119,69 +119,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);
}
};
@@ -190,48 +201,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 = sObjectMgr->GetWorldSafeLoc(gy[i]->GetGraveyardId()))
- player->TeleportTo(safeLoc->Loc);
+ 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 = sObjectMgr->GetWorldSafeLoc(gy[i]->GetGraveyardId()))
+ player->TeleportTo(safeLoc->Loc);
+ }
+ return true;
}
};
@@ -278,17 +290,11 @@ 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
+ bool GossipHello(Player* player) override
{
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(me->GetGUID());
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
if (!wintergrasp)
@@ -297,7 +303,7 @@ class npc_wg_queue : public CreatureScript
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());
+ SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID());
}
else
{
@@ -306,15 +312,15 @@ class npc_wg_queue : public CreatureScript
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, creature->GetGUID());
+ 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, creature->GetGUID());
+ SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID());
}
return true;
}
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) override
+ bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
CloseGossipMenuFor(player);
@@ -332,6 +338,12 @@ class npc_wg_queue : public CreatureScript
}
return true;
}
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_wg_queueAI(creature);
+ }
};
class go_wg_vehicle_teleporter : public GameObjectScript
@@ -345,8 +357,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)
@@ -355,7 +367,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;
@@ -367,7 +379,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 e9e94189bf7..48dc7a1d7e4 100644
--- a/src/server/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
@@ -19,6 +19,7 @@
#include "GameObject.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
+#include "GameObjectAI.h"
#include "Player.h"
#include "ScriptedEscortAI.h"
#include "ScriptedGossip.h"
@@ -270,12 +271,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:
@@ -306,20 +308,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);
}
};
@@ -555,13 +566,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:
@@ -581,10 +593,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);
}
};