From cc850522e6e31e5ecce4daa90c498881980d69cd Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Tue, 13 Sep 2022 09:29:07 -0400 Subject: [PATCH] BRRRRRRRRRRRRRRRRRRR --- .../engine/data/chunk/LinkedTerrainChunk.java | 2 +- .../volmit/iris/engine/object/IrisWorld.java | 9 ++ .../engine/platform/BukkitChunkGenerator.java | 97 +++++++++++++++---- .../iris/engine/platform/DummyBiomeGrid.java | 29 ++++++ 4 files changed, 115 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/volmit/iris/engine/platform/DummyBiomeGrid.java diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java b/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java index 38e9535b4..dc7775b19 100644 --- a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java +++ b/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java @@ -38,7 +38,7 @@ public class LinkedTerrainChunk implements TerrainChunk { private final BiomeGrid storage; private ChunkData rawChunkData; @Setter - private boolean unsafe = false; + private boolean unsafe = true; public LinkedTerrainChunk(World world) { this(null, Bukkit.createChunkData(world)); diff --git a/src/main/java/com/volmit/iris/engine/object/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/IrisWorld.java index 0589521d8..2b5090d20 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisWorld.java @@ -32,6 +32,7 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.generator.WorldInfo; import java.io.File; import java.util.Collection; @@ -109,6 +110,14 @@ public class IrisWorld { } } + public void bind(WorldInfo worldInfo) { + name(worldInfo.getName()) + .worldFolder(new File(worldInfo.getName())) + .minHeight(worldInfo.getMinHeight()) + .maxHeight(worldInfo.getMaxHeight()) + .environment(worldInfo.getEnvironment()); + } + public void bind(World world) { if(hasRealWorld()) { return; diff --git a/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java b/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java index eff5384cc..c4a7da32a 100644 --- a/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java +++ b/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java @@ -46,6 +46,7 @@ import lombok.EqualsAndHashCode; import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.Chunk; +import org.bukkit.HeightMap; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Biome; @@ -64,6 +65,8 @@ import java.util.List; import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; @EqualsAndHashCode(callSuper = true) @@ -75,6 +78,7 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun private final File dataLocation; private final String dimensionKey; private final ReactiveFolder folder; + private final ReentrantLock lock = new ReentrantLock(); private final KList populators; private final ChronoLatch hotloadChecker; private final AtomicBoolean setup; @@ -197,34 +201,42 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun } } - private Engine getEngine(World world) { + private Engine getEngine(WorldInfo world) { if(setup.get()) { return getEngine(); } - synchronized(this) { - getWorld().setRawWorldSeed(world.getSeed()); - setupEngine(); - this.hotloader = studio ? new Looper() { - @Override - protected long loop() { - if(hotloadChecker.flip()) { - folder.check(); - } + lock.lock(); - return 250; - } - } : null; - - if(studio) { - hotloader.setPriority(Thread.MIN_PRIORITY); - hotloader.start(); - hotloader.setName(getTarget().getWorld().name() + " Hotloader"); - } - - setup.set(true); + if(setup.get()) + { + return getEngine(); } + + setup.set(true); + getWorld().setRawWorldSeed(world.getSeed()); + setupEngine(); + this.hotloader = studio ? new Looper() { + @Override + protected long loop() { + if(hotloadChecker.flip()) { + folder.check(); + } + + return 250; + } + } : null; + + if(studio) { + hotloader.setPriority(Thread.MIN_PRIORITY); + hotloader.start(); + hotloader.setName(getTarget().getWorld().name() + " Hotloader"); + } + + lock.unlock(); + + return engine; } @@ -273,8 +285,51 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun getEngine(world); } + private final AtomicInteger a = new AtomicInteger(0); + + @Override + public void generateNoise(@NotNull WorldInfo world, @NotNull Random random, int x, int z, @NotNull ChunkGenerator.ChunkData d) { + try { + getEngine(world); + computeStudioGenerator(); + TerrainChunk tc = TerrainChunk.create(d, new IrisBiomeStorage()); + this.world.bind(world); + if(studioGenerator != null) { + studioGenerator.generateChunk(getEngine(), tc, x, z); + } else { + ChunkDataHunkHolder blocks = new ChunkDataHunkHolder(tc); + BiomeGridHunkHolder biomes = new BiomeGridHunkHolder(tc, tc.getMinHeight(), tc.getMaxHeight()); + getEngine().generate(x << 4, z << 4, blocks, biomes, true); + blocks.apply(); + biomes.apply(); + } + + Iris.debug("Generated " + x + " " + z); + } catch(Throwable e) { + Iris.error("======================================"); + e.printStackTrace(); + Iris.reportErrorChunk(x, z, e, "CHUNK"); + Iris.error("======================================"); + + for(int i = 0; i < 16; i++) { + for(int j = 0; j < 16; j++) { + d.setBlock(i, 0, j, Material.RED_GLAZED_TERRACOTTA.createBlockData()); + } + } + } + } + + @Override + public int getBaseHeight(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z, @NotNull HeightMap heightMap) { + return 4; + } + @Override public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) { + if(true) { + super.generateChunkData(world, ignored, x, z, biome); + } + try { getEngine(world); computeStudioGenerator(); diff --git a/src/main/java/com/volmit/iris/engine/platform/DummyBiomeGrid.java b/src/main/java/com/volmit/iris/engine/platform/DummyBiomeGrid.java new file mode 100644 index 000000000..0d9db538f --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/platform/DummyBiomeGrid.java @@ -0,0 +1,29 @@ +package com.volmit.iris.engine.platform; + +import org.bukkit.block.Biome; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; + +public class DummyBiomeGrid implements ChunkGenerator.BiomeGrid { + @NotNull + @Override + public Biome getBiome(int x, int z) { + return null; + } + + @NotNull + @Override + public Biome getBiome(int x, int y, int z) { + return null; + } + + @Override + public void setBiome(int x, int z, @NotNull Biome bio) { + + } + + @Override + public void setBiome(int x, int y, int z, @NotNull Biome bio) { + + } +}