魔兽游戏中最方便的搜索物品宏(支持TBC)
初始化搜索数据的宏
/run i_m={};i_m.id={};i_m.nm={};t_i=0;for i=1,50000 do local nm=GetItemInfo(i);if (nm) then t_i=t_i+1;i_m.id[t_i]=i;i_m.nm[t_i]=nm;end end
用来显示物品链接的宏
/run function SI_M(s) local _,lnk=GetItemInfo("item:"..s);if (lnk) then local o=s..": "..lnk;DEFAULT_CHAT_FRAME:AddMessage(o);return 1;end return 0;end
用来搜索物品的宏
/run function FI_M(str) local sum=0;for i=1,t_i do if (string.find(i_m.nm[i],str)) then sum=sum+SI_M(i_m.id[i]..":0:0:0:0:0:0:0");end end DEFAULT_CHAT_FRAME:AddMessage("搜索''"..str.."'', 共查到"..sum.."件物品");end
以上三个宏在进入游戏后按顺序执行过一遍就可以用下面的宏命令搜索物品。
/run FI_M("复仇角斗士的皮甲");
/run FI_M("骑乘虚空鳐");
/run FI_M("战斗大师");
下面对以上三条宏分别解释一下功能
第一条宏
/run i_m={}; --初始化全局变量i_m设置为空数组;
i_m.id={}; --初始化全局变量i_m的id值设置为空数组,用来存放魔兽世界所有物品的ID值;
i_m.nm={}; --初始化全局变量i_m的nm值设置为空数组,用来存放魔兽世界所有物品的名称;
t_i=0; --初始化全局变量t_i值为0,用来存放魔兽世界所有物品的总数;
for i=1,50000 do --循环50000次,
local nm=GetItemInfo(i); --用API函数GetItemInfo从魔兽世界客户端物品数据库缓存中取得物品名,保存到nm中;
if (nm) then --如果物品ID为i的物品存在,
t_i=t_i+1; --物品的总数增加1;
i_m.id[t_i]=i; --i_m.id数组保存物品的ID值为i;
i_m.nm[t_i]=nm; --i_m.nm数组保存物品的名称为nm;
end --if语句结束
end --for循环结束。
第二条宏
/run function SI_M(s) --定义函数SI_M(ShowItem_Macro),用作显示物品链接的功能,参数是物品链接相关的8个数值组成的字符串,格式为"x:x:x:x:x:x:x:x"
local _,lnk=GetItemInfo("item:"..s); --为_,lnk分别赋值为API函数GetItemInfo返回的前两个值,分别是物品的名称和物品链接;
if (lnk) then --如果物品链接存在,
local o=s..": "..lnk; --组合物品链接,s..": "只是物品链接之前显示的物品ID值,冒号后面才是物品链接lnk;
DEFAULT_CHAT_FRAME:AddMessage(o); --在默认的聊天框中显示刚才组合的字符串,格式为“物品ID : 物品链接”;
return 1; --返回一个数值1,外部调用此函数的时候,查找到的链接数累加1;
end --if语句结束
return 0; --返回一个数值0,外部调用此函数的时候,查找的链接数累加0;
end --函数定义结束。
第三条宏
/run function FI_M(str) --定义函数FI_M(FindItem_Macro),用作搜索物品的功能,参数是查询物品链接所用的字符串
local sum=0; --初始化变量sum用来保存搜索到的物品个数;
for i=1,t_i do --循环t_i次,循环的次数根据第一条宏执行后统计的总数而定
if (string.find(i_m.nm[i],str)) then --如果找到一个符合查询要求str的物品i_m.nm[i]
sum=sum+SI_M(i_m.id[i]..":0:0:0:0:0:0:0"); --调用由SI_M函数显示一条合成的物品链接字符串,返回的值累加到sum中;
end --if语句结束
end --for循环结束
DEFAULT_CHAT_FRAME:AddMessage("搜索''"..str.."'', 共查到"..sum.."件物品"); --在默认的聊天框中显示搜索结果;
end --函数定义结束。
下面说明一下查询字符串的用法
基本命令格式:
/run FI_M("复仇角斗士的皮甲");
/run FI_M("骑乘虚空鳐");
/run FI_M("战斗大师");
使用这个命令
/run FI_M("复仇角斗士");
可以查询出以下结果:
------------------------------------------------------
33700:0:0:0:0:0:0:0 : [复仇角斗士的皮甲手套]
33701:0:0:0:0:0:0:0 : [复仇角斗士的皮甲头盔]
33702:0:0:0:0:0:0:0 : [复仇角斗士的皮甲护腿]
33703:0:0:0:0:0:0:0 : [复仇角斗士的皮甲护肩]
33704:0:0:0:0:0:0:0 : [复仇角斗士的皮甲外套]
搜索''复仇角斗士的皮甲'', 共查到5件物品
------------------------------------------------------
使用这个命令
/run FI_M("骑乘虚空鳐");
可以查询出以下结果:
------------------------------------------------------
32314:0:0:0:0:0:0:0 : [绿色骑乘虚空鳐]
32316:0:0:0:0:0:0:0 : [紫色骑乘虚空鳐]
32317:0:0:0:0:0:0:0 : [红色骑乘虚空鳐]
32318:0:0:0:0:0:0:0 : [银色骑乘虚空鳐]
32319:0:0:0:0:0:0:0 : [蓝色骑乘虚空鳐]
搜索''骑乘虚空鳐'', 共查到5件物品
------------------------------------------------------
使用这个命令
/run FI_M("战斗大师");
可以查询出以下结果:
------------------------------------------------------
34576:0:0:0:0:0:0:0 : [战斗大师的残暴]
34577:0:0:0:0:0:0:0 : [战斗大师的堕落]
34578:0:0:0:0:0:0:0 : [战斗大师的决心]
34579:0:0:0:0:0:0:0 : [战斗大师的勇猛]
34580:0:0:0:0:0:0:0 : [战斗大师的坚定]
搜索''战斗大师'', 共查到5件物品
------------------------------------------------------
还可以使用这样的字符串搜索:
/run FI_M("图鉴:(.+)水玉");
可以查询出以下结果:
------------------------------------------------------
24217:0:0:0:0:0:0:0 : [图鉴:坚硬水玉]
24218:0:0:0:0:0:0:0 : [图鉴:辐光水玉]
24219:0:0:0:0:0:0:0 : [图鉴:眩光水玉]
24220:0:0:0:0:0:0:0 : [图鉴:裂纹水玉]
33783:0:0:0:0:0:0:0 : [图鉴:稳固水玉]
搜索''图鉴:(.+)水玉'', 共查到5件物品
------------------------------------------------------
如果换成
/run FI_M("图鉴:(.-)水玉");
可以查询出以下结果:
------------------------------------------------------
24182:0:0:0:0:0:0:0 : [图鉴:水玉猫头鹰]
24217:0:0:0:0:0:0:0 : [图鉴:坚硬水玉]
24218:0:0:0:0:0:0:0 : [图鉴:辐光水玉]
24219:0:0:0:0:0:0:0 : [图鉴:眩光水玉]
24220:0:0:0:0:0:0:0 : [图鉴:裂纹水玉]
33783:0:0:0:0:0:0:0 : [图鉴:稳固水玉]
搜索''图鉴:(.-)水玉'', 共查到6件物品
------------------------------------------------------
(.+)可以代替一个或多个字符。如果想代替零个或多个字符请用(.-)
由于这个搜索功能是使用的Lua编程语言的string类的find函数功能,所以可以使用模式字符串。
下面的表列出了Lua支持的所有字符类:
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表0的字符
Lua中的模式修饰符有四个:
+ 匹配前一字符1次或多次
* 匹配前一字符0次或多次
- 匹配前一字符0次或多次
? 匹配前一字符0次或1次
其实以上列出的Lua模式字符串在本搜索中很少能用到,能用的也只有(.+)和(.-),所以可以不必担心必须了解Lua语言。
使用这个命令的前提是 被搜索的物品必须是客户端缓存数据库中已存在的物品,换句话说就是你在使用这台电脑时曾经见过的物品。由于燃烧的远征2.0版本的更新,以前缓存的物品已经全部不存在了,所以查出的物品都是你在2.0版本之后出现过的物品。当然随着你经常见到新的物品,你电脑里缓存的物品数据越来越多,能查到的东西也越来越多,那么,使用这套宏就像是在使用一个高效率的物品查看器,想发什么物品的链接就能发。