Advertisement
EmuDevs

TrinityCore C++ Profession Gossip

Jan 4th, 2014
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.48 KB | None | 0 0
  1. /*
  2. <--------------------------------------------------------------------------->
  3. - Updated by: Tommy
  4. - Complete: %100
  5. - ScriptName: 'Professions_NPC'
  6. - Comment: Untested.
  7. - Shared for:Emudevs by Synth
  8. <--------------------------------------------------------------------------->
  9. */
  10. #include "Language.h"
  11.  
  12. class Professions_NPC : public CreatureScript
  13. {
  14. public:
  15.     Professions_NPC () : CreatureScript("Professions_NPC") { }
  16.                
  17.     void CreatureWhisperBasedOnBool(const char* text, Creature* creature, Player* player, bool value)
  18.     {
  19.         if (value)
  20.             creature->MonsterWhisper(text, player);
  21.     }
  22.  
  23.     uint32 PlayerMaxLevel() const
  24.     {
  25.         return sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
  26.     }
  27.  
  28.     bool PlayerHasItemOrSpell(Player* player, uint32 itemId, uint32 spellId)
  29.     {
  30.         return player->HasItemCount(itemId, 1, true) || player->HasSpell(spellId);
  31.     }
  32.                
  33.     bool PlayerAlreadyHasTwoProfessions(Player* player)
  34.     {
  35.         uint32 skillCount = 0;
  36.  
  37.         if (player->HasSkill(SKILL_MINING))
  38.             skillCount++;
  39.         if (player->HasSkill(SKILL_SKINNING))
  40.             skillCount++;
  41.         if (player->HasSkill(SKILL_HERBALISM))
  42.             skillCount++;
  43.  
  44.         if (skillCount >= 2)
  45.             return true;
  46.  
  47.         for (uint32 i = 1; i < sSkillLineStore.GetNumRows(); ++i)
  48.         {
  49.             SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(i);
  50.             if (!SkillInfo)
  51.                 continue;
  52.  
  53.             if (SkillInfo->categoryId == SKILL_CATEGORY_SECONDARY)
  54.                 continue;
  55.  
  56.             if ((SkillInfo->categoryId != SKILL_CATEGORY_PROFESSION) || !SkillInfo->canLink)
  57.                 continue;
  58.  
  59.             uint32 skillID = SkillInfo->id;
  60.             if (player->HasSkill(skillID))
  61.                 skillCount++;
  62.  
  63.             if (skillCount >= 2)
  64.                 return true;
  65.         }
  66.  
  67.         return false;
  68.     }
  69.  
  70.     bool LearnAllRecipesInProfession(Player* player, SkillType skill)
  71.     {
  72.         char* skill_name;
  73.  
  74.         SkillLineEntry const* SkillInfo = sSkillLineStore.LookupEntry(skill);
  75.         skill_name = SkillInfo->name[ChatHandler(player->GetSession()).GetSessionDbcLocale()];
  76.  
  77.         if (!SkillInfo)
  78.             return false;      
  79.  
  80.         LearnSkillRecipesHelper(player, SkillInfo->id);
  81.  
  82.         player->SetSkill(SkillInfo->id, player->GetSkillStep(SkillInfo->id), 450, 450);
  83.         ChatHandler(player->GetSession()).PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, skill_name);
  84.                
  85.         return true;
  86.     }
  87.        
  88.     void LearnSkillRecipesHelper(Player* player, uint32 skill_id)
  89.     {
  90.         uint32 classmask = player->getClassMask();
  91.  
  92.         for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
  93.         {
  94.             SkillLineAbilityEntry const* skillLine = sSkillLineAbilityStore.LookupEntry(j);
  95.             if (!skillLine)
  96.                 continue;
  97.  
  98.             if (skillLine->skillId != skill_id)
  99.                 continue;
  100.  
  101.             if (skillLine->forward_spellid)
  102.                 continue;
  103.  
  104.             if (skillLine->racemask != 0)
  105.                 continue;
  106.  
  107.             if (skillLine->classmask && (skillLine->classmask & classmask) == 0)
  108.                 continue;
  109.  
  110.             SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(skillLine->spellId);
  111.             if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, player, false))
  112.                 continue;
  113.                                
  114.             player->learnSpell(skillLine->spellId, false);
  115.         }
  116.     }
  117.  
  118.     bool IsSecondarySkill(SkillType skill)
  119.     {
  120.         return skill == SKILL_COOKING || skill == SKILL_FIRST_AID;
  121.     }
  122.  
  123.     void CompleteLearnProfession(Player* player, Creature* creature, SkillType skill)
  124.     {
  125.         if (PlayerAlreadyHasTwoProfessions(player) && !IsSecondarySkill(skill))
  126.             creature->MonsterWhisper("You already know two professions!", player);
  127.         else
  128.         {
  129.             if (!LearnAllRecipesInProfession(player, skill))
  130.                 creature->MonsterWhisper("Internal error occured!", player);
  131.         }
  132.     }
  133.  
  134.     bool OnGossipHello(Player* player, Creature* creature)
  135.     {
  136.         player->ADD_GOSSIP_ITEM(9, "[Professions] ->", GOSSIP_SENDER_MAIN, 196);
  137.         player->SEND_GOSSIP_MENU(907, creature->GetGUID());
  138.         return true;
  139.     }
  140.  
  141.     bool OnGossipSelect(Player* player, Creature* creature, uint32 /* sender */, uint32 actions)
  142.     {
  143.         player->PlayerTalkClass->ClearMenus();
  144.  
  145.         switch (actions)
  146.         {
  147.             case 196:
  148.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Alchemy", GOSSIP_SENDER_MAIN, 1);
  149.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Blacksmithing", GOSSIP_SENDER_MAIN, 2);
  150.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Leatherworking", GOSSIP_SENDER_MAIN, 3);
  151.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Tailoring", GOSSIP_SENDER_MAIN, 4);
  152.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Engineering", GOSSIP_SENDER_MAIN, 5);
  153.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Enchanting", GOSSIP_SENDER_MAIN, 6);
  154.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Jewelcrafting", GOSSIP_SENDER_MAIN, 7);
  155.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Inscription", GOSSIP_SENDER_MAIN, 8);
  156.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Herbalism", GOSSIP_SENDER_MAIN, 11);
  157.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Skinning", GOSSIP_SENDER_MAIN, 12);
  158.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Mining", GOSSIP_SENDER_MAIN, 13);
  159.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Cooking", GOSSIP_SENDER_MAIN, 9);
  160.                 player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "First Aid", GOSSIP_SENDER_MAIN, 10);
  161.  
  162.                 player->SEND_GOSSIP_MENU(907, creature->GetGUID());
  163.                 break;
  164.             case 1:
  165.                 if(player->HasSkill(SKILL_ALCHEMY))
  166.                 {
  167.                     player->CLOSE_GOSSIP_MENU();
  168.                     return false;
  169.                 }
  170.  
  171.                 CompleteLearnProfession(player, creature, SKILL_ALCHEMY);
  172.                 player->CLOSE_GOSSIP_MENU();
  173.                 break;
  174.             case 2:
  175.                 if(player->HasSkill(SKILL_BLACKSMITHING))
  176.                 {
  177.                     player->CLOSE_GOSSIP_MENU();
  178.                     return false;
  179.                 }
  180.  
  181.                 CompleteLearnProfession(player, creature, SKILL_BLACKSMITHING);
  182.                 player->CLOSE_GOSSIP_MENU();
  183.                 break;
  184.             case 3:
  185.                 if(player->HasSkill(SKILL_LEATHERWORKING))
  186.                 {
  187.                     player->CLOSE_GOSSIP_MENU();
  188.                     return false;
  189.                 }
  190.  
  191.                 CompleteLearnProfession(player, creature, SKILL_LEATHERWORKING);
  192.                 player->CLOSE_GOSSIP_MENU();
  193.                 break;
  194.             case 4:
  195.                 if(player->HasSkill(SKILL_TAILORING))
  196.                 {
  197.                     player->CLOSE_GOSSIP_MENU();
  198.                     return false;
  199.                 }
  200.  
  201.                 CompleteLearnProfession(player, creature, SKILL_TAILORING);
  202.                 player->PlayerTalkClass->SendCloseGossip();
  203.                 break;
  204.             case 5:
  205.                 if(player->HasSkill(SKILL_ENGINEERING))
  206.                 {
  207.                     player->CLOSE_GOSSIP_MENU();
  208.                     return;
  209.                 }
  210.  
  211.                 CompleteLearnProfession(player, creature, SKILL_ENGINEERING);
  212.                 player->CLOSE_GOSSIP_MENU();
  213.                 break;
  214.                                                
  215.             case 6:
  216.                 if(player->HasSkill(SKILL_ENCHANTING))
  217.                 {
  218.                     player->CLOSE_GOSSIP_MENU();
  219.                     return false;
  220.                 }
  221.  
  222.                 CompleteLearnProfession(player, creature, SKILL_ENCHANTING);
  223.                 player->CLOSE_GOSSIP_MENU();
  224.                 break;
  225.             case 7:
  226.                 if(player->HasSkill(SKILL_JEWELCRAFTING))
  227.                 {
  228.                     player->CLOSE_GOSSIP_MENU();
  229.                     return false;
  230.                 }
  231.  
  232.                 CompleteLearnProfession(player, creature, SKILL_JEWELCRAFTING);
  233.                 player->CLOSE_GOSSIP_MENU();
  234.                 break;
  235.             case 8:
  236.                 if(player->HasSkill(SKILL_INSCRIPTION))
  237.                 {
  238.                     player->CLOSE_GOSSIP_MENU();
  239.                     return false;
  240.                 }
  241.  
  242.                 CompleteLearnProfession(player, creature, SKILL_INSCRIPTION);
  243.                 player->CLOSE_GOSSIP_MENU();
  244.                 break;
  245.             case 9:
  246.                 if(player->HasSkill(SKILL_COOKING))
  247.                 {
  248.                     player->CLOSE_GOSSIP_MENU();
  249.                     return false;
  250.                 }
  251.  
  252.                 CompleteLearnProfession(player, creature, SKILL_COOKING);
  253.                 player->CLOSE_GOSSIP_MENU();
  254.                 break;
  255.             case 10:
  256.                 if(player->HasSkill(SKILL_FIRST_AID))
  257.                 {
  258.                     player->CLOSE_GOSSIP_MENU();
  259.                     return false;
  260.                 }
  261.  
  262.                 CompleteLearnProfession(player, creature, SKILL_FIRST_AID);
  263.                 player->CLOSE_GOSSIP_MENU();;
  264.                 break;
  265.             case 11:
  266.                 if(player->HasSkill(SKILL_HERBALISM))
  267.                 {
  268.                     player->CLOSE_GOSSIP_MENU();
  269.                     return false;
  270.                 }
  271.  
  272.                 CompleteLearnProfession(player, creature, SKILL_HERBALISM);
  273.                 player->CLOSE_GOSSIP_MENU();
  274.                 break;
  275.             case 12:
  276.                 if(player->HasSkill(SKILL_SKINNING))
  277.                 {
  278.                     player->CLOSE_GOSSIP_MENU();
  279.                     return false;
  280.                 }
  281.  
  282.                 CompleteLearnProfession(player, creature, SKILL_SKINNING);
  283.                 player->CLOSE_GOSSIP_MENU();
  284.                 break;
  285.             case 13:
  286.                 if(player->HasSkill(SKILL_MINING))
  287.                 {
  288.                     player->CLOSE_GOSSIP_MENU();
  289.                     return false;
  290.                 }
  291.  
  292.                 CompleteLearnProfession(player, creature, SKILL_MINING);
  293.                 player->CLOSE_GOSSIP_MENU();
  294.                 break;
  295.         }
  296.         return true;
  297.     }
  298. };
  299.  
  300. void AddSC_Professions_NPC()
  301. {
  302.     new Professions_NPC();
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement