kusanagy

NPC Professions

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