diff --git a/data/sql/updates/pending_db_world/rev_1643424341492582600.sql b/data/sql/updates/pending_db_world/rev_1643424341492582600.sql new file mode 100644 index 000000000..e846e3ee2 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1643424341492582600.sql @@ -0,0 +1,40 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1643424341492582600'); + +DELETE FROM `npc_text` WHERE `ID` IN (10303, 10304); +INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `BroadcastTextID0`) VALUES +(10303, 'Forgetting tribal leatherworking is not something to do lightly. If you choose to abandon it you will forget all recipes that require tribal leatherworking as well!', 'Forgetting tribal leatherworking is not something to do lightly. If you choose to abandon it you will forget all recipes that require tribal leatherworking as well!', 18974), +(10304, 'Forgetting dragonscale leatherworking is not something to do lightly. If you choose to abandon it you will forget all recipes that require dragonscale leatherworking as well!', 'Forgetting dragonscale leatherworking is not something to do lightly. If you choose to abandon it you will forget all recipes that require dragonscale leatherworking as well!', 18976); + +DELETE FROM `gossip_menu` WHERE `MenuID` IN (3068, 3069, 3073) AND `TextID` IN (3802, 3803, 3806); +DELETE FROM `gossip_menu` WHERE `MenuID` IN (3075, 3076, 3077) AND `TextID` IN (10302, 10303, 10304); +INSERT INTO `gossip_menu` (`MenuID`, `TextID`) VALUES +(3068, 3802), +(3069, 3803), +(3073, 3806), +(3075, 10304), -- dragonscale +(3076, 10302), -- elemental +(3077, 10303); -- tribal + +DELETE FROM `gossip_menu_option` WHERE `MenuID` IN (3067, 3068, 3069, 3070, 3072, 3073) AND `OptionID` = 0; +DELETE FROM `gossip_menu_option` WHERE `MenuID` IN (3067, 3068, 3069, 3070, 3072, 3073, 3075, 3076, 3077) AND `OptionID` = 1; +INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES +(3067, 0, 3, 'I would like to train.', 5597, 5, 16, 0, 0, 0, 0, '', 0, 0), +(3067, 1, 0, 'I wish to unlearn dragonscale leatherworking!', 18977, 1, 1, 3075, 0, 0, 0, '', 0, 0), +(3068, 0, 3, 'I would like to train.', 5597, 5, 16, 0, 0, 0, 0, '', 0, 0), +(3068, 1, 0, 'I wish to unlearn dragonscale leatherworking!', 18977, 1, 1, 3075, 0, 0, 0, '', 0, 0), +(3069, 0, 3, 'I would like to train.', 5597, 5, 16, 0, 0, 0, 0, '', 0, 0), +(3069, 1, 0, 'I wish to unlearn elemental leatherworking!', 18917, 1, 1, 3076, 0, 0, 0, '', 0, 0), +(3070, 0, 3, 'I would like to train.', 5597, 5, 16, 0, 0, 0, 0, '', 0, 0), +(3070, 1, 0, 'I wish to unlearn elemental leatherworking!', 18917, 1, 1, 3076, 0, 0, 0, '', 0, 0), +(3072, 0, 3, 'I would like to train.', 5597, 5, 16, 0, 0, 0, 0, '', 0, 0), +(3072, 1, 0, 'I wish to unlearn tribal leatherworking!', 18975, 1, 1, 3077, 0, 0, 0, '', 0, 0), +(3073, 0, 3, 'I would like to train.', 5597, 5, 16, 0, 0, 0, 0, '', 0, 0), +(3073, 1, 0, 'I wish to unlearn tribal leatherworking!', 18975, 1, 1, 3077, 0, 0, 0, '', 0, 0), +(3075, 1, 0, 'I wish to unlearn dragonscale leatherworking!', 18977, 1, 1, 0, 0, 0, 0, 'Do you really want to unlearn your leatherworking specialty and lose all associated recipes?', 18969, 0), +(3076, 1, 0, 'I wish to unlearn elemental leatherworking!', 18917, 1, 1, 0, 0, 0, 0, 'Do you really want to unlearn your leatherworking specialty and lose all associated recipes?', 18969, 0), +(3077, 1, 0, 'I wish to unlearn tribal leatherworking!', 18975, 1, 1, 0, 0, 0, 0, 'Do you really want to unlearn your leatherworking specialty and lose all associated recipes?', 18969, 0); + + +UPDATE `creature_template` SET `gossip_menu_id` = 3068, `npcflag` = `npcflag`|1 WHERE `entry` = 7867; -- Thorkaf Dragoneye +UPDATE `creature_template` SET `gossip_menu_id` = 3069, `npcflag` = `npcflag`|1 WHERE `entry` = 7869; -- Mrumn Winterhoof +UPDATE `creature_template` SET `gossip_menu_id` = 3073, `npcflag` = `npcflag`|1 WHERE `entry` = 7871; -- Se'Jib diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index f984bcfcc..002eabbbf 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -18,7 +18,7 @@ /* ScriptData SDName: Npc_Professions SD%Complete: 80 -SDComment: Provides learn/unlearn/relearn-options for professions. Not supported: Unlearn engineering, re-learn engineering, re-learn leatherworking. +SDComment: Provides learn/unlearn/relearn-options for professions. Not supported: Unlearn engineering, re-learn engineering. SDCategory: NPCs EndScriptData */ @@ -86,10 +86,6 @@ there is no difference here (except that default text is chosen with `gameobject #define BOX_UNLEARN_WEAPON_SPEC "Do you really want to unlearn your weaponsmith specialty and lose all associated recipes? \n Cost: " -#define GOSSIP_LEARN_DRAGON "I wish to learn Dragonscale Leatherworking" -#define GOSSIP_LEARN_ELEMENTAL "I wish to learn Elemental Leatherworking" -#define GOSSIP_LEARN_TRIBAL "I wish to learn Tribal Leatherworking" - #define GOSSIP_LEARN_SPELLFIRE "Please teach me how to become a Spellcloth tailor" #define GOSSIP_UNLEARN_SPELLFIRE "I wish to unlearn Spellfire Tailoring" #define GOSSIP_LEARN_MOONCLOTH "Please teach me how to become a Mooncloth tailor" @@ -230,6 +226,37 @@ enum SpecializationQuests Q_MASTER_POTION = 10897, }; +// All referred to gossips (menu, menu_opt, actions) +enum Gossips +{ + // Leatherworking + GOSSIP_MENU_PETER_GALEN = 3067, + GOSSIP_MENU_THORKAF_DRAGONEYE = 3068, + GOSSIP_MENU_BRUMN_WINTERHOOF = 3069, + GOSSIP_MENU_SARAH_TANNER = 3070, + GOSSIP_MENU_CARYSSIA_MOONHUNTER = 3072, + GOSSIP_MENU_SEJIB = 3073, + + GOSSIP_MENU_UNLEARN_CONFIRM_DRAGONSCALE = 3075, + GOSSIP_MENU_UNLEARN_CONFIRM_ELEMENTAL = 3076, + GOSSIP_MENU_UNLEARN_CONFIRM_TRIBAL = 3077, + + GOSSIP_MENU_OPTION_TRAIN = 0, + GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_DRAGONSCALE = 1, + GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_ELEMENTAL = 1, + GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_TRIBAL = 1, + + GOSSIP_TEXT_UNLEARN_CONFIRM_DRAGONSCALE = 10304, + GOSSIP_TEXT_UNLEARN_CONFIRM_ELEMENTAL = 10302, + GOSSIP_TEXT_UNLEARN_CONFIRM_TRIBAL = 10303, + + GOSSIP_MENU_GO_SOOTHSAYING_FOR_DUMMIES = 7058, + GOSSIP_MENU_OPTION_GO_LEARN_DRAGONSCALE = 4, + GOSSIP_MENU_OPTION_GO_LEARN_ELEMENTAL = 5, + GOSSIP_MENU_OPTION_GO_LEARN_TRIBAL = 6, + +}; + /*### # formulas to calculate unlearning cost ###*/ @@ -347,7 +374,11 @@ void ProfessionUnlearnSpells(Player* player, uint32 type) player->removeSpell(36259, SPEC_MASK_ALL, false); // Lionheart Executioner break; case S_UNLEARN_DRAGON: // S_UNLEARN_DRAGON + player->removeSpell(10619, SPEC_MASK_ALL, false); // Dragonscale Guantlets + player->removeSpell(10650, SPEC_MASK_ALL, false); // Dragonscale Breastplate player->removeSpell(36076, SPEC_MASK_ALL, false); // Dragonstrike Leggings + player->removeSpell(24655, SPEC_MASK_ALL, false); // Green Dragonscale Gauntlets + player->removeSpell(24654, SPEC_MASK_ALL, false); // Blue Dragonscale Leggings player->removeSpell(36079, SPEC_MASK_ALL, false); // Golden Dragonstrike Breastplate player->removeSpell(35576, SPEC_MASK_ALL, false); // Ebon Netherscale Belt player->removeSpell(35577, SPEC_MASK_ALL, false); // Ebon Netherscale Bracers @@ -362,6 +393,8 @@ void ProfessionUnlearnSpells(Player* player, uint32 type) player->removeSpell(35590, SPEC_MASK_ALL, false); // Primalstrike Belt player->removeSpell(35591, SPEC_MASK_ALL, false); // Primalstrike Bracers player->removeSpell(35589, SPEC_MASK_ALL, false); // Primalstrike Vest + player->removeSpell(10630, SPEC_MASK_ALL, false); // Gauntlets of the Sea + player->removeSpell(10632, SPEC_MASK_ALL, false); // Helm of Fire break; case S_UNLEARN_TRIBAL: // S_UNLEARN_TRIBAL player->removeSpell(35585, SPEC_MASK_ALL, false); // Windhawk Hauberk @@ -369,6 +402,8 @@ void ProfessionUnlearnSpells(Player* player, uint32 type) player->removeSpell(35588, SPEC_MASK_ALL, false); // Windhawk Bracers player->removeSpell(36075, SPEC_MASK_ALL, false); // Wildfeather Leggings player->removeSpell(36078, SPEC_MASK_ALL, false); // Living Crystal Breastplate + player->removeSpell(10621, SPEC_MASK_ALL, false); // Wolfshead Helm + player->removeSpell(10647, SPEC_MASK_ALL, false); // Feathered Breastplate break; case S_UNLEARN_SPELLFIRE: // S_UNLEARN_SPELLFIRE player->removeSpell(26752, SPEC_MASK_ALL, false); // Spellfire Belt @@ -950,44 +985,39 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { + ClearGossipMenuFor(player); + if (creature->IsQuestGiver()) + { player->PrepareQuestMenu(creature->GetGUID()); + } - if (creature->IsVendor()) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - - // pussywizard: NO UNLEARNING! LEATHERWORKING SPECIALTY IS A PERMANENT DECISION AND CANNOT BE CHANGED IN ANY WAY! - // pussywizard: CAN RE-LEARN ONLY THE ONE FOR WHICH QUEST IS COMPLETED! - - if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 250 && player->getLevel() > 49) + if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 225 && player->getLevel() > 40) { switch (creature->GetEntry()) { - case N_TRAINER_DRAGON1: //Peter Galen - case N_TRAINER_DRAGON2: //Thorkaf Dragoneye - if (!HasLeatherSpecialty(player) && (player->GetQuestRewardStatus(5141) || player->GetQuestRewardStatus(5145))) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_DRAGON, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + case N_TRAINER_DRAGON1: //Peter Galen + case N_TRAINER_DRAGON2: //Thorkaf Dragoneye if (player->HasSpell(S_DRAGON)) { - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + AddGossipItemFor(player, creature->GetEntry() == N_TRAINER_DRAGON1 ? GOSSIP_MENU_PETER_GALEN : GOSSIP_MENU_THORKAF_DRAGONEYE, GOSSIP_MENU_OPTION_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + AddGossipItemFor(player, creature->GetEntry() == N_TRAINER_DRAGON1 ? GOSSIP_MENU_PETER_GALEN : GOSSIP_MENU_THORKAF_DRAGONEYE, GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_DRAGONSCALE, GOSSIP_SENDER_MAIN, GOSSIP_MENU_UNLEARN_CONFIRM_DRAGONSCALE); } break; - case N_TRAINER_ELEMENTAL1: //Sarah Tanner - case N_TRAINER_ELEMENTAL2: //Brumn Winterhoof - if (!HasLeatherSpecialty(player) && (player->GetQuestRewardStatus(5144) || player->GetQuestRewardStatus(5146))) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELEMENTAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + case N_TRAINER_ELEMENTAL1: //Sarah Tanner + case N_TRAINER_ELEMENTAL2: //Brumn Winterhoof if (player->HasSpell(S_ELEMENTAL)) { - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + AddGossipItemFor(player, creature->GetEntry() == N_TRAINER_ELEMENTAL1 ? GOSSIP_MENU_SARAH_TANNER : GOSSIP_MENU_BRUMN_WINTERHOOF, GOSSIP_MENU_OPTION_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + AddGossipItemFor(player, creature->GetEntry() == N_TRAINER_ELEMENTAL1 ? GOSSIP_MENU_SARAH_TANNER : GOSSIP_MENU_BRUMN_WINTERHOOF, GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_ELEMENTAL, GOSSIP_SENDER_MAIN, GOSSIP_MENU_UNLEARN_CONFIRM_ELEMENTAL); } break; - case N_TRAINER_TRIBAL1: //Caryssia Moonhunter - case N_TRAINER_TRIBAL2: //Se'Jib - if (!HasLeatherSpecialty(player) && (player->GetQuestRewardStatus(5143) || player->GetQuestRewardStatus(5148))) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRIBAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + case N_TRAINER_TRIBAL1: //Caryssia Moonhunter + case N_TRAINER_TRIBAL2: //Se'Jib if (player->HasSpell(S_TRIBAL)) { - AddGossipItemFor(player, GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + AddGossipItemFor(player, creature->GetEntry() == N_TRAINER_TRIBAL1 ? GOSSIP_MENU_CARYSSIA_MOONHUNTER : GOSSIP_MENU_SEJIB, GOSSIP_MENU_OPTION_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); + AddGossipItemFor(player, creature->GetEntry() == N_TRAINER_TRIBAL1 ? GOSSIP_MENU_CARYSSIA_MOONHUNTER : GOSSIP_MENU_SEJIB, GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_TRIBAL, GOSSIP_SENDER_MAIN, GOSSIP_MENU_UNLEARN_CONFIRM_TRIBAL); } break; } @@ -997,36 +1027,35 @@ public: return true; } - void SendActionMenu(Player* player, Creature* creature, uint32 action) + bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { + ClearGossipMenuFor(player); + switch (action) { - case GOSSIP_ACTION_TRADE: - player->GetSession()->SendListInventory(creature->GetGUID()); - break; case GOSSIP_ACTION_TRAIN: player->GetSession()->SendTrainerList(creature->GetGUID()); break; - // Learn Leather + case GOSSIP_MENU_UNLEARN_CONFIRM_DRAGONSCALE: + AddGossipItemFor(player, GOSSIP_MENU_UNLEARN_CONFIRM_DRAGONSCALE, GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_DRAGONSCALE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1, DoMedUnlearnCost(player)); + SendGossipMenuFor(player, GOSSIP_TEXT_UNLEARN_CONFIRM_DRAGONSCALE, creature); + break; + case GOSSIP_MENU_UNLEARN_CONFIRM_ELEMENTAL: + AddGossipItemFor(player, GOSSIP_MENU_UNLEARN_CONFIRM_ELEMENTAL, GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_ELEMENTAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2, DoMedUnlearnCost(player)); + SendGossipMenuFor(player, GOSSIP_TEXT_UNLEARN_CONFIRM_ELEMENTAL, creature); + break; + case GOSSIP_MENU_UNLEARN_CONFIRM_TRIBAL: + AddGossipItemFor(player, GOSSIP_MENU_UNLEARN_CONFIRM_TRIBAL, GOSSIP_MENU_OPTION_CONFIRM_UNLEARN_TRIBAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3, DoMedUnlearnCost(player)); + SendGossipMenuFor(player, GOSSIP_TEXT_UNLEARN_CONFIRM_TRIBAL, creature); + break; case GOSSIP_ACTION_INFO_DEF + 1: - ProcessCastaction(player, creature, S_DRAGON, S_LEARN_DRAGON, 0); + ProcessUnlearnAction(player, creature, S_UNLEARN_DRAGON, 0, DoMedUnlearnCost(player)); break; case GOSSIP_ACTION_INFO_DEF + 2: - ProcessCastaction(player, creature, S_ELEMENTAL, S_LEARN_ELEMENTAL, 0); + ProcessUnlearnAction(player, creature, S_UNLEARN_ELEMENTAL, 0, DoMedUnlearnCost(player)); break; case GOSSIP_ACTION_INFO_DEF + 3: - ProcessCastaction(player, creature, S_TRIBAL, S_LEARN_TRIBAL, 0); - break; - } - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) override - { - ClearGossipMenuFor(player); - switch (sender) - { - case GOSSIP_SENDER_MAIN: - SendActionMenu(player, creature, action); + ProcessUnlearnAction(player, creature, S_UNLEARN_TRIBAL, 0, DoMedUnlearnCost(player)); break; } return true; @@ -1210,9 +1239,14 @@ class go_evil_book_for_dummies : public GameObjectScript public: go_evil_book_for_dummies() : GameObjectScript("go_evil_book_for_dummies") { } + inline bool HasLeatherSpecialty(Player* player) + { + return (player->HasSpell(S_DRAGON) || player->HasSpell(S_ELEMENTAL) || player->HasSpell(S_TRIBAL)); + } + bool OnGossipHello(Player* player, GameObject* gameobject) override { - //TAILORING SPEC + //ENGINEERING SPEC if (player->HasSkill(SKILL_ENGINEERING) && player->GetBaseSkillValue(SKILL_ENGINEERING) >= 225 && player->getLevel() >= 35) { if (player->GetQuestRewardStatus(3643) || player->GetQuestRewardStatus(3641) || player->GetQuestRewardStatus(3639)) @@ -1233,6 +1267,17 @@ public: } } + //LEATHERWORKING SPEC + if (player->HasSkill(SKILL_LEATHERWORKING) && player->GetBaseSkillValue(SKILL_LEATHERWORKING) >= 225 && player->getLevel() >= 40) + { + if (!HasLeatherSpecialty(player) && (player->GetQuestRewardStatus(5141) || player->GetQuestRewardStatus(5143) || player->GetQuestRewardStatus(5144) || player->GetQuestRewardStatus(5145) || player->GetQuestRewardStatus(5146) || player->GetQuestRewardStatus(5148))) + { + AddGossipItemFor(player, GOSSIP_MENU_GO_SOOTHSAYING_FOR_DUMMIES, GOSSIP_MENU_OPTION_GO_LEARN_DRAGONSCALE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); + AddGossipItemFor(player, GOSSIP_MENU_GO_SOOTHSAYING_FOR_DUMMIES, GOSSIP_MENU_OPTION_GO_LEARN_ELEMENTAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); + AddGossipItemFor(player, GOSSIP_MENU_GO_SOOTHSAYING_FOR_DUMMIES, GOSSIP_MENU_OPTION_GO_LEARN_TRIBAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); + } + } + SendGossipMenuFor(player, player->GetGossipTextId(gameobject), gameobject->GetGUID()); return true; } @@ -1257,6 +1302,18 @@ public: case GOSSIP_ACTION_INFO_DEF + 4: ProcessUnlearnAction(player, nullptr, S_UNLEARN_GNOMISH, 0, DoHighUnlearnCost(player)); break; + //Learn Dragon + case GOSSIP_ACTION_INFO_DEF + 5: + ProcessCastaction(player, nullptr, S_DRAGON, S_LEARN_DRAGON, 0); + break; + //Learn Elemental + case GOSSIP_ACTION_INFO_DEF + 6: + ProcessCastaction(player, nullptr, S_ELEMENTAL, S_LEARN_ELEMENTAL, 0); + break; + //Learn Tribal + case GOSSIP_ACTION_INFO_DEF + 7: + ProcessCastaction(player, nullptr, S_TRIBAL, S_LEARN_TRIBAL, 0); + break; } }