added defering of pixel spawning
This commit is contained in:
parent
4bda427693
commit
ab58b291c8
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user