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 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> 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);