• T端整合的商业技能训练师C++脚本


    这个是T端的,作用是商业技能训练了。。什么酿酒 锻造 皮革制作  工程(学 附魔 珠宝 铭文 烹饪 急救 这些商业技能
    
    让你在一个NPC就学完了。。
    
    下面是代码。。适用于Trinity Core 335怀旧魔兽版本哈
    
    
    
    
    // Fixed Error & Updated by : Dawnbringers
    #pragma once
    #include "ScriptPCH.h"
    #include "Language.h"
     
    class skill_npc : public CreatureScript
     
        {
    public:
     
    skill_npc() : CreatureScript("skill_npc") {}
     
    struct skill_npcAI : public ScriptedAI
        {
            skill_npcAI(Creature *c) : ScriptedAI(c)
            {
            }
     
     
        };
     
        CreatureAI* GetAI(Creature* _creature) const
        {
            return new skill_npcAI(_creature);
        }
     
        void CreatureWhisperBasedOnBool(const char *text, Creature *_creature, Player *pPlayer, bool value)
        {
            if (value)
                _creature->MonsterWhisper(text, pPlayer->GetGUID());
        }
     
        uint32 PlayerMaxLevel() const
        {
            return sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
        }
     
     
    void MainMenu(Player *pPlayer, Creature* _creature)
    {
            pPlayer->ADD_GOSSIP_ITEM(9, "[Professions] ->", GOSSIP_SENDER_MAIN, 196);
           
    }
     
        bool PlayerHasItemOrSpell(const Player *plr, uint32 itemId, uint32 spellId) const
        {
            return plr->HasItemCount(itemId, 1, true) || plr->HasSpell(spellId);
        }
     
        bool OnGossipHello(Player* pPlayer, Creature* pCreature)
        {
            MainMenu(pPlayer, pCreature);
     
            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)
            {
                sLog->outError(LOG_FILTER_PLAYER,"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;
        }
     
        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 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->MonsterWhisper("You already know two professions!", pPlayer->GetGUID());
            else
            {
                if (!LearnAllRecipesInProfession(pPlayer, skill))
                    pCreature->MonsterWhisper("Internal error occured!", pPlayer->GetGUID());
            }
        }
     
         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_CHAT, "Alchemy", GOSSIP_SENDER_MAIN, 1); //酿酒
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Blacksmithing", GOSSIP_SENDER_MAIN, 2);//锻造
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Leatherworking", GOSSIP_SENDER_MAIN, 3); //皮革制作
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Tailoring", GOSSIP_SENDER_MAIN, 4); // 裁缝
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Engineering", GOSSIP_SENDER_MAIN, 5); //工程(学
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Enchanting", GOSSIP_SENDER_MAIN, 6); //附魔
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Jewelcrafting", GOSSIP_SENDER_MAIN, 7); //珠宝
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Inscription", GOSSIP_SENDER_MAIN, 8); //铭文
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Cooking", GOSSIP_SENDER_MAIN, 9);  //烹饪
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "First Aid", GOSSIP_SENDER_MAIN, 10); //急救
     
                    pPlayer->PlayerTalkClass->SendGossipMenu(907, _creature->GetGUID());
                    break;
                case 1:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_ALCHEMY);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 2:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_BLACKSMITHING);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 3:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_LEATHERWORKING);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 4:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_TAILORING);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 5:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_ENGINEERING);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 6:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_ENCHANTING);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 7:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_JEWELCRAFTING);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 8:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_INSCRIPTION);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 9:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_COOKING);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
                case 10:
                    CompleteLearnProfession(pPlayer, _creature, SKILL_FIRST_AID);
     
                    pPlayer->CLOSE_GOSSIP_MENU();
                    break;
            }
     
            
        }
         return true;
         }
     
    };
     
    void AddSC_skill_npc()
    {
        new skill_npc();
    }
  • 相关阅读:
    安装mysql
    date, Calendar
    心态
    jdbc ---- DBUTilDao 类
    jdbc--------JdbcUtilDao 类
    Python与C/C++相互调用
    用链表和数组实现HASH表,几种碰撞冲突解决方法
    用链表实现消息队列
    文件系统的发展
    [深度学习]开源的深度学习框架
  • 原文地址:https://www.cnblogs.com/needly/p/3752593.html
Copyright © 2020-2023  润新知