• This is a read only backup of the old Emudevs forum. If you want to have anything removed, please message me on Discord: KittyKaev

[SOLVED] [HELP] Profession npc for 4.3.4

Status
Not open for further replies.

slp13at420

Mad Scientist
due to trinityCore dropping support for Cataclysm there is not a lot of scripts or customizations for Cataclysm in TrinityCore. Cmangos does keep there Cataclysm project supported and up to date.
if your core is TrinityCore then you may have better luck looking over the trainers in-game and building one your self or checking Cmangos and convert over to Mangos or try to convert a trainer from mangos to Trinity .. dunno if that would work though.
But we will leave this open just in case someone might have what you need :D
 

Skream

Emulation Addict
http://pastebin.com/7mNpEbzz
by Wise
Have already done. 100% working
Use of health who need


cd7c06f9deda.jpg
 
Last edited by a moderator:

slp13at420

Mad Scientist
kewl :D
Thanks for sharing your find . I will add a hard copy here for future ppl looking.


Code:
[COLOR="#808080"]
// By @Wise

#include "ScriptPCH.h"
#include "Language.h"

#define ICON_ALCHEMY "|TInterface\\icons\\trade_alchemy:30|t"
#define ICON_BLACKSMITHING "|TInterface\\icons\\INV_Ingot_05:30|t"
#define ICON_LEATHERWORKING "|TInterface\\icons\\INV_Misc_LeatherScrap_02:30|t"
#define ICON_TAILORING "|TInterface\\icons\\INV_Fabric_Felcloth_Ebon:30|t"
#define ICON_ENGINEERING "|TInterface\\icons\\inv_misc_wrench_01:30|t"
#define ICON_ENCHANTING "|TInterface\\icons\\trade_engraving:30|t"
#define ICON_JEWELCRAFTING "|TInterface\\icons\\inv_misc_gem_01:30|t"
#define ICON_INSCRIPTION "|TInterface\\icons\\INV_Scroll_08:30|t"
#define ICON_FIRST_AID "|TInterface\\icons\\Spell_Holy_SealOfSacrifice|t"

// not used atm
enum ProfMenus
{
    MAIN_MENU = 0,
    ALCHEMY = 1,
    BLACKSMITHING = 2,
    LEATHERWROKING = 3,
    TAILORING = 4,
    ENGINEERING = 5,
    ENCHANTING = 6,
    JEWELCRAFTING = 7,
    INSCRIPTION = 8,
    FIRST_AID = 9
};

bool PlayerAlreadyHasTwoProfessions(const Player *player) /*const*/
{
    uint32 skillCount = 0;

    if (player->HasSkill(SKILL_MINING))
        skillCount++;
    if (player->HasSkill(SKILL_SKINNING))
        skillCount++;
    if (player->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 (player->HasSkill(skillID))
            skillCount++;

        if (skillCount >= 2)
            return true;
    }
    return false;
}


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;

        player->learnSpell(skillLine->spellId, false);
    }
}

bool LearnAllRecipesInProfession(Player *player, SkillType skill)
{
    ChatHandler handler(player->GetSession());
    std::string skill_name;

    SkillLineEntry const *SkillInfo = sSkillLineStore.LookupEntry(skill);
    skill_name, SkillInfo->name[handler.GetSessionDbcLocale()];

    if (!SkillInfo)
    {
        sLog->outError(LOG_FILTER_GENERAL, "Profession NPC: received non-valid skill ID (LearnAllRecipesInProfession)");
        return false;
    }

    LearnSkillRecipesHelper(player, SkillInfo->id);

    uint16 maxLevel = player->GetPureMaxSkillValue(SkillInfo->id);
    player->SetSkill(SkillInfo->id, player->GetSkillStep(SkillInfo->id), maxLevel, maxLevel);
    handler.PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, skill_name.c_str());
    return true;
}

bool IsSecondarySkill(SkillType skill) /* const */
{
    return skill == SKILL_COOKING || skill == SKILL_FIRST_AID || skill == SKILL_FISHING || skill == SKILL_ARCHAEOLOGY;
}

void CompleteLearnProfession(Player *player, Creature *creature, SkillType skill)
{
    if (PlayerAlreadyHasTwoProfessions(player) && !IsSecondarySkill(skill))
        creature->MonsterWhisper("Вы уже обучили 2 профессии!", player->GetGUID());
    else
        if (!LearnAllRecipesInProfession(player, skill))
            creature->MonsterWhisper("Произошла внутренняя ошибка!", player->GetGUID());
}

class skill_npc : public CreatureScript
{
public: skill_npc() : CreatureScript("skill_npc") {}

        bool OnGossipHello(Player* player, Creature* creature)
        {
            // Primary
            if (!player->HasSkill(SKILL_ALCHEMY))
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Alchemy:30|t Алхимия.|r", GOSSIP_SENDER_MAIN, 1);
            if (!player->HasSkill(SKILL_BLACKSMITHING))
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_BlackSmithing:30|t Кузнечное дело.|r", GOSSIP_SENDER_MAIN, 2);
            if (!player->HasSkill(SKILL_LEATHERWORKING))
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_ArmorKit_17:30|t Кожевничество.|r", GOSSIP_SENDER_MAIN, 3);
            if (!player->HasSkill(SKILL_TAILORING))
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Tailoring:30|t Портняжное дело.|r", GOSSIP_SENDER_MAIN, 4);
            if (!player->HasSkill(SKILL_ENGINEERING))
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Engineering:30|t Инженерное дело.|r", GOSSIP_SENDER_MAIN, 5);
            if (!player->HasSkill(SKILL_ENCHANTING))
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Engraving:30|t Наложение чар.|r", GOSSIP_SENDER_MAIN, 6);
            if (!player->HasSkill(SKILL_JEWELCRAFTING))
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_Gem_01:30|t Ювелирное дело.|r", GOSSIP_SENDER_MAIN, 7);
            if (!player->HasSkill(SKILL_INSCRIPTION))
                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Inscription_Tradeskill01:30|t Начертание.|r", GOSSIP_SENDER_MAIN, 8); 
            if (!player->HasSkill(SKILL_HERBALISM))
                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Spell_Nature_NatureTouchGrow:30|t Травничество.|r", GOSSIP_SENDER_MAIN, 19);
            if (!player->HasSkill(SKILL_MINING))
                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Mining:30|t Горное дело.|r", GOSSIP_SENDER_MAIN, 20);
            if (!player->HasSkill(SKILL_SKINNING))
                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_Pelt_Wolf_01:30|t Снятие шкур.|r", GOSSIP_SENDER_MAIN, 21);
            // Secondary
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/icons/Spell_ChargeNegative:30|t Дополнительные профессии.|r", GOSSIP_SENDER_MAIN, 9);
            player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
            return true;
        }

        bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction)
        {
            player->PlayerTalkClass->ClearMenus();

            if (uiSender == GOSSIP_SENDER_MAIN)
            {
                switch (uiAction)
                {
                case 0:
                    OnGossipHello(player, creature);
                    break;

                case 1:
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/icons/Spell_ChargeNegative:30|t Назад.|r", GOSSIP_SENDER_MAIN, 0);
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Alchemy:30|t Алхимия: Мастер трансмутации.|r", GOSSIP_SENDER_MAIN, 10);
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Alchemy:30|t Алхимия: Мастер эликсиров.|r", GOSSIP_SENDER_MAIN, 11);
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Alchemy:30|t Алхимия: Мастер Зелья.|r", GOSSIP_SENDER_MAIN, 12);
                    player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
                    break;
                case 10:
                    CompleteLearnProfession(player, creature, SKILL_ALCHEMY);
                    player->removeSpell(28677, false);
                    player->removeSpell(28675, false);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 11:
                    CompleteLearnProfession(player, creature, SKILL_ALCHEMY);
                    player->removeSpell(28672, false);
                    player->removeSpell(28675, false);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 12:
                    CompleteLearnProfession(player, creature, SKILL_ALCHEMY);
                    player->removeSpell(28677, false);
                    player->removeSpell(28672, false);
                    player->CLOSE_GOSSIP_MENU();
                    break;

                case 2:
                    CompleteLearnProfession(player, creature, SKILL_BLACKSMITHING);
                    player->CLOSE_GOSSIP_MENU();
                    break;

                case 3:
                    CompleteLearnProfession(player, creature, SKILL_LEATHERWORKING);
                    player->CLOSE_GOSSIP_MENU();
                    break;

                case 4:
                    CompleteLearnProfession(player, creature, SKILL_TAILORING);
                    player->CLOSE_GOSSIP_MENU();
                    break;

                case 5:
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/icons/Spell_ChargeNegative:30|t Назад!|r", GOSSIP_SENDER_MAIN, 0);
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Engineering:30|t Гномская инженерия.|r", GOSSIP_SENDER_MAIN, 13);
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Engineering:30|t Гоблинская инженерия.|r", GOSSIP_SENDER_MAIN, 14);
                    player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
                    break;
                case 13:
                    CompleteLearnProfession(player, creature, SKILL_ENGINEERING);
                    player->removeSpell(20222, false);
                    player->removeSpell(82207, false);
                    player->removeSpell(105518, false);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 14:
                    CompleteLearnProfession(player, creature, SKILL_ENGINEERING);
                    player->removeSpell(20219, false);
                    player->removeSpell(82207, false);
                    player->removeSpell(105518, false);
                    player->CLOSE_GOSSIP_MENU();
                    break;

                case 6:
                    CompleteLearnProfession(player, creature, SKILL_ENCHANTING);
                    player->CLOSE_GOSSIP_MENU();
                    break;

                case 7:
                    CompleteLearnProfession(player, creature, SKILL_JEWELCRAFTING);
                    player->CLOSE_GOSSIP_MENU();
                    break;

                case 8:
                    CompleteLearnProfession(player, creature, SKILL_INSCRIPTION);
                    player->CLOSE_GOSSIP_MENU();
                    break;

                case 9:
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/icons/Spell_ChargeNegative:30|t Назад!|r", GOSSIP_SENDER_MAIN, 0);
                    if (!player->HasSkill(SKILL_FIRST_AID)/* || player->GetClass() == CLASS_DEATH_KNIGHT*/)
                        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Spell_Holy_SealOfSacrifice:30|t Первая помощь.|r", GOSSIP_SENDER_MAIN, 15);
                    if (!player->HasSkill(SKILL_FISHING))
                        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/Trade_Fishing:30|t Рыбная ловля.|r", GOSSIP_SENDER_MAIN, 16);
                    if (!player->HasSkill(SKILL_COOKING))
                        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_Food_15:30|t Кулинария.|r", GOSSIP_SENDER_MAIN, 17);
                     if (!player->HasSkill(SKILL_ARCHAEOLOGY))
                        player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_2, "|TInterface/ICONS/INV_Misc_Food_15:30|t Археология.|r", GOSSIP_SENDER_MAIN, 18); 
                    player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
                    break;
                case 15:
                    CompleteLearnProfession(player, creature, SKILL_FIRST_AID);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 16:
                    CompleteLearnProfession(player, creature, SKILL_FISHING);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 17:
                    CompleteLearnProfession(player, creature, SKILL_COOKING);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 18:
                    CompleteLearnProfession(player, creature, SKILL_ARCHAEOLOGY);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 19:
                    CompleteLearnProfession(player, creature, SKILL_HERBALISM);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 20:
                    CompleteLearnProfession(player, creature, SKILL_MINING);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                case 21:
                    CompleteLearnProfession(player, creature, SKILL_SKINNING);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                }
            }
            return true;
        }
};

void AddSC_skill_npc()
{
    new skill_npc();
}
[/COLOR]

that way if @Wise ever deletes that pastebin its still here to access :D

https://github.com/BlackWolfsDen/misc/blob/master/Cataclysm_TC_NPC_Profession_Trainer/Cataclysm_TC_NPC_Profession_Trainer.cpp

Please use only the recommended image upload sites listed here --> Section: 2A, Rule#2


Don't use Code tags around image tags ,
Code:
radikal.ru
does try to virus attack but MS Security Essentials nails it before any damage.
 
Last edited:
Status
Not open for further replies.
Top