关灯
开启左侧

[脚本代码]无限制附魔NPC脚本-TrinityCore(Wotlk335怀旧)

  [复制链接]
admin实名认证 发表于 2016-4-26 22:35:18 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
1、首先,这个是脚本代码。你需要知道Trinity-Core如何增加脚本

2、这个是一套NPC的脚本。

3、脚本功能就是通过NPC来给自己身上的物品附魔(附魔都知道吧?)

5、你需要在creature_template里面加上对应的NPC,然后使用npc_enchantment脚本名称,。然后进入游戏用.npc add 来增加该功能NPC


下面是代码
#include "ScriptPCH.h"
class npc_enchantment : public CreatureScript
{
    public:
        npc_enchantment() : CreatureScript("npc_enchantment") { }

    bool OnGossipHello(Player* player, Creature* creature)
    {
        player->ADD_GOSSIP_ITEM(0, "[Enchant Weapon]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_MAINHAND);
        player->ADD_GOSSIP_ITEM(0, "[Enchant Off-Hand]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_OFFHAND);
        player->ADD_GOSSIP_ITEM(0, "[Enchant Cloak]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_BACK);
        player->ADD_GOSSIP_ITEM(0, "[Enchant Chest]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_CHEST);
        player->ADD_GOSSIP_ITEM(0, "[Enchant Bracers]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_WRISTS);
        player->ADD_GOSSIP_ITEM(0, "[Enchant Gloves]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_HANDS);
        player->ADD_GOSSIP_ITEM(0, "[Enchant Feet]", GOSSIP_SENDER_MAIN, EQUIPMENT_SLOT_FEET);

        player->SEND_GOSSIP_MENU(1, creature->GetGUID());
        return true;
    }

    void Enchant(Player* player, uint8 equipSlot, uint32 enchantID)
    {
        Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipSlot);
        if (!item)
        {
            player->CLOSE_GOSSIP_MENU();
            return;
        }

        // Must re-check that the currently equipped item is valid
        uint32 i;
        for (i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
        {
            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
            if (!spellInfo)
                continue;
            if (spellInfo->Effects[0].Effect != SPELL_EFFECT_ENCHANT_ITEM)
                continue;
            if (spellInfo->Effects[0].MiscValue != enchantID)
                continue;

            uint32 spellID = 0;
            SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellInfo->Id);
            for (SkillLineAbilityMap::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
            {
                // Not from the enchanting skill
                if (itr->second->skillId != 333 || itr->second->spellId != spellInfo->Id)
                    continue;
                spellID = itr->second->id;
                break;
            }
            if (spellID == 0)
                continue;

            int32 invType = (int32)pow(2, item->GetTemplate()->InventoryType);
            int32 subClass = (int32)pow(2, item->GetTemplate()->SubClass);
            if (item->GetTemplate()->ItemLevel < spellInfo->BaseLevel)
                continue;
            else if (spellInfo->EquippedItemClass != item->GetTemplate()->Class)
                continue;
            else if (!(spellInfo->EquippedItemSubClassMask & subClass))
                continue;
            else if (item->GetTemplate()->Class == ITEM_CLASS_ARMOR && item->GetTemplate()->SubClass != ITEM_SUBCLASS_ARMOR_SHIELD)
            {
                if (!(spellInfo->EquippedItemInventoryTypeMask & invType))
                    continue;
                else // Passed all checks
                    break;
            }
            else
                break;

        }
        if (i == sSpellMgr->GetSpellInfoStoreSize())
        {
            ChatHandler(player->GetSession()).PSendSysMessage("Failed to enchant item.");
            return;
        }

        player->ApplyEnchantment(item, PERM_ENCHANTMENT_SLOT, false);
        item->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchantID, 0, 0);
        player->ApplyEnchantment(item, PERM_ENCHANTMENT_SLOT, true);

        std::string color = "|cff";
        switch (item->GetTemplate()->Quality)
        {
            case 0: color += "9d9d9d"; break;
            case 1: color += "ffffff"; break;
            case 2: color += "1eff00"; break;
            case 3: color += "0070dd"; break;
            case 4: color += "a335ee"; break;
            case 5: color += "ff8000"; break;
        }
        ChatHandler(player->GetSession()).PSendSysMessage("|cffFFFFFF[%s%s|cffFFFFFF] |cffFF0000succesfully enchanted!", color.c_str(), item->GetTemplate()->Name1.c_str());
    }

    void ShowPage(Player* player, uint32 page, uint8 equipSlot)
    {
        Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, equipSlot);
        if (!item)
        {
            player->CLOSE_GOSSIP_MENU();
            return;
        }

        ItemTemplate const* itemTemplate = item->GetTemplate();
        if (!itemTemplate)
        {
            player->CLOSE_GOSSIP_MENU();
            return;
        }

        player->PlayerTalkClass->ClearMenus();
        uint32 startPos = (page - 1) * 10;
        uint32 currentPos = 0;

        uint32 i;
        for (i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
        {
            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
            if (!spellInfo)
                continue;
            if (spellInfo->Effects[0].Effect != SPELL_EFFECT_ENCHANT_ITEM)
                continue;
            if (spellInfo->Id == 62257) // Ignore Titanguard
                continue;
            if (itemTemplate->ItemLevel < spellInfo->BaseLevel)
                continue;
            if (spellInfo->EquippedItemClass != itemTemplate->Class)
                continue;
            int32 subClass = (int32)pow(2, itemTemplate->SubClass);
            if (!(spellInfo->EquippedItemSubClassMask & subClass))
                continue;
            int32 invType = (int32)pow(2, itemTemplate->InventoryType);
            if (itemTemplate->Class == ITEM_CLASS_ARMOR && itemTemplate->SubClass != ITEM_SUBCLASS_ARMOR_SHIELD)
                if (!(spellInfo->EquippedItemInventoryTypeMask & invType))
                    continue;

            uint32 spellID = 0;
            SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellInfo->Id);
            for (SkillLineAbilityMap::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
            {
                // Not from the enchanting skill
                if (itr->second->skillId != 333 || itr->second->spellId != spellInfo->Id)
                    continue;
                spellID = itr->second->id;
                break;
            }
            if (spellID == 0)
                continue;
            if (SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(spellInfo->Effects[0].MiscValue))
            {
                if (enchant->requiredLevel > player->getLevel())
                    continue;
                if (currentPos >= startPos)
                    player->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, enchant->description[0], equipSlot, enchant->ID);

                currentPos++;
                // Stop looping once we are 10 positions ahead
                if (currentPos == startPos + 10)
                    break;
            }
        }

        // Make sure there is actually another page
        if (currentPos == startPos + 10 && i != sSpellMgr->GetSpellInfoStoreSize())
            player->ADD_GOSSIP_ITEM(0, "Next Page", 100 + page + 1, equipSlot);  // Have to offset by 100 to ensure it gets pushed to the default case
        player->ADD_GOSSIP_ITEM(0, "Back", 100 + page - 1, equipSlot);
    }

    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)
    {
        player->PlayerTalkClass->ClearMenus();
        switch(sender)
        {
            case GOSSIP_SENDER_MAIN:
                ShowPage(player, 1, action);
                player->SEND_GOSSIP_MENU(1, creature->GetGUID());
                break;
            default:
                if (sender < 100)
                {
                    Enchant(player, sender, action);
                    player->CLOSE_GOSSIP_MENU();
                    break;
                }
                if (sender == 100)
                    OnGossipHello(player, creature);
                else
                {
                    ShowPage(player, sender - 100, action);
                    player->SEND_GOSSIP_MENU(1, creature->GetGUID());
                }
                break;
        }
        return true;
    }
};

void AddSC_npc_enchantment()
{
    new npc_enchantment();
}


下面是完整代码文件

游客,如果您要查看本帖隐藏内容请回复


 

精彩评论9

倒序浏览
wbsnbsxhlx 发表于 2022-12-29 12:41:16 | 显示全部楼层
 
支持楼主、楼主好人
 
f00000 发表于 2022-3-12 03:32:37 | 显示全部楼层
 
看着好高深的样子,废了废了.
 
gfmscsb 发表于 2022-3-8 22:12:53 | 显示全部楼层
 
[脚本代码]无限制附魔NPC脚本-TrinityCore(Wotlk335怀旧) [修改]
高级模式
 
wshjf2019 发表于 2022-1-28 23:29:11 | 显示全部楼层
 

感谢楼主分享,祝愿吾爱尚玩越来越好
 
蒋佳李 发表于 2021-7-17 15:06:27 | 显示全部楼层
 
牛逼得很。
 
qilinhuhu 发表于 2021-6-12 17:19:25 | 显示全部楼层
 
认真学习一下哦
 
selovean 发表于 2021-5-13 16:52:04 | 显示全部楼层
 
学习一下 一直对源码很感兴趣!
 
wjfh123 发表于 2021-4-17 03:00:23 | 显示全部楼层
 
找了好久终于找到了!吾爱尚玩真棒!
 
sqt 发表于 2021-3-24 13:27:02 | 显示全部楼层
 
感谢楼主分享,祝愿吾爱尚玩越来越好!
 
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • 荣誉管理

    曾经为论坛做出突出贡献目前已离职的版主
  • 论坛元老

    为论坛做出突出贡献的会员

0关注

5粉丝

3421帖子

排行榜
作者专栏

QQ交流群&&微信订阅号

QQ交流群

微信订阅号

吾爱尚玩资源基地永久域名:

Www.523Play.Com

在线管理员QQ:1589479632

邮箱:Email@523play.com

QQ交流群:558936238

Copyright   ©2015-2116  吾爱尚玩资源基地|523play.comPowered by©523Pplay.Com技术支持:吾爱尚玩资源基地