Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.99 KB | None | 0 0
  1. #include "ScriptPCH.h"
  2. #include "Language.h"
  3.  
  4. #define ICON_ALCHEMY "|TInterface\\icons\\trade_alchemy:30|t"
  5. #define ICON_BLACKSMITHING "|TInterface\\icons\\INV_Ingot_05:30|t"
  6. #define ICON_LEATHERWORKING "|TInterface\\icons\\INV_Misc_LeatherScrap_02:30|t"
  7. #define ICON_TAILORING "|TInterface\\icons\\INV_Fabric_Felcloth_Ebon:30|t"
  8. #define ICON_ENGINEERING "|TInterface\\icons\\inv_misc_wrench_01:30|t"
  9. #define ICON_ENCHANTING "|TInterface\\icons\\trade_engraving:30|t"
  10. #define ICON_JEWELCRAFTING "|TInterface\\icons\\inv_misc_gem_01:30|t"
  11. #define ICON_INSCRIPTION "|TInterface\\icons\\INV_Scroll_08:30|t"
  12. #define ICON_FIRST_AID "|TInterface\\icons\\Spell_Holy_SealOfSacrifice|t"
  13.  
  14. // not used atm
  15. enum ProfMenus
  16. {
  17. MAIN_MENU = 0,
  18. ALCHEMY = 1,
  19. BLACKSMITHING = 2,
  20. LEATHERWROKING = 3,
  21. TAILORING = 4,
  22. ENGINEERING = 5,
  23. ENCHANTING = 6,
  24. JEWELCRAFTING = 7,
  25. INSCRIPTION = 8,
  26. FIRST_AID = 9
  27. };
  28.  
  29. bool PlayerAlreadyHasTwoProfessions(const Player *player) /*const*/
  30. {
  31. uint32 skillCount = 0;
  32.  
  33. if (player->HasSkill(SKILL_MINING))
  34. skillCount++;
  35. if (player->HasSkill(SKILL_SKINNING))
  36. skillCount++;
  37. if (player->HasSkill(SKILL_HERBALISM))
  38. skillCount++;
  39.  
  40. if (skillCount >= 2)
  41. return true;
  42.  
  43. for (uint32 i = 1; i < sSkillLineStore.GetNumRows(); ++i)
  44. {
  45. SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(i);
  46. if (!SkillInfo)
  47. continue;
  48.  
  49. if (SkillInfo->categoryId == SKILL_CATEGORY_SECONDARY)
  50. continue;
  51.  
  52. if ((SkillInfo->categoryId != SKILL_CATEGORY_PROFESSION) || !SkillInfo->canLink)
  53. continue;
  54.  
  55. const uint32 skillID = SkillInfo->id;
  56. if (player->HasSkill(skillID))
  57. skillCount++;
  58.  
  59. if (skillCount >= 2)
  60. return true;
  61. }
  62. return false;
  63. }
  64.  
  65.  
  66. void LearnSkillRecipesHelper(Player *player, uint32 skill_id)
  67. {
  68. uint32 classmask = player->getClassMask();
  69.  
  70. for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
  71. {
  72. SkillLineAbilityEntry const *skillLine = sSkillLineAbilityStore.LookupEntry(j);
  73. if (!skillLine)
  74. continue;
  75.  
  76. // wrong skill
  77. if (skillLine->skillId != skill_id)
  78. continue;
  79.  
  80. // not high rank
  81. if (skillLine->forward_spellid)
  82. continue;
  83.  
  84. // skip racial skills
  85. if (skillLine->racemask != 0)
  86. continue;
  87.  
  88. // skip wrong class skills
  89. if (skillLine->classmask && (skillLine->classmask & classmask) == 0)
  90. continue;
  91.  
  92. player->learnSpell(skillLine->spellId, false);
  93. }
  94. }
  95.  
  96. bool LearnAllRecipesInProfession(Player *player, SkillType skill)
  97. {
  98. ChatHandler handler(player->GetSession());
  99. std::string skill_name;
  100.  
  101. SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(skill);
  102. skill_name, SkillInfo->name[handler.GetSessionDbcLocale()];
  103.  
  104. if (!SkillInfo)
  105. {
  106. sLog->outError(LOG_FILTER_GENERAL, "Profession NPC: received non-valid skill ID (LearnAllRecipesInProfession)");
  107. return false;
  108. }
  109.  
  110. LearnSkillRecipesHelper(player, SkillInfo->id);
  111.  
  112. uint16 maxLevel = player->GetPureMaxSkillValue(SkillInfo->id);
  113. player->SetSkill(SkillInfo->id, player->GetSkillStep(SkillInfo->id), maxLevel, maxLevel);
  114. handler.PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, skill_name.c_str());
  115. return true;
  116. }
  117.  
  118. bool IsSecondarySkill(SkillType skill) /* const */
  119. {
  120. return skill == SKILL_COOKING || skill == SKILL_FIRST_AID || skill == SKILL_FISHING || skill == SKILL_ARCHAEOLOGY;
  121. }
  122.  
  123. void CompleteLearnProfession(Player *player, Creature *creature, SkillType skill)
  124. {
  125. if (PlayerAlreadyHasTwoProfessions(player) && !IsSecondarySkill(skill))
  126. creature->MonsterWhisper("Вы уже обучили 2 профессии!", player->GetGUID());
  127. else
  128. if (!LearnAllRecipesInProfession(player, skill))
  129. creature->MonsterWhisper("Произошла внутренняя ошибка!", player->GetGUID());
  130. }
  131.  
  132. class skill_npc : public CreatureScript
  133. {
  134. public: skill_npc() : CreatureScript("skill_npc") {}
  135.  
  136. bool OnGossipHello(Player* player, Creature* creature)
  137. {
  138. // Primary
  139. if (!player->HasSkill(SKILL_ALCHEMY))
  140. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Alchemy:30|t Алхимия.|r", GOSSIP_SENDER_MAIN, 1);
  141. if (!player->HasSkill(SKILL_BLACKSMITHING))
  142. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_BlackSmithing:30|t Кузнечное дело.|r", GOSSIP_SENDER_MAIN, 2);
  143. if (!player->HasSkill(SKILL_LEATHERWORKING))
  144. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_ArmorKit_17:30|t Кожевничество.|r", GOSSIP_SENDER_MAIN, 3);
  145. if (!player->HasSkill(SKILL_TAILORING))
  146. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Tailoring:30|t Портняжное дело.|r", GOSSIP_SENDER_MAIN, 4);
  147. if (!player->HasSkill(SKILL_ENGINEERING))
  148. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Engineering:30|t Инженерное дело.|r", GOSSIP_SENDER_MAIN, 5);
  149. if (!player->HasSkill(SKILL_ENCHANTING))
  150. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Engraving:30|t Наложение чар.|r", GOSSIP_SENDER_MAIN, 6);
  151. if (!player->HasSkill(SKILL_JEWELCRAFTING))
  152. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_Gem_01:30|t Ювелирное дело.|r", GOSSIP_SENDER_MAIN, 7);
  153. if (!player->HasSkill(SKILL_INSCRIPTION))
  154. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Inscription_Tradeskill01:30|t Начертание.|r", GOSSIP_SENDER_MAIN, 8);
  155. if (!player->HasSkill(SKILL_HERBALISM))
  156. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Spell_Nature_NatureTouchGrow:30|t Травничество.|r", GOSSIP_SENDER_MAIN, 19);
  157. if (!player->HasSkill(SKILL_MINING))
  158. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Mining:30|t Горное дело.|r", GOSSIP_SENDER_MAIN, 20);
  159. if (!player->HasSkill(SKILL_SKINNING))
  160. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_Pelt_Wolf_01:30|t Снятие шкур.|r", GOSSIP_SENDER_MAIN, 21);
  161. // Secondary
  162. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/icons/Spell_ChargeNegative:30|t Дополнительные профессии.|r", GOSSIP_SENDER_MAIN, 9);
  163. player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
  164. return true;
  165. }
  166.  
  167. bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction)
  168. {
  169. player->PlayerTalkClass->ClearMenus();
  170.  
  171. if (uiSender == GOSSIP_SENDER_MAIN)
  172. {
  173. switch (uiAction)
  174. {
  175. case 0:
  176. OnGossipHello(player, creature);
  177. break;
  178.  
  179. case 1:
  180. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/icons/Spell_ChargeNegative:30|t Назад.|r", GOSSIP_SENDER_MAIN, 0);
  181. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Alchemy:30|t Алхимия: Мастер трансмутации.|r", GOSSIP_SENDER_MAIN, 10);
  182. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Alchemy:30|t Алхимия: Мастер эликсиров.|r", GOSSIP_SENDER_MAIN, 11);
  183. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Alchemy:30|t Алхимия: Мастер Зелья.|r", GOSSIP_SENDER_MAIN, 12);
  184. player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
  185. break;
  186. case 10:
  187. CompleteLearnProfession(player, creature, SKILL_ALCHEMY);
  188. player->removeSpell(28677, false);
  189. player->removeSpell(28675, false);
  190. player->CLOSE_GOSSIP_MENU();
  191. break;
  192. case 11:
  193. CompleteLearnProfession(player, creature, SKILL_ALCHEMY);
  194. player->removeSpell(28672, false);
  195. player->removeSpell(28675, false);
  196. player->CLOSE_GOSSIP_MENU();
  197. break;
  198. case 12:
  199. CompleteLearnProfession(player, creature, SKILL_ALCHEMY);
  200. player->removeSpell(28677, false);
  201. player->removeSpell(28672, false);
  202. player->CLOSE_GOSSIP_MENU();
  203. break;
  204.  
  205. case 2:
  206. CompleteLearnProfession(player, creature, SKILL_BLACKSMITHING);
  207. player->CLOSE_GOSSIP_MENU();
  208. break;
  209.  
  210. case 3:
  211. CompleteLearnProfession(player, creature, SKILL_LEATHERWORKING);
  212. player->CLOSE_GOSSIP_MENU();
  213. break;
  214.  
  215. case 4:
  216. CompleteLearnProfession(player, creature, SKILL_TAILORING);
  217. player->CLOSE_GOSSIP_MENU();
  218. break;
  219.  
  220. case 5:
  221. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/icons/Spell_ChargeNegative:30|t Назад!|r", GOSSIP_SENDER_MAIN, 0);
  222. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Engineering:30|t Гномская инженерия.|r", GOSSIP_SENDER_MAIN, 13);
  223. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Engineering:30|t Гоблинская инженерия.|r", GOSSIP_SENDER_MAIN, 14);
  224. player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
  225. break;
  226. case 13:
  227. CompleteLearnProfession(player, creature, SKILL_ENGINEERING);
  228. player->removeSpell(20222, false);
  229. player->removeSpell(82207, false);
  230. player->removeSpell(105518, false);
  231. player->CLOSE_GOSSIP_MENU();
  232. break;
  233. case 14:
  234. CompleteLearnProfession(player, creature, SKILL_ENGINEERING);
  235. player->removeSpell(20219, false);
  236. player->removeSpell(82207, false);
  237. player->removeSpell(105518, false);
  238. player->CLOSE_GOSSIP_MENU();
  239. break;
  240.  
  241. case 6:
  242. CompleteLearnProfession(player, creature, SKILL_ENCHANTING);
  243. player->CLOSE_GOSSIP_MENU();
  244. break;
  245.  
  246. case 7:
  247. CompleteLearnProfession(player, creature, SKILL_JEWELCRAFTING);
  248. player->CLOSE_GOSSIP_MENU();
  249. break;
  250.  
  251. case 8:
  252. CompleteLearnProfession(player, creature, SKILL_INSCRIPTION);
  253. player->CLOSE_GOSSIP_MENU();
  254. break;
  255.  
  256. case 9:
  257. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/icons/Spell_ChargeNegative:30|t Назад!|r", GOSSIP_SENDER_MAIN, 0);
  258. if (!player->HasSkill(SKILL_FIRST_AID)/* || player->GetClass() == CLASS_DEATH_KNIGHT*/)
  259. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Spell_Holy_SealOfSacrifice:30|t Первая помощь.|r", GOSSIP_SENDER_MAIN, 15);
  260. if (!player->HasSkill(SKILL_FISHING))
  261. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Fishing:30|t Рыбная ловля.|r", GOSSIP_SENDER_MAIN, 16);
  262. if (!player->HasSkill(SKILL_COOKING))
  263. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_Food_15:30|t Кулинария.|r", GOSSIP_SENDER_MAIN, 17);
  264. if (!player->HasSkill(SKILL_ARCHAEOLOGY))
  265. player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_Food_15:30|t Археология.|r", GOSSIP_SENDER_MAIN, 18);
  266. player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
  267. break;
  268. case 15:
  269. CompleteLearnProfession(player, creature, SKILL_FIRST_AID);
  270. player->CLOSE_GOSSIP_MENU();
  271. break;
  272. case 16:
  273. CompleteLearnProfession(player, creature, SKILL_FISHING);
  274. player->CLOSE_GOSSIP_MENU();
  275. break;
  276. case 17:
  277. CompleteLearnProfession(player, creature, SKILL_COOKING);
  278. player->CLOSE_GOSSIP_MENU();
  279. break;
  280. case 18:
  281. CompleteLearnProfession(player, creature, SKILL_ARCHAEOLOGY);
  282. player->CLOSE_GOSSIP_MENU();
  283. break;
  284. case 19:
  285. CompleteLearnProfession(player, creature, SKILL_HERBALISM);
  286. player->CLOSE_GOSSIP_MENU();
  287. break;
  288. case 20:
  289. CompleteLearnProfession(player, creature, SKILL_MINING);
  290. player->CLOSE_GOSSIP_MENU();
  291. break;
  292. case 21:
  293. CompleteLearnProfession(player, creature, SKILL_SKINNING);
  294. player->CLOSE_GOSSIP_MENU();
  295. break;
  296. }
  297. }
  298. return true;
  299. }
  300. };
  301.  
  302. void AddSC_skill_npc()
  303. {
  304. new skill_npc();
  305. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement