qweshen
如题。比如我想制作“食物腐败”的效果,让玩家背包里的面包放置超过一定时间就会“发霉腐败”变成腐肉。item指令只能替换指定槽位上的物品,而如果要替换某一件指定的物品而且继承它的槽位该怎么操作呢?如果使用clear和give指令则不能控制新物品的槽位是否与旧物品相同(比如面包放在背包里,clear面包后give腐肉的时候如果快捷栏有空位就会优先放在快捷栏里面)。我看到很多地图都能做到类似的效果,遂想求问,是否除了item穷举所有槽位还有别的更便捷的办法?游戏版本是1.20.

开心的阿诺
https://www.mcbbs.net/thread-1363931-1-1.html

qweshen
开心的阿诺 发表于 2023-7-24 14:11
https://www.mcbbs.net/thread-1363931-1-1.html

也就是说只能穷举了对吧😭

开心的阿诺
qweshen 发表于 2023-7-24 15:37
也就是说只能穷举了对吧😭

我是这么干的

Ph-苯
我有一个没试验过的设想:先给一个潜影盒装满不能由其它途径得到的特定物品(记为I1),然后用data modify append from把玩家的物品栏加入到潜影盒,这样玩家的前27个槽位中的非空槽位就会替换掉潜影盒的槽位,然后就可以用data对潜影盒批量操作,再loot replace替换掉玩家物品栏的前27个槽位,最后clear清除I1,这样就实现了对玩家前27个槽位的非穷举操作。这个方法利用的是列表中Slot相同的槽位复合标签,后面的会覆盖前面的,所以用data modify append from能用玩家槽位覆盖潜影盒已有槽位。但是其它槽位我还没想到什么非穷举方法。

qweshen
Ph-苯 发表于 2023-7-24 16:30
我有一个没试验过的设想:先给一个潜影盒装满不能由其它途径得到的特定物品(记为I1),然后用data modify  ...

是个好思路,我刚刚试了一下,的确可以用玩家的前27个槽位替换掉潜影盒的槽位并对里面的数据批量编辑,最后返回到玩家的时候出了问题,loot指令我不太会用,现看的wiki然后试着用/loot replace entity @p container.0 27 mine 0 0 0 mainhand指令返回,但是只会返回一个装着那些东西的潜影盒而不能把潜影盒里面的东西直接返回到玩家背包。。。

Ph-苯
qweshen 发表于 2023-7-24 20:34
是个好思路,我刚刚试了一下,的确可以用玩家的前27个槽位替换掉潜影盒的槽位并对里面的数据批量编辑,最 ...

你得修改战利品表,比如这个浅蓝色潜影盒:
然后用指定工具挖掘:
  1. loot replace entity @p hotbar.0 27 mine 0 0 0 iron_pickaxe{drop_content:1b}
复制代码

qweshen
Ph-苯 发表于 2023-7-25 12:18
你得修改战利品表,比如这个浅蓝色潜影盒:然后用指定工具挖掘:

原来如此,按这样操作确实能正确返回物品了。如果单论前27个槽位的话,确实能做到非穷举把面包改为腐肉的效果了。但是若我想给面包加上“保质期”的分数,然后每秒让背包里的各面包的这个分数-1就没办法了,要做到这样估计还是得穷举。不管怎么样这个思路还是很有价值的,谢谢大佬

Ph-苯
qweshen 发表于 2023-7-25 18:47
原来如此,按这样操作确实能正确返回物品了。如果单论前27个槽位的话,确实能做到非穷举把面包改为腐肉的 ...

为什么要做到保质期还是得穷举?

qweshen
Ph-苯 发表于 2023-7-26 02:06
为什么要做到保质期还是得穷举?

我是这样想的,如果玩家背包内有多个保质期不同的面包,要让这些面包的的保质期每隔一定时间都下降一定值。但是用data modify set指令只能把所有面包的保质期都改为同一个值,用execute store和data get又不行,因为data get只能返回单个nbt值。即便我有办法获取这27个格子内所有面包的保质期,修改后也不知道怎么才能修改后按顺序准确返回到各自原面包的路径里。要准确获取每个槽位上面包的保质期然后减1后再各自返回,我除了穷举实在想不出什么办法了😂

Ph-苯
qweshen 发表于 2023-7-26 13:24
我是这样想的,如果玩家背包内有多个保质期不同的面包,要让这些面包的的保质期每隔一定时间都下降一定值 ...

你知道如何遍历一个列表吗?
  1. data get storage s list[0]
  2. data modify storage s list append from storage s list[0]
  3. data remove storage s list[0]
  4. scoreboard players remove c v 1
  5. execute if score c v matches 1.. run function this
复制代码

qweshen
Ph-苯 发表于 2023-7-26 18:09
你知道如何遍历一个列表吗?

我的确不知道。。。指令这些我是最近才有兴趣和时间入门学习的,只是照着wiki上学了一点最基本的格式什么的,对于这些比较进阶的用法确实不懂。非常感谢你的耐心解答。