今天小编为大家带来我的世界1.13命令方块教程,此次教大家用雪球实现不蓄力的弓,想学的玩家别错过下面的内容!
引言
在1.13中,execute store ... 取代了 stat,我一直在想,怎么样可以实现把nbt标签与命令的返回值联系起来呢?正巧,在维基上找到了这样的一段话:
...将返回值储存在目标坐标方块在标签路径的NBT标签上...
卧槽,如此神奇?那么就来试一试。
需要
1个命令方块
数据包里的函数
指令
循环型命令方块:
function shoot:givedata
复制代码
函数 givedata.mcfunction
#添加标签
tag @a[nbt={Inventory:[{Slot:-106b,id:"minecraft:bow"}]}] add bow_player
give @a[tag=bow_player,nbt={SelectedItem:{id:"minecraft:snowball",Count:1b}}] snowball 1
execute at @a[tag=bow_player] run tag @e[type=minecraft:snowball,limit=1,distance=..2,tag=] add bow_snowball
#生成箭
execute at @e[tag=bow_snowball] run summon minecraft:arrow ~ ~1 ~ {Tags:["bow_arrow"],damage:4b,pickup:2b}
#复制扔出雪球的 Motion
execute store result entity @e[tag=bow_arrow,limit=1] Motion[0] double 0.01 run data get entity @e[tag=bow_snowball,limit=1] Motion[0] 100
execute store result entity @e[tag=bow_arrow,limit=1] Motion[1] double 0.01 run data get entity @e[tag=bow_snowball,limit=1] Motion[1] 100
execute store result entity @e[tag=bow_arrow,limit=1] Motion[2] double 0.01 run data get entity @e[tag=bow_snowball,limit=1] Motion[2] 100
#添加新tag以防被再次选择
tag @e[tag=bow_snowball] add bow_snowball_old
tag @e[tag=bow_arrow] add bow_arrow_old
tag @e[tag=bow_snowball] remove bow_snowball
tag @e[tag=bow_arrow] remove bow_arrow
tag @a[tag=bow_player] remove bow_player
#清除雪球
kill @e[type=minecraft:snowball,tag=bow_arrow_old]
复制代码
原理
原理就是将雪球的Motion复制到弓箭上,使用
execute store result entity @e[tag=bow_arrow,limit=1] Motion[0] double 0.01 run data get entity @e[tag=bow_snowball,limit=1] Motion[0] 100
省略数组第一个元素以及第二个元素的复制命令,重复了
复制代码这里要注意倍率中有0.01与100,因为Motion中的元素都是双精确浮点数(就是小数啦,现在还没搞清楚数据类型d与b)但一输出就变成整数了,这时这样可以取到2位的精度。
其他就没什么好说的了
使用说明以及因为我没有做好的原因
将弓放到副手,左手拿一个普通的雪球(有nbt的话就会堆叠不到一起去)
右键丢出雪球,雪球会被立即替换成箭,会有显示bug(好像发现了什么)
箭会顺着雪球的轨迹走,直到落地或砸在生物上
请勿往自己脚下砸,会有伤害的
其他想说的
发现了一个bug,但是估计报告了也不会修复
如果在雪球的位置生成一个弓箭,弓箭还会是雪球的材质
在写函数的时候,开启日志,这样可以看是哪里错了(正版在启动器的设置中)
未在多人模式下进行测试
Mojang真不用心,雪球和箭的飞行算法是一样的,阻力呢,牛顿的眼泪233