试图在minecraft中有效地挖空球体(织物改装,1.16.5)

  • 本文关键字:minecraft 有效地 java minecraft
  • 更新时间 :
  • 英文 :


我正在尝试挖空一个球体,我已经做到了,但速度非常慢(对于半径为5的球体,几秒钟,对于半径为100的球体,需要几分钟(

这是我的代码:

BlockPos pos = player.getBlockPos();
int startX = pos.getX();
int startY = pos.getY();
int startZ = pos.getZ();
int squaredRadius = radius * radius;
int x1;
int y1;
int z1;
int flags = 2 | 8 | 16 | 32;
BlockPos.Mutable blockPos = new BlockPos.Mutable(0, 0, 0);
BlockState state = Blocks.AIR.getDefaultState();
for (int x = startX - radius; x < startX + radius; x++) {
for (int y = Math.max(0, startY - radius), maxY2 = Math.min(255, startY + radius); y < maxY2; y++) {
for (int z = startZ - radius; z < startZ + radius; z++) {
x1 = x - startX;
y1 = y - startY;
z1 = z - startZ;
if (x1 * x1 + y1 * y1 + z1 * z1 <= squaredRadius)
world.setBlockState(blockPos.set(x, y, z), state, flags);
}
}
}

我怎么能加快速度?(或者它已经尽可能快了吗?(

编辑:在我的机器上,100半径大约需要8分钟

更新:我设法修复了它!我所做的是在World#setBlockState(BlockPos, BlockState, int)中进行混合,并检查标志是否是我设置的某个数字(在我的情况下是999(,以及它是否是我在设置块状态后立即取消方法执行的地方,从而在放置大量块时节省了大量时间。然而,它并没有将区块发送给玩家,所以你所要做的就是简单地将你更改的所有区块发送给播放器,我通过存储我更改的所有块来做到这一点,对于世界上的每个玩家,我都向播放器发送了一个带有新区块的ChunkDataS2Packet,这完全解决了我的问题,它就像一个魅力:D

编辑:它也不做块更新/照明更新

最新更新