added defering of pixel spawning

This commit is contained in:
Elias Müller 2024-10-11 20:03:15 +02:00
parent 4bda427693
commit ab58b291c8

View File

@ -17,6 +17,8 @@ import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.io.File; import java.io.File;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class PixelBlock { public class PixelBlock {
private final PixelBlockWorld pixelWorld; private final PixelBlockWorld pixelWorld;
@ -122,34 +124,51 @@ public class PixelBlock {
} }
public void updateEntities() { public void updateEntities() {
this.getBlockTaskChain() record PixelData(PixelBlock parent, Vector relativeLocation, BlockData block, double scale) {
.sync(this::clearEntities) Pixel create() {
.sync(() -> { return Pixel.newPixel(this.parent, this.relativeLocation, this.block, this.scale);
for (int x = 0; x < pixelsPerBlock; x++) { }
for (int y = 0; y < pixelsPerBlock; y++) { }
for (int z = 0; z < pixelsPerBlock; z++) { List<PixelData> pixelData = new ArrayList<>();
World world = pixelBlockLocation.getWorld();
Location relativeLocation = new Location(world, x, y, z);
Location blockLocation = this.pixelWorld.getBuildOrigin(); this.clearEntities();
switch (this.facingDirection) { for (int x = 0; x < pixelsPerBlock; x++) {
case south -> blockLocation.add(relativeLocation.x(), relativeLocation.y(), relativeLocation.z()); for (int y = 0; y < pixelsPerBlock; y++) {
case north -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.x(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.z()); for (int z = 0; z < pixelsPerBlock; z++) {
case east -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.z(), relativeLocation.y(), relativeLocation.x()); World world = pixelBlockLocation.getWorld();
case west -> blockLocation.add(relativeLocation.z(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.x()); Location relativeLocation = new Location(world, x, y, z);
}
BlockData block = blockLocation.getBlock().getBlockData();
if(!block.getMaterial().isEmpty()) { Location blockLocation = this.pixelWorld.getBuildOrigin();
this.getBlockTaskChain() switch (this.facingDirection) {
.delay(1) case south -> blockLocation.add(relativeLocation.x(), relativeLocation.y(), relativeLocation.z());
.sync(() -> pixels.add(Pixel.newPixel(this, relativeLocation.toVector(), block, (double) 1 / pixelsPerBlock))) case north -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.x(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.z());
.execute(); 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(() -> { .sync(() -> {
if(this.pixels.size() < 5) { if(this.pixels.size() < 5) {
// Location relativeLocation = new Location(pixelBlockLocation.getWorld(), 0, 0, 0); // Location relativeLocation = new Location(pixelBlockLocation.getWorld(), 0, 0, 0);