由于游戏提供的函数无法直接由物品名称调用该物品,所以通常简单的使用物品宏是比较麻烦的,一定要把使用的物品放在背包内特定的位置
;或则大多术士都需要的问题,能随时监视自己的灵魂碎片(当然,有插件可以做到这一点)。
以下我写写关于如何制作这类宏:
首先,我们要在背包里找到自己需要的东西,必须用循环里遍历这些包。由于放的位置有2个参数,1个是包的编号,一个是包内槽位的编号,
所以我们需要一个循环嵌套来搜索:
以下假设我们身上都是16格的包:
for bag=0,4,1 do --包的编号为从右到左,0,1,2,3,4
for cw=1,16,1 do --槽位的编号为上到下,左到右 1,2,3,4,5......16
.............. --这里我们可以写如判断物品是否为我们需要的东西的语句
end --表示内循环结束
end --外循环结束
或者用其他方式做这个循环:
While循环:while 条件 do … end
Repeat循环:repeat … until 条件
然后,要处理的是物品的判断:
我们有两个函数可以使用
GetContainerItemLink() 和 GetContainerItemInfo()
这两个函数使用的变量都是2个,一个是包的编号,一个是槽位的编号,但他们的返回值不同
GetContainerItemLink()是返回一个带着物品名字的连接,如果你用聊天函数把返回值说出来就可以看到,说出来的不光是物品的名称,还是
一个可以连接到物品详细内容窗口的连接。
比如,你的包里4,1的位置放了一块熊肉,那么用/script SendChatMessage(GetContainerItemLink(4,1),"SAY")后,就可以看到自己说“[熊
肉]”,而且用鼠标点一下说的内容,还可以弹出一个描写这块肉的窗口。
但要注意,直接用"[熊肉]"这样字符串来判断这个物品是不行的,例如:
if GetContainerItemLink(4,1)=="[熊肉]" then ..... end
这个判断是无效的。
正确的方法是,先把要做判断的物品的赋一个变量,再用变量做出判断:
rou=GetContainerItemLink(4,1) --把物品连接值赋给rou
if GetContainerItemLink(4,1)==rou then ..... end --现在就可以正常判断物品了
最后要注意的是,这个函数无法对术士的灵魂碎片做出正确的判断,意思就是,虽然灵魂碎片用这个函数显示出来是一样的,但这个函数却认
为所有的灵魂碎片都是不同的东西,即你把这个灵魂碎片的连接赋给一个变量后,这个变量就只能判断这个灵魂碎片,其他的灵魂碎片就无法
作出判断,奇怪把。所以要判断灵魂碎片,就必须用到第二个函数GetContainerItemInfo()
GetContainerItemInfo()的返回值非常多,几乎所有的物品信息都可以返回,但我们这里判断只用它返回的第一个值。
我们可以先用聊天函数来看看第一个返回值是什么样子的:
/script
a=GetContainerItemInfo(4,1)
SendChatMessage(a,"SAY")
可以看到,返回值相当长的英文,但物品的关键字是在后面。
这样,我们就有2种方法来使用这个函数来判断物品。
1、和前一个函数的方法一样,用变量存储值后再判断,前提是要把判断的物品放在特定的位置赋一下值。
2、只使用特定物品,把物品的判断关键字写在函数里,然后用string.find()来判断他。
例子:某物品的关键字是bd
if string.find(GetContainerItemInfo(4,1),bd) then .....end --判断包1,4位置是否存在关键字为bd物品。
接着要处理的是物品的使用和交换。
使用特定背包位置的物品函数:UseContainerItem(index,slot)
这个好理解,不用多解释了把。
拾取/放下物品的函数:PickupContainerItem(index,slot)
这个函数有意思,你鼠标上没抓着东西的时候就是帮你拿起特定位置的物品,有的话就变成放下物品到特定的位置并交换拿起该位置的物品。
所以要完成2个物品在包内的交换要使用3次这个函数:
PickupContainerItem(4,1) --拿起4,1位置的物品
PickupContainerItem(1,4) --放在1,4位置并拿起1,4位置的物品
PickupContainerItem(4,1) --把1,4位置的物品放在4,1位置
好拉,把以上几点组合后宏就基本完成了:
下面的例子是关于灵魂碎片的整理,把前4个包的灵魂碎片全放到最后一个包内:
/script
bag=0 cw=1 sc=1 --定义好变量,bag是包的编号,cw表示查找包的槽位,sc指向最后一个包内的槽位
for bag=0,3,1 do --从0号包开始,到3号包结束,最后一个包不搜索。
for cw=1,16,1 do --这里假设所有的包都是16个槽位的,如果没那么多槽位的包也可以用。
if GetContainerItemLink(bag,cw)~=nil --判断这个槽位是否是空的,是空就直接跳到下一个槽位
then
if string.find(GetContainerItemInfo(bag,cw),"Gem") --判断这个槽位里是否是灵魂碎片,Gem为灵魂碎片的关键字
then
while string.find(GetContainerItemInfo(4,sc),"Gem") do sc=sc+1 end
--这是一个小循环,用于判断最后一个包里原来是否已经有灵魂碎片,有的话就指向包的下一个槽位
PickupContainerItem(bag,cw)
PickupContainerItem(4,sc)
PickupContainerItem(bag,cw) --这3句控制灵魂碎片和最后一个包内物品的交换
sc=sc+1 --重要,不能忘记这个,每放置好一个碎片后就要把最后一个包的
槽位指针指向下一个槽位,上面的小循环是无法判断刚刚放好的碎片的。
end
end
end
end -循环结束
完了么,当然不行。。。因为宏的限制是255个字。所以要简化我们的宏。
最长的内容估计就是函数了,就先从简化函数开始:
建立以下宏:
/script function P(c,d) PickupContainerItem(c,d) end
/script function I(e,f) if GetContainerItemInfo(e,f) then return string.find(GetContainerItemInfo(e,f),"Gem") else return nil end end
原来的宏就变成了:
/script
bag=0 cw=1 sc=1
for bag=0,3,1 do
for cw=1,16,1 do
if G(bag,cw)~=nil
then
if I(bag,cw)
then
while I(4,sc) do sc=sc+1 end
P(bag,cw)
P(4,sc)
P(bag,cw)
sc=sc+1
end
end
end
end
多余的变量定义和过长的变量都可以更改:
/script
s=1
for g=0,3 do
for w=1,16 do
if G(g,w)
then
if I(g,w)
then
while I(4,s) do s=s+1 end
P(g,w)
P(4,s)
P(g,w)
s=s+1
end
end
end
end
现在写的下了吧。呵呵,至于使用物品的宏我虽然已经写好了,但没有测试过,等测试没问题后再放出来把。有兴趣的朋友也可以自己写写。
但要注意一点,使用物品的宏只要找到物品就可以马上跳出循环,所以用Repeat循环做比较合适