Advertisement
Dinoza

ProffMaster

Jan 14th, 2015
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.11 KB | None | 0 0
  1. class prof_master : public CreatureScript
  2. {
  3. public:
  4.     prof_master() : CreatureScript("prof_master") { }
  5.  
  6.     void CompleteLearnProfession(Player *pPlayer, Creature *pCreature, SkillType skill)
  7.     {
  8.         if (PlayerAlreadyHasNineProfessions(pPlayer) && !IsSecondarySkill(skill)){
  9.         char wh[255];
  10.         sprintf(wh, "АТАТА по рукам вы уже выучили %i професии!", sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL));
  11.             pCreature->MonsterWhisper(wh, pPlayer->GetGUID(), true);
  12.         }
  13.         else
  14.         {
  15.             if (!LearnAllRecipesInProfession(pPlayer, skill))
  16.                 pCreature->MonsterWhisper("Ошибка!", pPlayer->GetGUID(), true);
  17.         }
  18.     }
  19.    
  20.      bool IsSecondarySkill(SkillType skill) const
  21.     {
  22.         return skill == SKILL_COOKING || skill == SKILL_FIRST_AID;
  23.     }
  24.    
  25.      bool PlayerAlreadyHasNineProfessions(const Player *pPlayer) const
  26.     {
  27.         uint32 skillCount = 0;
  28.  
  29.         if (pPlayer->HasSkill(SKILL_MINING))
  30.             skillCount++;
  31.         if (pPlayer->HasSkill(SKILL_SKINNING))
  32.             skillCount++;
  33.         if (pPlayer->HasSkill(SKILL_HERBALISM))
  34.             skillCount++;
  35.  
  36.         if (skillCount >= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
  37.             return true;
  38.  
  39.         for (uint32 i = 0; i < sSkillLineStore.GetNumRows(); ++i)
  40.         {
  41.             SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(i);
  42.             if (!SkillInfo)
  43.                 continue;
  44.  
  45.             if (SkillInfo->categoryId == SKILL_CATEGORY_SECONDARY)
  46.                 continue;
  47.  
  48.             if ((SkillInfo->categoryId != SKILL_CATEGORY_PROFESSION) || !SkillInfo->canLink)
  49.                 continue;
  50.  
  51.             const uint32 skillID = SkillInfo->id;
  52.             if (pPlayer->HasSkill(skillID))
  53.                 skillCount++;
  54.  
  55.             if (skillCount >= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
  56.                 return true;
  57.         }
  58.  
  59.         return false;
  60.     }
  61.  
  62.     bool LearnAllRecipesInProfession(Player *pPlayer, SkillType skill)
  63.     {
  64.         ChatHandler handler(pPlayer);
  65.         char* skill_name;
  66.  
  67.         SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(skill);
  68.         skill_name = SkillInfo->name[handler.GetSessionDbcLocale()];
  69.  
  70.         if (!SkillInfo)
  71.         {
  72.             sLog->outError("Teleport NPC: received non-valid skill ID (LearnAllRecipesInProfession)");
  73.             return false;
  74.         }
  75.  
  76.         LearnSkillRecipesHelper(pPlayer, SkillInfo->id);
  77.  
  78.         uint16 maxLevel = pPlayer->GetPureMaxSkillValue(SkillInfo->id);
  79.         pPlayer->SetSkill(SkillInfo->id, pPlayer->GetSkillStep(SkillInfo->id), maxLevel, maxLevel);
  80.         handler.PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, skill_name);
  81.        
  82.         return true;
  83.     }
  84.     // See "static void HandleLearnSkillRecipesHelper(Player* player,uint32 skill_id)" from cs_learn.cpp
  85.     void LearnSkillRecipesHelper(Player *player, uint32 skill_id)
  86.     {
  87.         uint32 classmask = player->getClassMask();
  88.  
  89.         for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
  90.         {
  91.             SkillLineAbilityEntry const *skillLine = sSkillLineAbilityStore.LookupEntry(j);
  92.             if (!skillLine)
  93.                 continue;
  94.  
  95.             // wrong skill
  96.             if (skillLine->skillId != skill_id)
  97.                 continue;
  98.  
  99.             // not high rank
  100.             if (skillLine->forward_spellid)
  101.                 continue;
  102.  
  103.             // skip racial skills
  104.             if (skillLine->racemask != 0)
  105.                 continue;
  106.  
  107.             // skip wrong class skills
  108.             if (skillLine->classmask && (skillLine->classmask & classmask) == 0)
  109.                 continue;
  110.  
  111.             SpellEntry const* spellInfo = sSpellStore.LookupEntry(skillLine->spellId);
  112.             if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, player, false))
  113.                 continue;
  114.  
  115.             player->learnSpell(skillLine->spellId, false);
  116.         }
  117.     }
  118.    
  119.     bool OnGossipHello(Player* pPlayer, Creature* pCreature)
  120.     {
  121.         if (pCreature->isQuestGiver())
  122.             pPlayer->PrepareQuestMenu(pCreature->GetGUID());
  123.            
  124.             pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Алхимия", GOSSIP_SENDER_MAIN, 44);
  125.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Кузнечное дело", GOSSIP_SENDER_MAIN, 45);
  126.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Кожевничество", GOSSIP_SENDER_MAIN, 46);
  127.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Портняжное дело", GOSSIP_SENDER_MAIN, 47);
  128.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Инженерное дело", GOSSIP_SENDER_MAIN, 48);
  129.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Наложение чар", GOSSIP_SENDER_MAIN, 49);
  130.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Ювелирное дело", GOSSIP_SENDER_MAIN, 50);
  131.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Начертание", GOSSIP_SENDER_MAIN, 51);
  132.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Снятие шкур", GOSSIP_SENDER_MAIN, 52);
  133.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Травничество", GOSSIP_SENDER_MAIN, 53);
  134.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Кулинария", GOSSIP_SENDER_MAIN, 54);
  135.                 pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Первая помощь", GOSSIP_SENDER_MAIN, 55);
  136.                
  137.                 pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
  138.         return true;
  139.     }
  140.    
  141. void SendDefaultMenu(Player *pPlayer, Creature *pCreature, uint32 action)
  142.     {
  143.         switch(action)
  144.       {
  145.         case 44:
  146.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_ALCHEMY);
  147.  
  148.                 pPlayer->CLOSE_GOSSIP_MENU();
  149.                 break;
  150.             case 45:
  151.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_BLACKSMITHING);
  152.  
  153.                 pPlayer->CLOSE_GOSSIP_MENU();
  154.                 break;
  155.             case 46:
  156.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_LEATHERWORKING);
  157.  
  158.                 pPlayer->CLOSE_GOSSIP_MENU();
  159.                 break;
  160.             case 47:
  161.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_TAILORING);
  162.  
  163.                 pPlayer->CLOSE_GOSSIP_MENU();
  164.                 break;
  165.             case 48:
  166.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_ENGINERING);
  167.  
  168.                 pPlayer->CLOSE_GOSSIP_MENU();
  169.                 break;
  170.             case 49:
  171.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_ENCHANTING);
  172.  
  173.                 pPlayer->CLOSE_GOSSIP_MENU();
  174.                 break;
  175.             case 50:
  176.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_JEWELCRAFTING);
  177.  
  178.                 pPlayer->CLOSE_GOSSIP_MENU();
  179.                 break;
  180.             case 51:
  181.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_INSCRIPTION);
  182.  
  183.                 pPlayer->CLOSE_GOSSIP_MENU();
  184.                 break;
  185.             case 52:
  186.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_SKINNING);
  187.  
  188.                 pPlayer->CLOSE_GOSSIP_MENU();
  189.                 break;
  190.             case 53:
  191.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_HERBALISM);
  192.  
  193.                 pPlayer->CLOSE_GOSSIP_MENU();
  194.                 break;
  195.             case 54:
  196.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_COOKING);
  197.  
  198.                 pPlayer->CLOSE_GOSSIP_MENU();
  199.                 break;
  200.             case 55:
  201.                 CompleteLearnProfession(pPlayer, pCreature, SKILL_FIRST_AID);
  202.  
  203.                 pPlayer->CLOSE_GOSSIP_MENU();
  204.                 break;
  205.            
  206.        }
  207.      }
  208.            
  209.        bool OnGossipSelect(Player *pPlayer, Creature *_Creature, uint32 sender, uint32 action )
  210.         {
  211.                 if (sender == GOSSIP_SENDER_MAIN)
  212.                         SendDefaultMenu(pPlayer, _Creature, action);
  213.  
  214.                 return true;
  215.  
  216.         }
  217.    
  218. };
  219.  
  220. void AddSC_prof_master()
  221. {
  222.     new prof_master;
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement