鱼宝放心飞
# 使用矩形实体阵对范围内的方块进行扫描。


# 方案一
# foo:main
scoreboard players operation @e[tag=marker] value = #step value
execute as @e[tag=marker] at @s run function foo:loop


# foo:loop
execute if block ~ ~ ~ stone run function foo:find
scoreboard players remove @s value 1
execute if score @s value matches 1.. positioned ~ ~1 ~ run function foo:loop


# 方案二
# foo:main
function foo:loop


# foo:loop
execute at @e[tag=marker] if block ~ ~ ~ stone run function foo:find
scoreboard players remove #step value 1
execute as @e[tag=marker] at @s run tp @s ~ ~1 ~
execute if score #step value matches 1.. run function foo:loop


# 哪个方案更好?
# 或者有没有更好的方法?

Dahesor
都能完成问题。
但如果你问的是效率的话,指令这玩意占的资源又没多大,需要资源多一些的命令又没有多太多(就你这几个而言),主要还是看指令数量。


所以,如果让我选,我要第一个。
(还有,
如果你的扫描范围已经大到非常大,那我建议直接用clone把区域备份一份,然后用fill把原区域除了目标方块外全都替换成空气。
然后直接用spreadplayer把属量足够的盔甲家分散出去^^最后再把原区域替换回备份的那一份……说了区域得大到很大,要不然不值,感觉…………好吧好像不太对……但在特定情况下很有用)

鱼宝放心飞
Dahesor 发表于 2021-5-2 12:51
都能完成问题。
但如果你问的是效率的话,指令这玩意占的资源又没多大,需要资源多一些的命令又没有多太多 ...

# 你是第一个来回答问题的。
# foo:1
execute as @e[type=pig] run give @p apple 1
# foo:2
execute as @e[type=pig] run function foo:3
# foo:3
give @p apple 1


# 假如现在有 5 只猪,玩家分别在聊天栏里运行 foo:1 和 foo:2,你猜猜最后反馈的结果分别是运行了多少条命令?
# 其次,命令运行的数量不一定与性能消耗成正相关。


[1.14.4] 追根溯「源」——实体选择器
https://www.mcbbs.net/thread-891687-1-1.html


https://www.mcbbs.net/forum.php? ... 994402&pid=17113390


数据包结构 、 各种存储或判断方式的性能测试、以及游戏更新顺序的测试
https://www.mcbbs.net/thread-1143275-1-1.html

晴路卡
不比,没意思,爬


fill范围内可以通过fill replace来达到差不多的效果
比如我想在一个区域内的tnt位置执行caonimacaonimacaonimacaonimacaonima:woshuocaonimanitingdaolemei
那么我可以通过这样一条命令来实现:

代码:

  1. fill ~-8 ~8 ~-8 ~8 ~-8 ~8 command_block{Command:"function caonimacaonimacaonimacaonimacaonima:woshuocaonimanitingdaolemei",auto:1b} replace tnt
同时我们在caonimacaonimacaonimacaonimacaonima:woshuocaonimanitingdaolemei里可以把执行位置的方块重新setblock回tnt
缺点是会有1tick的延时因为放下来的命令方块中的指令需要在下一tick被执行。
总之这个方法适不适用还是要看你的情景,不过要做类似一定范围内高亮特定方块这种,显然用fill省事多了




鱼宝放心飞
晴路卡 发表于 2021-5-2 16:52
不比,没意思,爬


fill范围内可以通过fill replace来达到差不多的效果

换成有方块状态的方块、方块实体就没用了。