diff options
Diffstat (limited to 'src/server/scripts/Northrend')
35 files changed, 1066 insertions, 899 deletions
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h index 970a64e1fd8..c1bf139c070 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h @@ -80,10 +80,10 @@ enum AKGameObjectIds GO_SPHERE_2 = 193094 }; -template<class AI> -AI* GetAhnKahetAI(Creature* creature) +template<class AI, class T> +AI* GetAhnKahetAI(T* obj) { - return GetInstanceAI<AI>(creature, AhnKahetScriptName); + return GetInstanceAI<AI>(obj, AhnKahetScriptName); } #endif // AHNKAHET_H_ diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp index 32e296a508a..a261febcd6d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp @@ -17,6 +17,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellScript.h" #include "Player.h" #include "ahnkahet.h" @@ -380,33 +381,41 @@ class go_prince_taldaram_sphere : public GameObjectScript public: go_prince_taldaram_sphere() : GameObjectScript("go_prince_taldaram_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_prince_taldaram_sphereAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + go_prince_taldaram_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_PRINCE_TALDARAM)); - if (PrinceTaldaram && PrinceTaldaram->IsAlive()) - { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + InstanceScript* instance; - switch (go->GetEntry()) + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + Creature* princeTaldaram = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PRINCE_TALDARAM)); + if (princeTaldaram && princeTaldaram->IsAlive()) { - case GO_SPHERE_1: - instance->SetData(DATA_SPHERE_1, IN_PROGRESS); - PrinceTaldaram->AI()->Talk(SAY_1); - break; - case GO_SPHERE_2: - instance->SetData(DATA_SPHERE_2, IN_PROGRESS); - PrinceTaldaram->AI()->Talk(SAY_1); - break; - } + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); - ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); + switch (me->GetEntry()) + { + case GO_SPHERE_1: + instance->SetData(DATA_SPHERE_1, IN_PROGRESS); + princeTaldaram->AI()->Talk(SAY_1); + break; + case GO_SPHERE_2: + instance->SetData(DATA_SPHERE_2, IN_PROGRESS); + princeTaldaram->AI()->Talk(SAY_1); + break; + } + + ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, princeTaldaram->AI())->CheckSpheres(); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetAhnKahetAI<go_prince_taldaram_sphereAI>(go); } }; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index c1045aaee74..0b179b1e252 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1379,7 +1379,7 @@ class go_twilight_portal : public GameObjectScript if (!_deleted) { _deleted = true; - go->Delete(); + me->Delete(); } } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index 839488cff86..f31010c9676 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -446,48 +446,43 @@ public: break; } } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_announcer_toc5AI>(creature); - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - - if (instance && - ((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE && - instance->GetData(BOSS_BLACK_KNIGHT) == DONE && - instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) || - instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)) - return false; - - if (instance && - instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED && - instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED && - instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED && - instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - else if (instance) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } + bool GossipHello(Player* player) override + { + if (((instance->GetData(BOSS_GRAND_CHAMPIONS) == DONE && + instance->GetData(BOSS_BLACK_KNIGHT) == DONE && + instance->GetData(BOSS_ARGENT_CHALLENGE_E) == DONE) || + instance->GetData(BOSS_ARGENT_CHALLENGE_P) == DONE)) + return false; + + if (instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED && + instance->GetData(BOSS_ARGENT_CHALLENGE_E) == NOT_STARTED && + instance->GetData(BOSS_ARGENT_CHALLENGE_P) == NOT_STARTED && + instance->GetData(BOSS_BLACK_KNIGHT) == NOT_STARTED) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + else if (instance) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - CloseGossipMenuFor(player); - ENSURE_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter(); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + StartEncounter(); + } + return true; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_announcer_toc5AI>(creature); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 5c9be579132..a2046ca0b44 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -514,20 +514,20 @@ class npc_essence_of_twin : public CreatureScript return spellReturned; } + + bool GossipHello(Player* player) override + { + player->RemoveAurasDueToSpell(GetData(ESSENCE_REMOVE)); + player->CastSpell(player, GetData(ESSENCE_APPLY), true); + CloseGossipMenuFor(player); + return true; + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_essence_of_twinAI(creature); }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - player->RemoveAurasDueToSpell(creature->GetAI()->GetData(ESSENCE_REMOVE)); - player->CastSpell(player, creature->GetAI()->GetData(ESSENCE_APPLY), true); - CloseGossipMenuFor(player); - return true; - } }; struct npc_unleashed_ballAI : public ScriptedAI diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 711be2c5772..084ce0b614d 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -111,7 +111,9 @@ class npc_announcer_toc10 : public CreatureScript struct npc_announcer_toc10AI : public ScriptedAI { - npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature) { } + npc_announcer_toc10AI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } + + InstanceScript* instance; void Reset() override { @@ -123,95 +125,88 @@ class npc_announcer_toc10 : public CreatureScript } void AttackStart(Unit* /*who*/) override { } - }; - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) - return true; + bool GossipHello(Player* player) override + { + char const* _message = "We are ready!"; - char const* _message = "We are ready!"; + if (player->IsInCombat() || instance->IsEncounterInProgress()) + return true; - if (player->IsInCombat() || instance->IsEncounterInProgress()) - return true; - - uint8 i = 0; - for (; i < NUM_MESSAGES; ++i) - { - if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE) - || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE)) + uint8 i = 0; + for (; i < NUM_MESSAGES; ++i) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id); - break; + if ((!_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) != DONE) + || (_GossipMessage[i].state && instance->GetBossState(_GossipMessage[i].encounter) == DONE)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, _message, GOSSIP_SENDER_MAIN, _GossipMessage[i].id); + break; + } } - } - - if (i >= NUM_MESSAGES) - return false; - SendGossipMenuFor(player, _GossipMessage[i].msgnum, creature->GetGUID()); - return true; - } + if (i >= NUM_MESSAGES) + return false; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override - { - ClearGossipMenuFor(player); - CloseGossipMenuFor(player); - InstanceScript* instance = creature->GetInstanceScript(); - if (!instance) + SendGossipMenuFor(player, _GossipMessage[i].msgnum, me->GetGUID()); return true; - - if (instance->GetBossState(BOSS_BEASTS) != DONE) - { - instance->SetData(TYPE_EVENT, 110); - instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED); - instance->SetBossState(BOSS_BEASTS, NOT_STARTED); } - else if (instance->GetBossState(BOSS_JARAXXUS) != DONE) + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { - // if Jaraxxus is spawned, but the raid wiped - if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS))) + ClearGossipMenuFor(player); + CloseGossipMenuFor(player); + + if (instance->GetBossState(BOSS_BEASTS) != DONE) { - jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); - jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC); - jaraxxus->SetReactState(REACT_DEFENSIVE); - jaraxxus->SetInCombatWithZone(); + instance->SetData(TYPE_EVENT, 110); + instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED); + instance->SetBossState(BOSS_BEASTS, NOT_STARTED); } - else + else if (instance->GetBossState(BOSS_JARAXXUS) != DONE) { - instance->SetData(TYPE_EVENT, 1010); - instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED); + // if Jaraxxus is spawned, but the raid wiped + if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(NPC_JARAXXUS))) + { + jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); + jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC); + jaraxxus->SetReactState(REACT_DEFENSIVE); + jaraxxus->SetInCombatWithZone(); + } + else + { + instance->SetData(TYPE_EVENT, 1010); + instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED); + } } + else if (instance->GetBossState(BOSS_CRUSADERS) != DONE) + { + if (player->GetTeam() == ALLIANCE) + instance->SetData(TYPE_EVENT, 3000); + else + instance->SetData(TYPE_EVENT, 3001); + instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED); + } + else if (instance->GetBossState(BOSS_VALKIRIES) != DONE) + { + instance->SetData(TYPE_EVENT, 4000); + instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED); + } + else if (instance->GetBossState(BOSS_LICH_KING) != DONE) + { + if (me->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE) + instance->SetData(TYPE_EVENT, 4020); + else + instance->SetData(TYPE_EVENT, 4030); + instance->SetBossState(BOSS_LICH_KING, NOT_STARTED); + } + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + return true; } - else if (instance->GetBossState(BOSS_CRUSADERS) != DONE) - { - if (player->GetTeam() == ALLIANCE) - instance->SetData(TYPE_EVENT, 3000); - else - instance->SetData(TYPE_EVENT, 3001); - instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED); - } - else if (instance->GetBossState(BOSS_VALKIRIES) != DONE) - { - instance->SetData(TYPE_EVENT, 4000); - instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED); - } - else if (instance->GetBossState(BOSS_LICH_KING) != DONE) - { - if (creature->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE) - instance->SetData(TYPE_EVENT, 4020); - else - instance->SetData(TYPE_EVENT, 4030); - instance->SetBossState(BOSS_LICH_KING, NOT_STARTED); - } - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { - return new npc_announcer_toc10AI(creature); + return GetInstanceAI<npc_announcer_toc10AI>(creature); } }; diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index 4e11e4afdb9..7a2c01ce17c 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -99,7 +99,7 @@ public: Initialize(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_ID_SYLVANAS && gossipListId == GOSSIP_OPTION_ID) { @@ -109,6 +109,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_INTRO_1, 1000); } + return false; } void UpdateAI(uint32 diff) override @@ -196,7 +197,7 @@ public: Initialize(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_ID_JAINA && gossipListId == GOSSIP_OPTION_ID) { @@ -206,6 +207,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_INTRO_1, 1000); } + return false; } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 9bda4b0ae0a..af4e20ccb06 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -343,28 +343,27 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript public: npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - if (instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL) + npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature) + { + _instance = me->GetInstanceScript(); + } + + bool GossipHello(Player* player) override + { + // override default gossip + if (_instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || _instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL) { ClearGossipMenuFor(player); return true; } - // load default gossip - return false; - } - - struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI - { - npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature) - { - _instance = me->GetInstanceScript(); + // load default gossip + return false; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); @@ -383,6 +382,7 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript default: break; } + return false; } void Reset() override @@ -790,21 +790,6 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript public: npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - if (instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) - { - player->PrepareGossipMenu(creature, creature->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true); - player->SendPreparedGossip(creature); - return true; - } - - // load default gossip - return false; - } - struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI { npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature), @@ -858,7 +843,21 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + if (_instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) + { + player->PrepareGossipMenu(me, me->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true); + player->SendPreparedGossip(me); + return true; + } + + // load default gossip + return false; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { ClearGossipMenuFor(player); @@ -872,6 +871,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript default: break; } + return false; } void DestroyIceWall() diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h index 68de4c716c9..44f160e36b7 100644 --- a/src/server/scripts/Northrend/Gundrak/gundrak.h +++ b/src/server/scripts/Northrend/Gundrak/gundrak.h @@ -91,10 +91,10 @@ enum GDInstanceMisc TIMER_STATUE_ACTIVATION = 3500 }; -template<class AI> -inline AI* GetGundrakAI(Creature* creature) +template<class AI, class T> +inline AI* GetGundrakAI(T* obj) { - return GetInstanceAI<AI>(creature, GundrakScriptName); + return GetInstanceAI<AI>(obj, GundrakScriptName); } #endif // GUNDRAK_H_ diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index b35b4f7696d..aed28522faf 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -18,6 +18,7 @@ #include "InstanceScript.h" #include "Player.h" #include "ScriptMgr.h" +#include "GameObjectAI.h" #include "gundrak.h" #include "EventMap.h" @@ -350,18 +351,25 @@ class go_gundrak_altar : public GameObjectScript public: go_gundrak_altar() : GameObjectScript("go_gundrak_altar") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_gundrak_altarAI : public GameObjectAI { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + go_gundrak_altarAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - if (InstanceScript* instance = go->GetInstanceScript()) + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - instance->SetData(DATA_STATUE_ACTIVATE, go->GetEntry()); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); + + instance->SetData(DATA_STATUE_ACTIVATE, me->GetEntry()); return true; } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetGundrakAI<go_gundrak_altarAI>(go); } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index ebf246affc2..db69da91e75 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -636,13 +636,14 @@ class npc_high_overlord_saurfang_icc : public CreatureScript _events.Reset(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId == GOSSIP_MENU_HIGH_OVERLORD_SAURFANG) { player->PlayerTalkClass->SendCloseGossip(); DoAction(ACTION_START_EVENT); } + return false; } void DoAction(int32 action) override @@ -832,13 +833,14 @@ class npc_muradin_bronzebeard_icc : public CreatureScript _events.Reset(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId == GOSSIP_MENU_MURADIN_BRONZEBEARD) { player->PlayerTalkClass->SendCloseGossip(); DoAction(ACTION_START_EVENT); } + return false; } void DoAction(int32 action) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index 647ea054263..974ae333746 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -962,7 +962,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript } } - void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override { me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->GetTransport()->EnableMovement(true); @@ -972,6 +972,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript _events.ScheduleEvent(EVENT_INTRO_SUMMON_SKYBREAKER, 24600, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_H_3, 29600, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_H_4, 39200, 0, PHASE_INTRO); + return false; } void DamageTaken(Unit* , uint32& damage) override @@ -1230,7 +1231,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript } } - void sGossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* /*player*/, uint32 /*menuId*/, uint32 /*gossipListId*/) override { me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->GetTransport()->EnableMovement(true); @@ -1241,6 +1242,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript _events.ScheduleEvent(EVENT_INTRO_A_3, 33000, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_A_4, 39000, 0, PHASE_INTRO); _events.ScheduleEvent(EVENT_INTRO_A_5, 45000, 0, PHASE_INTRO); + return false; } void DamageTaken(Unit* , uint32& damage) override @@ -1395,10 +1397,11 @@ class npc_zafod_boombox : public CreatureScript me->SetReactState(REACT_PASSIVE); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { player->AddItem(ITEM_GOBLIN_ROCKET_PACK, 1); player->PlayerTalkClass->SendCloseGossip(); + return false; } void UpdateAI(uint32 /*diff*/) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 34b505ae106..030a64d8a97 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1222,7 +1222,7 @@ class npc_tirion_fordring_tft : public CreatureScript me->LoadEquipment(1); // remove glow on ashbringer } - void sGossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* /*player*/, uint32 menuId, uint32 gossipListId) override { if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId) { @@ -1231,6 +1231,7 @@ class npc_tirion_fordring_tft : public CreatureScript me->SetWalk(true); me->GetMotionMaster()->MovePoint(POINT_TIRION_INTRO, TirionIntro); } + return false; } void JustReachedHome() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 108eb862287..1648274d02e 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -115,7 +115,6 @@ enum ICCSpells // Alchemist Adrianna SPELL_HARVEST_BLIGHT_SPECIMEN = 72155, - SPELL_HARVEST_BLIGHT_SPECIMEN25 = 72162, // Crok Scourgebane SPELL_ICEBOUND_ARMOR = 70714, @@ -717,12 +716,22 @@ class npc_alchemist_adrianna : public CreatureScript public: npc_alchemist_adrianna() : CreatureScript("npc_alchemist_adrianna") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_alchemist_adriannaAI : public ScriptedAI { - if (!creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN) && !creature->FindCurrentSpellBySpellId(SPELL_HARVEST_BLIGHT_SPECIMEN25)) - if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE)) - creature->CastSpell(creature, SPELL_HARVEST_BLIGHT_SPECIMEN, false); - return false; + npc_alchemist_adriannaAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override + { + if (!me->FindCurrentSpellBySpellId(sSpellMgr->GetSpellIdForDifficulty(SPELL_HARVEST_BLIGHT_SPECIMEN, me))) + if (player->HasAura(SPELL_ORANGE_BLIGHT_RESIDUE) && player->HasAura(SPELL_GREEN_BLIGHT_RESIDUE)) + DoCastSelf(SPELL_HARVEST_BLIGHT_SPECIMEN, false); + return false; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_alchemist_adriannaAI(creature); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 609ba3d1003..f0490e7d1d4 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -388,21 +388,21 @@ class go_sapphiron_birth : public GameObjectScript { go_sapphiron_birthAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - void OnStateChanged(uint32 state, Unit* who) override + void OnLootStateChanged(uint32 state, Unit* who) override { if (state == GO_ACTIVATED) { if (who) { - if (Creature* sapphiron = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_SAPPHIRON))) + if (Creature* sapphiron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SAPPHIRON))) sapphiron->AI()->DoAction(ACTION_BIRTH); instance->SetData(DATA_HAD_SAPPHIRON_BIRTH, 1u); } } else if (state == GO_JUST_DEACTIVATED) { // prevent ourselves from going back to _READY and resetting the client anim - go->SetRespawnTime(0); - go->Delete(); + me->SetRespawnTime(0); + me->Delete(); } } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 1a9216efda0..891e4af0732 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -17,6 +17,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "SpellScript.h" #include "SpellAuraEffects.h" #include "Player.h" @@ -224,22 +225,31 @@ class containment_sphere : public GameObjectScript public: containment_sphere() : GameObjectScript("containment_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct containment_sphereAI : public GameObjectAI { - InstanceScript* instance = go->GetInstanceScript(); + containment_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - Creature* pKeristrasza = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_KERISTRASZA)); - if (pKeristrasza && pKeristrasza->IsAlive()) + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { - // maybe these are hacks :( - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + Creature* keristrasza = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KERISTRASZA)); + if (keristrasza && keristrasza->IsAlive()) + { + // maybe these are hacks :( + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); - ENSURE_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); + ENSURE_AI(boss_keristrasza::boss_keristraszaAI, keristrasza->AI())->CheckContainmentSpheres(true); + } + return true; } - return true; - } + }; + GameObjectAI* GetAI(GameObject* go) const override + { + return GetInstanceAI<containment_sphereAI>(go); + } }; class spell_intense_cold : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 66095046f66..4aa0cf0d76e 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -141,7 +141,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript player->DestroyItemCount(itemId, 1, true, false); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { switch (menuId) { @@ -156,7 +156,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_EMERALD_ESSENCE); break; } - return; + return false; case GOSSIP_MENU_ETERNOS: if (gossipListId >= 1 && gossipListId <= 3) { @@ -168,7 +168,7 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_AMBER_ESSENCE); break; } - return; + return false; case GOSSIP_MENU_BELGARISTRASZ: if (gossipListId <= 2) { @@ -180,11 +180,12 @@ class npc_verdisa_beglaristrasz_eternos : public CreatureScript StoreEssence(player, ITEM_RUBY_ESSENCE); break; } - return; + return false; default: - return; + return false; } player->PlayerTalkClass->SendCloseGossip(); + return false; } void MovementInform(uint32 /*type*/, uint32 id) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index fdb0b539804..9937f4d6fc7 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -269,29 +269,6 @@ class npc_brann_hos : public CreatureScript public: npc_brann_hos() : CreatureScript("npc_brann_hos") { } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1 || action == GOSSIP_ACTION_INFO_DEF+2) - { - CloseGossipMenuFor(player); - ENSURE_AI(npc_brann_hos::npc_brann_hosAI, creature->AI())->StartWP(); - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, TEXT_ID_START, creature->GetGUID()); - - return true; - } - struct npc_brann_hosAI : public npc_escortAI { npc_brann_hosAI(Creature* creature) : npc_escortAI(creature) @@ -705,6 +682,30 @@ public: DoMeleeAttackIfReady(); } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1 || action == GOSSIP_ACTION_INFO_DEF + 2) + { + CloseGossipMenuFor(player); + StartWP(); + } + + return true; + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, TEXT_ID_START, me->GetGUID()); + + return true; + } }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 07dd5d6bc24..3e92fb5c2ea 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -976,17 +976,17 @@ class go_celestial_planetarium_access : public GameObjectScript struct go_celestial_planetarium_accessAI : public GameObjectAI { - go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go) - { - } + go_celestial_planetarium_accessAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; bool GossipHello(Player* player, bool /*reportUse*/) override { - if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE)) return true; bool hasKey = true; - if (LockEntry const* lock = sLockStore.LookupEntry(go->GetGOInfo()->goober.lockId)) + if (LockEntry const* lock = sLockStore.LookupEntry(me->GetGOInfo()->goober.lockId)) { hasKey = false; for (uint32 i = 0; i < MAX_LOCK_CASE; ++i) @@ -1006,20 +1006,17 @@ class go_celestial_planetarium_access : public GameObjectScript return false; // Start Algalon event - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); _events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000); - if (Creature* brann = go->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) + if (Creature* brann = me->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) brann->AI()->DoAction(ACTION_START_INTRO); - if (InstanceScript* instance = go->GetInstanceScript()) - { - instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_01))) - sigil->SetGoState(GO_STATE_ACTIVE); + instance->SetData(DATA_ALGALON_SUMMON_STATE, 1); + if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_01))) + sigil->SetGoState(GO_STATE_ACTIVE); - if (GameObject* sigil = ObjectAccessor::GetGameObject(*go, instance->GetGuidData(DATA_SIGILDOOR_02))) - sigil->SetGoState(GO_STATE_ACTIVE); - } + if (GameObject* sigil = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SIGILDOOR_02))) + sigil->SetGoState(GO_STATE_ACTIVE); return false; } @@ -1036,7 +1033,7 @@ class go_celestial_planetarium_access : public GameObjectScript switch (eventId) { case EVENT_DESPAWN_CONSOLE: - go->Delete(); + me->Delete(); break; } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 87129eefd9a..e78dc7f8ac5 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -26,6 +26,7 @@ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" #include "Cell.h" #include "CellImpl.h" #include "GridNotifiers.h" @@ -1185,7 +1186,7 @@ class npc_brann_bronzebeard_ulduar_intro : public CreatureScript _instance = creature->GetInstanceScript(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_BRANN_BRONZEBEARD && gossipListId == GOSSIP_OPTION_BRANN_BRONZEBEARD) { @@ -1194,6 +1195,7 @@ class npc_brann_bronzebeard_ulduar_intro : public CreatureScript if (Creature* loreKeeper = _instance->GetCreature(DATA_LORE_KEEPER_OF_NORGANNON)) loreKeeper->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } + return false; } private: @@ -1238,7 +1240,7 @@ class npc_lorekeeper : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_LORE_KEEPER && gossipListId == GOSSIP_OPTION_LORE_KEEPER) { @@ -1262,6 +1264,7 @@ class npc_lorekeeper : public CreatureScript } } } + return false; } private: @@ -1279,30 +1282,38 @@ class go_ulduar_tower : public GameObjectScript public: go_ulduar_tower() : GameObjectScript("go_ulduar_tower") { } - void OnDestroyed(GameObject* go, Player* /*player*/) override + struct go_ulduar_towerAI : public GameObjectAI + { + go_ulduar_towerAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + void Destroyed(Player* /*player*/, uint32 /*eventId*/) override + { + switch (me->GetEntry()) + { + case GO_TOWER_OF_STORMS: + instance->ProcessEvent(me, EVENT_TOWER_OF_STORM_DESTROYED); + break; + case GO_TOWER_OF_FLAMES: + instance->ProcessEvent(me, EVENT_TOWER_OF_FLAMES_DESTROYED); + break; + case GO_TOWER_OF_FROST: + instance->ProcessEvent(me, EVENT_TOWER_OF_FROST_DESTROYED); + break; + case GO_TOWER_OF_LIFE: + instance->ProcessEvent(me, EVENT_TOWER_OF_LIFE_DESTROYED); + break; + } + + if (Creature* trigger = me->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true)) + trigger->DisappearAndDie(); + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return; - - switch (go->GetEntry()) - { - case GO_TOWER_OF_STORMS: - instance->ProcessEvent(go, EVENT_TOWER_OF_STORM_DESTROYED); - break; - case GO_TOWER_OF_FLAMES: - instance->ProcessEvent(go, EVENT_TOWER_OF_FLAMES_DESTROYED); - break; - case GO_TOWER_OF_FROST: - instance->ProcessEvent(go, EVENT_TOWER_OF_FROST_DESTROYED); - break; - case GO_TOWER_OF_LIFE: - instance->ProcessEvent(go, EVENT_TOWER_OF_LIFE_DESTROYED); - break; - } - - if (Creature* trigger = go->FindNearestCreature(NPC_ULDUAR_GAUNTLET_GENERATOR, 15.0f, true)) - trigger->DisappearAndDie(); + return GetUlduarAI<go_ulduar_towerAI>(go); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 8152183231c..5742d607e41 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -23,6 +23,7 @@ #include "ScriptedCreature.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "GameObjectAI.h" #include "ulduar.h" #include "Vehicle.h" @@ -1645,20 +1646,29 @@ class go_mimiron_hardmode_button : public GameObjectScript public: go_mimiron_hardmode_button() : GameObjectScript("go_mimiron_hardmode_button") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_mimiron_hardmode_buttonAI : public GameObjectAI { - if (go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE)) - return true; + go_mimiron_hardmode_buttonAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (me->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE)) + return true; - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return false; + if (Creature* computer = instance->GetCreature(DATA_COMPUTER)) + computer->AI()->DoAction(DO_ACTIVATE_COMPUTER); - if (Creature* computer = instance->GetCreature(DATA_COMPUTER)) - computer->AI()->DoAction(DO_ACTIVATE_COMPUTER); - go->SetGoState(GO_STATE_ACTIVE); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - return true; + me->SetGoState(GO_STATE_ACTIVE); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUlduarAI<go_mimiron_hardmode_buttonAI>(go); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index e6aa2654d54..67f603fc9fe 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -20,6 +20,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "GameObjectAI.h" #include "SpellScript.h" #include "ulduar.h" #include "SpellInfo.h" @@ -316,12 +317,23 @@ class go_razorscale_harpoon : public GameObjectScript public: go_razorscale_harpoon() : GameObjectScript("go_razorscale_harpoon") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_razorscale_harpoonAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_razorscale_harpoonAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { if (instance->GetCreature(BOSS_RAZORSCALE)) - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - return false; + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUlduarAI<go_razorscale_harpoonAI>(go); } }; @@ -734,36 +746,37 @@ class npc_expedition_commander : public CreatureScript else AttackStartTimer -= Diff; } - }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF: - CloseGossipMenuFor(player); - ENSURE_AI(npc_expedition_commanderAI, creature->AI())->Phase = 1; - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + CloseGossipMenuFor(player); + Phase = 1; + break; + } + return true; } - return true; - } - bool OnGossipHello(Player* player, Creature* creature) override - { - InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) + bool GossipHello(Player* player) override { - player->PrepareGossipMenu(creature); + if (instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) + { + player->PrepareGossipMenu(me); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, 13853, creature->GetGUID()); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, 13853, me->GetGUID()); + } + else + SendGossipMenuFor(player, 13910, me->GetGUID()); + + return true; } - else - SendGossipMenuFor(player, 13910, creature->GetGUID()); - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 69404eacbad..be7b317c9d9 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -1523,10 +1523,10 @@ class npc_observation_ring_keeper : public CreatureScript DoCast(SPELL_KEEPER_ACTIVE); } - void sGossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 menuId, uint32 /*gossipListId*/) override { if (menuId != 10333) - return; + return false; me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->DespawnOrUnsummon(2000); @@ -1549,6 +1549,7 @@ class npc_observation_ring_keeper : public CreatureScript me->SummonCreature(NPC_MIMIRON_YS, YSKeepersPos[3]); break; } + return false; } void UpdateAI(uint32 /*diff*/) override { } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index d39608cb53f..07699fed87d 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -17,6 +17,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "utgarde_pinnacle.h" #include "SpellScript.h" #include "SpellAuraEffects.h" @@ -555,19 +556,30 @@ class go_palehoof_sphere : public GameObjectScript public: go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_palehoof_sphereAI : public GameObjectAI { - if (InstanceScript* instance = go->GetInstanceScript()) + go_palehoof_sphereAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + + InstanceScript* instance; + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override { if (Creature* palehoof = instance->GetCreature(DATA_GORTOK_PALEHOOF)) + { if (palehoof->IsAlive() && instance->GetBossState(DATA_GORTOK_PALEHOOF) != DONE) { - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetGoState(GO_STATE_ACTIVE); palehoof->AI()->DoAction(ACTION_START_ENCOUNTER); } + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetUtgardePinnacleAI<go_palehoof_sphereAI>(go); } }; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h index a2d5004c6e8..f4d217c74f3 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h @@ -95,10 +95,10 @@ enum UPGameObjectIds GO_KING_YMIRON_DOOR = 192174 }; -template<class AI> -AI* GetUtgardePinnacleAI(Creature* creature) +template<class AI, class T> +AI* GetUtgardePinnacleAI(T* obj) { - return GetInstanceAI<AI>(creature, UPScriptName); + return GetInstanceAI<AI>(obj, UPScriptName); } #endif // UTGARDE_PINNACLE_H_ diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index b2061ea6369..e6dd7bd218c 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -18,6 +18,7 @@ #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "GameObjectAI.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" #include "SpellAuraEffects.h" @@ -317,30 +318,6 @@ class npc_sinclari_vh : public CreatureScript public: npc_sinclari_vh() : CreatureScript("npc_sinclari_vh") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - // override default gossip - if (InstanceScript* instance = creature->GetInstanceScript()) - { - switch (instance->GetData(DATA_MAIN_EVENT_STATE)) - { - case IN_PROGRESS: - player->PrepareGossipMenu(creature, GOSSIP_MENU_SEND_ME_IN, true); - player->SendPreparedGossip(creature); - return true; - case DONE: - return true; // NYI - case NOT_STARTED: - case FAIL: - default: - break; - } - } - - // load default gossip - return false; - } - struct npc_sinclariAI : public ScriptedAI { npc_sinclariAI(Creature* creature) : ScriptedAI(creature), _summons(creature) @@ -369,7 +346,28 @@ class npc_sinclari_vh : public CreatureScript } } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipHello(Player* player) override + { + // override default gossip + switch (_instance->GetData(DATA_MAIN_EVENT_STATE)) + { + case IN_PROGRESS: + player->PrepareGossipMenu(me, GOSSIP_MENU_SEND_ME_IN, true); + player->SendPreparedGossip(me); + return true; + case DONE: + return true; // NYI + case NOT_STARTED: + case FAIL: + default: + break; + } + + // load default gossip + return false; + } + + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_MENU_START_ENCOUNTER && gossipListId == 0) { @@ -383,6 +381,7 @@ class npc_sinclari_vh : public CreatureScript me->CastSpell(player, SPELL_TELEPORT_PLAYER, true); player->PlayerTalkClass->SendCloseGossip(); } + return false; } void DoAction(int32 actionId) override @@ -1309,10 +1308,20 @@ class go_activation_crystal : public GameObjectScript public: go_activation_crystal() : GameObjectScript("go_activation_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_activation_crystalAI : public GameObjectAI + { + go_activation_crystalAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - player->CastSpell(player, SPELL_CRYSTAL_ACTIVATION, true); - return false; + return GetVioletHoldAI<go_activation_crystalAI>(go); } }; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index 537c5d51b1e..4238634d8c1 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -151,10 +151,10 @@ enum VHInstanceMisc POINT_INTRO = 1 }; -template<class AI> -inline AI* GetVioletHoldAI(Creature* creature) +template<class AI, class T> +inline AI* GetVioletHoldAI(T* obj) { - return GetInstanceAI<AI>(creature, VioletHoldScriptName); + return GetInstanceAI<AI>(obj, VioletHoldScriptName); } #endif // VIOLET_HOLD_H_ diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index e00d2489de8..595e53ea9d5 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -241,31 +241,40 @@ class npc_corastrasza : public CreatureScript public: npc_corastrasza() : CreatureScript("npc_corastrasza") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_corastraszaAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_corastraszaAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests. - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + if (player->GetQuestStatus(QUEST_ACES_HIGH) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_ACES_HIGH_DAILY) == QUEST_STATUS_INCOMPLETE) //It's the same dragon for both quests. + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_C_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - CloseGossipMenuFor(player); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); - player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + player->CastSpell(player, SPELL_SUMMON_WYRMREST_SKYTALON, true); + player->CastSpell(player, SPELL_WYRMREST_SKYTALON_RIDE_PERIODIC, true); + } + return true; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_corastraszaAI(creature); } }; @@ -287,27 +296,38 @@ class npc_iruk : public CreatureScript public: npc_iruk() : CreatureScript("npc_iruk") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_irukAI : public ScriptedAI { - if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + npc_irukAI(Creature* creature) : ScriptedAI(creature) { } - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, creature->GetGUID()); - return true; - } + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_SPIRITS_WATCH_OVER_US) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_I, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXT_I, me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); - CloseGossipMenuFor(player); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATURE_TOTEM_OF_ISSLIRUK, true); + CloseGossipMenuFor(player); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_irukAI(creature); } }; @@ -643,41 +663,37 @@ public: if (!UpdateVictim()) return; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_lurgglbrAI(creature); - } - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS) + void QuestAccept(Player* player, Quest const* quest) override { - if (GameObject* go = creature->FindNearestGameObject(GO_CAGE, 5.0f)) + if (quest->GetQuestId() == QUEST_ESCAPE_WINTERFIN_CAVERNS) { - go->SetRespawnTime(0); - go->SetGoType(GAMEOBJECT_TYPE_BUTTON); - go->UseDoorOrButton(20); - } + if (GameObject* go = me->FindNearestGameObject(GO_CAGE, 5.0f)) + { + go->SetRespawnTime(0); + go->SetGoType(GAMEOBJECT_TYPE_BUTTON); + go->UseDoorOrButton(20); + } - if (npc_escortAI* pEscortAI = CAST_AI(npc_lurgglbr::npc_lurgglbrAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + Start(true, false, player->GetGUID()); - switch (player->GetTeam()) - { - case ALLIANCE: - creature->SetFaction(FACTION_ESCORTEE_A); - break; - default: - case HORDE: - creature->SetFaction(FACTION_ESCORTEE_H); - break; + switch (player->GetTeam()) + { + case ALLIANCE: + me->SetFaction(FACTION_ESCORTEE_A); + break; + default: + case HORDE: + me->SetFaction(FACTION_ESCORTEE_H); + break; + } } - - return true; } - return false; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_lurgglbrAI(creature); } }; @@ -1046,33 +1062,33 @@ public: if (Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID)) arthas->RemoveFromWorld(); } - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && creature->GetAreaId() == 4128) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + if (player->GetQuestStatus(QUEST_LAST_RITES) == QUEST_STATUS_INCOMPLETE && me->GetAreaId() == 4128) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_T, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(200.0f); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + Start(true, false, player->GetGUID()); + SetMaxPlayerDistance(200.0f); + break; + } + return true; } - return true; - } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -1621,26 +1637,6 @@ class npc_mootoo_the_younger : public CreatureScript public: npc_mootoo_the_younger() : CreatureScript("npc_mootoo_the_younger") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST) - { - switch (player->GetTeam()) - { - case ALLIANCE: - creature->SetFaction(FACTION_ESCORTEE_A); - break; - case HORDE: - creature->SetFaction(FACTION_ESCORTEE_H); - break; - } - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->AI()->Talk(SAY_1, player); - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - } - return true; - } - struct npc_mootoo_the_youngerAI : public npc_escortAI { npc_mootoo_the_youngerAI(Creature* creature) : npc_escortAI(creature) { } @@ -1685,6 +1681,25 @@ public: break; } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_ESCAPING_THE_MIST) + { + switch (player->GetTeam()) + { + case ALLIANCE: + me->SetFaction(FACTION_ESCORTEE_A); + break; + case HORDE: + me->SetFaction(FACTION_ESCORTEE_H); + break; + } + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_1, player); + Start(true, false, player->GetGUID()); + } + } }; CreatureAI* GetAI(Creature* creature) const override @@ -1711,17 +1726,6 @@ class npc_bonker_togglevolt : public CreatureScript public: npc_bonker_togglevolt() : CreatureScript("npc_bonker_togglevolt") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE) - { - creature->SetStandState(UNIT_STAND_STATE_STAND); - creature->AI()->Talk(SAY_BONKER_2, player); - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID()); - } - return true; - } - struct npc_bonker_togglevoltAI : public npc_escortAI { npc_bonker_togglevoltAI(Creature* creature) : npc_escortAI(creature) @@ -1775,6 +1779,16 @@ public: break; } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_GET_ME_OUTA_HERE) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_BONKER_2, player); + Start(true, true, player->GetGUID()); + } + } }; CreatureAI* GetAI(Creature* creature) const override @@ -2209,11 +2223,6 @@ public: uiEventPhase = 1; } - void SetGUID(ObjectGuid uiGuid, int32 /*iId*/) override - { - uiPlayerGUID = uiGuid; - } - void AttackPlayer() { me->SetFaction(14); @@ -2280,65 +2289,65 @@ public: DoMeleeAttackIfReady(); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_hidden_cultistAI(creature); - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - uint32 uiGossipText = 0; - const char* charGossipItem; - switch (creature->GetEntry()) + bool GossipHello(Player* player) override { - case NPC_TOM_HEGGER: - uiGossipText = GOSSIP_TEXT_TOM_HEGGER; - charGossipItem = GOSSIP_ITEM_TOM_HEGGER; - break; - case NPC_SALTY_JOHN_THORPE: - uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; - charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE; - break; - case NPC_GUARD_MITCHELLS: - uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; - charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS; - break; - default: - charGossipItem = ""; - return false; - } + uint32 uiGossipText = 0; + const char* charGossipItem; - if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + switch (me->GetEntry()) + { + case NPC_TOM_HEGGER: + uiGossipText = GOSSIP_TEXT_TOM_HEGGER; + charGossipItem = GOSSIP_ITEM_TOM_HEGGER; + break; + case NPC_SALTY_JOHN_THORPE: + uiGossipText = GOSSIP_TEXT_SALTY_JOHN_THORPE; + charGossipItem = GOSSIP_ITEM_SALTY_JOHN_THORPE; + break; + case NPC_GUARD_MITCHELLS: + uiGossipText = GOSSIP_TEXT_GUARD_MITCHELSS; + charGossipItem = GOSSIP_ITEM_GUARD_MITCHELLS; + break; + default: + charGossipItem = ""; + return false; + } - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (player->HasAura(SPELL_RIGHTEOUS_VISION) && player->GetQuestStatus(QUEST_THE_HUNT_IS_ON) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, charGossipItem, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, uiGossipText, creature->GetGUID()); + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - return true; - } + SendGossipMenuFor(player, uiGossipText, me->GetGUID()); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); + return true; + } - if (action == GOSSIP_ACTION_INFO_DEF+1) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - CloseGossipMenuFor(player); - creature->AI()->SetGUID(player->GetGUID()); - creature->AI()->DoAction(1); - } + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_TRADE) - player->GetSession()->SendListInventory(creature->GetGUID()); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + uiPlayerGUID = player->GetGUID(); + DoAction(1); + } - return true; - } + if (action == GOSSIP_ACTION_TRADE) + player->GetSession()->SendListInventory(me->GetGUID()); + return true; + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_hidden_cultistAI(creature); + } }; enum WindsoulTotemAura diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index de8633283cc..219e6514b1e 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -494,33 +494,6 @@ class npc_wyrmrest_defender : public CreatureScript public: npc_wyrmrest_defender() : CreatureScript("npc_wyrmrest_defender") { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_DEFENDING_WYRMREST_TEMPLE) == QUEST_STATUS_INCOMPLETE) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_TEXTID_DEF1, creature->GetGUID()); - } - else - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF+1) - { - SendGossipMenuFor(player, GOSSIP_TEXTID_DEF2, creature->GetGUID()); - // Makes player cast trigger spell for 49207 on self - player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true); - // The gossip should not auto close - } - - return true; - } - struct npc_wyrmrest_defenderAI : public VehicleAI { npc_wyrmrest_defenderAI(Creature* creature) : VehicleAI(creature) @@ -592,6 +565,34 @@ class npc_wyrmrest_defender : public CreatureScript break; } } + + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_DEFENDING_WYRMREST_TEMPLE) == QUEST_STATUS_INCOMPLETE) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_TEXTID_DEF1, me->GetGUID()); + } + else + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + SendGossipMenuFor(player, GOSSIP_TEXTID_DEF2, me->GetGUID()); + // Makes player cast trigger spell for 49207 on self + player->CastSpell(player, SPELL_CHARACTER_SCRIPT, true); + // The gossip should not auto close + } + + return true; + } }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index e71a92b3e0c..ec3dd5fb5af 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -185,25 +185,23 @@ public: _RavenousworgGUID.Clear(); } + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE) + { + Talk(SAY_QUEST_ACCEPT); + if (Creature* Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 180.0f)) + Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + + Start(true, false, player->GetGUID()); + } + } + private: ObjectGuid _RavenousworgGUID; ObjectGuid _mrfloppyGUID; }; - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_PERILOUS_ADVENTURE) - { - creature->AI()->Talk(SAY_QUEST_ACCEPT); - if (Creature* Mrfloppy = GetClosestCreatureWithEntry(creature, NPC_MRFLOPPY, 180.0f)) - Mrfloppy->GetMotionMaster()->MoveFollow(creature, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - - if (npc_escortAI* pEscortAI = CAST_AI(npc_emily::npc_emilyAI, (creature->AI()))) - pEscortAI->Start(true, false, player->GetGUID()); - } - return true; - } - CreatureAI* GetAI(Creature* creature) const override { return new npc_emilyAI(creature); @@ -763,9 +761,10 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { DoCast(player, SPELL_SUMMON_ASHWOOD_BRAND); + return false; } private: diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 4061d69d021..7abe719ef71 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -79,15 +79,6 @@ class npc_apothecary_hanes : public CreatureScript public: npc_apothecary_hanes() : CreatureScript("npc_apothecary_hanes") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) - { - ENSURE_AI(npc_Apothecary_HanesAI, (creature->AI()))->StartEscort(player); - } - return true; - } - struct npc_Apothecary_HanesAI : public npc_escortAI { npc_Apothecary_HanesAI(Creature* creature) : npc_escortAI(creature) @@ -252,6 +243,12 @@ public: break; } } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) + StartEscort(player); + } }; CreatureAI* GetAI(Creature* creature) const override @@ -332,50 +329,63 @@ class npc_razael_and_lyana : public CreatureScript public: npc_razael_and_lyana() : CreatureScript("npc_razael_and_lyana") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_razael_and_lyanaAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_razael_and_lyanaAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE) - switch (creature->GetEntry()) + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(QUEST_REPORTS_FROM_THE_FIELD) == QUEST_STATUS_INCOMPLETE) { - case NPC_RAZAEL: - if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, creature->GetGUID()); - return true; - } - break; - case NPC_LYANA: - if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, creature->GetGUID()); - return true; - } - break; + switch (me->GetEntry()) + { + case NPC_RAZAEL: + if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_RAZAEL)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_RAZAEL_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL1, me->GetGUID()); + return true; + } + break; + case NPC_LYANA: + if (!player->GetReqKillOrCastCurrentCount(QUEST_REPORTS_FROM_THE_FIELD, NPC_LYANA)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LYANA_REPORT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA1, me->GetGUID()); + return true; + } + break; + } } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF + 1: - SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL2, creature->GetGUID()); - player->TalkedToCreature(NPC_RAZAEL, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA2, creature->GetGUID()); - player->TalkedToCreature(NPC_LYANA, creature->GetGUID()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + SendGossipMenuFor(player, GOSSIP_TEXTID_RAZAEL2, me->GetGUID()); + player->TalkedToCreature(NPC_RAZAEL, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + SendGossipMenuFor(player, GOSSIP_TEXTID_LYANA2, me->GetGUID()); + player->TalkedToCreature(NPC_LYANA, me->GetGUID()); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_razael_and_lyanaAI(creature); } }; @@ -405,17 +415,6 @@ class npc_daegarn : public CreatureScript public: npc_daegarn() : CreatureScript("npc_daegarn") { } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING) - { - if (npc_daegarnAI* pDaegarnAI = CAST_AI(npc_daegarn::npc_daegarnAI, creature->AI())) - pDaegarnAI->StartEvent(player->GetGUID()); - } - - return true; - } - /// @todo make prisoners help (unclear if summoned or using npc's from surrounding cages (summon inside small cages?)) struct npc_daegarnAI : public ScriptedAI { @@ -484,6 +483,12 @@ public: SummonGladiator(uiEntry); } + + void QuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_DEFEAT_AT_RING) + StartEvent(player->GetGUID()); + } }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 7b9cd56c6a9..6bcdc9cbe3f 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -62,40 +62,51 @@ class npc_vekjik : public CreatureScript public: npc_vekjik() : CreatureScript("npc_vekjik") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_vekjikAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_vekjikAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE) + bool GossipHello(Player* player) override { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK1, creature->GetGUID()); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK1, me->GetGUID()); + return true; + } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); return true; } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK2, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - CloseGossipMenuFor(player); - creature->AI()->Talk(SAY_TEXTID_VEKJIK1, player); - player->AreaExploredOrEventHappens(QUEST_MAKING_PEACE); - creature->CastSpell(player, SPELL_FREANZYHEARTS_FURY, false); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK2, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + CloseGossipMenuFor(player); + Talk(SAY_TEXTID_VEKJIK1, player); + player->AreaExploredOrEventHappens(QUEST_MAKING_PEACE); + DoCast(player, SPELL_FREANZYHEARTS_FURY, false); + break; + } + + return true; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_vekjikAI(creature); } }; @@ -123,37 +134,48 @@ class npc_avatar_of_freya : public CreatureScript public: npc_avatar_of_freya() : CreatureScript("npc_avatar_of_freya") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_avatar_of_freyaAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_avatar_of_freyaAI(Creature* creature) : ScriptedAI(creature) { } - if (player->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR1, creature->GetGUID()); - return true; - } + if (player->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR1, me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF+1: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR2, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR3, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->CastSpell(player, SPELL_FREYA_CONVERSATION, true); - CloseGossipMenuFor(player); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR2, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + player->PlayerTalkClass->SendGossipMenu(GOSSIP_TEXTID_AVATAR3, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + player->CastSpell(player, SPELL_FREYA_CONVERSATION, true); + CloseGossipMenuFor(player); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_avatar_of_freyaAI(creature); } }; @@ -308,27 +330,23 @@ public: m_uiChatTimer -= uiDiff; } } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_engineer_heliceAI(creature); - } - bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) override - { - if (quest->GetQuestId() == QUEST_DISASTER) + void QuestAccept(Player* player, Quest const* quest) override { - if (npc_engineer_heliceAI* pEscortAI = CAST_AI(npc_engineer_helice::npc_engineer_heliceAI, creature->AI())) + if (quest->GetQuestId() == QUEST_DISASTER) { - creature->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); - creature->SetFaction(113); + me->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); + me->SetFaction(113); - pEscortAI->Start(false, false, player->GetGUID()); - creature->AI()->Talk(SAY_WP_1); + Start(false, false, player->GetGUID()); + Talk(SAY_WP_1); } } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_engineer_heliceAI(creature); } }; @@ -564,55 +582,56 @@ public: { Talk(SAY_DWARF_OUCH); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_adventurous_dwarfAI(creature); - } + bool GossipHello(Player* player) override + { + if (player->GetQuestStatus(QUEST_12634) != QUEST_STATUS_INCOMPLETE) + return false; - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_12634) != QUEST_STATUS_INCOMPLETE) - return false; + if (player->GetItemCount(ITEM_ORANGE) < 1) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_ORANGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (player->GetItemCount(ITEM_ORANGE) < 1) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_ORANGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->GetItemCount(ITEM_BANANAS) < 2) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_BANANAS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->GetItemCount(ITEM_BANANAS) < 2) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_BANANAS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->GetItemCount(ITEM_PAPAYA) < 1) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_PAPAYA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - if (player->GetItemCount(ITEM_PAPAYA) < 1) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_PAPAYA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + player->PlayerTalkClass->SendGossipMenu(GOSSIP_MENU_DWARF, me->GetGUID()); + return true; + } - player->PlayerTalkClass->SendGossipMenu(GOSSIP_MENU_DWARF, creature->GetGUID()); - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + uint32 spellId = 0; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - uint32 spellId = 0; + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + spellId = SPELL_ADD_ORANGE; + break; + case GOSSIP_ACTION_INFO_DEF + 2: + spellId = SPELL_ADD_BANANAS; + break; + case GOSSIP_ACTION_INFO_DEF + 3: + spellId = SPELL_ADD_PAPAYA; + break; + } - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - spellId = SPELL_ADD_ORANGE; - break; - case GOSSIP_ACTION_INFO_DEF + 2: - spellId = SPELL_ADD_BANANAS; - break; - case GOSSIP_ACTION_INFO_DEF + 3: - spellId = SPELL_ADD_PAPAYA; - break; - } + if (spellId) + player->CastSpell(player, spellId, true); - if (spellId) - player->CastSpell(player, spellId, true); + Talk(SAY_DWARF_HELP); + me->DespawnOrUnsummon(); + return true; + } + }; - creature->AI()->Talk(SAY_DWARF_HELP); - creature->DespawnOrUnsummon(); - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_adventurous_dwarfAI(creature); } }; diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index e18670a1d9c..9e605ce6f1f 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -77,7 +77,7 @@ public: player->FailQuest(QUEST_BITTER_DEPARTURE); } - void UpdateAI(uint32 uiDiff) override + void UpdateAI(uint32 uiDiff) override { npc_escortAI::UpdateAI(uiDiff); if (!UpdateVictim()) @@ -85,7 +85,7 @@ public: DoMeleeAttackIfReady(); } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) { @@ -93,6 +93,13 @@ public: me->SetFaction(113); Start(true, true, player->GetGUID()); } + return false; + } + + void QuestAccept(Player* /*player*/, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE) + Talk(SAY_QUEST_ACCEPT); } }; @@ -100,14 +107,6 @@ public: { return new npc_injured_goblinAI(creature); } - - bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_BITTER_DEPARTURE) - creature->AI()->Talk(SAY_QUEST_ACCEPT); - - return false; - } }; /*###### @@ -125,38 +124,49 @@ class npc_roxi_ramrocket : public CreatureScript public: npc_roxi_ramrocket() : CreatureScript("npc_roxi_ramrocket") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_roxi_ramrocketAI : public ScriptedAI { - //Quest Menu - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_roxi_ramrocketAI(Creature* creature) : ScriptedAI(creature) { } - //Trainer Menu - if ( creature->IsTrainer() ) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + bool GossipHello(Player* player) override + { + //Quest Menu + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - //Vendor Menu - if ( creature->IsVendor() ) - if (player->HasSpell(SPELL_MECHANO_HOG) || player->HasSpell(SPELL_MEKGINEERS_CHOPPER)) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + //Trainer Menu + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + //Vendor Menu + if (me->IsVendor()) + if (player->HasSpell(SPELL_MECHANO_HOG) || player->HasSpell(SPELL_MEKGINEERS_CHOPPER)) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + break; + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_roxi_ramrocketAI(creature); } }; @@ -477,11 +487,12 @@ public: objectCounter = 0; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); playerGUID = player->GetGUID(); events.ScheduleEvent(EVENT_SCRIPT_1, 100); + return false; } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 49e4f5d3dee..5f8148dcfa9 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -115,69 +115,80 @@ class npc_wg_demolisher_engineer : public CreatureScript public: npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_wg_demolisher_engineerAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_wg_demolisher_engineerAI(Creature* creature) : ScriptedAI(creature) { } - if (CanBuild(creature)) + bool GossipHello(Player* player) override { - if (player->HasAura(SPELL_CORPORAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - else if (player->HasAura(SPELL_LIEUTENANT)) + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (CanBuild()) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->HasAura(SPELL_CORPORAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + else if (player->HasAura(SPELL_LIEUTENANT)) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + } } - } - else - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + else + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - CloseGossipMenuFor(player); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - if (CanBuild(creature)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (action - GOSSIP_ACTION_INFO_DEF) + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); + + if (CanBuild()) { - case 0: - creature->CastSpell(player, SPELL_BUILD_CATAPULT_FORCE, true); - break; - case 1: - creature->CastSpell(player, SPELL_BUILD_DEMOLISHER_FORCE, true); - break; - case 2: - creature->CastSpell(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); - break; + switch (action - GOSSIP_ACTION_INFO_DEF) + { + case 0: + DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true); + break; + case 1: + DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true); + break; + case 2: + DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); + break; + } + if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) + DoCast(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); } - if (Creature* controlArms = creature->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) - creature->CastSpell(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); + return true; } - return true; - } - private: - bool CanBuild(Creature* creature) - { - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return false; - - switch (creature->GetEntry()) + private: + bool CanBuild() const { - case NPC_GOBLIN_MECHANIC: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); - case NPC_GNOMISH_ENGINEER: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); - default: + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) return false; + + switch (me->GetEntry()) + { + case NPC_GOBLIN_MECHANIC: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); + case NPC_GNOMISH_ENGINEER: + return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); + default: + return false; + } } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_wg_demolisher_engineerAI(creature); } }; @@ -186,48 +197,49 @@ class npc_wg_spirit_guide : public CreatureScript public: npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_wg_spirit_guideAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; + void UpdateAI(uint32 /*diff*/) override + { + if (!me->HasUnitState(UNIT_STATE_CASTING)) + DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); + } - GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < graveyard.size(); i++) - if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - CloseGossipMenuFor(player); + GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < graveyard.size(); i++) + if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (wintergrasp) - { - GraveyardVect gy = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < gy.size(); i++) - if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) - if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) - player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - return true; - } - - struct npc_wg_spirit_guideAI : public ScriptedAI - { - npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } - void UpdateAI(uint32 /*diff*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - if (!me->HasUnitState(UNIT_STATE_CASTING)) - DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); + + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (wintergrasp) + { + GraveyardVect gy = wintergrasp->GetGraveyardVector(); + for (uint8 i = 0; i < gy.size(); i++) + if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) + if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) + player->TeleportTo(safeLoc->map_id, safeLoc->x, safeLoc->y, safeLoc->z, 0); + } + return true; } }; @@ -274,59 +286,59 @@ class npc_wg_queue : public CreatureScript DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_wg_queueAI(creature); - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; - if (wintergrasp->IsWarTime()) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID()); - } - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - player->SendUpdateWorldState(4354, time(NULL) + timer); - if (timer < 15 * MINUTE) + if (wintergrasp->IsWarTime()) { AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID()); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID()); } else - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, creature->GetGUID()); + { + uint32 timer = wintergrasp->GetTimer() / 1000; + player->SendUpdateWorldState(4354, time(NULL) + timer); + if (timer < 15 * MINUTE) + { + AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetTrinityString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID()); + } + else + SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID()); + } + return true; } - return true; - } - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + CloseGossipMenuFor(player); - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; + Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); + if (!wintergrasp) + return true; - if (wintergrasp->IsWarTime()) - wintergrasp->InvitePlayerToWar(player); - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - if (timer < 15 * MINUTE) - wintergrasp->InvitePlayerToQueue(player); + if (wintergrasp->IsWarTime()) + wintergrasp->InvitePlayerToWar(player); + else + { + uint32 timer = wintergrasp->GetTimer() / 1000; + if (timer < 15 * MINUTE) + wintergrasp->InvitePlayerToQueue(player); + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_wg_queueAI(creature); } }; @@ -341,8 +353,8 @@ class go_wg_vehicle_teleporter : public GameObjectScript bool IsFriendly(Unit* passenger) { - return ((go->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) || - (go->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE)); + return ((me->GetFaction() == WintergraspFaction[TEAM_HORDE] && passenger->GetFaction() == HORDE) || + (me->GetFaction() == WintergraspFaction[TEAM_ALLIANCE] && passenger->GetFaction() == ALLIANCE)); } Creature* GetValidVehicle(Creature* cVeh) @@ -351,7 +363,7 @@ class go_wg_vehicle_teleporter : public GameObjectScript if (Vehicle* vehicle = cVeh->GetVehicleKit()) if (Unit* passenger = vehicle->GetPassenger(0)) if (IsFriendly(passenger)) - if (Creature* teleportTrigger = passenger->SummonTrigger(go->GetPositionX()-60.0f, go->GetPositionY(), go->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1000)) + if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX()-60.0f, me->GetPositionY(), me->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1000)) return teleportTrigger; return nullptr; @@ -363,7 +375,7 @@ class go_wg_vehicle_teleporter : public GameObjectScript if (_checkTimer >= 1000) { for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++) - if (Creature* vehicleCreature = go->FindNearestCreature(vehiclesList[i], 3.0f, true)) + if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true)) if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature)) teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true); diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 26da2249623..199788903a6 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -19,6 +19,7 @@ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "ScriptedEscortAI.h" +#include "GameObjectAI.h" #include "Player.h" #include "SpellInfo.h" #include "SpellScript.h" @@ -267,12 +268,13 @@ public: return; } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { _events.ScheduleEvent(EVENT_RECRUIT_1, 100); CloseGossipMenuFor(player); me->CastSpell(player, SPELL_QUEST_CREDIT, true); me->SetFacingToObject(player); + return false; } private: @@ -303,20 +305,29 @@ class go_scourge_enclosure : public GameObjectScript public: go_scourge_enclosure() : GameObjectScript("go_scourge_enclosure") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_scourge_enclosureAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) + go_scourge_enclosureAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - Creature* gymerDummy = go->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f); - if (gymerDummy) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_OUR_ONLY_HOPE) == QUEST_STATUS_INCOMPLETE) { - player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID()); - gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true); - gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS); + if (Creature* gymerDummy = me->FindNearestCreature(NPC_GYMER_DUMMY, 20.0f)) + { + player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID()); + gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true); + gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS); + } } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_scourge_enclosureAI(go); } }; @@ -552,13 +563,14 @@ public: } } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override { CloseGossipMenuFor(player); DoCast(player, SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); _playerGUID = player->GetGUID(); _getingredienttry = 1; _events.ScheduleEvent(EVENT_EASY_123, 100); + return false; } private: @@ -578,10 +590,20 @@ class go_finklesteins_cauldron : public GameObjectScript public: go_finklesteins_cauldron() : GameObjectScript("go_finklesteins_cauldron") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_finklesteins_cauldronAI : public GameObjectAI + { + go_finklesteins_cauldronAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->CastSpell(player, SPELL_POT_CHECK); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override { - player->CastSpell(player, SPELL_POT_CHECK); - return true; + return new go_finklesteins_cauldronAI(go); } }; |
