// Copyright (c) CypherCore All rights reserved. // Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. using Framework.Constants; using Game.AI; using Game.Entities; using Game.Scripting; using Game.Spells; using static Global; namespace Scripts.World.NpcProfessions { struct SpellIds { public const uint Weapon = 9787; public const uint Armor = 9788; public const uint Hammer = 17040; public const uint Axe = 17041; public const uint Sword = 17039; public const uint LearnWeapon = 9789; public const uint LearnArmor = 9790; public const uint LearnHammer = 39099; public const uint LearnAxe = 39098; public const uint LearnSword = 39097; public const uint UnlearnWeapon = 36436; public const uint UnlearnArmor = 36435; public const uint UnlearnHammer = 36441; public const uint UnlearnAxe = 36439; public const uint UnlearnSword = 36438; public const uint RepArmor = 17451; public const uint RepWeapon = 17452; public const uint Dragon = 10656; public const uint Elemental = 10658; public const uint Tribal = 10660; public const uint LearnDragon = 10657; public const uint LearnElemental = 10659; public const uint LearnTribal = 10661; public const uint UnlearnDragon = 36434; public const uint UnlearnElemental = 36328; public const uint UnlearnTribal = 36433; public const uint Goblin = 20222; public const uint Gnomish = 20219; public const uint LearnGoblin = 20221; public const uint LearnGnomish = 20220; public const uint Spellfire = 26797; public const uint Mooncloth = 26798; public const uint Shadoweave = 26801; public const uint LearnSpellfire = 26796; public const uint LearnMooncloth = 26799; public const uint LearnShadoweave = 26800; public const uint UnlearnSpellfire = 41299; public const uint UnlearnMooncloth = 41558; public const uint UnlearnShadoweave = 41559; public const uint Transmute = 28672; public const uint Elixir = 28677; public const uint Potion = 28675; public const uint LearnTransmute = 28674; public const uint LearnElixir = 28678; public const uint LearnPotion = 28676; public const uint UnlearnTransmute = 41565; public const uint UnlearnElixir = 41564; public const uint UnlearnPotion = 41563; // EngineeringTrinkets public const uint LearnToEverlook = 23490; public const uint LearnToGadget = 23491; public const uint LearnToArea52 = 36956; public const uint LearnToToshley = 36957; public const uint ToEverlook = 23486; public const uint ToGadget = 23489; public const uint ToArea52 = 36954; public const uint ToToshley = 36955; } struct CreatureIds { //Alchemy public const uint TrainerTransmute = 22427; // Zarevhi public const uint TrainerElixir = 19052; // Lorokeem public const uint TrainerPotion = 17909; // Lauranna Thar'well //Blacksmithing public const uint TrainerSmithomni1 = 11145; // Myolor Sunderfury public const uint TrainerSmithomni2 = 11176; // Krathok Moltenfist public const uint TrainerWeapon1 = 11146; // Ironus Coldsteel public const uint TrainerWeapon2 = 11178; // Borgosh Corebender public const uint TrainerArmor1 = 5164; // Grumnus Steelshaper public const uint TrainerArmor2 = 11177; // Okothos Ironrager public const uint TrainerHammer = 11191; // Lilith the Lithe public const uint TrainerAxe = 11192; // Kilram public const uint TrainerSword = 11193; // Seril Scourgebane //Leatherworking public const uint TrainerDragon1 = 7866; // Peter Galen public const uint TrainerDragon2 = 7867; // Thorkaf Dragoneye public const uint TrainerElemental1 = 7868; // Sarah Tanner public const uint TrainerElemental2 = 7869; // Brumn Winterhoof public const uint TrainerTribal1 = 7870; // Caryssia Moonhunter public const uint TrainerTribal2 = 7871; // Se'Jib //Tailoring public const uint TrainerSpellfire = 22213; // Gidge Spellweaver public const uint TrainerMooncloth = 22208; // Nasmara Moonsong public const uint TrainerShadoweave = 22212; // Andrion Darkspinner // EngineeringTrinkets public const uint Zap = 14742; public const uint Jhordy = 14743; public const uint Kablam = 21493; public const uint Smiles = 21494; } struct QuestIds { //Alchemy public const uint MasterTransmute = 10899; public const uint MasterElixir = 10902; public const uint MasterPotion = 10897; } struct ProfessionConst { public const string GossipTextBrowseGoods = "I'd like to browse your goods."; public const string GossipTextTrain = "Train me!"; public const uint RepArmor = 46; public const uint RepWeapon = 289; public const uint RepHammer = 569; public const uint RepAxe = 570; public const uint RepSword = 571; public const uint TrainerIdAlchemy = 122; public const uint TrainerIdBlacksmithing = 80; public const uint TrainerIdLeatherworking = 103; public const uint TrainerIdTailoring = 117; public const string TalkMustUnlearnWeapon = "You must forget your weapon type specialty before I can help you. Go to Everlook in Winterspring and seek help there."; public const string TalkHammerLearn = "Ah, a seasoned veteran you once were. I know you are capable, you merely need to ask and I shall teach you the way of the hammersmith."; public const string TalkAxeLearn = "Ah, a seasoned veteran you once were. I know you are capable, you merely need to ask and I shall teach you the way of the axesmith."; public const string TalkSwordLearn = "Ah, a seasoned veteran you once were. I know you are capable, you merely need to ask and I shall teach you the way of the swordsmith."; public const string TalkHammerUnlearn = "Forgetting your Hammersmithing skill is not something to do lightly. If you choose to abandon it you will forget all recipes that require Hammersmithing to create!"; public const string TalkAxeUnlearn = "Forgetting your Axesmithing skill is not something to do lightly. If you choose to abandon it you will forget all recipes that require Axesmithing to create!"; public const string TalkSwordUnlearn = "Forgetting your Swordsmithing skill is not something to do lightly. If you choose to abandon it you will forget all recipes that require Swordsmithing to create!"; public const uint GossipSenderLearn = 50; public const uint GossipSenderUnlearn = 51; public const uint GossipSenderCheck = 52; public const string GossipLearnPotion = "Please teach me how to become a Master of Potions, Lauranna"; public const string GossipUnlearnPotion = "I wish to unlearn Potion Mastery"; public const string GossipLearnTransmute = "Please teach me how to become a Master of Transmutations, Zarevhi"; public const string GossipUnlearnTransmute = "I wish to unlearn Transmutation Mastery"; public const string GossipLearnElixir = "Please teach me how to become a Master of Elixirs, Lorokeem"; public const string GossipUnlearnElixir = "I wish to unlearn Elixir Mastery"; public const string BoxUnlearnAlchemySpec = "Do you really want to unlearn your alchemy specialty and lose all associated recipes? \n Cost: "; public const string GossipWeaponLearn = "Please teach me how to become a Weaponsmith"; public const string GossipWeaponUnlearn = "I wish to unlearn the art of Weaponsmithing"; public const string GossipArmorLearn = "Please teach me how to become a Armorsmith"; public const string GossipArmorUnlearn = "I wish to unlearn the art of Armorsmithing"; public const string GossipUnlearnSmithSpec = "I wish to unlearn my blacksmith specialty"; public const string BoxUnlearnAmorOrWeapon = "Do you really want to unlearn your blacksmith specialty and lose all associated recipes? \n Cost: "; public const string GossipLearnHammer = "Please teach me how to become a Hammersmith, Lilith"; public const string GossipUnlearnHammer = "I wish to unlearn Hammersmithing"; public const string GossipLearnAxe = "Please teach me how to become a Axesmith, Kilram"; public const string GossipUnlearnAxe = "I wish to unlearn Axesmithing"; public const string GossipLearnSword = "Please teach me how to become a Swordsmith, Seril"; public const string GossipUnlearnSword = "I wish to unlearn Swordsmithing"; public const string BoxUnlearnWeaponSpec = "Do you really want to unlearn your weaponsmith specialty and lose all associated recipes? \n Cost: "; public const string GossipUnlearnDragon = "I wish to unlearn Dragonscale Leatherworking"; public const string GossipUnlearnElemental = "I wish to unlearn Elemental Leatherworking"; public const string GossipUnlearnTribal = "I wish to unlearn Tribal Leatherworking"; public const string BoxUnlearnLeatherSpec = "Do you really want to unlearn your leatherworking specialty and lose all associated recipes? \n Cost: "; public const string GossipLearnSpellfire = "Please teach me how to become a Spellcloth tailor"; public const string GossipUnlearnSpellfire = "I wish to unlearn Spellfire Tailoring"; public const string GossipLearnMooncloth = "Please teach me how to become a Mooncloth tailor"; public const string GossipUnlearnMooncloth = "I wish to unlearn Mooncloth Tailoring"; public const string GossipLearnShadoweave = "Please teach me how to become a Shadoweave tailor"; public const string GossipUnlearnShadoweave = "I wish to unlearn Shadoweave Tailoring"; public const string BoxUnlearnTailorSpec = "Do you really want to unlearn your tailoring specialty and lose all associated recipes? \n Cost: "; public const uint GossipOptionAlchemy = 0; public const uint GossipOptionBlacksmithing = 1; public const uint GossipOptionEnchanting = 2; public const uint GossipOptionEngineering = 3; public const uint GossipOptionHerbalism = 4; public const uint GossipOptionInscription = 5; public const uint GossipOptionJewelcrafting = 6; public const uint GossipOptionLeatherworking = 7; public const uint GossipOptionMining = 8; public const uint GossipOptionSkinning = 9; public const uint GossipOptionTailoring = 10; public const uint GossipOptionMulti = 11; public const uint GossipMenuHerbalism = 12188; public const uint GossipMenuMining = 12189; public const uint GossipMenuSkinning = 12190; public const uint GossipMenuAlchemy = 12191; public const uint GossipMenuBlacksmithing = 12192; public const uint GossipMenuEnchanting = 12193; public const uint GossipMenuEngineering = 12195; public const uint GossipMenuInscription = 12196; public const uint GossipMenuJewelcrafting = 12197; public const uint GossipMenuLeatherworking = 12198; public const uint GossipMenuTailoring = 12199; public const string GossipItemZap = "This Dimensional Imploder sounds dangerous! How can I make one?"; public const string GossipItemJhordy = "I must build a beacon for this marvelous device!"; public const string GossipItemKablam = "[PH] Unknown"; public static int DoLearnCost(Player player) //tailor, alchemy { return 200000; } public static int DoHighUnlearnCost(Player player) //tailor, alchemy { return 1500000; } public static int DoMedUnlearnCost(Player player) //blacksmith, leatherwork { uint level = player.GetLevel(); if (level < 51) return 250000; else if (level < 66) return 500000; else return 1000000; } public static int DoLowUnlearnCost(Player player) //blacksmith { uint level = player.GetLevel(); if (level < 66) return 50000; else return 100000; } public static void ProcessCastaction(Player player, Creature creature, uint spellId, uint triggeredSpellId, int Cost) { if (!(spellId != 0 && player.HasSpell(spellId)) && player.HasEnoughMoney(Cost)) { player.CastSpell(player, triggeredSpellId, true); player.ModifyMoney(-Cost); } else player.SendBuyError(BuyResult.NotEnoughtMoney, creature, 0); player.CloseGossipMenu(); } static bool EquippedOk(Player player, uint spellId) { SpellInfo spell = SpellMgr.GetSpellInfo(spellId, Difficulty.None); if (spell == null) return false; foreach (SpellEffectInfo spellEffectInfo in spell.GetEffects()) { uint reqSpell = spellEffectInfo.TriggerSpell; if (reqSpell == 0) continue; Item item; for (byte j = EquipmentSlot.Start; j < EquipmentSlot.End; ++j) { item = player.GetItemByPos(InventorySlots.Bag0, j); if (item != null && item.GetTemplate().GetRequiredSpell() == reqSpell) { //player has item equipped that require specialty. Not allow to unlearn, player has to unequip first Log.outDebug(LogFilter.Scripts, $"player attempt to unlearn spell {reqSpell}, but item {item.GetEntry()} is equipped."); return false; } } } return true; } static void ProfessionUnlearnSpells(Player player, uint type) { switch (type) { case SpellIds.UnlearnWeapon: // SUnlearnWeapon player.RemoveSpell(36125); // Light Earthforged Blade player.RemoveSpell(36128); // Light Emberforged Hammer player.RemoveSpell(36126); // Light Skyforged Axe break; case SpellIds.UnlearnArmor: // SUnlearnArmor player.RemoveSpell(36122); // Earthforged Leggings player.RemoveSpell(36129); // Heavy Earthforged Breastplate player.RemoveSpell(36130); // Stormforged Hauberk player.RemoveSpell(34533); // Breastplate of Kings player.RemoveSpell(34529); // Nether Chain Shirt player.RemoveSpell(34534); // Bulwark of Kings player.RemoveSpell(36257); // Bulwark of the Ancient Kings player.RemoveSpell(36256); // Embrace of the Twisting Nether player.RemoveSpell(34530); // Twisting Nether Chain Shirt player.RemoveSpell(36124); // Windforged Leggings break; case SpellIds.UnlearnHammer: // SUnlearnHammer player.RemoveSpell(36262); // Dragonstrike player.RemoveSpell(34546); // Dragonmaw player.RemoveSpell(34545); // Drakefist Hammer player.RemoveSpell(36136); // Lavaforged Warhammer player.RemoveSpell(34547); // Thunder player.RemoveSpell(34567); // Deep Thunder player.RemoveSpell(36263); // Stormherald player.RemoveSpell(36137); // Great Earthforged Hammer break; case SpellIds.UnlearnAxe: // SUnlearnAxe player.RemoveSpell(36260); // Wicked Edge of the Planes player.RemoveSpell(34562); // Black Planar Edge player.RemoveSpell(34541); // The Planar Edge player.RemoveSpell(36134); // Stormforged Axe player.RemoveSpell(36135); // Skyforged Great Axe player.RemoveSpell(36261); // Bloodmoon player.RemoveSpell(34543); // Lunar Crescent player.RemoveSpell(34544); // Mooncleaver break; case SpellIds.UnlearnSword: // SUnlearnSword player.RemoveSpell(36258); // Blazefury player.RemoveSpell(34537); // Blazeguard player.RemoveSpell(34535); // Fireguard player.RemoveSpell(36131); // Windforged Rapier player.RemoveSpell(36133); // Stoneforged Claymore player.RemoveSpell(34538); // Lionheart Blade player.RemoveSpell(34540); // Lionheart Chapion player.RemoveSpell(36259); // Lionheart Executioner break; case SpellIds.UnlearnDragon: // SUnlearnDragon player.RemoveSpell(36076); // Dragonstrike Leggings player.RemoveSpell(36079); // Golden Dragonstrike Breastplate player.RemoveSpell(35576); // Ebon Netherscale Belt player.RemoveSpell(35577); // Ebon Netherscale Bracers player.RemoveSpell(35575); // Ebon Netherscale Breastplate player.RemoveSpell(35582); // Netherstrike Belt player.RemoveSpell(35584); // Netherstrike Bracers player.RemoveSpell(35580); // Netherstrike Breastplate break; case SpellIds.UnlearnElemental: // SUnlearnElemental player.RemoveSpell(36074); // Blackstorm Leggings player.RemoveSpell(36077); // Primalstorm Breastplate player.RemoveSpell(35590); // Primalstrike Belt player.RemoveSpell(35591); // Primalstrike Bracers player.RemoveSpell(35589); // Primalstrike Vest break; case SpellIds.UnlearnTribal: // SUnlearnTribal player.RemoveSpell(35585); // Windhawk Hauberk player.RemoveSpell(35587); // Windhawk Belt player.RemoveSpell(35588); // Windhawk Bracers player.RemoveSpell(36075); // Wildfeather Leggings player.RemoveSpell(36078); // Living Crystal Breastplate break; case SpellIds.UnlearnSpellfire: // SUnlearnSpellfire player.RemoveSpell(26752); // Spellfire Belt player.RemoveSpell(26753); // Spellfire Gloves player.RemoveSpell(26754); // Spellfire Robe break; case SpellIds.UnlearnMooncloth: // SUnlearnMooncloth player.RemoveSpell(26760); // Primal Mooncloth Belt player.RemoveSpell(26761); // Primal Mooncloth Shoulders player.RemoveSpell(26762); // Primal Mooncloth Robe break; case SpellIds.UnlearnShadoweave: // SUnlearnShadoweave player.RemoveSpell(26756); // Frozen Shadoweave Shoulders player.RemoveSpell(26757); // Frozen Shadoweave Boots player.RemoveSpell(26758); // Frozen Shadoweave Robe break; } } public static void ProcessUnlearnAction(Player player, Creature creature, uint spellId, uint alternativeSpellId, int Cost) { if (EquippedOk(player, spellId)) { if (player.HasEnoughMoney(Cost)) { player.CastSpell(player, spellId, true); ProfessionUnlearnSpells(player, spellId); player.ModifyMoney(-Cost); if (alternativeSpellId != 0) creature.CastSpell(player, alternativeSpellId, true); } else player.SendBuyError(BuyResult.NotEnoughtMoney, creature, 0); } else player.SendEquipError(InventoryResult.ClientLockedOut, null, null); player.CloseGossipMenu(); } } [Script] class npc_prof_alchemy : ScriptedAI { public npc_prof_alchemy(Creature creature) : base(creature) { } bool HasAlchemySpell(Player player) { return player.HasSpell(SpellIds.Transmute) || player.HasSpell(SpellIds.Elixir) || player.HasSpell(SpellIds.Potion); } public override bool OnGossipHello(Player player) { if (me.IsQuestGiver()) if (me.IsVendor()) player.AddGossipItem(GossipOptionNpc.Vendor, "I'd like to browse your goods.", eTradeskill.GossipSenderMain, eTradeskill.GossipActionTrade); if (me.IsTrainer()) player.AddGossipItem(GossipOptionNpc.Trainer, "Train me!", eTradeskill.GossipSenderMain, eTradeskill.GossipActionTrain); if (player.HasSkill(SkillType.Alchemy) && player.GetBaseSkillValue(SkillType.Alchemy) >= 350 && player.GetLevel() > 67) { if (player.GetQuestRewardStatus(QuestIds.MasterTransmute) || player.GetQuestRewardStatus(QuestIds.MasterElixir) || player.GetQuestRewardStatus(QuestIds.MasterPotion)) { switch (me.GetEntry()) { case CreatureIds.TrainerTransmute: //Zarevhi if (!HasAlchemySpell(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnTransmute, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 1); if (player.HasSpell(SpellIds.Transmute)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnTransmute, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 4); break; case CreatureIds.TrainerElixir: //Lorokeem if (!HasAlchemySpell(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnElixir, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 2); if (player.HasSpell(SpellIds.Elixir)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnElixir, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 5); break; case CreatureIds.TrainerPotion: //Lauranna Thar'well if (!HasAlchemySpell(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnPotion, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 3); if (player.HasSpell(SpellIds.Potion)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnPotion, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 6); break; } } } player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); return true; } void SendActionMenu(Player player, uint action) { switch (action) { case eTradeskill.GossipActionTrade: player.GetSession().SendListInventory(me.GetGUID()); break; case eTradeskill.GossipActionTrain: player.GetSession().SendTrainerList(me, ProfessionConst.TrainerIdAlchemy); break; //Learn Alchemy case eTradeskill.GossipActionInfoDef + 1: ProfessionConst.ProcessCastaction(player, me, SpellIds.Transmute, SpellIds.LearnTransmute, ProfessionConst.DoLearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 2: ProfessionConst.ProcessCastaction(player, me, SpellIds.Elixir, SpellIds.LearnElixir, ProfessionConst.DoLearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 3: ProfessionConst.ProcessCastaction(player, me, SpellIds.Potion, SpellIds.LearnPotion, ProfessionConst.DoLearnCost(player)); break; //Unlearn Alchemy case eTradeskill.GossipActionInfoDef + 4: ProfessionConst.ProcessCastaction(player, me, 0, SpellIds.UnlearnTransmute, ProfessionConst.DoHighUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 5: ProfessionConst.ProcessCastaction(player, me, 0, SpellIds.UnlearnElixir, ProfessionConst.DoHighUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 6: ProfessionConst.ProcessCastaction(player, me, 0, SpellIds.UnlearnPotion, ProfessionConst.DoHighUnlearnCost(player)); break; } } void SendConfirmLearn(Player player, uint action) { if (action != 0) { switch (me.GetEntry()) { case CreatureIds.TrainerTransmute: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnTransmute, ProfessionConst.GossipSenderCheck, action); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerElixir: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnElixir, ProfessionConst.GossipSenderCheck, action); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerPotion: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnPotion, ProfessionConst.GossipSenderCheck, action); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; } } } void SendConfirmUnlearn(Player player, uint action) { if (action != 0) { switch (me.GetEntry()) { case CreatureIds.TrainerTransmute: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnTransmute, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnAlchemySpec, (uint)ProfessionConst.DoHighUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerElixir: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnElixir, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnAlchemySpec, (uint)ProfessionConst.DoHighUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerPotion: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnPotion, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnAlchemySpec, (uint)ProfessionConst.DoHighUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; } } } public override bool OnGossipSelect(Player player, uint menuId, uint gossipListId) { uint sender = player.PlayerTalkClass.GetGossipOptionSender(gossipListId); uint action = player.PlayerTalkClass.GetGossipOptionAction(gossipListId); player.ClearGossipMenu(); switch (sender) { case eTradeskill.GossipSenderMain: SendActionMenu(player, action); break; case ProfessionConst.GossipSenderLearn: SendConfirmLearn(player, action); break; case ProfessionConst.GossipSenderUnlearn: SendConfirmUnlearn(player, action); break; case ProfessionConst.GossipSenderCheck: SendActionMenu(player, action); break; } return true; } } [Script] class npc_prof_blacksmith : ScriptedAI { public npc_prof_blacksmith(Creature creature) : base(creature) { } bool HasWeaponSub(Player player) { return (player.HasSpell(SpellIds.Hammer) || player.HasSpell(SpellIds.Axe) || player.HasSpell(SpellIds.Sword)); } public override bool OnGossipHello(Player player) { if (me.IsQuestGiver()) if (me.IsVendor()) player.AddGossipItem(GossipOptionNpc.Vendor, ProfessionConst.GossipTextBrowseGoods, eTradeskill.GossipSenderMain, eTradeskill.GossipActionTrade); if (me.IsTrainer()) player.AddGossipItem(GossipOptionNpc.Trainer, ProfessionConst.GossipTextTrain, eTradeskill.GossipSenderMain, eTradeskill.GossipActionTrain); uint creatureId = me.GetEntry(); //Weaponsmith & Armorsmith if (player.GetBaseSkillValue(SkillType.Blacksmithing) >= 225) { switch (creatureId) { case CreatureIds.TrainerSmithomni1: case CreatureIds.TrainerSmithomni2: if (!player.HasSpell(SpellIds.Armor) && !player.HasSpell(SpellIds.Weapon) && player.GetReputationRank(ProfessionConst.RepArmor) >= ReputationRank.Friendly) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipArmorLearn, eTradeskill.GossipSenderMain, eTradeskill.GossipActionInfoDef + 1); if (!player.HasSpell(SpellIds.Weapon) && !player.HasSpell(SpellIds.Armor) && player.GetReputationRank(ProfessionConst.RepWeapon) >= ReputationRank.Friendly) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipWeaponLearn, eTradeskill.GossipSenderMain, eTradeskill.GossipActionInfoDef + 2); break; case CreatureIds.TrainerWeapon1: case CreatureIds.TrainerWeapon2: if (player.HasSpell(SpellIds.Weapon)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipWeaponUnlearn, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 3); break; case CreatureIds.TrainerArmor1: case CreatureIds.TrainerArmor2: if (player.HasSpell(SpellIds.Armor)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipArmorUnlearn, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 4); break; } } //Weaponsmith Spec if (player.HasSpell(SpellIds.Weapon) && player.GetLevel() > 49 && player.GetBaseSkillValue(SkillType.Blacksmithing) >= 250) { switch (creatureId) { case CreatureIds.TrainerHammer: if (!HasWeaponSub(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnHammer, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 5); if (player.HasSpell(SpellIds.Hammer)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnHammer, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 8); break; case CreatureIds.TrainerAxe: if (!HasWeaponSub(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnAxe, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 6); if (player.HasSpell(SpellIds.Axe)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnAxe, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 9); break; case CreatureIds.TrainerSword: if (!HasWeaponSub(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnSword, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 7); if (player.HasSpell(SpellIds.Sword)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnSword, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 10); break; } } player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); return true; } void SendActionMenu(Player player, uint action) { switch (action) { case eTradeskill.GossipActionTrade: player.GetSession().SendListInventory(me.GetGUID()); break; case eTradeskill.GossipActionTrain: player.GetSession().SendTrainerList(me, ProfessionConst.TrainerIdBlacksmithing); break; //Learn Armor/Weapon case eTradeskill.GossipActionInfoDef + 1: if (!player.HasSpell(SpellIds.Armor)) { player.CastSpell(player, SpellIds.LearnArmor, true); //_Creature.CastSpell(player, SRepArmor, true); } player.CloseGossipMenu(); break; case eTradeskill.GossipActionInfoDef + 2: if (!player.HasSpell(SpellIds.Weapon)) { player.CastSpell(player, SpellIds.LearnWeapon, true); //_Creature.CastSpell(player, SRepWeapon, true); } player.CloseGossipMenu(); break; //Unlearn Armor/Weapon case eTradeskill.GossipActionInfoDef + 3: if (HasWeaponSub(player)) { //unknown textID (TalkMustUnlearnWeapon) player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); } else ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnWeapon, SpellIds.RepArmor, ProfessionConst.DoLowUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 4: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnArmor, SpellIds.RepWeapon, ProfessionConst.DoLowUnlearnCost(player)); break; //Learn Hammer/Axe/Sword case eTradeskill.GossipActionInfoDef + 5: player.CastSpell(player, SpellIds.LearnHammer, true); player.CloseGossipMenu(); break; case eTradeskill.GossipActionInfoDef + 6: player.CastSpell(player, SpellIds.LearnAxe, true); player.CloseGossipMenu(); break; case eTradeskill.GossipActionInfoDef + 7: player.CastSpell(player, SpellIds.LearnSword, true); player.CloseGossipMenu(); break; //Unlearn Hammer/Axe/Sword case eTradeskill.GossipActionInfoDef + 8: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnHammer, 0, ProfessionConst.DoMedUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 9: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnAxe, 0, ProfessionConst.DoMedUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 10: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnSword, 0, ProfessionConst.DoMedUnlearnCost(player)); break; } } void SendConfirmLearn(Player player, uint action) { if (action != 0) { switch (me.GetEntry()) { case CreatureIds.TrainerHammer: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnHammer, ProfessionConst.GossipSenderCheck, action); //unknown textID (TalkHammerLearn) player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerAxe: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnAxe, ProfessionConst.GossipSenderCheck, action); //unknown textID (TalkAxeLearn) player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerSword: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnSword, ProfessionConst.GossipSenderCheck, action); //unknown textID (TalkSwordLearn) player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; } } } void SendConfirmUnlearn(Player player, uint action) { if (action != 0) { switch (me.GetEntry()) { case CreatureIds.TrainerWeapon1: case CreatureIds.TrainerWeapon2: case CreatureIds.TrainerArmor1: case CreatureIds.TrainerArmor2: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnSmithSpec, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnAmorOrWeapon, (uint)ProfessionConst.DoLowUnlearnCost(player), false); //unknown textID (TalkUnlearnAxeorweapon) player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerHammer: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnHammer, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnWeaponSpec, (uint)ProfessionConst.DoMedUnlearnCost(player), false); //unknown textID (TalkHammerUnlearn) player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerAxe: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnAxe, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnWeaponSpec, (uint)ProfessionConst.DoMedUnlearnCost(player), false); //unknown textID (TalkAxeUnlearn) player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerSword: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnSword, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnWeaponSpec, (uint)ProfessionConst.DoMedUnlearnCost(player), false); //unknown textID (TalkSwordUnlearn) player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; } } } public override bool OnGossipSelect(Player player, uint menuId, uint gossipListId) { uint sender = player.PlayerTalkClass.GetGossipOptionSender(gossipListId); uint action = player.PlayerTalkClass.GetGossipOptionAction(gossipListId); player.ClearGossipMenu(); switch (sender) { case eTradeskill.GossipSenderMain: SendActionMenu(player, action); break; case ProfessionConst.GossipSenderLearn: SendConfirmLearn(player, action); break; case ProfessionConst.GossipSenderUnlearn: SendConfirmUnlearn(player, action); break; case ProfessionConst.GossipSenderCheck: SendActionMenu(player, action); break; } return true; } } [Script] class npc_engineering_tele_trinket : ScriptedAI { public npc_engineering_tele_trinket(Creature creature) : base(creature) { } bool CanLearn(Player player, uint textId, uint altTextId, uint skillValue, uint reqSpellId, uint spellId, ref uint npcTextId) { bool res = false; npcTextId = textId; if (player.GetBaseSkillValue(SkillType.Engineering) >= skillValue && player.HasSpell(reqSpellId)) { if (!player.HasSpell(spellId)) res = true; else npcTextId = altTextId; } return res; } public override bool OnGossipHello(Player player) { uint npcTextId = 0; string gossipItem = ""; bool canLearn = false; if (player.HasSkill(SkillType.Engineering)) { switch (me.GetEntry()) { case CreatureIds.Zap: canLearn = CanLearn(player, 6092, 0, 260, SpellIds.Goblin, SpellIds.ToEverlook, ref npcTextId); if (canLearn) gossipItem = ProfessionConst.GossipItemZap; break; case CreatureIds.Jhordy: canLearn = CanLearn(player, 7251, 7252, 260, SpellIds.Gnomish, SpellIds.ToGadget, ref npcTextId); if (canLearn) gossipItem = ProfessionConst.GossipItemJhordy; break; case CreatureIds.Kablam: canLearn = CanLearn(player, 10365, 0, 350, SpellIds.Goblin, SpellIds.ToArea52, ref npcTextId); if (canLearn) gossipItem = ProfessionConst.GossipItemKablam; break; case CreatureIds.Smiles: canLearn = CanLearn(player, 10363, 0, 350, SpellIds.Gnomish, SpellIds.ToToshley, ref npcTextId); if (canLearn) gossipItem = ProfessionConst.GossipItemKablam; break; } } if (canLearn) player.AddGossipItem(GossipOptionNpc.None, gossipItem, me.GetEntry(), eTradeskill.GossipActionInfoDef + 1); player.SendGossipMenu(npcTextId != 0 ? npcTextId : player.GetGossipTextId(me), me.GetGUID()); return true; } public override bool OnGossipSelect(Player player, uint menuId, uint gossipListId) { uint sender = player.PlayerTalkClass.GetGossipOptionSender(gossipListId); uint action = player.PlayerTalkClass.GetGossipOptionAction(gossipListId); player.ClearGossipMenu(); if (action == eTradeskill.GossipActionInfoDef + 1) player.CloseGossipMenu(); if (sender != me.GetEntry()) return true; switch (sender) { case CreatureIds.Zap: player.CastSpell(player, SpellIds.LearnToEverlook, false); break; case CreatureIds.Jhordy: player.CastSpell(player, SpellIds.LearnToGadget, false); break; case CreatureIds.Kablam: player.CastSpell(player, SpellIds.LearnToArea52, false); break; case CreatureIds.Smiles: player.CastSpell(player, SpellIds.LearnToToshley, false); break; } return true; } } [Script] class npc_prof_leather : ScriptedAI { public npc_prof_leather(Creature creature) : base(creature) { } public override bool OnGossipHello(Player player) { if (me.IsQuestGiver()) if (me.IsVendor()) player.AddGossipItem(GossipOptionNpc.Vendor, ProfessionConst.GossipTextBrowseGoods, eTradeskill.GossipSenderMain, eTradeskill.GossipActionTrade); if (me.IsTrainer()) player.AddGossipItem(GossipOptionNpc.Trainer, ProfessionConst.GossipTextTrain, eTradeskill.GossipSenderMain, eTradeskill.GossipActionTrain); if (player.HasSkill(SkillType.Tailoring) && player.GetBaseSkillValue(SkillType.Tailoring) >= 250 && player.GetLevel() > 49) { switch (me.GetEntry()) { case CreatureIds.TrainerDragon1: case CreatureIds.TrainerDragon2: if (player.HasSpell(SpellIds.Dragon)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnDragon, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 1); break; case CreatureIds.TrainerElemental1: case CreatureIds.TrainerElemental2: if (player.HasSpell(SpellIds.Elemental)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnElemental, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 2); break; case CreatureIds.TrainerTribal1: case CreatureIds.TrainerTribal2: if (player.HasSpell(SpellIds.Tribal)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnTribal, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 3); break; } } player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); return true; } void SendActionMenu(Player player, uint action) { switch (action) { case eTradeskill.GossipActionTrade: player.GetSession().SendListInventory(me.GetGUID()); break; case eTradeskill.GossipActionTrain: player.GetSession().SendTrainerList(me, ProfessionConst.TrainerIdLeatherworking); break; //Unlearn Leather case eTradeskill.GossipActionInfoDef + 1: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnDragon, 0, ProfessionConst.DoMedUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 2: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnElemental, 0, ProfessionConst.DoMedUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 3: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnTribal, 0, ProfessionConst.DoMedUnlearnCost(player)); break; } } void SendConfirmUnlearn(Player player, uint action) { if (action != 0) { switch (me.GetEntry()) { case CreatureIds.TrainerDragon1: case CreatureIds.TrainerDragon2: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnDragon, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnLeatherSpec, (uint)ProfessionConst.DoMedUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerElemental1: case CreatureIds.TrainerElemental2: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnElemental, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnLeatherSpec, (uint)ProfessionConst.DoMedUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerTribal1: case CreatureIds.TrainerTribal2: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnTribal, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnLeatherSpec, (uint)ProfessionConst.DoMedUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; } } } public override bool OnGossipSelect(Player player, uint menuId, uint gossipListId) { uint sender = player.PlayerTalkClass.GetGossipOptionSender(gossipListId); uint action = player.PlayerTalkClass.GetGossipOptionAction(gossipListId); player.ClearGossipMenu(); switch (sender) { case eTradeskill.GossipSenderMain: SendActionMenu(player, action); break; case ProfessionConst.GossipSenderUnlearn: SendConfirmUnlearn(player, action); break; case ProfessionConst.GossipSenderCheck: SendActionMenu(player, action); break; } return true; } } [Script] class npc_prof_tailor : ScriptedAI { public npc_prof_tailor(Creature creature) : base(creature) { } bool HasTailorSpell(Player player) { return (player.HasSpell(SpellIds.Mooncloth) || player.HasSpell(SpellIds.Shadoweave) || player.HasSpell(SpellIds.Spellfire)); } public override bool OnGossipHello(Player player) { if (me.IsQuestGiver()) if (me.IsVendor()) player.AddGossipItem(GossipOptionNpc.Vendor, ProfessionConst.GossipTextBrowseGoods, eTradeskill.GossipSenderMain, eTradeskill.GossipActionTrade); if (me.IsTrainer()) player.AddGossipItem(GossipOptionNpc.Trainer, ProfessionConst.GossipTextTrain, eTradeskill.GossipSenderMain, eTradeskill.GossipActionTrain); //Tailoring Spec if (player.HasSkill(SkillType.Tailoring) && player.GetBaseSkillValue(SkillType.Tailoring) >= 350 && player.GetLevel() > 59) { if (player.GetQuestRewardStatus(10831) || player.GetQuestRewardStatus(10832) || player.GetQuestRewardStatus(10833)) { switch (me.GetEntry()) { case CreatureIds.TrainerSpellfire: if (!HasTailorSpell(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnSpellfire, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 1); if (player.HasSpell(SpellIds.Spellfire)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnSpellfire, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 4); break; case CreatureIds.TrainerMooncloth: if (!HasTailorSpell(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnMooncloth, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 2); if (player.HasSpell(SpellIds.Mooncloth)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnMooncloth, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 5); break; case CreatureIds.TrainerShadoweave: if (!HasTailorSpell(player)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnShadoweave, ProfessionConst.GossipSenderLearn, eTradeskill.GossipActionInfoDef + 3); if (player.HasSpell(SpellIds.Shadoweave)) player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnShadoweave, ProfessionConst.GossipSenderUnlearn, eTradeskill.GossipActionInfoDef + 6); break; } } } player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); return true; } void SendActionMenu(Player player, uint action) { switch (action) { case eTradeskill.GossipActionTrade: player.GetSession().SendListInventory(me.GetGUID()); break; case eTradeskill.GossipActionTrain: player.GetSession().SendTrainerList(me, ProfessionConst.TrainerIdTailoring); break; //Learn Tailor case eTradeskill.GossipActionInfoDef + 1: ProfessionConst.ProcessCastaction(player, me, SpellIds.Spellfire, SpellIds.LearnSpellfire, ProfessionConst.DoLearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 2: ProfessionConst.ProcessCastaction(player, me, SpellIds.Mooncloth, SpellIds.LearnMooncloth, ProfessionConst.DoLearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 3: ProfessionConst.ProcessCastaction(player, me, SpellIds.Shadoweave, SpellIds.LearnShadoweave, ProfessionConst.DoLearnCost(player)); break; //Unlearn Tailor case eTradeskill.GossipActionInfoDef + 4: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnSpellfire, 0, ProfessionConst.DoHighUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 5: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnMooncloth, 0, ProfessionConst.DoHighUnlearnCost(player)); break; case eTradeskill.GossipActionInfoDef + 6: ProfessionConst.ProcessUnlearnAction(player, me, SpellIds.UnlearnShadoweave, 0, ProfessionConst.DoHighUnlearnCost(player)); break; } } void SendConfirmLearn(Player player, uint action) { if (action != 0) { switch (me.GetEntry()) { case CreatureIds.TrainerSpellfire: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnSpellfire, ProfessionConst.GossipSenderCheck, action); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerMooncloth: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnMooncloth, ProfessionConst.GossipSenderCheck, action); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerShadoweave: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipLearnShadoweave, ProfessionConst.GossipSenderCheck, action); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; } } } void SendConfirmUnlearn(Player player, uint action) { if (action != 0) { switch (me.GetEntry()) { case CreatureIds.TrainerSpellfire: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnSpellfire, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnTailorSpec, (uint)ProfessionConst.DoHighUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerMooncloth: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnMooncloth, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnTailorSpec, (uint)ProfessionConst.DoHighUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; case CreatureIds.TrainerShadoweave: player.AddGossipItem(GossipOptionNpc.None, ProfessionConst.GossipUnlearnShadoweave, ProfessionConst.GossipSenderCheck, action, ProfessionConst.BoxUnlearnTailorSpec, (uint)ProfessionConst.DoHighUnlearnCost(player), false); //unknown textID () player.SendGossipMenu(player.GetGossipTextId(me), me.GetGUID()); break; } } } public override bool OnGossipSelect(Player player, uint menuId, uint gossipListId) { uint sender = player.PlayerTalkClass.GetGossipOptionSender(gossipListId); uint action = player.PlayerTalkClass.GetGossipOptionAction(gossipListId); player.ClearGossipMenu(); switch (sender) { case eTradeskill.GossipSenderMain: SendActionMenu(player, action); break; case ProfessionConst.GossipSenderLearn: SendConfirmLearn(player, action); break; case ProfessionConst.GossipSenderUnlearn: SendConfirmUnlearn(player, action); break; case ProfessionConst.GossipSenderCheck: SendActionMenu(player, action); break; } return true; } } }