• T端无限制附魔NPC脚本


    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();
    }
  • 相关阅读:
    jQuery技巧总结
    IBatis.NET框架
    武林足球Ajax全站的核心JS
    Lucene入门与使用(2)转
    图片预加载
    构建基于词典的Lucene分析器
    利用system表来注入
    查看执行后的HTML代码,方便调试
    每日英语
    关于URL的地址重写,自己也实验了一把!
  • 原文地址:https://www.cnblogs.com/needly/p/3752612.html
Copyright © 2020-2023  润新知