From f913f3bb8977c127d200d5d4a608ab434b21bbcd Mon Sep 17 00:00:00 2001 From: ariel- Date: Mon, 1 May 2017 18:19:36 -0300 Subject: Core/Scripts: unified scripted gossip/quest api - Changed self-accessor on GameObjectAI to "me", like UnitAI - Moved all related functions to AI, now Unit and GameObject have the same function names with identical behaviour - Remove "OnUpdate" from CreatureScript/GameObjectScript, was never used and we already have AI Update method - Quest methods no longer return a bool, the return value was used to call the AI version if the ScriptMgr one returned false - Implemented GameObjectAI::Destroyed hook (was never called), implemented Damaged method - Rename OnStateChanged to OnLootStateChanged to reflect when it's really called, and created a new hook OnStateChanged that only gets called on GOState change - Since the functions are now only getting called from AI, made GetAI methods full virtual. (CanSpawn method is anyways going to be used on creatures with AI) --- src/server/scripts/World/go_scripts.cpp | 1048 ++++++++++++++-------- src/server/scripts/World/npc_innkeeper.cpp | 131 +-- src/server/scripts/World/npc_professions.cpp | 1196 ++++++++++++++------------ src/server/scripts/World/npcs_special.cpp | 438 +++++----- 4 files changed, 1615 insertions(+), 1198 deletions(-) (limited to 'src/server/scripts/World') diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index 4c70439f421..0e0641932f2 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -69,10 +69,20 @@ class go_cat_figurine : public GameObjectScript public: go_cat_figurine() : GameObjectScript("go_cat_figurine") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_cat_figurineAI : public GameObjectAI { - player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true); - return false; + go_cat_figurineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->CastSpell(player, SPELL_SUMMON_GHOST_SABER, true); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_cat_figurineAI(go); } }; @@ -85,12 +95,22 @@ class go_barov_journal : public GameObjectScript public: go_barov_journal() : GameObjectScript("go_barov_journal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_barov_journalAI : public GameObjectAI { - if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086)) - player->CastSpell(player, 26095, false); + go_barov_journalAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 280 && !player->HasSpell(26086)) + player->CastSpell(player, 26095, false); + + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_barov_journalAI(go); } }; @@ -109,17 +129,27 @@ class go_gilded_brazier : public GameObjectScript public: go_gilded_brazier() : GameObjectScript("go_gilded_brazier") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_gilded_brazierAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + go_gilded_brazierAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE) + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) { - if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000)) - Stillblade->AI()->AttackStart(player); + if (player->GetQuestStatus(QUEST_THE_FIRST_TRIAL) == QUEST_STATUS_INCOMPLETE) + { + if (Creature* Stillblade = player->SummonCreature(NPC_STILLBLADE, 8106.11f, -7542.06f, 151.775f, 3.02598f, TEMPSUMMON_DEAD_DESPAWN, 60000)) + Stillblade->AI()->AttackStart(player); + } } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_gilded_brazierAI(go); } }; @@ -132,12 +162,22 @@ class go_orb_of_command : public GameObjectScript public: go_orb_of_command() : GameObjectScript("go_orb_of_command") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_orb_of_commandAI : public GameObjectAI { - if (player->GetQuestRewardStatus(7761)) - player->CastSpell(player, 23460, true); + go_orb_of_commandAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestRewardStatus(7761)) + player->CastSpell(player, 23460, true); - return true; + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_orb_of_commandAI(go); } }; @@ -150,12 +190,22 @@ class go_tablet_of_madness : public GameObjectScript public: go_tablet_of_madness() : GameObjectScript("go_tablet_of_madness") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_tablet_of_madnessAI : public GameObjectAI { - if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266)) - player->CastSpell(player, 24267, false); + go_tablet_of_madnessAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasSkill(SKILL_ALCHEMY) && player->GetSkillValue(SKILL_ALCHEMY) >= 300 && !player->HasSpell(24266)) + player->CastSpell(player, 24267, false); + + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tablet_of_madnessAI(go); } }; @@ -168,16 +218,26 @@ class go_tablet_of_the_seven : public GameObjectScript public: go_tablet_of_the_seven() : GameObjectScript("go_tablet_of_the_seven") { } - /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support. - bool OnGossipHello(Player* player, GameObject* go) override + struct go_tablet_of_the_sevenAI : public GameObjectAI { - if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) - return true; + go_tablet_of_the_sevenAI(GameObject* go) : GameObjectAI(go) { } + + /// @todo use gossip option ("Transcript the Tablet") instead, if Trinity adds support. + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) + return true; + + if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, 15065, false); - if (player->GetQuestStatus(4296) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 15065, false); + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tablet_of_the_sevenAI(go); } }; @@ -190,12 +250,22 @@ class go_jump_a_tron : public GameObjectScript public: go_jump_a_tron() : GameObjectScript("go_jump_a_tron") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_jump_a_tronAI : public GameObjectAI { - if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) - player->CastSpell(player, 33382, true); + go_jump_a_tronAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestStatus(10111) == QUEST_STATUS_INCOMPLETE) + player->CastSpell(player, 33382, true); + + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_jump_a_tronAI(go); } }; @@ -224,39 +294,49 @@ class go_ethereum_prison : public GameObjectScript public: go_ethereum_prison() : GameObjectScript("go_ethereum_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_ethereum_prisonAI : public GameObjectAI { - go->UseDoorOrButton(); - int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); + go_ethereum_prisonAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) + bool GossipHello(Player* player, bool /*reportUse*/) override { - if (!creature->IsHostileTo(player)) + me->UseDoorOrButton(); + int Random = rand32() % (sizeof(NpcPrisonEntry) / sizeof(uint32)); + + if (Creature* creature = player->SummonCreature(NpcPrisonEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { - if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry()) + if (!creature->IsHostileTo(player)) { - uint32 Spell = 0; - - switch (pFaction->faction) + if (FactionTemplateEntry const* pFaction = creature->GetFactionTemplateEntry()) { - case 1011: Spell = SPELL_REP_LC; break; - case 935: Spell = SPELL_REP_SHAT; break; - case 942: Spell = SPELL_REP_CE; break; - case 933: Spell = SPELL_REP_CON; break; - case 989: Spell = SPELL_REP_KT; break; - case 970: Spell = SPELL_REP_SPOR; break; - } + uint32 Spell = 0; - if (Spell) - creature->CastSpell(player, Spell, false); - else - TC_LOG_ERROR("scripts", "go_ethereum_prison summoned Creature (entry %u) but faction (%u) are not expected by script.", creature->GetEntry(), creature->GetFaction()); + switch (pFaction->faction) + { + case 1011: Spell = SPELL_REP_LC; break; + case 935: Spell = SPELL_REP_SHAT; break; + case 942: Spell = SPELL_REP_CE; break; + case 933: Spell = SPELL_REP_CON; break; + case 989: Spell = SPELL_REP_KT; break; + case 970: Spell = SPELL_REP_SPOR; break; + } + + if (Spell) + creature->CastSpell(player, Spell, false); + else + TC_LOG_ERROR("scripts", "go_ethereum_prison summoned Creature (entry %u) but faction (%u) are not expected by script.", creature->GetEntry(), creature->GetFaction()); + } } } + + return false; } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ethereum_prisonAI(go); } }; @@ -274,15 +354,25 @@ class go_ethereum_stasis : public GameObjectScript public: go_ethereum_stasis() : GameObjectScript("go_ethereum_stasis") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_ethereum_stasisAI : public GameObjectAI { - go->UseDoorOrButton(); - int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32)); + go_ethereum_stasisAI(GameObject* go) : GameObjectAI(go) { } - player->SummonCreature(NpcStasisEntry[Random], go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), - TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->UseDoorOrButton(); + int Random = rand32() % (sizeof(NpcStasisEntry) / sizeof(uint32)); + + player->SummonCreature(NpcStasisEntry[Random], me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), + TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + + return false; + } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_ethereum_stasisAI(go); } }; @@ -300,12 +390,22 @@ class go_resonite_cask : public GameObjectScript public: go_resonite_cask() : GameObjectScript("go_resonite_cask") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_resonite_caskAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - go->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); + go_resonite_caskAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + me->SummonCreature(NPC_GOGGEROC, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 300000); - return false; + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_resonite_caskAI(go); } }; @@ -323,12 +423,22 @@ class go_sacred_fire_of_life : public GameObjectScript public: go_sacred_fire_of_life() : GameObjectScript("go_sacred_fire_of_life") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_sacred_fire_of_lifeAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + go_sacred_fire_of_lifeAI(GameObject* go) : GameObjectAI(go) { } - return true; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + player->SummonCreature(NPC_ARIKARA, -5008.338f, -2118.894f, 83.657f, 0.874f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_sacred_fire_of_lifeAI(go); } }; @@ -351,30 +461,40 @@ class go_shrine_of_the_birds : public GameObjectScript public: go_shrine_of_the_birds() : GameObjectScript("go_shrine_of_the_birds") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_shrine_of_the_birdsAI : public GameObjectAI { - uint32 BirdEntry = 0; - - float fX, fY, fZ; - go->GetClosePoint(fX, fY, fZ, go->GetCombatReach(), INTERACTION_DISTANCE); + go_shrine_of_the_birdsAI(GameObject* go) : GameObjectAI(go) { } - switch (go->GetEntry()) + bool GossipHello(Player* player, bool /*reportUse*/) override { - case GO_SHRINE_HAWK: - BirdEntry = NPC_HAWK_GUARD; - break; - case GO_SHRINE_EAGLE: - BirdEntry = NPC_EAGLE_GUARD; - break; - case GO_SHRINE_FALCON: - BirdEntry = NPC_FALCON_GUARD; - break; - } + uint32 BirdEntry = 0; + + float fX, fY, fZ; + me->GetClosePoint(fX, fY, fZ, me->GetCombatReach(), INTERACTION_DISTANCE); + + switch (me->GetEntry()) + { + case GO_SHRINE_HAWK: + BirdEntry = NPC_HAWK_GUARD; + break; + case GO_SHRINE_EAGLE: + BirdEntry = NPC_EAGLE_GUARD; + break; + case GO_SHRINE_FALCON: + BirdEntry = NPC_FALCON_GUARD; + break; + } - if (BirdEntry) - player->SummonCreature(BirdEntry, fX, fY, fZ, go->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + if (BirdEntry) + player->SummonCreature(BirdEntry, fX, fY, fZ, me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - return false; + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_shrine_of_the_birdsAI(go); } }; @@ -394,15 +514,25 @@ class go_southfury_moonstone : public GameObjectScript public: go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_southfury_moonstoneAI : public GameObjectAI { - //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose - //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false); + go_southfury_moonstoneAI(GameObject* go) : GameObjectAI(go) { } - if (Creature* creature = player->SummonCreature(NPC_RIZZLE, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0)) - creature->CastSpell(player, SPELL_BLACKJACK, false); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose + //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false); + + if (Creature* creature = player->SummonCreature(NPC_RIZZLE, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0)) + creature->CastSpell(player, SPELL_BLACKJACK, false); + + return false; + } + }; - return false; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_southfury_moonstoneAI(go); } }; @@ -423,14 +553,23 @@ class go_tele_to_dalaran_crystal : public GameObjectScript public: go_tele_to_dalaran_crystal() : GameObjectScript("go_tele_to_dalaran_crystal") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_tele_to_dalaran_crystalAI : public GameObjectAI { - if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG)) - return false; + go_tele_to_dalaran_crystalAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestRewardStatus(QUEST_TELE_CRYSTAL_FLAG)) + return false; - player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); + player->GetSession()->SendNotification(GO_TELE_TO_DALARAN_CRYSTAL_FAILED); + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tele_to_dalaran_crystalAI(go); } }; @@ -443,12 +582,22 @@ class go_tele_to_violet_stand : public GameObjectScript public: go_tele_to_violet_stand() : GameObjectScript("go_tele_to_violet_stand") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_tele_to_violet_standAI : public GameObjectAI { - if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE) - return false; + go_tele_to_violet_standAI(GameObject* go) : GameObjectAI(go) { } - return true; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestRewardStatus(QUEST_LEARN_LEAVE_RETURN) || player->GetQuestStatus(QUEST_LEARN_LEAVE_RETURN) == QUEST_STATUS_INCOMPLETE) + return false; + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tele_to_violet_standAI(go); } }; @@ -473,41 +622,52 @@ class go_fel_crystalforge : public GameObjectScript public: go_fel_crystalforge() : GameObjectScript("go_fel_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_fel_crystalforgeAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(go->GetGUID()); /* return true*/ + go_fel_crystalforgeAI(GameObject* go) : GameObjectAI(go) { } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(me->GetGUID()); /* return true*/ - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID()); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - return true; - } + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID()); - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF: - player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, go->GetGUID()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_BEAST, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_BEAST, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FEL_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_FEL_CRYSTALFORGE_TEXT, me->GetGUID()); + break; + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_fel_crystalforgeAI(go); } }; @@ -532,41 +692,52 @@ class go_bashir_crystalforge : public GameObjectScript public: go_bashir_crystalforge() : GameObjectScript("go_bashir_crystalforge") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_bashir_crystalforgeAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ - player->PrepareQuestMenu(go->GetGUID()); /* return true*/ + go_bashir_crystalforgeAI(GameObject* go) : GameObjectAI(go) { } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) /* != GAMEOBJECT_TYPE_QUESTGIVER) */ + player->PrepareQuestMenu(me->GetGUID()); /* return true*/ - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID()); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - return true; - } + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID()); - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - switch (action) + return true; + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_ACTION_INFO_DEF: - player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, go->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, go->GetGUID()); - break; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF: + player->CastSpell(player, SPELL_CREATE_1_FLASK_OF_SORCERER, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 1: + player->CastSpell(player, SPELL_CREATE_5_FLASK_OF_SORCERER, false); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_RETURN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_TEXT_RETURN, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_BASHIR_CRYSTALFORGE_ITEM_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_BASHIR_CRYSTALFORGE_TEXT, me->GetGUID()); + break; + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_bashir_crystalforgeAI(go); } }; @@ -596,42 +767,52 @@ class go_matrix_punchograph : public GameObjectScript public: go_matrix_punchograph() : GameObjectScript("go_matrix_punchograph") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_matrix_punchographAI : public GameObjectAI { - switch (go->GetEntry()) + go_matrix_punchographAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - case MATRIX_PUNCHOGRAPH_3005_A: - if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true); - } - break; - case MATRIX_PUNCHOGRAPH_3005_B: - if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true); - } - break; - case MATRIX_PUNCHOGRAPH_3005_C: - if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_RED_PUNCH_CARD, true); - } - break; - case MATRIX_PUNCHOGRAPH_3005_D: - if (player->HasItemCount(ITEM_RED_PUNCH_CARD)) - { - player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true); - player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true); - } - break; - default: - break; + switch (me->GetEntry()) + { + case MATRIX_PUNCHOGRAPH_3005_A: + if (player->HasItemCount(ITEM_WHITE_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_WHITE_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_YELLOW_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_B: + if (player->HasItemCount(ITEM_YELLOW_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_YELLOW_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_BLUE_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_C: + if (player->HasItemCount(ITEM_BLUE_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_BLUE_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_RED_PUNCH_CARD, true); + } + break; + case MATRIX_PUNCHOGRAPH_3005_D: + if (player->HasItemCount(ITEM_RED_PUNCH_CARD)) + { + player->DestroyItemCount(ITEM_RED_PUNCH_CARD, 1, true); + player->CastSpell(player, SPELL_PRISMATIC_PUNCH_CARD, true); + } + break; + default: + break; + } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_matrix_punchographAI(go); } }; @@ -649,16 +830,26 @@ class go_scourge_cage : public GameObjectScript public: go_scourge_cage() : GameObjectScript("go_scourge_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_scourge_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (Creature* pNearestPrisoner = go->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + go_scourge_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); - pNearestPrisoner->DisappearAndDie(); + me->UseDoorOrButton(); + if (Creature* pNearestPrisoner = me->FindNearestCreature(NPC_SCOURGE_PRISONER, 5.0f, true)) + { + player->KilledMonsterCredit(NPC_SCOURGE_PRISONER, pNearestPrisoner->GetGUID()); + pNearestPrisoner->DisappearAndDie(); + } + + return true; } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_scourge_cageAI(go); } }; @@ -677,15 +868,25 @@ class go_arcane_prison : public GameObjectScript public: go_arcane_prison() : GameObjectScript("go_arcane_prison") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_arcane_prisonAI : public GameObjectAI { - if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE) + go_arcane_prisonAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - go->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000); - player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); - return true; + if (player->GetQuestStatus(QUEST_PRISON_BREAK) == QUEST_STATUS_INCOMPLETE) + { + me->SummonCreature(25318, 3485.089844f, 6115.7422188f, 70.966812f, 0, TEMPSUMMON_TIMED_DESPAWN, 60000); + player->CastSpell(player, SPELL_ARCANE_PRISONER_KILL_CREDIT, true); + return true; + } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_arcane_prisonAI(go); } }; @@ -704,12 +905,22 @@ class go_blood_filled_orb : public GameObjectScript public: go_blood_filled_orb() : GameObjectScript("go_blood_filled_orb") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_blood_filled_orbAI : public GameObjectAI { - if (go->GetGoType() == GAMEOBJECT_TYPE_GOOBER) - player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + go_blood_filled_orbAI(GameObject* go) : GameObjectAI(go) { } - return true; + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (me->GetGoType() == GAMEOBJECT_TYPE_GOOBER) + player->SummonCreature(NPC_ZELEMAR, -369.746f, 166.759f, -21.50f, 5.235f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_blood_filled_orbAI(go); } }; @@ -735,41 +946,51 @@ class go_jotunheim_cage : public GameObjectScript public: go_jotunheim_cage() : GameObjectScript("go_jotunheim_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_jotunheim_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - Creature* pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); - if (!pPrisoner) + go_jotunheim_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); + me->UseDoorOrButton(); + Creature* pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_HUMAN, 5.0f, true); if (!pPrisoner) { - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true); + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_TROLL, 5.0f, true); if (!pPrisoner) - pPrisoner = go->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true); + { + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_ORC, 5.0f, true); + if (!pPrisoner) + pPrisoner = me->FindNearestCreature(NPC_EBON_BLADE_PRISONER_NE, 5.0f, true); + } } - } - if (!pPrisoner || !pPrisoner->IsAlive()) - return false; + if (!pPrisoner || !pPrisoner->IsAlive()) + return false; - pPrisoner->DisappearAndDie(); - player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN); - switch (pPrisoner->GetEntry()) - { - case NPC_EBON_BLADE_PRISONER_HUMAN: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_H, true); - break; - case NPC_EBON_BLADE_PRISONER_NE: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_NE, true); - break; - case NPC_EBON_BLADE_PRISONER_TROLL: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_TROLL, true); - break; - case NPC_EBON_BLADE_PRISONER_ORC: - player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_ORC, true); - break; + pPrisoner->DisappearAndDie(); + player->KilledMonsterCredit(NPC_EBON_BLADE_PRISONER_HUMAN); + switch (pPrisoner->GetEntry()) + { + case NPC_EBON_BLADE_PRISONER_HUMAN: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_H, true); + break; + case NPC_EBON_BLADE_PRISONER_NE: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_NE, true); + break; + case NPC_EBON_BLADE_PRISONER_TROLL: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_TROLL, true); + break; + case NPC_EBON_BLADE_PRISONER_ORC: + player->CastSpell(player, SPELL_SUMMON_BLADE_KNIGHT_ORC, true); + break; + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_jotunheim_cageAI(go); } }; @@ -785,14 +1006,23 @@ class go_table_theka : public GameObjectScript public: go_table_theka() : GameObjectScript("go_table_theka") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_table_thekaAI : public GameObjectAI { - if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD); + go_table_thekaAI(GameObject* go) : GameObjectAI(go) { } - SendGossipMenuFor(player, GOSSIP_TABLE_THEKA, go->GetGUID()); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->GetQuestStatus(QUEST_SPIDER_GOLD) == QUEST_STATUS_INCOMPLETE) + player->AreaExploredOrEventHappens(QUEST_SPIDER_GOLD); - return true; + SendGossipMenuFor(player, GOSSIP_TABLE_THEKA, me->GetGUID()); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_table_thekaAI(go); } }; @@ -811,14 +1041,23 @@ class go_inconspicuous_landmark : public GameObjectScript public: go_inconspicuous_landmark() : GameObjectScript("go_inconspicuous_landmark") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + struct go_inconspicuous_landmarkAI : public GameObjectAI { - if (player->HasItemCount(ITEM_CUERGOS_KEY)) - return false; + go_inconspicuous_landmarkAI(GameObject* go) : GameObjectAI(go) { } - player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + bool GossipHello(Player* player, bool /*reportUse*/) override + { + if (player->HasItemCount(ITEM_CUERGOS_KEY)) + return false; + + player->CastSpell(player, SPELL_SUMMON_PIRATES_TREASURE_AND_TRIGGER_MOB, true); + return true; + } + }; - return true; + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_inconspicuous_landmarkAI(go); } }; @@ -893,7 +1132,7 @@ class go_soulwell : public GameObjectScript /// on the well. We have to find how to segregate REPORT_USE and USE. bool GossipHello(Player* player, bool /*reportUse*/) override { - Unit* owner = go->GetOwner(); + Unit* owner = me->GetOwner(); if (_stoneSpell == 0 || _stoneId == 0) return true; @@ -911,7 +1150,7 @@ class go_soulwell : public GameObjectScript owner->CastSpell(player, _stoneSpell, true); // Item has to actually be created to remove a charge on the well. if (player->HasItemCount(_stoneId)) - go->AddUse(); + me->AddUse(); return false; } @@ -946,35 +1185,45 @@ class go_dragonflayer_cage : public GameObjectScript public: go_dragonflayer_cage() : GameObjectScript("go_dragonflayer_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_dragonflayer_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE) - return true; + go_dragonflayer_cageAI(GameObject* go) : GameObjectAI(go) { } - Creature* pPrisoner = go->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); - if (!pPrisoner) + bool GossipHello(Player* player, bool /*reportUse*/) override { - pPrisoner = go->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_PRISONERS_OF_WYRMSKULL) != QUEST_STATUS_INCOMPLETE) + return true; + + Creature* pPrisoner = me->FindNearestCreature(NPC_PRISONER_PRIEST, 2.0f); if (!pPrisoner) { - pPrisoner = go->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); + pPrisoner = me->FindNearestCreature(NPC_PRISONER_MAGE, 2.0f); if (!pPrisoner) - pPrisoner = go->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); + { + pPrisoner = me->FindNearestCreature(NPC_PRISONER_WARRIOR, 2.0f); + if (!pPrisoner) + pPrisoner = me->FindNearestCreature(NPC_PRISONER_PALADIN, 2.0f); + } } - } - if (!pPrisoner || !pPrisoner->IsAlive()) - return true; + if (!pPrisoner || !pPrisoner->IsAlive()) + return true; - Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL); - if (qInfo) - { - /// @todo prisoner should help player for a short period of time - player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]); - pPrisoner->DisappearAndDie(); + Quest const* qInfo = sObjectMgr->GetQuestTemplate(QUEST_PRISONERS_OF_WYRMSKULL); + if (qInfo) + { + /// @todo prisoner should help player for a short period of time + player->KilledMonsterCredit(qInfo->RequiredNpcOrGo[0]); + pPrisoner->DisappearAndDie(); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_dragonflayer_cageAI(go); } }; @@ -994,20 +1243,30 @@ class go_tadpole_cage : public GameObjectScript public: go_tadpole_cage() : GameObjectScript("go_tadpole_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_tadpole_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE) + go_tadpole_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - Creature* pTadpole = go->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f); - if (pTadpole) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_OH_NOES_THE_TADPOLES) == QUEST_STATUS_INCOMPLETE) { - pTadpole->DisappearAndDie(); - player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE); - //FIX: Summon minion tadpole + Creature* pTadpole = me->FindNearestCreature(NPC_WINTERFIN_TADPOLE, 1.0f); + if (pTadpole) + { + pTadpole->DisappearAndDie(); + player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE); + //FIX: Summon minion tadpole + } } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_tadpole_cageAI(go); } }; @@ -1035,43 +1294,54 @@ class go_amberpine_outhouse : public GameObjectScript public: go_amberpine_outhouse() : GameObjectScript("go_amberpine_outhouse") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_amberpine_outhouseAI : public GameObjectAI { - QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY); - if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_OUTHOUSE_VACANT, go->GetGUID()); - } - else - SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, go->GetGUID()); + go_amberpine_outhouseAI(GameObject* go) : GameObjectAI(go) { } - return true; - } - - bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF +1) + bool GossipHello(Player* player, bool /*reportUse*/) override { - CloseGossipMenuFor(player); - Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); - if (target) + QuestStatus status = player->GetQuestStatus(QUEST_DOING_YOUR_DUTY); + if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED) { - target->AI()->SetData(1, player->getGender()); - go->CastSpell(target, SPELL_INDISPOSED_III); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_USE_OUTHOUSE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_OUTHOUSE_VACANT, me->GetGUID()); } - go->CastSpell(player, SPELL_INDISPOSED); - if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER)) - go->CastSpell(player, SPELL_CREATE_AMBERSEEDS); + else + SendGossipMenuFor(player, GOSSIP_OUTHOUSE_INUSE, me->GetGUID()); + return true; } - else + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - CloseGossipMenuFor(player); - player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND); - return false; + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + { + CloseGossipMenuFor(player); + Creature* target = GetClosestCreatureWithEntry(player, NPC_OUTHOUSE_BUNNY, 3.0f); + if (target) + { + target->AI()->SetData(1, player->getGender()); + me->CastSpell(target, SPELL_INDISPOSED_III); + } + me->CastSpell(player, SPELL_INDISPOSED); + if (player->HasItemCount(ITEM_ANDERHOLS_SLIDER_CIDER)) + me->CastSpell(player, SPELL_CREATE_AMBERSEEDS); + return true; + } + else + { + CloseGossipMenuFor(player); + player->GetSession()->SendNotification(GO_ANDERHOLS_SLIDER_CIDER_NOT_FOUND); + return false; + } } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_amberpine_outhouseAI(go); } }; @@ -1091,12 +1361,22 @@ class go_hive_pod : public GameObjectScript public: go_hive_pod() : GameObjectScript("go_hive_pod") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_hive_podAI : public GameObjectAI { - player->SendLoot(go->GetGUID(), LOOT_CORPSE); - go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX()+1, go->GetPositionY(), go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - go->SummonCreature(NPC_HIVE_AMBUSHER, go->GetPositionX(), go->GetPositionY()+1, go->GetPositionZ(), go->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - return true; + go_hive_podAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + player->SendLoot(me->GetGUID(), LOOT_CORPSE); + me->SummonCreature(NPC_HIVE_AMBUSHER, me->GetPositionX() + 1, me->GetPositionY(), me->GetPositionZ(), me->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + me->SummonCreature(NPC_HIVE_AMBUSHER, me->GetPositionX(), me->GetPositionY() + 1, me->GetPositionZ(), me->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_hive_podAI(go); } }; @@ -1105,10 +1385,20 @@ class go_massive_seaforium_charge : public GameObjectScript public: go_massive_seaforium_charge() : GameObjectScript("go_massive_seaforium_charge") { } - bool OnGossipHello(Player* /*player*/, GameObject* go) override + struct go_massive_seaforium_chargeAI : public GameObjectAI { - go->SetLootState(GO_JUST_DEACTIVATED); - return true; + go_massive_seaforium_chargeAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* /*player*/, bool /*reportUse*/) override + { + me->SetLootState(GO_JUST_DEACTIVATED); + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_massive_seaforium_chargeAI(go); } }; @@ -1128,23 +1418,33 @@ class go_veil_skith_cage : public GameObjectScript public: go_veil_skith_cage() : GameObjectScript("go_veil_skith_cage") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_veil_skith_cageAI : public GameObjectAI { - go->UseDoorOrButton(); - if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE) + go_veil_skith_cageAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - std::list childrenList; - GetCreatureListWithEntryInGrid(childrenList, go, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE); - for (std::list::const_iterator itr = childrenList.begin(); itr != childrenList.end(); ++itr) + me->UseDoorOrButton(); + if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE) { - player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID()); - (*itr)->DespawnOrUnsummon(5000); - (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); - (*itr)->AI()->Talk(SAY_FREE_0); - (*itr)->GetMotionMaster()->Clear(); + std::vector childrenList; + GetCreatureListWithEntryInGrid(childrenList, me, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE); + for (Creature* creature : childrenList) + { + player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, creature->GetGUID()); + creature->DespawnOrUnsummon(5000); + creature->GetMotionMaster()->MovePoint(1, me->GetPositionX() + 5, me->GetPositionY(), me->GetPositionZ()); + creature->AI()->Talk(SAY_FREE_0); + creature->GetMotionMaster()->Clear(); + } } + return false; } - return false; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_veil_skith_cageAI(go); } }; @@ -1165,16 +1465,28 @@ class go_frostblade_shrine : public GameObjectScript public: go_frostblade_shrine() : GameObjectScript("go_frostblade_shrine") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_frostblade_shrineAI : public GameObjectAI { - go->UseDoorOrButton(10); - if (!player->HasAura(SPELL_RECENT_MEDITATION)) - if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE) + go_frostblade_shrineAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override + { + me->UseDoorOrButton(10); + if (!player->HasAura(SPELL_RECENT_MEDITATION)) { - player->CastSpell(player, SPELL_CLEANSING_SOUL); - player->SetStandState(UNIT_STAND_STATE_SIT); + if (player->GetQuestStatus(QUEST_THE_CLEANSING_HORDE) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(QUEST_THE_CLEANSING_ALLIANCE) == QUEST_STATUS_INCOMPLETE) + { + player->CastSpell(player, SPELL_CLEANSING_SOUL); + player->SetStandState(UNIT_STAND_STATE_SIT); + } } - return true; + return true; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_frostblade_shrineAI(go); } }; @@ -1192,11 +1504,21 @@ class go_midsummer_bonfire : public GameObjectScript public: go_midsummer_bonfire() : GameObjectScript("go_midsummer_bonfire") { } - bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 /*sender*/, uint32 /*action*/) override + struct go_midsummer_bonfireAI : public GameObjectAI { - player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true); - CloseGossipMenuFor(player); - return false; + go_midsummer_bonfireAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override + { + player->CastSpell(player, STAMP_OUT_BONFIRE_QUEST_COMPLETE, true); + CloseGossipMenuFor(player); + return false; + } + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_midsummer_bonfireAI(go); } }; @@ -1213,14 +1535,24 @@ class go_midsummer_ribbon_pole : public GameObjectScript public: go_midsummer_ribbon_pole() : GameObjectScript("go_midsummer_ribbon_pole") { } - bool OnGossipHello(Player* player, GameObject* go) override + struct go_midsummer_ribbon_poleAI : public GameObjectAI { - if (Creature* creature = go->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f)) + go_midsummer_ribbon_poleAI(GameObject* go) : GameObjectAI(go) { } + + bool GossipHello(Player* player, bool /*reportUse*/) override { - creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES); - player->CastSpell(creature, SPELL_POLE_DANCE, true); + if (Creature* creature = me->FindNearestCreature(NPC_POLE_RIBBON_BUNNY, 10.0f)) + { + creature->GetAI()->DoAction(ACTION_COSMETIC_FIRES); + player->CastSpell(creature, SPELL_POLE_DANCE, true); + } + return true; } - return true; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return new go_midsummer_ribbon_poleAI(go); } }; @@ -1244,7 +1576,7 @@ class go_toy_train_set : public GameObjectScript _pulseTimer -= diff; else { - go->CastSpell(nullptr, SPELL_TOY_TRAIN_PULSE, true); + me->CastSpell(nullptr, SPELL_TOY_TRAIN_PULSE, true); _pulseTimer = 6 * IN_MILLISECONDS; } } @@ -1252,7 +1584,7 @@ class go_toy_train_set : public GameObjectScript // triggered on wrecker'd void DoAction(int32 /*action*/) override { - go->Delete(); + me->Delete(); } private: @@ -1344,39 +1676,39 @@ public: if (!IsHolidayActive(HOLIDAY_BREWFEST)) // Check if Brewfest is active break; // Check if gob is correct area, play music, set time of music - if (go->GetAreaId() == SILVERMOON || go->GetAreaId() == UNDERCITY || go->GetAreaId() == ORGRIMMAR_1 || go->GetAreaId() == ORGRIMMAR_2 || go->GetAreaId() == THUNDERBLUFF || go->GetAreaId() == SHATTRATH) + if (me->GetAreaId() == SILVERMOON || me->GetAreaId() == UNDERCITY || me->GetAreaId() == ORGRIMMAR_1 || me->GetAreaId() == ORGRIMMAR_2 || me->GetAreaId() == THUNDERBLUFF || me->GetAreaId() == SHATTRATH) { if (rnd == 0) { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN01); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN01); musicTime = EVENT_BREWFESTGOBLIN01_TIME; } else if (rnd == 1) { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN02); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN02); musicTime = EVENT_BREWFESTGOBLIN02_TIME; } else { - go->PlayDirectMusic(EVENT_BREWFESTGOBLIN03); + me->PlayDirectMusic(EVENT_BREWFESTGOBLIN03); musicTime = EVENT_BREWFESTGOBLIN03_TIME; } } - if (go->GetAreaId() == IRONFORGE_1 || go->GetAreaId() == IRONFORGE_2 || go->GetAreaId() == STORMWIND || go->GetAreaId() == EXODAR || go->GetAreaId() == DARNASSUS || go->GetAreaId() == SHATTRATH) + if (me->GetAreaId() == IRONFORGE_1 || me->GetAreaId() == IRONFORGE_2 || me->GetAreaId() == STORMWIND || me->GetAreaId() == EXODAR || me->GetAreaId() == DARNASSUS || me->GetAreaId() == SHATTRATH) { if (rnd == 0) { - go->PlayDirectMusic(EVENT_BREWFESTDWARF01); + me->PlayDirectMusic(EVENT_BREWFESTDWARF01); musicTime = EVENT_BREWFESTDWARF01_TIME; } else if (rnd == 1) { - go->PlayDirectMusic(EVENT_BREWFESTDWARF02); + me->PlayDirectMusic(EVENT_BREWFESTDWARF02); musicTime = EVENT_BREWFESTDWARF02_TIME; } else { - go->PlayDirectMusic(EVENT_BREWFESTDWARF03); + me->PlayDirectMusic(EVENT_BREWFESTDWARF03); musicTime = EVENT_BREWFESTDWARF03_TIME; } } @@ -1437,13 +1769,13 @@ public: break; std::vector playersNearby; - go->GetPlayerListInGrid(playersNearby, go->GetMap()->GetVisibilityRange()); + me->GetPlayerListInGrid(playersNearby, me->GetMap()->GetVisibilityRange()); for (Player* player : playersNearby) { if (player->GetTeamId() == TEAM_HORDE) - go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); + me->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_H, player); else - go->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); + me->PlayDirectMusic(EVENTMIDSUMMERFIREFESTIVAL_A, player); } _events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; @@ -1499,7 +1831,7 @@ public: case EVENT_DFM_START_MUSIC: if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH)) break; - go->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); + me->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: @@ -1553,7 +1885,7 @@ public: case EVENT_PDM_START_MUSIC: if (!IsHolidayActive(HOLIDAY_PIRATES_DAY)) break; - go->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); + me->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: @@ -1619,16 +1951,16 @@ public: void InitializeAI() override { - switch (go->GetEntry()) + switch (me->GetEntry()) { case GO_HORDE_BELL: - _soundId = go->GetAreaId() == UNDERCITY_AREA ? BELLTOLLHORDE : BELLTOLLTRIBAL; + _soundId = me->GetAreaId() == UNDERCITY_AREA ? BELLTOLLHORDE : BELLTOLLTRIBAL; break; case GO_ALLIANCE_BELL: { - if (go->GetAreaId() == IRONFORGE_1_AREA || go->GetAreaId() == IRONFORGE_2_AREA) + if (me->GetAreaId() == IRONFORGE_1_AREA || me->GetAreaId() == IRONFORGE_2_AREA) _soundId = BELLTOLLDWARFGNOME; - else if (go->GetAreaId() == DARNASSUS_AREA || go->GetZoneId() == TELDRASSIL_ZONE) + else if (me->GetAreaId() == DARNASSUS_AREA || me->GetZoneId() == TELDRASSIL_ZONE) _soundId = BELLTOLLNIGHTELF; else _soundId = BELLTOLLALLIANCE; @@ -1664,7 +1996,7 @@ public: switch (eventId) { case EVENT_RING_BELL: - go->PlayDirectSound(_soundId); + me->PlayDirectSound(_soundId); break; default: break; diff --git a/src/server/scripts/World/npc_innkeeper.cpp b/src/server/scripts/World/npc_innkeeper.cpp index 8c321c82664..d5cba9a7225 100644 --- a/src/server/scripts/World/npc_innkeeper.cpp +++ b/src/server/scripts/World/npc_innkeeper.cpp @@ -49,86 +49,97 @@ class npc_innkeeper : public CreatureScript public: npc_innkeeper() : CreatureScript("npc_innkeeper") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_innkeeperAI : public ScriptedAI { - if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + npc_innkeeperAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - const char* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) + if (IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) { - case LOCALE_frFR: localizedEntry = LOCALE_TRICK_OR_TREAT_2; break; - case LOCALE_deDE: localizedEntry = LOCALE_TRICK_OR_TREAT_3; break; - case LOCALE_esES: localizedEntry = LOCALE_TRICK_OR_TREAT_6; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_TRICK_OR_TREAT_0; + const char* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_frFR: localizedEntry = LOCALE_TRICK_OR_TREAT_2; break; + case LOCALE_deDE: localizedEntry = LOCALE_TRICK_OR_TREAT_3; break; + case LOCALE_esES: localizedEntry = LOCALE_TRICK_OR_TREAT_6; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_TRICK_OR_TREAT_0; + } + AddGossipItemFor(player, GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - } - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - if (creature->IsInnkeeper()) - { - const char* localizedEntry; - switch (player->GetSession()->GetSessionDbcLocale()) + if (me->IsInnkeeper()) { - case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break; - case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0; + const char* localizedEntry; + switch (player->GetSession()->GetSessionDbcLocale()) + { + case LOCALE_deDE: localizedEntry = LOCALE_INNKEEPER_3; break; + case LOCALE_enUS: default: localizedEntry = LOCALE_INNKEEPER_0; + } + AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN); } - AddGossipItemFor(player, GOSSIP_ICON_INTERACT_1, localizedEntry, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INN); - } - player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } + player->TalkedToCreature(me->GetEntry(), me->GetGUID()); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); - - if (urand(0, 1)) - player->CastSpell(player, SPELL_TREAT, true); - else + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1 && IsHolidayActive(HOLIDAY_HALLOWS_END) && !player->HasAura(SPELL_TRICK_OR_TREATED)) { - uint32 trickspell = 0; - switch (urand(0, 13)) + player->CastSpell(player, SPELL_TRICK_OR_TREATED, true); + + if (urand(0, 1)) + player->CastSpell(player, SPELL_TREAT, true); + else { - case 0: trickspell = 24753; break; // cannot cast, random 30sec - case 1: trickspell = 24713; break; // lepper gnome costume - case 2: trickspell = 24735; break; // male ghost costume - case 3: trickspell = 24736; break; // female ghostcostume - case 4: trickspell = 24710; break; // male ninja costume - case 5: trickspell = 24711; break; // female ninja costume - case 6: trickspell = 24708; break; // male pirate costume - case 7: trickspell = 24709; break; // female pirate costume - case 8: trickspell = 24723; break; // skeleton costume - case 9: trickspell = 24753; break; // Trick - case 10: trickspell = 24924; break; // Hallow's End Candy - case 11: trickspell = 24925; break; // Hallow's End Candy - case 12: trickspell = 24926; break; // Hallow's End Candy - case 13: trickspell = 24927; break; // Hallow's End Candy + uint32 trickspell = 0; + switch (urand(0, 13)) + { + case 0: trickspell = 24753; break; // cannot cast, random 30sec + case 1: trickspell = 24713; break; // lepper gnome costume + case 2: trickspell = 24735; break; // male ghost costume + case 3: trickspell = 24736; break; // female ghostcostume + case 4: trickspell = 24710; break; // male ninja costume + case 5: trickspell = 24711; break; // female ninja costume + case 6: trickspell = 24708; break; // male pirate costume + case 7: trickspell = 24709; break; // female pirate costume + case 8: trickspell = 24723; break; // skeleton costume + case 9: trickspell = 24753; break; // Trick + case 10: trickspell = 24924; break; // Hallow's End Candy + case 11: trickspell = 24925; break; // Hallow's End Candy + case 12: trickspell = 24926; break; // Hallow's End Candy + case 13: trickspell = 24927; break; // Hallow's End Candy + } + player->CastSpell(player, trickspell, true); } - player->CastSpell(player, trickspell, true); + CloseGossipMenuFor(player); + return true; } + CloseGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(me->GetGUID()); break; + case GOSSIP_ACTION_INN: player->SetBindPoint(me->GetGUID()); break; + } return true; } + }; - CloseGossipMenuFor(player); - - switch (action) - { - case GOSSIP_ACTION_TRADE: player->GetSession()->SendListInventory(creature->GetGUID()); break; - case GOSSIP_ACTION_INN: player->SetBindPoint(creature->GetGUID()); break; - } - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_innkeeperAI(creature); } }; diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 61c49b77028..bfc8f19add0 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -446,159 +446,171 @@ class npc_prof_alchemy : public CreatureScript public: npc_prof_alchemy() : CreatureScript("npc_prof_alchemy") { } - inline bool HasAlchemySpell(Player* player) + struct npc_prof_alchemyAI : public ScriptedAI { - return (player->HasSpell(S_TRANSMUTE) || player->HasSpell(S_ELIXIR) || player->HasSpell(S_POTION)); - } + npc_prof_alchemyAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + inline bool HasAlchemySpell(Player* player) + { + return (player->HasSpell(S_TRANSMUTE) || player->HasSpell(S_ELIXIR) || player->HasSpell(S_POTION)); + } - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - if (player->HasSkill(SKILL_ALCHEMY) && player->GetBaseSkillValue(SKILL_ALCHEMY) >= 350 && player->getLevel() > 67) - { - if (player->GetQuestRewardStatus(Q_MASTER_TRANSMUTE) || player->GetQuestRewardStatus(Q_MASTER_ELIXIR) || player->GetQuestRewardStatus(Q_MASTER_POTION)) + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + if (player->HasSkill(SKILL_ALCHEMY) && player->GetBaseSkillValue(SKILL_ALCHEMY) >= 350 && player->getLevel() > 67) { - switch (creature->GetEntry()) + if (player->GetQuestRewardStatus(Q_MASTER_TRANSMUTE) || player->GetQuestRewardStatus(Q_MASTER_ELIXIR) || player->GetQuestRewardStatus(Q_MASTER_POTION)) { - case N_TRAINER_TRANSMUTE: //Zarevhi - if (!HasAlchemySpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); - if (player->HasSpell(S_TRANSMUTE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); - break; - case N_TRAINER_ELIXIR: //Lorokeem - if (!HasAlchemySpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->HasSpell(S_ELIXIR)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); - break; - case N_TRAINER_POTION: //Lauranna Thar'well - if (!HasAlchemySpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); - if (player->HasSpell(S_POTION)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); - break; + switch (me->GetEntry()) + { + case N_TRAINER_TRANSMUTE: //Zarevhi + if (!HasAlchemySpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->HasSpell(S_TRANSMUTE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + break; + case N_TRAINER_ELIXIR: //Lorokeem + if (!HasAlchemySpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->HasSpell(S_ELIXIR)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); + break; + case N_TRAINER_POTION: //Lauranna Thar'well + if (!HasAlchemySpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); + if (player->HasSpell(S_POTION)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); + break; + } } } - } - - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - //Learn Alchemy - case GOSSIP_ACTION_INFO_DEF + 1: - ProcessCastaction(player, creature, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ProcessCastaction(player, creature, S_ELIXIR, S_LEARN_ELIXIR, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ProcessCastaction(player, creature, S_POTION, S_LEARN_POTION, DoLearnCost(player)); - break; - //Unlearn Alchemy - case GOSSIP_ACTION_INFO_DEF + 4: - ProcessCastaction(player, creature, 0, S_UNLEARN_TRANSMUTE, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - ProcessCastaction(player, creature, 0, S_UNLEARN_ELIXIR, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - ProcessCastaction(player, creature, 0, S_UNLEARN_POTION, DoHighUnlearnCost(player)); - break; + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - } - void SendConfirmLearn(Player* player, Creature* creature, uint32 action) - { - if (action) + void SendActionMenu(Player* player, uint32 action) { - switch (creature->GetEntry()) + switch (action) { - case N_TRAINER_TRANSMUTE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + break; + //Learn Alchemy + case GOSSIP_ACTION_INFO_DEF + 1: + ProcessCastaction(player, me, S_TRANSMUTE, S_LEARN_TRANSMUTE, DoLearnCost(player)); break; - case N_TRAINER_ELIXIR: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_ACTION_INFO_DEF + 2: + ProcessCastaction(player, me, S_ELIXIR, S_LEARN_ELIXIR, DoLearnCost(player)); break; - case N_TRAINER_POTION: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_ACTION_INFO_DEF + 3: + ProcessCastaction(player, me, S_POTION, S_LEARN_POTION, DoLearnCost(player)); + break; + //Unlearn Alchemy + case GOSSIP_ACTION_INFO_DEF + 4: + ProcessCastaction(player, me, 0, S_UNLEARN_TRANSMUTE, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + ProcessCastaction(player, me, 0, S_UNLEARN_ELIXIR, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + ProcessCastaction(player, me, 0, S_UNLEARN_POTION, DoHighUnlearnCost(player)); break; } } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) + void SendConfirmLearn(Player* player, uint32 action) { - switch (creature->GetEntry()) + if (action) { - case N_TRAINER_TRANSMUTE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_ELIXIR: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_POTION: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + switch (me->GetEntry()) + { + case N_TRAINER_TRANSMUTE: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_ELIXIR: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_POTION: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } } } - } - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) + void SendConfirmUnlearn(Player* player, uint32 action) + { + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_TRANSMUTE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_ELIXIR: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_POTION: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } + } + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); + break; - case GOSSIP_SENDER_LEARN: - SendConfirmLearn(player, creature, action); - break; + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); + break; - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); + break; - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); + break; + } + return true; } - return true; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_prof_alchemyAI(creature); } }; @@ -611,224 +623,236 @@ class npc_prof_blacksmith : public CreatureScript public: npc_prof_blacksmith() : CreatureScript("npc_prof_blacksmith") { } - inline bool HasWeaponSub(Player* player) + struct npc_prof_blacksmithAI : public ScriptedAI { - return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD)); - } + npc_prof_blacksmithAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + inline bool HasWeaponSub(Player* player) + { + return (player->HasSpell(S_HAMMER) || player->HasSpell(S_AXE) || player->HasSpell(S_SWORD)); + } - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - uint32 creatureId = creature->GetEntry(); - //WEAPONSMITH & ARMORSMITH - if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225) - { - switch (creatureId) + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + uint32 creatureId = me->GetEntry(); + //WEAPONSMITH & ARMORSMITH + if (player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 225) { - case N_TRAINER_SMITHOMNI1: - case N_TRAINER_SMITHOMNI2: - if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - break; - case N_TRAINER_WEAPON1: - case N_TRAINER_WEAPON2: - if (player->HasSpell(S_WEAPON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); - break; - case N_TRAINER_ARMOR1: - case N_TRAINER_ARMOR2: - if (player->HasSpell(S_ARMOR)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); - break; + switch (creatureId) + { + case N_TRAINER_SMITHOMNI1: + case N_TRAINER_SMITHOMNI2: + if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + break; + case N_TRAINER_WEAPON1: + case N_TRAINER_WEAPON2: + if (player->HasSpell(S_WEAPON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); + break; + case N_TRAINER_ARMOR1: + case N_TRAINER_ARMOR2: + if (player->HasSpell(S_ARMOR)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + break; + } + } + //WEAPONSMITH SPEC + if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250) + { + switch (creatureId) + { + case N_TRAINER_HAMMER: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5); + if (player->HasSpell(S_HAMMER)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8); + break; + case N_TRAINER_AXE: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6); + if (player->HasSpell(S_AXE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9); + break; + case N_TRAINER_SWORD: + if (!HasWeaponSub(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7); + if (player->HasSpell(S_SWORD)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 10); + break; + } } + + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; } - //WEAPONSMITH SPEC - if (player->HasSpell(S_WEAPON) && player->getLevel() > 49 && player->GetBaseSkillValue(SKILL_BLACKSMITHING) >= 250) + + void SendActionMenu(Player* player, uint32 action) { - switch (creatureId) + switch (action) { - case N_TRAINER_HAMMER: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5); - if (player->HasSpell(S_HAMMER)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8); + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); break; - case N_TRAINER_AXE: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6); - if (player->HasSpell(S_AXE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9); + //Learn Armor/Weapon + case GOSSIP_ACTION_INFO_DEF + 1: + if (!player->HasSpell(S_ARMOR)) + { + player->CastSpell(player, S_LEARN_ARMOR, true); + //_Creature->CastSpell(player, S_REP_ARMOR, true); + } + CloseGossipMenuFor(player); break; - case N_TRAINER_SWORD: - if (!HasWeaponSub(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7); - if (player->HasSpell(S_SWORD)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 10); + case GOSSIP_ACTION_INFO_DEF + 2: + if (!player->HasSpell(S_WEAPON)) + { + player->CastSpell(player, S_LEARN_WEAPON, true); + //_Creature->CastSpell(player, S_REP_WEAPON, true); + } + CloseGossipMenuFor(player); + break; + //Unlearn Armor/Weapon + case GOSSIP_ACTION_INFO_DEF + 3: + if (HasWeaponSub(player)) + { + //unknown textID (TALK_MUST_UNLEARN_WEAPON) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + } + else + ProcessUnlearnAction(player, me, S_UNLEARN_WEAPON, S_REP_ARMOR, DoLowUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + ProcessUnlearnAction(player, me, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player)); + break; + //Learn Hammer/Axe/Sword + case GOSSIP_ACTION_INFO_DEF + 5: + player->CastSpell(player, S_LEARN_HAMMER, true); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + player->CastSpell(player, S_LEARN_AXE, true); + CloseGossipMenuFor(player); + break; + case GOSSIP_ACTION_INFO_DEF + 7: + player->CastSpell(player, S_LEARN_SWORD, true); + CloseGossipMenuFor(player); + break; + //Unlearn Hammer/Axe/Sword + case GOSSIP_ACTION_INFO_DEF + 8: + ProcessUnlearnAction(player, me, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 9: + ProcessUnlearnAction(player, me, S_UNLEARN_AXE, 0, DoMedUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 10: + ProcessUnlearnAction(player, me, S_UNLEARN_SWORD, 0, DoMedUnlearnCost(player)); break; } } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) + void SendConfirmLearn(Player* player, uint32 action) { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - //Learn Armor/Weapon - case GOSSIP_ACTION_INFO_DEF + 1: - if (!player->HasSpell(S_ARMOR)) - { - player->CastSpell(player, S_LEARN_ARMOR, true); - //_Creature->CastSpell(player, S_REP_ARMOR, true); - } - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - if (!player->HasSpell(S_WEAPON)) - { - player->CastSpell(player, S_LEARN_WEAPON, true); - //_Creature->CastSpell(player, S_REP_WEAPON, true); - } - CloseGossipMenuFor(player); - break; - //Unlearn Armor/Weapon - case GOSSIP_ACTION_INFO_DEF + 3: - if (HasWeaponSub(player)) + if (action) + { + switch (me->GetEntry()) { - //unknown textID (TALK_MUST_UNLEARN_WEAPON) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case N_TRAINER_HAMMER: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_HAMMER_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_AXE: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_AXE_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SWORD: + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); + //unknown textID (TALK_SWORD_LEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; } - else - ProcessUnlearnAction(player, creature, S_UNLEARN_WEAPON, S_REP_ARMOR, DoLowUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - ProcessUnlearnAction(player, creature, S_UNLEARN_ARMOR, S_REP_WEAPON, DoLowUnlearnCost(player)); - break; - //Learn Hammer/Axe/Sword - case GOSSIP_ACTION_INFO_DEF + 5: - player->CastSpell(player, S_LEARN_HAMMER, true); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - player->CastSpell(player, S_LEARN_AXE, true); - CloseGossipMenuFor(player); - break; - case GOSSIP_ACTION_INFO_DEF + 7: - player->CastSpell(player, S_LEARN_SWORD, true); - CloseGossipMenuFor(player); - break; - //Unlearn Hammer/Axe/Sword - case GOSSIP_ACTION_INFO_DEF + 8: - ProcessUnlearnAction(player, creature, S_UNLEARN_HAMMER, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 9: - ProcessUnlearnAction(player, creature, S_UNLEARN_AXE, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 10: - ProcessUnlearnAction(player, creature, S_UNLEARN_SWORD, 0, DoMedUnlearnCost(player)); - break; + } } - } - void SendConfirmLearn(Player* player, Creature* creature, uint32 action) - { - if (action) + void SendConfirmUnlearn(Player* player, uint32 action) { - switch (creature->GetEntry()) + if (action) { - case N_TRAINER_HAMMER: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_HAMMER_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_AXE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_AXE_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_SWORD: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); - //unknown textID (TALK_SWORD_LEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + switch (me->GetEntry()) + { + case N_TRAINER_WEAPON1: + case N_TRAINER_WEAPON2: + case N_TRAINER_ARMOR1: + case N_TRAINER_ARMOR2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); + //unknown textID (TALK_UNLEARN_AXEORWEAPON) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + + case N_TRAINER_HAMMER: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_HAMMER_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_AXE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_AXE_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SWORD: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); + //unknown textID (TALK_SWORD_UNLEARN) + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } } } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) { - case N_TRAINER_WEAPON1: - case N_TRAINER_WEAPON2: - case N_TRAINER_ARMOR1: - case N_TRAINER_ARMOR2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); - //unknown textID (TALK_UNLEARN_AXEORWEAPON) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); break; - case N_TRAINER_HAMMER: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_HAMMER_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); break; - case N_TRAINER_AXE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_AXE_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); break; - case N_TRAINER_SWORD: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); - //unknown textID (TALK_SWORD_UNLEARN) - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); break; } + return true; } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_LEARN: - SendConfirmLearn(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; - } - return true; + return new npc_prof_blacksmithAI(creature); } }; @@ -863,86 +887,98 @@ class npc_engineering_tele_trinket : public CreatureScript public: npc_engineering_tele_trinket() : CreatureScript("npc_engineering_tele_trinket") { } - bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId) + struct npc_engineering_tele_trinketAI : public ScriptedAI { - bool res = false; - npcTextId = textId; - if (player->GetBaseSkillValue(SKILL_ENGINEERING) >= skillValue && player->HasSpell(reqSpellId)) + npc_engineering_tele_trinketAI(Creature* creature) : ScriptedAI(creature) { } + + bool CanLearn(Player* player, uint32 textId, uint32 altTextId, uint32 skillValue, uint32 reqSpellId, uint32 spellId, uint32& npcTextId) { - if (!player->HasSpell(spellId)) - res = true; - else - npcTextId = altTextId; + bool res = false; + npcTextId = textId; + if (player->GetBaseSkillValue(SKILL_ENGINEERING) >= skillValue && player->HasSpell(reqSpellId)) + { + if (!player->HasSpell(spellId)) + res = true; + else + npcTextId = altTextId; + } + return res; } - return res; - } - bool OnGossipHello(Player* player, Creature* creature) override - { - uint32 npcTextId = 0; - std::string gossipItem; - bool canLearn = false; + bool GossipHello(Player* player) override + { + uint32 npcTextId = 0; + std::string gossipItem; + bool canLearn = false; + + if (player->HasSkill(SKILL_ENGINEERING)) + { + switch (me->GetEntry()) + { + case NPC_ZAP: + canLearn = CanLearn(player, 6092, 0, 260, S_GOBLIN, SPELL_TO_EVERLOOK, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_ZAP; + break; + case NPC_JHORDY: + canLearn = CanLearn(player, 7251, 7252, 260, S_GNOMISH, SPELL_TO_GADGET, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_JHORDY; + break; + case NPC_KABLAM: + canLearn = CanLearn(player, 10365, 0, 350, S_GOBLIN, SPELL_TO_AREA52, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_KABLAM; + break; + case NPC_SMILES: + canLearn = CanLearn(player, 10363, 0, 350, S_GNOMISH, SPELL_TO_TOSHLEY, npcTextId); + if (canLearn) + gossipItem = GOSSIP_ITEM_KABLAM; + break; + } + } + + if (canLearn) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipItem, me->GetEntry(), GOSSIP_ACTION_INFO_DEF + 1); + + SendGossipMenuFor(player, npcTextId ? npcTextId : player->GetGossipTextId(me), me->GetGUID()); + return true; + } - if (player->HasSkill(SKILL_ENGINEERING)) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1) + CloseGossipMenuFor(player); + + if (sender != me->GetEntry()) + return true; + + switch (sender) { case NPC_ZAP: - canLearn = CanLearn(player, 6092, 0, 260, S_GOBLIN, SPELL_TO_EVERLOOK, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_ZAP; + player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false); break; case NPC_JHORDY: - canLearn = CanLearn(player, 7251, 7252, 260, S_GNOMISH, SPELL_TO_GADGET, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_JHORDY; + player->CastSpell(player, SPELL_LEARN_TO_GADGET, false); break; case NPC_KABLAM: - canLearn = CanLearn(player, 10365, 0, 350, S_GOBLIN, SPELL_TO_AREA52, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_KABLAM; + player->CastSpell(player, SPELL_LEARN_TO_AREA52, false); break; case NPC_SMILES: - canLearn = CanLearn(player, 10363, 0, 350, S_GNOMISH, SPELL_TO_TOSHLEY, npcTextId); - if (canLearn) - gossipItem = GOSSIP_ITEM_KABLAM; + player->CastSpell(player, SPELL_LEARN_TO_TOSHLEY, false); break; } - } - - if (canLearn) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, gossipItem, creature->GetEntry(), GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, npcTextId ? npcTextId : player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - CloseGossipMenuFor(player); - - if (sender != creature->GetEntry()) return true; - - switch (sender) - { - case NPC_ZAP: - player->CastSpell(player, SPELL_LEARN_TO_EVERLOOK, false); - break; - case NPC_JHORDY: - player->CastSpell(player, SPELL_LEARN_TO_GADGET, false); - break; - case NPC_KABLAM: - player->CastSpell(player, SPELL_LEARN_TO_AREA52, false); - break; - case NPC_SMILES: - player->CastSpell(player, SPELL_LEARN_TO_TOSHLEY, false); - break; } + }; - return true; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_engineering_tele_trinketAI(creature); } }; @@ -1025,112 +1061,124 @@ class npc_prof_leather : public CreatureScript public: npc_prof_leather() : CreatureScript("npc_prof_leather") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_prof_leatherAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + npc_prof_leatherAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49) + { + switch (me->GetEntry()) + { + case N_TRAINER_DRAGON1: + case N_TRAINER_DRAGON2: + if (player->HasSpell(S_DRAGON)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1); + break; + case N_TRAINER_ELEMENTAL1: + case N_TRAINER_ELEMENTAL2: + if (player->HasSpell(S_ELEMENTAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2); + break; + case N_TRAINER_TRIBAL1: + case N_TRAINER_TRIBAL2: + if (player->HasSpell(S_TRIBAL)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); + break; + } + } - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49) + void SendActionMenu(Player* player, uint32 action) { - switch (creature->GetEntry()) + switch (action) { - case N_TRAINER_DRAGON1: - case N_TRAINER_DRAGON2: - if (player->HasSpell(S_DRAGON)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1); + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + break; + //Unlearn Leather + case GOSSIP_ACTION_INFO_DEF + 1: + ProcessUnlearnAction(player, me, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player)); break; - case N_TRAINER_ELEMENTAL1: - case N_TRAINER_ELEMENTAL2: - if (player->HasSpell(S_ELEMENTAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2); + case GOSSIP_ACTION_INFO_DEF + 2: + ProcessUnlearnAction(player, me, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player)); break; - case N_TRAINER_TRIBAL1: - case N_TRAINER_TRIBAL2: - if (player->HasSpell(S_TRIBAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); + case GOSSIP_ACTION_INFO_DEF + 3: + ProcessUnlearnAction(player, me, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player)); break; } } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) + void SendConfirmUnlearn(Player* player, uint32 action) { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - //Unlearn Leather - case GOSSIP_ACTION_INFO_DEF + 1: - ProcessUnlearnAction(player, creature, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ProcessUnlearnAction(player, creature, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ProcessUnlearnAction(player, creature, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player)); - break; + if (action) + { + switch (me->GetEntry()) + { + case N_TRAINER_DRAGON1: + case N_TRAINER_DRAGON2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_ELEMENTAL1: + case N_TRAINER_ELEMENTAL2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_TRIBAL1: + case N_TRAINER_TRIBAL2: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } + } } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) { - case N_TRAINER_DRAGON1: - case N_TRAINER_DRAGON2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); break; - case N_TRAINER_ELEMENTAL1: - case N_TRAINER_ELEMENTAL2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); break; - case N_TRAINER_TRIBAL1: - case N_TRAINER_TRIBAL2: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); break; } + return true; } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; - } - return true; + return new npc_prof_leatherAI(creature); } }; @@ -1143,160 +1191,172 @@ class npc_prof_tailor : public CreatureScript public: npc_prof_tailor() : CreatureScript("npc_prof_tailor") { } - inline bool HasTailorSpell(Player* player) + struct npc_prof_tailorAI : public ScriptedAI { - return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE)); - } + npc_prof_tailorAI(Creature* creature) : ScriptedAI(creature) { } - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); + inline bool HasTailorSpell(Player* player) + { + return (player->HasSpell(S_MOONCLOTH) || player->HasSpell(S_SHADOWEAVE) || player->HasSpell(S_SPELLFIRE)); + } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (me->IsVendor()) + AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + + if (me->IsTrainer()) + AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + + //TAILORING SPEC + if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59) + { + if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833)) + { + switch (me->GetEntry()) + { + case N_TRAINER_SPELLFIRE: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); + if (player->HasSpell(S_SPELLFIRE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + break; + case N_TRAINER_MOONCLOTH: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); + if (player->HasSpell(S_MOONCLOTH)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); + break; + case N_TRAINER_SHADOWEAVE: + if (!HasTailorSpell(player)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); + if (player->HasSpell(S_SHADOWEAVE)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); + break; + } + } + } - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + return true; + } - if (creature->IsTrainer()) - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + void SendActionMenu(Player* player, uint32 action) + { + switch (action) + { + case GOSSIP_ACTION_TRADE: + player->GetSession()->SendListInventory(me->GetGUID()); + break; + case GOSSIP_ACTION_TRAIN: + player->GetSession()->SendTrainerList(me->GetGUID()); + break; + //Learn Tailor + case GOSSIP_ACTION_INFO_DEF + 1: + ProcessCastaction(player, me, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + ProcessCastaction(player, me, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + ProcessCastaction(player, me, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); + break; + //Unlearn Tailor + case GOSSIP_ACTION_INFO_DEF + 4: + ProcessUnlearnAction(player, me, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + ProcessUnlearnAction(player, me, S_UNLEARN_MOONCLOTH, 0, DoHighUnlearnCost(player)); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + ProcessUnlearnAction(player, me, S_UNLEARN_SHADOWEAVE, 0, DoHighUnlearnCost(player)); + break; + } + } - //TAILORING SPEC - if (player->HasSkill(SKILL_TAILORING) && player->GetBaseSkillValue(SKILL_TAILORING) >= 350 && player->getLevel() > 59) + void SendConfirmLearn(Player* player, uint32 action) { - if (player->GetQuestRewardStatus(10831) || player->GetQuestRewardStatus(10832) || player->GetQuestRewardStatus(10833)) + if (action) { - switch (creature->GetEntry()) + switch (me->GetEntry()) { case N_TRAINER_SPELLFIRE: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); - if (player->HasSpell(S_SPELLFIRE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); break; case N_TRAINER_MOONCLOTH: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); - if (player->HasSpell(S_MOONCLOTH)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); break; case N_TRAINER_SHADOWEAVE: - if (!HasTailorSpell(player)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); - if (player->HasSpell(S_SHADOWEAVE)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 6); + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); break; } } } - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - void SendActionMenu(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - //Learn Tailor - case GOSSIP_ACTION_INFO_DEF + 1: - ProcessCastaction(player, creature, S_SPELLFIRE, S_LEARN_SPELLFIRE, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - ProcessCastaction(player, creature, S_MOONCLOTH, S_LEARN_MOONCLOTH, DoLearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - ProcessCastaction(player, creature, S_SHADOWEAVE, S_LEARN_SHADOWEAVE, DoLearnCost(player)); - break; - //Unlearn Tailor - case GOSSIP_ACTION_INFO_DEF + 4: - ProcessUnlearnAction(player, creature, S_UNLEARN_SPELLFIRE, 0, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - ProcessUnlearnAction(player, creature, S_UNLEARN_MOONCLOTH, 0, DoHighUnlearnCost(player)); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - ProcessUnlearnAction(player, creature, S_UNLEARN_SHADOWEAVE, 0, DoHighUnlearnCost(player)); - break; - } - } - - void SendConfirmLearn(Player* player, Creature* creature, uint32 action) - { - if (action) + void SendConfirmUnlearn(Player* player, uint32 action) { - switch (creature->GetEntry()) + if (action) { - case N_TRAINER_SPELLFIRE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_MOONCLOTH: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; - case N_TRAINER_SHADOWEAVE: - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - break; + switch (me->GetEntry()) + { + case N_TRAINER_SPELLFIRE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_MOONCLOTH: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + case N_TRAINER_SHADOWEAVE: + AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); + //unknown textID () + SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + break; + } } } - } - void SendConfirmUnlearn(Player* player, Creature* creature, uint32 action) - { - if (action) + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - switch (creature->GetEntry()) + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + switch (sender) { - case N_TRAINER_SPELLFIRE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + case GOSSIP_SENDER_MAIN: + SendActionMenu(player, action); break; - case N_TRAINER_MOONCLOTH: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_LEARN: + SendConfirmLearn(player, action); + break; + + case GOSSIP_SENDER_UNLEARN: + SendConfirmUnlearn(player, action); break; - case N_TRAINER_SHADOWEAVE: - AddGossipItemFor(player, 0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); - //unknown textID () - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); + + case GOSSIP_SENDER_CHECK: + SendActionMenu(player, action); break; } + return true; } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); - break; - - case GOSSIP_SENDER_LEARN: - SendConfirmLearn(player, creature, action); - break; - - case GOSSIP_SENDER_UNLEARN: - SendConfirmUnlearn(player, creature, action); - break; - - case GOSSIP_SENDER_CHECK: - SendActionMenu(player, creature, action); - break; - } - return true; + return new npc_prof_tailorAI(creature); } }; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 268b4ff2c69..17f1649de4c 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -329,28 +329,24 @@ public: break; } } + + void QuestAccept(Player* /*player*/, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_CLUCK) + Reset(); + } + + void QuestReward(Player* /*player*/, Quest const* quest, uint32 /*opt*/) override + { + if (quest->GetQuestId() == QUEST_CLUCK) + Reset(); + } }; CreatureAI* GetAI(Creature* creature) const override { return new npc_chicken_cluckAI(creature); } - - bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_CLUCK) - ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); - - return true; - } - - bool OnQuestReward(Player* /*player*/, Creature* creature, Quest const* quest, uint32 /*opt*/) override - { - if (quest->GetQuestId() == QUEST_CLUCK) - ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); - - return true; - } }; /*###### @@ -819,15 +815,13 @@ public: void UpdateAI(uint32 diff) override; void EnterCombat(Unit* /*who*/) override { } - }; - - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622)) - ENSURE_AI(npc_doctor::npc_doctorAI, creature->AI())->BeginEvent(player); - return true; - } + void QuestAccept(Player* player, Quest const* quest) override + { + if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622)) + BeginEvent(player); + } + }; CreatureAI* GetAI(Creature* creature) const override { @@ -1282,117 +1276,129 @@ class npc_sayge : public CreatureScript public: npc_sayge() : CreatureScript("npc_sayge") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_saygeAI : public ScriptedAI { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetSpellHistory()->HasCooldown(SPELL_STRENGTH) || - player->GetSpellHistory()->HasCooldown(SPELL_AGILITY) || - player->GetSpellHistory()->HasCooldown(SPELL_STAMINA) || - player->GetSpellHistory()->HasCooldown(SPELL_SPIRIT) || - player->GetSpellHistory()->HasCooldown(SPELL_INTELLECT) || - player->GetSpellHistory()->HasCooldown(SPELL_ARMOR) || - player->GetSpellHistory()->HasCooldown(SPELL_DAMAGE) || - player->GetSpellHistory()->HasCooldown(SPELL_RESISTANCE)) - SendGossipMenuFor(player, GOSSIP_MENU_CANT_GIVE_YOU_YOUR, creature->GetGUID()); - else + npc_saygeAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); + + if (player->GetSpellHistory()->HasCooldown(SPELL_STRENGTH) || + player->GetSpellHistory()->HasCooldown(SPELL_AGILITY) || + player->GetSpellHistory()->HasCooldown(SPELL_STAMINA) || + player->GetSpellHistory()->HasCooldown(SPELL_SPIRIT) || + player->GetSpellHistory()->HasCooldown(SPELL_INTELLECT) || + player->GetSpellHistory()->HasCooldown(SPELL_ARMOR) || + player->GetSpellHistory()->HasCooldown(SPELL_DAMAGE) || + player->GetSpellHistory()->HasCooldown(SPELL_RESISTANCE)) + SendGossipMenuFor(player, GOSSIP_MENU_CANT_GIVE_YOU_YOUR, me->GetGUID()); + else + { + AddGossipItemFor(player, GOSSIP_I_AM_READY_TO_DISCOVER, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, GOSSIP_MENU_I_HAVE_LONG_KNOWN, me->GetGUID()); + } + + return true; + } + + void SendAction(Player* player, uint32 action) { - AddGossipItemFor(player, GOSSIP_I_AM_READY_TO_DISCOVER, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, GOSSIP_MENU_I_HAVE_LONG_KNOWN, creature->GetGUID()); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE1, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE2, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE3, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE4, GOSSIP_MENU_OPTION_ID_ANSWER_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + SendGossipMenuFor(player, GOSSIP_MENU_YOU_HAVE_BEEN_TASKED, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 2: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE5, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 1, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE6, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE7, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_SWORN_EXECUTIONER, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 3: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE8, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE9, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE10, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_DIPLOMATIC_MISSION, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 4: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE11, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 6, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE12, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 7, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE13, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 8, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_YOUR_BROTHER_SEEKS, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 5: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE14, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE15, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE16, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, GOSSIP_MENU_A_TERRIBLE_BEAST, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF: + AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE17, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + SendGossipMenuFor(player, GOSSIP_MENU_YOUR_FORTUNE_IS_CAST, me->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF + 6: + DoCast(player, SPELL_FORTUNE, false); + SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, me->GetGUID()); + break; + } } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const sender = player->PlayerTalkClass->GetGossipOptionSender(gossipListId); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + uint32 spellId = 0; + switch (sender) + { + case GOSSIP_SENDER_MAIN: + SendAction(player, action); + break; + case GOSSIP_SENDER_MAIN + 1: + spellId = SPELL_DAMAGE; + break; + case GOSSIP_SENDER_MAIN + 2: + spellId = SPELL_RESISTANCE; + break; + case GOSSIP_SENDER_MAIN + 3: + spellId = SPELL_ARMOR; + break; + case GOSSIP_SENDER_MAIN + 4: + spellId = SPELL_SPIRIT; + break; + case GOSSIP_SENDER_MAIN + 5: + spellId = SPELL_INTELLECT; + break; + case GOSSIP_SENDER_MAIN + 6: + spellId = SPELL_STAMINA; + break; + case GOSSIP_SENDER_MAIN + 7: + spellId = SPELL_STRENGTH; + break; + case GOSSIP_SENDER_MAIN + 8: + spellId = SPELL_AGILITY; + break; + } - void SendAction(Player* player, Creature* creature, uint32 action) - { - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE1, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE2, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE3, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE4, GOSSIP_MENU_OPTION_ID_ANSWER_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - SendGossipMenuFor(player, GOSSIP_MENU_YOU_HAVE_BEEN_TASKED, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 2: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE5, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 1, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE6, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE7, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_SWORN_EXECUTIONER, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 3: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE8, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE9, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE10,GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 2, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_DIPLOMATIC_MISSION, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 4: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE11, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 6, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE12, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 7, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE13, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 8, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_YOUR_BROTHER_SEEKS, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 5: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE14, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN + 5, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE15, GOSSIP_MENU_OPTION_ID_ANSWER_2, GOSSIP_SENDER_MAIN + 4, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE16, GOSSIP_MENU_OPTION_ID_ANSWER_3, GOSSIP_SENDER_MAIN + 3, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, GOSSIP_MENU_A_TERRIBLE_BEAST, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF: - AddGossipItemFor(player, GOSSIP_MENU_OPTION_SAYGE17, GOSSIP_MENU_OPTION_ID_ANSWER_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - SendGossipMenuFor(player, GOSSIP_MENU_YOUR_FORTUNE_IS_CAST, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF + 6: - creature->CastSpell(player, SPELL_FORTUNE, false); - SendGossipMenuFor(player, GOSSIP_MENU_HERE_IS_YOUR_FORTUNE, creature->GetGUID()); - break; + if (spellId) + { + DoCast(player, spellId, false); + player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2)); + SendAction(player, action); + } + return true; } - } + }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - uint32 spellId = 0; - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendAction(player, creature, action); - break; - case GOSSIP_SENDER_MAIN + 1: - spellId = SPELL_DAMAGE; - break; - case GOSSIP_SENDER_MAIN + 2: - spellId = SPELL_RESISTANCE; - break; - case GOSSIP_SENDER_MAIN + 3: - spellId = SPELL_ARMOR; - break; - case GOSSIP_SENDER_MAIN + 4: - spellId = SPELL_SPIRIT; - break; - case GOSSIP_SENDER_MAIN + 5: - spellId = SPELL_INTELLECT; - break; - case GOSSIP_SENDER_MAIN + 6: - spellId = SPELL_STAMINA; - break; - case GOSSIP_SENDER_MAIN + 7: - spellId = SPELL_STRENGTH; - break; - case GOSSIP_SENDER_MAIN + 8: - spellId = SPELL_AGILITY; - break; - } - - if (spellId) - { - creature->CastSpell(player, spellId, false); - player->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::hours(2)); - SendAction(player, creature, action); - } - return true; + return new npc_saygeAI(creature); } }; @@ -1867,8 +1873,6 @@ public: enum NPC_Wormhole { - DATA_SHOW_UNDERGROUND = 1, // -> Random 0 or 1 - MENU_ID_WORMHOLE = 10668, // "This tear in the fabric of time and space looks ominous." NPC_TEXT_WORMHOLE = 14785, // (not 907 "What brings you to this part of the world, $n?") GOSSIP_OPTION_1 = 0, // "Borean Tundra" @@ -1908,71 +1912,67 @@ class npc_wormhole : public CreatureScript Initialize(); } - uint32 GetData(uint32 type) const override + bool GossipHello(Player* player) override { - return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0; - } - - private: - bool _showUnderground; - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsSummon()) - { - if (player == creature->ToTempSummon()->GetSummoner()) + if (me->IsSummon()) { - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + if (player == me->ToTempSummon()->GetSummoner()) + { + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - if (creature->AI()->GetData(DATA_SHOW_UNDERGROUND)) - AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + if (_showUnderground) + AddGossipItemFor(player, MENU_ID_WORMHOLE, GOSSIP_OPTION_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, creature->GetGUID()); + SendGossipMenuFor(player, NPC_TEXT_WORMHOLE, me->GetGUID()); + } } + + return true; } - return true; - } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra + CloseGossipMenuFor(player); + DoCast(player, SPELL_BOREAN_TUNDRA, false); + break; + case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord + CloseGossipMenuFor(player); + DoCast(player, SPELL_HOWLING_FJORD, false); + break; + case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin + CloseGossipMenuFor(player); + DoCast(player, SPELL_SHOLAZAR_BASIN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown + CloseGossipMenuFor(player); + DoCast(player, SPELL_ICECROWN, false); + break; + case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks + CloseGossipMenuFor(player); + DoCast(player, SPELL_STORM_PEAKS, false); + break; + case GOSSIP_ACTION_INFO_DEF + 6: // Underground + CloseGossipMenuFor(player); + DoCast(player, SPELL_UNDERGROUND, false); + break; + } - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: // Borean Tundra - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_BOREAN_TUNDRA, false); - break; - case GOSSIP_ACTION_INFO_DEF + 2: // Howling Fjord - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_HOWLING_FJORD, false); - break; - case GOSSIP_ACTION_INFO_DEF + 3: // Sholazar Basin - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_SHOLAZAR_BASIN, false); - break; - case GOSSIP_ACTION_INFO_DEF + 4: // Icecrown - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_ICECROWN, false); - break; - case GOSSIP_ACTION_INFO_DEF + 5: // Storm peaks - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_STORM_PEAKS, false); - break; - case GOSSIP_ACTION_INFO_DEF + 6: // Underground - CloseGossipMenuFor(player); - creature->CastSpell(player, SPELL_UNDERGROUND, false); - break; + return true; } - return true; - } + private: + bool _showUnderground; + }; CreatureAI* GetAI(Creature* creature) const override { @@ -1999,13 +1999,14 @@ public: { npc_pet_trainerAI(Creature* creature) : ScriptedAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { if (menuId == MENU_ID_PET_UNLEARN && gossipListId == OPTION_ID_PLEASE_DO) { player->ResetPetTalents(); CloseGossipMenuFor(player); } + return false; } }; @@ -2032,36 +2033,47 @@ class npc_experience : public CreatureScript public: npc_experience() : CreatureScript("npc_experience") { } - bool OnGossipHello(Player* player, Creature* creature) override + struct npc_experienceAI : public ScriptedAI { - if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP + npc_experienceAI(Creature* creature) : ScriptedAI(creature) { } + + bool GossipHello(Player* player) override { - AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, creature->GetGUID()); + if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN)) // not gaining XP + { + AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_ON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, me->GetGUID()); + } + else // currently gaining XP + { + AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_OFF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, me->GetGUID()); + } + return true; } - else // currently gaining XP + + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - AddGossipItemFor(player, MENU_ID_XP_ON_OFF, OPTION_ID_XP_OFF, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - SendGossipMenuFor(player, NPC_TEXT_XP_ON_OFF, creature->GetGUID()); + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + + switch (action) + { + case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected + player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain + break; + case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected + player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain + break; + } + CloseGossipMenuFor(player); + return true; } - return true; - } + }; - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override + CreatureAI* GetAI(Creature* creature) const override { - ClearGossipMenuFor(player); - - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: // XP ON selected - player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn on XP gain - break; - case GOSSIP_ACTION_INFO_DEF + 2: // XP OFF selected - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NO_XP_GAIN); // turn off XP gain - break; - } - CloseGossipMenuFor(player); - return true; + return new npc_experienceAI(creature); } }; @@ -2522,11 +2534,11 @@ class npc_stable_master : public CreatureScript { npc_stable_masterAI(Creature* creature) : SmartAI(creature) { } - void sGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { - SmartAI::sGossipSelect(player, menuId, gossipListId); + SmartAI::GossipSelect(player, menuId, gossipListId); if (menuId != STABLE_MASTER_GOSSIP_SUB_MENU) - return; + return false; switch (gossipListId) { @@ -2552,10 +2564,11 @@ class npc_stable_master : public CreatureScript player->CastSpell(player, SPELL_WOLPERTINGER, false); break; default: - return; + return false; } player->PlayerTalkClass->SendCloseGossip(); + return false; } }; @@ -2776,7 +2789,7 @@ public: }); } - void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { switch (gossipListId) { @@ -2827,6 +2840,7 @@ public: break; } player->PlayerTalkClass->SendCloseGossip(); + return false; } void UpdateAI(uint32 diff) override -- cgit v1.2.3