mirror of
https://github.com/ornfelt/azerothcore_lua_scripts
synced 2026-08-22 06:26:03 -04:00
225 lines
7.9 KiB
C++
225 lines
7.9 KiB
C++
|
|
/*
|
|||
|
|
© Cemak 2012*/
|
|||
|
|
class prof_master : public CreatureScript
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
prof_master() : CreatureScript("prof_master") { }
|
|||
|
|
|
|||
|
|
void CompleteLearnProfession(Player *pPlayer, Creature *pCreature, SkillType skill)
|
|||
|
|
{
|
|||
|
|
if (PlayerAlreadyHasNineProfessions(pPlayer) && !IsSecondarySkill(skill)){
|
|||
|
|
char wh[255];
|
|||
|
|
sprintf(wh, "АТАТА по рукам вы уже выучили %i професии!", sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL));
|
|||
|
|
pCreature->MonsterWhisper(wh, pPlayer->GetGUID(), true);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (!LearnAllRecipesInProfession(pPlayer, skill))
|
|||
|
|
pCreature->MonsterWhisper("Ошибка!", pPlayer->GetGUID(), true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool IsSecondarySkill(SkillType skill) const
|
|||
|
|
{
|
|||
|
|
return skill == SKILL_COOKING || skill == SKILL_FIRST_AID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool PlayerAlreadyHasNineProfessions(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 >= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
|
|||
|
|
return true;
|
|||
|
|
|
|||
|
|
for (uint32 i = 0; 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 >= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool LearnAllRecipesInProfession(Player *pPlayer, SkillType skill)
|
|||
|
|
{
|
|||
|
|
ChatHandler handler(pPlayer);
|
|||
|
|
char* skill_name;
|
|||
|
|
|
|||
|
|
SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(skill);
|
|||
|
|
skill_name = SkillInfo->name[handler.GetSessionDbcLocale()];
|
|||
|
|
|
|||
|
|
if (!SkillInfo)
|
|||
|
|
{
|
|||
|
|
sLog->outError("Teleport NPC: received non-valid skill ID (LearnAllRecipesInProfession)");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
LearnSkillRecipesHelper(pPlayer, SkillInfo->id);
|
|||
|
|
|
|||
|
|
uint16 maxLevel = pPlayer->GetPureMaxSkillValue(SkillInfo->id);
|
|||
|
|
pPlayer->SetSkill(SkillInfo->id, pPlayer->GetSkillStep(SkillInfo->id), maxLevel, maxLevel);
|
|||
|
|
handler.PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, skill_name);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// See "static void HandleLearnSkillRecipesHelper(Player* player,uint32 skill_id)" from cs_learn.cpp
|
|||
|
|
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;
|
|||
|
|
|
|||
|
|
SpellEntry const* spellInfo = sSpellStore.LookupEntry(skillLine->spellId);
|
|||
|
|
if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, player, false))
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
player->learnSpell(skillLine->spellId, false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
|
|||
|
|
{
|
|||
|
|
if (pCreature->isQuestGiver())
|
|||
|
|
pPlayer->PrepareQuestMenu(pCreature->GetGUID());
|
|||
|
|
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Алхимия", GOSSIP_SENDER_MAIN, 44);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Кузнечное дело", GOSSIP_SENDER_MAIN, 45);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Кожевничество", GOSSIP_SENDER_MAIN, 46);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Портняжное дело", GOSSIP_SENDER_MAIN, 47);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Инженерное дело", GOSSIP_SENDER_MAIN, 48);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Наложение чар", GOSSIP_SENDER_MAIN, 49);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Ювелирное дело", GOSSIP_SENDER_MAIN, 50);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Начертание", GOSSIP_SENDER_MAIN, 51);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Снятие шкур", GOSSIP_SENDER_MAIN, 52);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Травничество", GOSSIP_SENDER_MAIN, 53);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Кулинария", GOSSIP_SENDER_MAIN, 54);
|
|||
|
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Первая помощь", GOSSIP_SENDER_MAIN, 55);
|
|||
|
|
|
|||
|
|
pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void SendDefaultMenu(Player *pPlayer, Creature *pCreature, uint32 action)
|
|||
|
|
{
|
|||
|
|
switch(action)
|
|||
|
|
{
|
|||
|
|
case 44:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_ALCHEMY);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 45:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_BLACKSMITHING);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 46:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_LEATHERWORKING);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 47:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_TAILORING);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 48:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_ENGINERING);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 49:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_ENCHANTING);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 50:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_JEWELCRAFTING);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 51:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_INSCRIPTION);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 52:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_SKINNING);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 53:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_HERBALISM);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 54:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_COOKING);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
case 55:
|
|||
|
|
CompleteLearnProfession(pPlayer, pCreature, SKILL_FIRST_AID);
|
|||
|
|
|
|||
|
|
pPlayer->CLOSE_GOSSIP_MENU();
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool OnGossipSelect(Player *pPlayer, Creature *_Creature, uint32 sender, uint32 action )
|
|||
|
|
{
|
|||
|
|
if (sender == GOSSIP_SENDER_MAIN)
|
|||
|
|
SendDefaultMenu(pPlayer, _Creature, action);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
void AddSC_prof_master()
|
|||
|
|
{
|
|||
|
|
new prof_master;
|
|||
|
|
}
|