魔兽世界插件开发:实现装备物品随机属性和技能的动态显示

这篇教程将指导您如何创建一个魔兽世界插件,用于在鼠标悬停到装备物品时,动态地显示其随机属性和技能信息。

一、插件功能概述

本插件的核心功能是读取物品上的随机属性和技能信息,并在玩家鼠标悬停在物品上时,将这些信息附加显示在物品提示框中。

二、代码实现

以下代码展示了如何使用 Lua 和 WoW API 来实现上述功能:lua-- 辅助函数:将字符串按照分隔符拆分成列表function Ea_Split(str, sep) local result = {} string.gsub(str, '[^'..sep..']+', function(subStr) table.insert(result, subStr) end) return resultend

-- 发送插件消息function Ea_SendData(packet, msg) SendAddonMessage(packet, msg, 'GUILD')end

-- 基础ID号,用于区分不同类型的交互消息BaseStatGuid = 1000000000

-- 所有物品的属性和技能数据存储Dream_ItemStatAndSpell_All_Data = {}

local ItemStatShowStr = { [0] = '|cFF14b4ff+ %d 法力值|r', [1] = '|cFF14b4ff+ %d 生命值|r', -- ... 其他属性}

-- 接收和处理其他玩家发送的交互消息local function Ea_OnEvent(self, event, packet, msg, type, sender) if event == 'CHAT_MSG_ADDON' then -- 添加属性说明和技能说明数据 if packet == 'AddShowData' then Dream_AddItemStatAndSpellData(msg) end endend

-- 创建用于接收其他玩家发送的交互消息的框架,并注册事件监听器local Ea_Frame = CreateFrame('Frame')Ea_Frame:RegisterEvent('CHAT_MSG_ADDON')Ea_Frame:SetScript('OnEvent', Ea_OnEvent)

-- 添加物品属性和技能数据function Dream_AddItemStatAndSpellData(msg) local args = Ea_Split(msg, '@') local itemGuid = tonumber(args[1]) Dream_ItemStatAndSpell_All_Data[itemGuid] = { args[2], args[3] }end

-- 在鼠标悬停在装备物品上时显示物品的随机属性和传奇属性信息local function OnFuncShowTooltip(self)

if not self.itemProcessed then        self.itemProcessed = true        local itemName, itemLink = self:GetItem()        if itemLink then            -- 提取出物品ID号            local _, _, _, _, _, _, _, _, itemGuidLow, _ = strsplit(':', string.match(itemLink, 'item[%-?%d:]+'))            local guidLow = tonumber(itemGuidLow)

        -- 如果是随机属性物品,则通过交互消息获取属性信息            if guidLow >= BaseStatGuid then		        print('1')		        Ea_SendData('GetShowData', tostring(guidLow - BaseStatGuid))            end                    -- 处理各个文本行,添加随机属性和传奇属性的具体数值            for i = 1, self:NumLines() do                local textLeft = _G[self:GetName()..'TextLeft'..i]                local text = textLeft:GetText()                            if text then                    -- 对于未鉴定的物品,在需要等级一栏添加一个红色“[未鉴定]”的提示                    if guidLow == BaseStatGuid and string.find(text, '需要等级%s%d') then                        local unidentifiedStr = '|n|cFFEA0000[未鉴定]|r|n'                        local lastLine = _G[self:GetName()..'TextLeft'..(i-1)]                        local lastText = lastLine:GetText()                        lastLine:SetText(lastText..unidentifiedStr)                    end                                    -- 对于已知的随机属性物品,在需要等级一栏下面添加随机属性的具体数值                    if guidLow ~= 0 and Dream_ItemStatAndSpell_All_Data[guidLow] ~= nil then                        local statData = Ea_Split(Dream_ItemStatAndSpell_All_Data[guidLow][1], '|')					    -- local spellData = Ea_Split(Dream_ItemStatAndSpell_All_Data[guidLow][2], '|')                                            if string.find(text, '需要等级%s%d') and i ~= 1 then                            local statStr = ''                            local atStr = ''                                                    for k = 1, #statData do                                local ar = Ea_Split(statData[k], '#')                                for e = 1, #ar do                                    local statData = Ea_Split(ar[e], '^')                                    local typ = tonumber(statData[1])                                    local val = tonumber(statData[2])                                                                    if val ~= 0 then								        -- if typ < 100 or typ > 104 then                                            atStr = '|n|n'                                            statStr = statStr..string.format(ItemStatShowStr[typ], val)..'|n'									    -- end                                    end                                end                            end                                                    local lastLine = _G[self:GetName()..'TextLeft'..(i - 1)]                            local lastText = lastLine:GetText()                                                    lastLine:SetText(lastText..atStr..statStr..'|n')                        end                    end                end            end        end	endend

