首先列舉出這一套宏:
- /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版本之後出現過的物品。當然隨着你經常見到新的物品,你電腦里緩存的物品數據越來越多,能查到的東西也越來越多,那麼,使用這套宏就像是在使用一個高效率的物品查看器,想發什麼物品的鏈接就能發。