本帖最后由 懒动行不行 于 2023-7-6 10:49 AM 编辑
函数:ItemInBag(ItemName)
说明:判断玩家背包内是否有指定物品
返回值:true:如果有指定物品;false:如果没有制定物品
例子:
[Lua] 纯文本查看 复制代码 if ItemInBag("完美火焰石") then print("您背包里已有完美火焰石") else print("您背包里没发现有完美火焰石,赶紧制造一个吧") end
本人Lua小白,没有系统学习过lua语言,多次拾起过programming in Lua等书籍,奈何从没阅读超过书全文的1/10,总是被各种各样的事情打扰,真是怀念以前读书的时光。废话不对说,下面说一个小故事,一次所谓“自写函数”的经历,供诸君一乐
不久前在逛lua论坛时看到了这样一个帖子
[函数] 摧毁物品函数
作者:玄月无尘 发表时间: 2017-7-18
在向大佬学习的同时,突然联想到在写术士WBE脚本时有一个自动使用法术石/火焰石的脚本,但是没有做背包没有就自动制作的脚本。当时翻了翻WBE手册,发现没有检索背包特定物品的函数,真是天下掉下来个林妹妹,想什么就来什么,完全可以根据这个例子,自写一个检索背包特定物品的函数嘛。于是说干就干,完全模仿大神的写法,最初是这样写的:
[Lua] 纯文本查看 复制代码 function ItemInBag(ItemName) --自定义ItemInBag()函数
for bag=0,4,1 do --检索背包0到4
for slot=1, GetContainerNumSlots(bag), 1 do --检索背包每一格,从1~最大数
local name=GetContainerItemLink(bag,slot) --局部变量name,通过GetContainerItemLink获得第bag背包第slot格内的物品链接
if ItemName==name then return true --如果输入的ItemName等于name,则返回真
else return false --否则就返回假。也就是说自定义的ItemInBag()函数返回的是布尔值。
end
end
end
end
写完后感觉自信满满,于是直接写了自动制造火焰石的脚本
[Lua] 纯文本查看 复制代码 --使用自定义函数判断背包是否有完美火焰石,如果没有则制造,如果有则判断是否有武器附魔,如果没有则使用火焰石附魔武器
if not ItemInBag("完美火焰石") then
if not BeeUnitAffectingCombat("player") and BeeUnitCastSpellTime("player")<0 and BeeIsRun("完美火焰石") then BeeRun("/cast 制造火焰石") return end
if ItemInBag("完美火焰石") and not BeeUnitAffectingCombat("player") and BeeUnitCastSpellTime("player")<0 and BeeWeaponEnchantInfo(1)<0 then BeeRun("/use 完美火焰石\n /use 16") return end
但是悲剧的是,背包里面没有火焰石,也不会制造,也就是说自定义函数出问题了,于是一个语句一个语句的分析,碍于浅薄的lua基础,看不出哪儿有问题。于是在背包里面手动制造了火焰石,然后运行自定义的这个函数,看看返回值是什么
[Lua] 纯文本查看 复制代码 /run print(ItemInBag("完美火焰石"))
返回值显示是false,那么肯定是第5行语句错了。于是左思右想,想想还是照着大神照搬吧,别自作聪明想着做精简了,于是把代码重新改了下
[Lua] 纯文本查看 复制代码 function ItemInBag(ItemName) --自定义ItemInBag()函数
for bag=0,4,1 do --检索背包0到4
for slot=1, GetContainerNumSlots(bag), 1 do --检索背包每一格,从1~最大数
local name=GetContainerItemLink(bag,slot) --局部变量name,通过GetContainerItemLink获得第bag背包第slot格内的物品链接
local item=select(2,GetItemInfo(ItemName))
if name==item then return true --如果输入的ItemName等于name,则返回真
else return false --否则就返回假
end
end
end
end
悲剧的是,写完后依旧不行,包里实际有完美火焰石时,ItemInBag(”完美火焰石")的返回值依旧是false
于是又捧起Lua书,学习for do循环控制语句,看到一知半解的时候,有点明白自己写的函数可能错在哪里了
- 在for do循环控制结构语句中,返回值可能无法传递出去,比如这句
[Lua] 纯文本查看 复制代码 if name==item then return true
即使结果返回为真,也没办法传递给函数
2. 由于for do一直在循环检索,按照else return false的逻辑,除非是最后一个背包最后一个格子放的是指定物品,否则都最终返回为false
为验证上面的思考,我在LuatOS上设计了一代码进行验证,因为离开WOW没有对应的API,所以相关API用表代替,代码如下:
[Lua] 纯文本查看 复制代码
function ItemInBag(j)
local a=nil
i={1,2,3,4,13,6,7,8,9}
for m=1,9,1 do
if i[m]==j then
a=true
print(m,i[m],j)
end;
end;
if a==true then
return true
else return false
end;
end
j=13
print(ItemInBag(j))
i表就相当于背包内物品信息,而j相当于我们要检索的物品,在倒数第二行输入j的值,来验证函数的返回结果。如果j的值不在i表中,则应返回为假,否则返回为真。通过测试,这段代码达到了预期要求。
在进行上述思考后,对自写函数的代码进行了重新编辑,和上面的测试代码一样,增加一个局部变量,并将for do循环结果传递到这个局部变量,再通过这个局部变量对函数的真假进行判断。代码如下:
经测试,运行正常,使用/run print(ItemInBag("完美火焰石"))在游戏内进行验证,当背包里面有火焰石时,函数返回为真,没有时,返回为假,达到了我们的预期,可以进行下一步自动制造火焰石以及上武器临时附魔了。针对于毁灭术士,我做了一个自动制造火焰石和武器附魔的脚本,在上武器附魔时,如果武器上附魔效果还在,是要求确认的,因此脚本里面增加了自动确认的代码,各位有兴趣可以打包下载,不愿意花伸手费的,如果仔细看上文的话,基本也能得到。如果实在懒就花点小钱直接下载吧
|