diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2017-05-01 18:19:36 -0300 |
|---|---|---|
| committer | funjoker <funjoker109@gmail.com> | 2020-05-03 03:04:32 +0200 |
| commit | 6604849716bc73d82a4cdbf8c66bb188086ceae4 (patch) | |
| tree | bd293ee1fdac3baf8bef0a55aa854fe8bf793bc2 /src/server/scripts/Northrend | |
| parent | e3489c48ee6929018618322571adbb8dc59e11b1 (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')
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); } }; |
