这个是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(); }