From ab58b291c8a2f0d29112b00d7fc8a47b203f1ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 11 Oct 2024 20:03:15 +0200 Subject: [PATCH] added defering of pixel spawning --- .../pixelblocks/pixelblock/PixelBlock.java | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java index 21b93a0..b66ff49 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java @@ -17,6 +17,8 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.io.File; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class PixelBlock { private final PixelBlockWorld pixelWorld; @@ -122,34 +124,51 @@ public class PixelBlock { } public void updateEntities() { - this.getBlockTaskChain() - .sync(this::clearEntities) - .sync(() -> { - for (int x = 0; x < pixelsPerBlock; x++) { - for (int y = 0; y < pixelsPerBlock; y++) { - for (int z = 0; z < pixelsPerBlock; z++) { - World world = pixelBlockLocation.getWorld(); - Location relativeLocation = new Location(world, x, y, z); + record PixelData(PixelBlock parent, Vector relativeLocation, BlockData block, double scale) { + Pixel create() { + return Pixel.newPixel(this.parent, this.relativeLocation, this.block, this.scale); + } + } + List pixelData = new ArrayList<>(); - Location blockLocation = this.pixelWorld.getBuildOrigin(); - switch (this.facingDirection) { - case south -> blockLocation.add(relativeLocation.x(), relativeLocation.y(), relativeLocation.z()); - case north -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.x(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.z()); - case east -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.z(), relativeLocation.y(), relativeLocation.x()); - case west -> blockLocation.add(relativeLocation.z(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.x()); - } - BlockData block = blockLocation.getBlock().getBlockData(); + this.clearEntities(); + for (int x = 0; x < pixelsPerBlock; x++) { + for (int y = 0; y < pixelsPerBlock; y++) { + for (int z = 0; z < pixelsPerBlock; z++) { + World world = pixelBlockLocation.getWorld(); + Location relativeLocation = new Location(world, x, y, z); - if(!block.getMaterial().isEmpty()) { - this.getBlockTaskChain() - .delay(1) - .sync(() -> pixels.add(Pixel.newPixel(this, relativeLocation.toVector(), block, (double) 1 / pixelsPerBlock))) - .execute(); - } - } + Location blockLocation = this.pixelWorld.getBuildOrigin(); + switch (this.facingDirection) { + case south -> blockLocation.add(relativeLocation.x(), relativeLocation.y(), relativeLocation.z()); + case north -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.x(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.z()); + case east -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.z(), relativeLocation.y(), relativeLocation.x()); + case west -> blockLocation.add(relativeLocation.z(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.x()); + } + BlockData block = blockLocation.getBlock().getBlockData(); + + if(!block.getMaterial().isEmpty()) { + pixelData.add(new PixelData(this, relativeLocation.toVector(), block, (double) 1 / pixelsPerBlock)); } } - }) + } + } + + int spawnSpreadInTicks = 10; + int chunkSize = (int) Math.ceil((double) pixelData.size() / spawnSpreadInTicks); + + IntStream.range(0, spawnSpreadInTicks) + .mapToObj(i -> pixelData.stream() + .skip((long) i * chunkSize) + .limit(chunkSize) + .collect(Collectors.toList())) + .forEach(pixels -> this.getBlockTaskChain() + .delay(1) + .sync(() -> pixels.forEach(pixel -> this.pixels.add(pixel.create()))) + .execute()); + + + this.getBlockTaskChain() .sync(() -> { if(this.pixels.size() < 5) { // Location relativeLocation = new Location(pixelBlockLocation.getWorld(), 0, 0, 0);