Created
October 13, 2014 05:46
-
-
Save JadaDev/586d316b0bb4fa988f25 to your computer and use it in GitHub Desktop.
C++ Profession Script created by AddeDev updated by JadaDev
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "ScriptPCH.h" | |
#include "Language.h" | |
class Professions_NPC : public CreatureScript | |
{ | |
public: | |
Professions_NPC () : CreatureScript("Professions_NPC") {} | |
void CreatureWhisperBasedOnBool(const char *text, Creature *_creature, Player *pPlayer, bool value) | |
{ | |
if (value) | |
_creature->TextEmote(text, pPlayer); | |
} | |
uint32 PlayerMaxLevel() const | |
{ | |
return sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); | |
} | |
bool PlayerHasItemOrSpell(const Player *plr, uint32 itemId, uint32 spellId) const | |
{ | |
return plr->HasItemCount(itemId, 1, true) || plr->HasSpell(spellId); | |
} | |
bool OnGossipHello(Player *pPlayer, Creature* _creature) | |
{ | |
pPlayer->ADD_GOSSIP_ITEM(9, "[Professions] ->", GOSSIP_SENDER_MAIN, 196); | |
pPlayer->PlayerTalkClass->SendGossipMenu(907, _creature->GetGUID()); | |
return true; | |
} | |
bool PlayerAlreadyHasTwoProfessions(const Player *pPlayer) const | |
{ | |
uint32 skillCount = 0; | |
if (pPlayer->HasSkill(SKILL_MINING)) | |
skillCount++; | |
if (pPlayer->HasSkill(SKILL_SKINNING)) | |
skillCount++; | |
if (pPlayer->HasSkill(SKILL_HERBALISM)) | |
skillCount++; | |
if (skillCount >= 2) | |
return true; | |
for (uint32 i = 1; i < sSkillLineStore.GetNumRows(); ++i) | |
{ | |
SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(i); | |
if (!SkillInfo) | |
continue; | |
if (SkillInfo->categoryId == SKILL_CATEGORY_SECONDARY) | |
continue; | |
if ((SkillInfo->categoryId != SKILL_CATEGORY_PROFESSION) || !SkillInfo->canLink) | |
continue; | |
const uint32 skillID = SkillInfo->id; | |
if (pPlayer->HasSkill(skillID)) | |
skillCount++; | |
if (skillCount >= 2) | |
return true; | |
} | |
return false; | |
} | |
bool LearnAllRecipesInProfession(Player *pPlayer, SkillType skill) | |
{ | |
ChatHandler handler(pPlayer->GetSession()); | |
char* skill_name; | |
SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(skill); | |
skill_name = SkillInfo->name[handler.GetSessionDbcLocale()]; | |
if (!SkillInfo) | |
{ | |
TC_LOG_ERROR("server.loading", "Profession NPC: received non-valid skill ID (LearnAllRecipesInProfession)"); | |
} | |
LearnSkillRecipesHelper(pPlayer, SkillInfo->id); | |
pPlayer->SetSkill(SkillInfo->id, pPlayer->GetSkillStep(SkillInfo->id), 450, 450); | |
handler.PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, skill_name); | |
return true; | |
} | |
void LearnSkillRecipesHelper(Player *player, uint32 skill_id) | |
{ | |
uint32 classmask = player->getClassMask(); | |
for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) | |
{ | |
SkillLineAbilityEntry const *skillLine = sSkillLineAbilityStore.LookupEntry(j); | |
if (!skillLine) | |
continue; | |
// wrong skill | |
if (skillLine->skillId != skill_id) | |
continue; | |
// not high rank | |
if (skillLine->forward_spellid) | |
continue; | |
// skip racial skills | |
if (skillLine->racemask != 0) | |
continue; | |
// skip wrong class skills | |
if (skillLine->classmask && (skillLine->classmask & classmask) == 0) | |
continue; | |
SpellInfo const * spellInfo = sSpellMgr->GetSpellInfo(skillLine->spellId); | |
if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, player, false)) | |
continue; | |
player->LearnSpell(skillLine->spellId, false); | |
} | |
} | |
bool IsSecondarySkill(SkillType skill) const | |
{ | |
return skill == SKILL_COOKING || skill == SKILL_FIRST_AID; | |
} | |
void CompleteLearnProfession(Player *pPlayer, Creature *pCreature, SkillType skill) | |
{ | |
if (PlayerAlreadyHasTwoProfessions(pPlayer) && !IsSecondarySkill(skill)) | |
pCreature->TextEmote("You already know two professions!", pPlayer); | |
else | |
{ | |
if (!LearnAllRecipesInProfession(pPlayer, skill)) | |
pCreature->TextEmote("Internal error occured!", pPlayer); | |
} | |
} | |
bool OnGossipSelect(Player* pPlayer, Creature* _creature, uint32 uiSender, uint32 uiAction) | |
{ | |
pPlayer->PlayerTalkClass->ClearMenus(); | |
if (uiSender == GOSSIP_SENDER_MAIN) | |
{ | |
switch (uiAction) | |
{ | |
case 196: | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\trade_alchemy:30|t Alchemy.", GOSSIP_SENDER_MAIN, 1); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\INV_Ingot_05:30|t Blacksmithing.", GOSSIP_SENDER_MAIN, 2); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\INV_Misc_LeatherScrap_02:30|t Leatherworking.", GOSSIP_SENDER_MAIN, 3); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\INV_Fabric_Felcloth_Ebon:30|t Tailoring.", GOSSIP_SENDER_MAIN, 4); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\inv_misc_wrench_01:30|t Engineering.", GOSSIP_SENDER_MAIN, 5); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\trade_engraving:30|t Enchanting.", GOSSIP_SENDER_MAIN, 6); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\inv_misc_gem_01:30|t Jewelcrafting.", GOSSIP_SENDER_MAIN, 7); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\INV_Scroll_08:30|t Inscription.", GOSSIP_SENDER_MAIN, 8); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\INV_Misc_Herb_07:30|t Herbalism.", GOSSIP_SENDER_MAIN, 9); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\inv_misc_pelt_wolf_01:30|t Skinning.", GOSSIP_SENDER_MAIN, 10); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface\\icons\\trade_mining:30|t Mining.", GOSSIP_SENDER_MAIN, 11); | |
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "|TInterface/ICONS/Thrown_1H_Harpoon_D_01Blue:30|t Nevermind!", GOSSIP_SENDER_MAIN, 12); | |
pPlayer->PlayerTalkClass->SendGossipMenu(1, _creature->GetGUID()); | |
break; | |
case 1: | |
if(pPlayer->HasSkill(SKILL_ALCHEMY)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_ALCHEMY); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 2: | |
if(pPlayer->HasSkill(SKILL_BLACKSMITHING)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_BLACKSMITHING); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 3: | |
if(pPlayer->HasSkill(SKILL_LEATHERWORKING)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_LEATHERWORKING); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 4: | |
if(pPlayer->HasSkill(SKILL_TAILORING)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_TAILORING); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 5: | |
if(pPlayer->HasSkill(SKILL_ENGINEERING)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_ENGINEERING); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 6: | |
if(pPlayer->HasSkill(SKILL_ENCHANTING)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_ENCHANTING); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 7: | |
if(pPlayer->HasSkill(SKILL_JEWELCRAFTING)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_JEWELCRAFTING); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 8: | |
if(pPlayer->HasSkill(SKILL_INSCRIPTION)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_INSCRIPTION); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 9: | |
if(pPlayer->HasSkill(SKILL_HERBALISM)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_HERBALISM); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 10: | |
if(pPlayer->HasSkill(SKILL_SKINNING)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_SKINNING); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 11: | |
if(pPlayer->HasSkill(SKILL_MINING)) | |
{ | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
CompleteLearnProfession(pPlayer, _creature, SKILL_MINING); | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
case 12: | |
pPlayer->PlayerTalkClass->SendCloseGossip(); | |
break; | |
} | |
} | |
return true; | |
} | |
}; | |
void AddSC_Professions_NPC() | |
{ | |
new Professions_NPC(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This script fully created by AddeDev ! i just update it to last TC no more.