-- 注册鼠标悬停事件监听器-- 在鼠标悬停在物品上时显示的 tooltip。-- GameTooltip:HookScript('OnShow', OnFuncShowTooltip)GameTooltip:HookScript('OnTooltipSetItem', OnFuncShowTooltip)-- 在聊天窗口中点击物品链接后弹出的 tooltip。ItemRefTooltip:HookScript('OnTooltipSetItem', OnFuncShowTooltip)-- 在聊天窗口中点击商店链接后弹出的 tooltip。ItemRefShoppingTooltip1:HookScript('OnTooltipSetItem', OnFuncShowTooltip)ItemRefShoppingTooltip2:HookScript('OnTooltipSetItem', OnFuncShowTooltip)-- 在商店中购买物品时弹出的 tooltip。ShoppingTooltip1:HookScript('OnTooltipSetItem', OnFuncShowTooltip)ShoppingTooltip2:HookScript('OnTooltipSetItem', OnFuncShowTooltip)

三、代码解析

  1. 辅助函数 Ea_Split: 将一个字符串按照指定的分隔符拆分成多个子字符串,并将结果存储在一个 Lua 表格中。

  2. 发送插件消息函数 Ea_SendData: 使用 SendAddonMessage 函数向游戏内发送插件消息。

  3. 全局变量: - BaseStatGuid: 用于区分不同类型交互消息的基准 ID 号。 - Dream_ItemStatAndSpell_All_Data: 存储所有物品的属性和技能数据的 Lua 表格。

  4. 事件处理函数 Ea_OnEvent: 监听游戏内的 CHAT_MSG_ADDON 事件,用于处理其他玩家发送的交互消息。

  5. 添加物品数据函数 Dream_AddItemStatAndSpellData: 将接收到的物品属性和技能数据添加到 Dream_ItemStatAndSpell_All_Data 表格中。

  6. 物品提示框显示函数 OnFuncShowTooltip: - 判断物品是否已经处理过,避免重复操作。 - 获取物品ID。 - 如果是随机属性物品,则发送消息请求属性信息。 - 遍历物品提示框的每一行文本,根据物品 ID 从 Dream_ItemStatAndSpell_All_Data 表格中获取对应的属性和技能数据,并将其格式化后添加到物品提示框的对应位置。

  7. 注册事件监听器: 将 OnFuncShowTooltip 函数注册到各个类型的物品提示框的 OnTooltipSetItem 事件中,以便在鼠标悬停在物品上时触发该函数。

四、总结

通过以上步骤,您就可以创建一个简单的魔兽世界插件,实现将随机属性和技能信息动态地显示在物品提示框中。

您可以根据自己的需求对代码进行修改和扩展,例如:

  • 添加更多的属性和技能类型。* 自定义属性和技能的显示格式。* 添加其他功能,例如显示物品评分等等。

希望这篇教程能够帮助您入门魔兽世界插件开发,祝您开发愉快


原文地址: https://www.cveoy.top/t/topic/RJG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录