CloakedOsprey36
如何在一个区域内随机刷新方块
求大佬们解答一下吧

xiyanxinnian
用we的概率生成试试?

破损的鞘翅
假设你先用结构方块存了一个32x32x32的实心石头立方体。
然后在需要随机刷新方块的地方加载这个结构,加载之前把结构完整性调到0.01或者更低的值,这样结构方块只会随机加载这个石头立方体结构中的一小部分,达到随机刷新方块的效果

钠钠钠镓
上面那个结构方块的解法似乎挺好的
我补一个麻烦点的?
生成多个盔甲架,然后spreadplayers,在盔甲架的位置setblock

Dahesor
问题可以以下方法实现, 这项工程大约将花费你15~25分钟:

你将需要用到以下指令:
/execute /scoreboard /tag /tp /setblock /summon
这里默认你了解他们,因为我写的很匆忙会有很多BUG,需要你自己改,不了解的话请自行搜索,或在下面回复。

为了简单一些,在这里我们将你想要生成的区域设为一个区块, 即16×16×256格高的长方体

首先,创建3个记分板 x, y, z, 亦可以叫其他的名字
/scoreboard objectives add x dummy
/scoreboard objectives add y dummy
/scoreboard objectives add z dummy

然后,选择一个原点生成一个无敌隐形无重力不受影响的盔甲架,为他加上“creator”(即“创造者”)标签 (当然,你可以用别的) :
/summon minecraft:armor_stand ~ ~1 ~ {Tags:["creator"],NoAI:1b,Invulnerable:1b,PersistenceRequired:1b,Silent:1b,NoGravity:1b,Invisible:1,NoBasePlate:1}

接下来,设置一整套的命令方块组如下:

循环命令方块,保持开启1:若creator在记分板"x"上的分数小于等于16(即你想要的区域的X轴长度),在原地生成另一个,带有“x”标签

/execute if score @e[tag=creator,limit=1] x matches 1..16 run summon minecraft:armor_stand ~ ~1 ~
{Tags:["x"],NoAI:1b,Invulnerable:1b,PersistenceRequired:1b,Silent:1b,NoGravity:1b,Invisible:1,NoBasePlate:1}

连锁命令方块,条件制约2:将creator向x方向移动3格

/execute as @e[tag=creator] at @e[tag=creator] run tp ~3 ~ ~

连锁命令方块,条件制约3:将该盔甲家在记分板“x”上的分数设为creator在x上的分数

execute at @e[tag=creator,limit=1] run /scoreboard players operation @e[tag=x,x=~,y=~,z=~,dx=1,dy=1,dz=1] x = @e[tag=creator] x

连锁命令方块,条件制约4:将creator在x上的分数加一

/scoreboard players add @e[tag=creator] x 1

连锁命令方块,条件制约5:若creator在记分板"x"上的分数小于等于16(即你想要的区域的X轴长度)运行一个/say 或 /tellraw 提醒你进程结束。

/execute if score @e[tag=creator,limit=1] x matches 16.. run say 结束啦


接下来,将creator传送回原点换在y轴z轴上各运行一遍, 你就得到了这样一个东西:



形成的长方体就是你的区域了





接下来,设置第二套命令方块:

1.循环型命令方块,或根据你想要的生成速度设置红石脉冲:

在原点生成盔甲家带标签“block”或者别的什么:
/summon minecraft:armor_stand ~ ~1 ~ {Tags:["block"],NoAI:1b,Invulnerable:1b,PersistenceRequired:1b,Silent:1b,NoGravity:1b,Invisible:1,NoBasePlate:1}

2/3/4. 连锁型命令方块  将他在x,y,z上的分数设为分别随机一个带有x,y,z标签的盔甲架

scoreboard players operation @e[tag=block,!score={x=-10..}] x @r[tag=x] x
scoreboard players operation @e[tag=block,!score={y=-10..}] y @r[tag=y] y
scoreboard players operation @e[tag=block,!score={z=-10..}] z @r[tag=z] z

5/6/7.  连锁型命令方块  将所有分数x/y/z大于0的盔甲架向x/y/z方向移动一格

execute as @e[tag=block,score={x=0..}] at @e[tag=block,score={x=0..}] run tp ~1 ~ ~
execute as @e[tag=block,score={y=0..}] at @e[tag=block,score={y=0..}] run tp ~ ~1 ~
execute as @e[tag=block,score={z=0..}] at @e[tag=block,score={z=0..}] run tp ~ ~ ~1

8.连锁型命令方块  在分数归零的盔甲架上放置方块

execute at @e[tag=block,score={x=0..,z=0..,y=0..}] run setblock ~ ~ ~ stone keep

以上





CloakedOsprey36
Dahesor 发表于 2021-2-17 06:20
问题可以以下方法实现, 这项工程大约将花费你15~25分钟:
你将需要用到以下指令:/execute /scoreboard /ta ...

我的生成是2D的

Dahesor
本帖最后由 Dahesor 于 2021-2-18 23:19 编辑

那简单很多啦!
如果你的最底部有方块只需要/spreadplayer就好了,如果全是虚空就省略Y轴,如果你只在每个Y轴最上面那一层生成就用“坠落中的方块”......
生成一种方块简单,生成任意方块打函数会打得你想吐



不过可以扒其他数据包的一部分


CloakedOsprey36
Dahesor 发表于 2021-2-18 23:15
那简单很多啦!
如果你的最底部有方块只需要/spreadplayer就好了,如果全是虚空就省略Y轴,如果你只在每个 ...

/spreadplayer怎么用

Dahesor
/spreadplayers <x> <z> <分散间距> <最大范围> [under 最大高度] <考虑队伍> <传送目标…>

<x><z>填你区域正中间的坐标:注意,<y>在此指令中被忽略。
分散间距即两名传传送者之间的最短距离,在你的情况下填0就好。
<最大范围>就是你的范围大小(填100就是200×200的正方形)最大高度......你不是一个平面吗?平面多高,你就在那之上加1。考虑队伍填false,传送目标为@e[type=armor_stand,tag=自定标签]