• 关于背包物品使用整理类的宏的制作
    时间:2008-10-22   作者:佚名   出处:互联网

    由于游戏提供的函数无法直接由物品名称调用该物品,所以通常简单的使用物品宏是比较麻烦的,一定要把使用的物品放在背包内特定的位置

    ;或则大多术士都需要的问题,能随时监视自己的灵魂碎片(当然,有插件可以做到这一点)。

    以下我写写关于如何制作这类宏:

    首先,我们要在背包里找到自己需要的东西,必须用循环里遍历这些包。由于放的位置有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循环做比较合适

    网友留言/评论

    我要留言/评论