LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
查看: 418|回复: 32

WBE/Lua学习心得(一):自定义物品查找函数

[复制链接]
发表于 2023-7-6 09:58:20 | 显示全部楼层 |阅读模式
本帖最后由 懒动行不行 于 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("完美火焰石"))在游戏内进行验证,当背包里面有火焰石时,函数返回为真,没有时,返回为假,达到了我们的预期,可以进行下一步自动制造火焰石以及上武器临时附魔了。针对于毁灭术士,我做了一个自动制造火焰石和武器附魔的脚本,在上武器附魔时,如果武器上附魔效果还在,是要求确认的,因此脚本里面增加了自动确认的代码,各位有兴趣可以打包下载,不愿意花伸手费的,如果仔细看上文的话,基本也能得到。如果实在懒就花点小钱直接下载吧




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入我们

x
回复

使用道具 举报

发表于 2023-7-6 10:34:28 | 显示全部楼层
大佬牛逼啊,之前也曾想过做个自动附魔的语言,但是水平有限,一直不到怎么写哈。此贴要好好收藏。
回复 支持 反对

使用道具 举报

发表于 2023-7-6 11:32:20 | 显示全部楼层
自己做实现做的多了。慢慢的就差不多能写出自动化方面的挂机之类的了
回复 支持 反对

使用道具 举报

发表于 2023-7-6 11:36:13 | 显示全部楼层
对了。
到了这里差不多可以去申请进阶区勋章了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-6 15:44:52 | 显示全部楼层
vshrd 发表于 2023-7-6 11:36 AM
对了。
到了这里差不多可以去申请进阶区勋章了


太棒了
回复 支持 反对

使用道具 举报

发表于 2023-7-7 01:04:03 | 显示全部楼层
此贴要好好收藏。此贴要好好收藏。
回复 支持 反对

使用道具 举报

发表于 2023-7-7 13:22:36 | 显示全部楼层
这个必须学习学习,关于物品的函数
回复 支持 反对

使用道具 举报

发表于 2023-7-7 17:04:49 | 显示全部楼层
恭喜楼主进阶。。。哎。。不知道我什么时候能进去。。。
回复 支持 反对

使用道具 举报

发表于 2023-7-7 20:38:36 | 显示全部楼层
终于交流起来了
回复 支持 反对

使用道具 举报

发表于 2023-7-10 11:21:15 | 显示全部楼层
日常白嫖,特来学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|LUACN论坛

GMT+8, 2026-5-31 06:10 AM , Processed in 0.037109 second(s), 32 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表