魔兽世界插件开发:实现装备物品随机属性和技能的动态显示
魔兽世界插件开发:实现装备物品随机属性和技能的动态显示
这篇教程将指导您如何创建一个魔兽世界插件,用于在鼠标悬停到装备物品时,动态地显示其随机属性和技能信息。
一、插件功能概述
本插件的核心功能是读取物品上的随机属性和技能信息,并在玩家鼠标悬停在物品上时,将这些信息附加显示在物品提示框中。
二、代码实现
以下代码展示了如何使用 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)
三、代码解析
-
辅助函数
Ea_Split: 将一个字符串按照指定的分隔符拆分成多个子字符串,并将结果存储在一个 Lua 表格中。 -
发送插件消息函数
Ea_SendData: 使用SendAddonMessage函数向游戏内发送插件消息。 -
全局变量: -
BaseStatGuid: 用于区分不同类型交互消息的基准 ID 号。 -Dream_ItemStatAndSpell_All_Data: 存储所有物品的属性和技能数据的 Lua 表格。 -
事件处理函数
Ea_OnEvent: 监听游戏内的CHAT_MSG_ADDON事件,用于处理其他玩家发送的交互消息。 -
添加物品数据函数
Dream_AddItemStatAndSpellData: 将接收到的物品属性和技能数据添加到Dream_ItemStatAndSpell_All_Data表格中。 -
物品提示框显示函数
OnFuncShowTooltip: - 判断物品是否已经处理过,避免重复操作。 - 获取物品ID。 - 如果是随机属性物品,则发送消息请求属性信息。 - 遍历物品提示框的每一行文本,根据物品 ID 从Dream_ItemStatAndSpell_All_Data表格中获取对应的属性和技能数据,并将其格式化后添加到物品提示框的对应位置。 -
注册事件监听器: 将
OnFuncShowTooltip函数注册到各个类型的物品提示框的OnTooltipSetItem事件中,以便在鼠标悬停在物品上时触发该函数。
四、总结
通过以上步骤,您就可以创建一个简单的魔兽世界插件,实现将随机属性和技能信息动态地显示在物品提示框中。
您可以根据自己的需求对代码进行修改和扩展,例如:
- 添加更多的属性和技能类型。* 自定义属性和技能的显示格式。* 添加其他功能,例如显示物品评分等等。
希望这篇教程能够帮助您入门魔兽世界插件开发,祝您开发愉快
原文地址: https://www.cveoy.top/t/topic/RJG 著作权归作者所有。请勿转载和采集!