diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index c0a6c81bd..68f1c7237 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -47,6 +47,8 @@ import com.volmit.iris.util.Queue; import com.volmit.iris.util.RNG; import com.volmit.iris.util.ShurikenQueue; +import io.papermc.lib.PaperLib; + public class Iris extends MortarPlugin { public static KList executors = new KList<>(); @@ -178,6 +180,7 @@ public class Iris extends MortarPlugin J.a(this::bstats); J.s(this::splash, 20); J.sr(this::tickQueue, 0); + PaperLib.suggestPaper(this); super.onEnable(); } diff --git a/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java b/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java index 61f92d1ee..6384df3fb 100644 --- a/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java @@ -370,12 +370,12 @@ public abstract class ContextualTerrainProvider implements TerrainProvider, List if(j == i || j + i == 16) { - chunk.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA")); + chunk.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA").getType()); } else { - chunk.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA")); + chunk.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA").getType()); } } } diff --git a/src/main/java/com/volmit/iris/gen/DimensionalTerrainProvider.java b/src/main/java/com/volmit/iris/gen/DimensionalTerrainProvider.java index 14e177969..9baa4450b 100644 --- a/src/main/java/com/volmit/iris/gen/DimensionalTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/DimensionalTerrainProvider.java @@ -4,7 +4,6 @@ import java.io.File; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import com.volmit.iris.Iris; @@ -15,6 +14,7 @@ import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.B; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.MortarSender; import com.volmit.iris.util.RNG; @@ -26,10 +26,10 @@ import lombok.EqualsAndHashCode; public abstract class DimensionalTerrainProvider extends ContextualTerrainProvider { private String dimensionName; - protected static final BlockData AIR = Material.AIR.createBlockData(); - protected static final BlockData CAVE_AIR = B.get("CAVE_AIR"); - protected static final BlockData BEDROCK = Material.BEDROCK.createBlockData(); - protected static final BlockData WATER = Material.WATER.createBlockData(); + protected static final FastBlockData AIR = FastBlockData.of(Material.AIR); + protected static final FastBlockData CAVE_AIR = B.get("CAVE_AIR"); + protected static final FastBlockData BEDROCK = FastBlockData.of(Material.BEDROCK); + protected static final FastBlockData WATER = FastBlockData.of(Material.WATER); public DimensionalTerrainProvider(TerrainTarget t, String dimensionName) { diff --git a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java index d8cadb05f..34b9cb3f0 100644 --- a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java @@ -8,7 +8,6 @@ import java.util.function.Function; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; -import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.entity.EntitySpawnEvent; @@ -31,6 +30,7 @@ import com.volmit.iris.object.IrisEffect; import com.volmit.iris.object.IrisEntityInitialSpawn; import com.volmit.iris.object.IrisEntitySpawnOverride; import com.volmit.iris.object.IrisRegion; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.Form; import com.volmit.iris.util.IrisStructureResult; import com.volmit.iris.util.KList; @@ -331,7 +331,7 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte return; } - BlockData data = e.getBlockState().getBlockData(); + FastBlockData data = FastBlockData.of(e.getBlockState().getBlockData()); KList drops = new KList<>(); boolean skipParents = false; diff --git a/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java b/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java index 9f61e3b16..17a2fd27a 100644 --- a/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java @@ -5,7 +5,6 @@ import java.util.List; import org.bukkit.Chunk; import org.bukkit.World; -import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.generator.BlockPopulator; @@ -29,6 +28,7 @@ import com.volmit.iris.util.BiomeMap; import com.volmit.iris.util.CarveResult; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.ChunkPosition; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.HeightMap; import com.volmit.iris.util.IObjectPlacer; import com.volmit.iris.util.IrisLock; @@ -129,15 +129,15 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider } @Override - public void set(int x, int y, int z, BlockData d) + public void set(int x, int y, int z, FastBlockData d) { getParallaxSliver(x, z).set(y, d); } @Override - public BlockData get(int x, int y, int z) + public FastBlockData get(int x, int y, int z) { - BlockData b = sampleSliver(x, z).getBlock()[y]; + FastBlockData b = sampleSliver(x, z).getBlock()[y]; return b == null ? AIR : b; } diff --git a/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java b/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java index 0a96799be..72cd02ea8 100644 --- a/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java @@ -1,6 +1,5 @@ package com.volmit.iris.gen; -import org.bukkit.block.data.BlockData; import org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.Iris; @@ -8,6 +7,7 @@ import com.volmit.iris.gen.post.PostMasterPatcher; import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.util.CaveResult; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.IPostBlockAccess; import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KList; @@ -83,17 +83,17 @@ public abstract class PostBlockTerrainProvider extends ParallaxTerrainProvider i } @Override - public BlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) + public FastBlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { if(y > 255 || y < 0) { return null; } - + if(x >> 4 == currentPostX && z >> 4 == currentPostZ) { getPostLock().lock(); - BlockData d = currentData.getBlockData(x & 15, y, z & 15); + FastBlockData d = FastBlockData.of(currentData.getBlockData(x & 15, y, z & 15)); getPostLock().unlock(); return d; } @@ -102,12 +102,22 @@ public abstract class PostBlockTerrainProvider extends ParallaxTerrainProvider i } @Override - public void setPostBlock(int x, int y, int z, BlockData d, int currentPostX, int currentPostZ, ChunkData currentData) + public void setPostBlock(int x, int y, int z, FastBlockData d, int currentPostX, int currentPostZ, ChunkData currentData) { if(x >> 4 == currentPostX && z >> 4 == currentPostZ) { getPostLock().lock(); - currentData.setBlock(x & 15, y, z & 15, d); + + if(d.hasBlockData()) + { + currentData.setBlock(x & 15, y, z & 15, d.getBlockData()); + } + + else + { + currentData.setBlock(x & 15, y, z & 15, d.getType()); + } + getPostLock().unlock(); } diff --git a/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java b/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java index a75525268..c0050331d 100644 --- a/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java @@ -4,7 +4,6 @@ import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.Bisected.Half; -import org.bukkit.block.data.BlockData; import com.volmit.iris.Iris; import com.volmit.iris.gen.atomics.AtomicSliver; @@ -29,6 +28,7 @@ import com.volmit.iris.util.B; import com.volmit.iris.util.BiomeMap; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.ChronoLatch; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.HeightMap; import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KList; @@ -70,6 +70,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider @Override public void onInit(RNG rng) { + generatorSize = 0; super.onInit(rng); getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName()); buildGenLayers(getMasterRandom()); @@ -126,7 +127,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider } RNG crand = getMasterRandom().nextParallelRNG(rx).nextParallelRNG(rz); - BlockData block; + FastBlockData block; int fluidHeight = getDimension().getFluidHeight(); double ox = getModifiedX(rx, rz); double oz = getModifiedZ(rx, rz); @@ -146,10 +147,10 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider throw new RuntimeException("Null Biome!"); } - KList layers = biome.generateLayers(rx, rz, getMasterRandom(), height, height - getFluidHeight(), getData()); - KList cavernLayers = null; - KList seaLayers = biome.isAquatic() || biome.isShore() ? biome.generateSeaLayers(rx, rz, getMasterRandom(), fluidHeight - height, getData()) : new KList<>(); - BlockData biomeFluid = biome.getFluidType().isEmpty() ? null : B.get(biome.getFluidType()); + KList layers = biome.generateLayers(rx, rz, getMasterRandom(), height, height - getFluidHeight(), getData()); + KList cavernLayers = null; + KList seaLayers = biome.isAquatic() || biome.isShore() ? biome.generateSeaLayers(rx, rz, getMasterRandom(), fluidHeight - height, getData()) : new KList<>(); + FastBlockData biomeFluid = biome.getFluidType().isEmpty() ? null : B.get(biome.getFluidType()); boolean caverning = false; KList cavernHeights = new KList<>(); @@ -306,9 +307,9 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider } } - KList floor = caveBiome.generateLayers(wx, wz, rockRandom, i.getFloor() - 2, i.getFloor() - 2, getData()); - KList ceiling = caveBiome.generateLayers(wx + 256, wz + 256, rockRandom, (carvable ? getCarvedWaterHeight(rx, rz) : height) - i.getCeiling() - 2, (carvable ? getCarvedWaterHeight(rx, rz) : height) - i.getCeiling() - 2, getData()); - BlockData blockc = null; + KList floor = caveBiome.generateLayers(wx, wz, rockRandom, i.getFloor() - 2, i.getFloor() - 2, getData()); + KList ceiling = caveBiome.generateLayers(wx + 256, wz + 256, rockRandom, (carvable ? getCarvedWaterHeight(rx, rz) : height) - i.getCeiling() - 2, (carvable ? getCarvedWaterHeight(rx, rz) : height) - i.getCeiling() - 2, getData()); + FastBlockData blockc = null; for(int j = 0; j < floor.size(); j++) { if(j == 0) @@ -351,7 +352,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider } } - private void decorateLand(RNG rng, IrisBiome biome, AtomicSliver sliver, int k, int rx, int rz, BlockData block) + private void decorateLand(RNG rng, IrisBiome biome, AtomicSliver sliver, int k, int rx, int rz, FastBlockData block) { if(!getDimension().isDecorate()) { @@ -367,7 +368,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider continue; } - BlockData d = i.getBlockData(biome, rng.nextParallelRNG(38888 + biome.getRarity() + biome.getName().length() + j++), rx, rz, getData()); + FastBlockData d = i.getBlockData(biome, rng.nextParallelRNG(38888 + biome.getRarity() + biome.getName().length() + j++), rx, rz, getData()); if(d != null) { @@ -392,14 +393,15 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider } } - if(d instanceof Bisected && k < 254) + if(d.getBlockData() instanceof Bisected && k < 254) { - Bisected t = ((Bisected) d.clone()); + FastBlockData bb = d.clone(); + Bisected t = ((Bisected) d.getBlockData()); t.setHalf(Half.TOP); - Bisected b = ((Bisected) d.clone()); + Bisected b = ((Bisected) bb.getBlockData()); b.setHalf(Half.BOTTOM); - sliver.set(k + 1, b); - sliver.set(k + 2, t); + sliver.set(k + 1, bb); + sliver.set(k + 2, d); } else @@ -425,7 +427,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider } } - private void decorateCave(RNG rng, IrisBiome biome, AtomicSliver sliver, int k, int rx, int rz, BlockData block) + private void decorateCave(RNG rng, IrisBiome biome, AtomicSliver sliver, int k, int rx, int rz, FastBlockData block) { if(!getDimension().isDecorate()) { @@ -436,7 +438,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider for(IrisBiomeDecorator i : biome.getDecorators()) { - BlockData d = i.getBlockData(biome, rng.nextParallelRNG(2333877 + biome.getRarity() + biome.getName().length() + +j++), rx, rz, getData()); + FastBlockData d = i.getBlockData(biome, rng.nextParallelRNG(2333877 + biome.getRarity() + biome.getName().length() + +j++), rx, rz, getData()); if(d != null) { @@ -453,14 +455,15 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider } } - if(d instanceof Bisected && k < 254) + if(d.getBlockData() instanceof Bisected && k < 254) { - Bisected t = ((Bisected) d.clone()); + FastBlockData bb = d.clone(); + Bisected t = ((Bisected) d.getBlockData()); t.setHalf(Half.TOP); - Bisected b = ((Bisected) d.clone()); + Bisected b = ((Bisected) bb.getBlockData()); b.setHalf(Half.BOTTOM); - sliver.set(k + 1, b); - sliver.set(k + 2, t); + sliver.set(k + 1, bb); + sliver.set(k + 2, d); } else @@ -507,7 +510,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider continue; } - BlockData d = i.getBlockData(biome, getMasterRandom().nextParallelRNG(2555 + biome.getRarity() + biome.getName().length() + j++), rx, rz, getData()); + FastBlockData d = i.getBlockData(biome, getMasterRandom().nextParallelRNG(2555 + biome.getRarity() + biome.getName().length() + j++), rx, rz, getData()); if(d != null) { @@ -723,6 +726,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider @Override public void onHotload() { + generatorSize = 0; super.onHotload(); getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName()); loadGenerators(); @@ -756,7 +760,15 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider for(int j = 0; j < generatorSize; j++) { - h += interpolateGenerator(rrx, rrz, generatorList.get(j)); + try + { + h += interpolateGenerator(rrx, rrz, generatorList.get(j)); + } + + catch(Throwable e) + { + + } } return h; diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicSliver.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicSliver.java index 432e756cf..53c5c9355 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/AtomicSliver.java +++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicSliver.java @@ -6,12 +6,12 @@ import java.io.IOException; import org.bukkit.Material; import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; import org.bukkit.generator.ChunkGenerator.BiomeGrid; import org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.Iris; import com.volmit.iris.util.B; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.HeightMap; import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KList; @@ -22,7 +22,7 @@ import lombok.Data; @Data public class AtomicSliver { - public static final BlockData AIR = B.getBlockData("AIR"); + public static final FastBlockData AIR = B.getBlockData("AIR"); public static boolean forgetful = false; private transient Biome[] biome; private transient Biome onlyBiome; @@ -32,7 +32,7 @@ public class AtomicSliver private transient final byte x; private transient final byte z; private transient boolean modified = false; - private BlockData[] block; + private FastBlockData[] block; private KList blockUpdates; private int highestBlock = 0; @@ -42,7 +42,7 @@ public class AtomicSliver this.x = (byte) x; this.z = (byte) z; blockUpdates = new KList<>(4); - this.block = new BlockData[256]; + this.block = new FastBlockData[256]; this.biome = new Biome[256]; } @@ -81,13 +81,13 @@ public class AtomicSliver blockUpdates.remove(Byte.valueOf((byte) (y + Byte.MIN_VALUE))); } - public BlockData get(int h) + public FastBlockData get(int h) { if(forgetful) { return null; } - BlockData b = block[h]; + FastBlockData b = block[h]; last = M.ms(); if(b == null) @@ -98,13 +98,13 @@ public class AtomicSliver return b; } - public BlockData getOrNull(int h) + public FastBlockData getOrNull(int h) { if(forgetful || oob(h)) { return null; } - BlockData b = block[h]; + FastBlockData b = block[h]; last = M.ms(); if(b.getMaterial().equals(Material.AIR)) @@ -115,7 +115,7 @@ public class AtomicSliver return b; } - public void set(int h, BlockData d) + public void set(int h, FastBlockData d) { if(forgetful || oob(h)) { @@ -129,7 +129,7 @@ public class AtomicSliver lock.unlock(); } - public void setSilently(int h, BlockData d) + public void setSilently(int h, FastBlockData d) { if(forgetful) { @@ -217,13 +217,13 @@ public class AtomicSliver { if(!skipNull) { - d.setBlock(x, i, z, AIR); + d.setBlock(x, i, z, AIR.getMaterial()); } } else { - d.setBlock(x, i, z, block[i]); + d.setBlock(x, i, z, block[i].getBlockData()); } } lock.unlock(); @@ -262,14 +262,14 @@ public class AtomicSliver public void read(DataInputStream din) throws IOException { lock.lock(); - this.block = new BlockData[256]; + this.block = new FastBlockData[256]; getUpdatables().clear(); // Block Palette int p = din.readByte() - Byte.MIN_VALUE; int h = din.readByte() - Byte.MIN_VALUE; int u = din.readByte() - Byte.MIN_VALUE; - KList palette = new KList(); + KList palette = new KList(); highestBlock = h; for(int i = 0; i < p; i++) @@ -306,8 +306,8 @@ public class AtomicSliver for(int i = 0; i <= highestBlock; i++) { - BlockData dat = block[i]; - String d = (dat == null ? AIR : dat).getAsString(true); + FastBlockData dat = block[i]; + String d = (dat == null ? AIR : dat).getBlockData().getAsString(true); if(!palette.contains(d)) { @@ -327,8 +327,8 @@ public class AtomicSliver // Blocks for(int i = 0; i <= highestBlock; i++) { - BlockData dat = block[i]; - String d = (dat == null ? AIR : dat).getAsString(true); + FastBlockData dat = block[i]; + String d = (dat == null ? AIR : dat).getBlockData().getAsString(true); dos.writeByte(palette.indexOf(d) + Byte.MIN_VALUE); } @@ -352,7 +352,7 @@ public class AtomicSliver { if(block[i] == null || block[i].equals(AIR)) { - BlockData b = atomicSliver.block[i]; + FastBlockData b = atomicSliver.block[i]; if(b == null || b.equals(AIR)) { continue; @@ -374,7 +374,7 @@ public class AtomicSliver for(int i = 0; i < block.length; i++) { - BlockData b = block[i]; + FastBlockData b = block[i]; if(b != null) { if(b.getMaterial().equals(Material.AIR)) @@ -382,7 +382,15 @@ public class AtomicSliver continue; } - currentData.setBlock(x, i, z, b); + if(b.hasBlockData()) + { + currentData.setBlock(x, i, z, b.getBlockData()); + } + + else + { + currentData.setBlock(x, i, z, b.getType()); + } } } diff --git a/src/main/java/com/volmit/iris/gen/layer/BiomeDataProvider.java b/src/main/java/com/volmit/iris/gen/layer/BiomeDataProvider.java index c2849b274..cf4f48933 100644 --- a/src/main/java/com/volmit/iris/gen/layer/BiomeDataProvider.java +++ b/src/main/java/com/volmit/iris/gen/layer/BiomeDataProvider.java @@ -18,6 +18,8 @@ public class BiomeDataProvider private InferredType type; private CNG generator; private GenLayerBiome layer; + private double offx = 0; + private double offz = 0; public BiomeDataProvider(@NonNull GenLayerBiome layer, @NonNull InferredType type, @NonNull RNG rng) { @@ -31,16 +33,22 @@ public class BiomeDataProvider Iris.error("BIOME STYLE IS NULL FOR " + type); } - generator = b.create(rng.nextParallelRNG(4645079 + (type.ordinal() * 23845))); + generator = b.create(rng.nextParallelRNG((layer.getIris().getDimension().isAggressiveBiomeReshuffle() ? (177 + type.ordinal() + rng.nextParallelRNG(229 - type.ordinal()).nextInt()) : 4645079) + (type.ordinal() * 23845))); + + if(layer.getIris().getDimension().isAggressiveBiomeReshuffle()) + { + offx += generator.fitDouble(-1000, 1000, 10000, -10000); + offz += generator.fitDouble(-1000, 1000, -10000, 10000); + } } public IrisBiome generatePureData(ContextualTerrainProvider g, double bx, double bz, int rawX, int rawZ, IrisRegion regionData) { - return layer.generateBiomeData(bx, bz, regionData, getGenerator(), regionData.getBiomes(g, getType()), getType(), rawX, rawZ, true); + return layer.generateBiomeData(bx + offx, bz + offz, regionData, getGenerator(), regionData.getBiomes(g, getType()), getType(), (int) (rawX + offx), (int) (rawZ + offz), true); } public IrisBiome generateData(ContextualTerrainProvider g, double bx, double bz, int rawX, int rawZ, IrisRegion regionData) { - return layer.generateBiomeData(bx, bz, regionData, getGenerator(), regionData.getBiomes(g, getType()), getType(), rawX, rawZ, false); + return layer.generateBiomeData(bx + offx, bz + offz, regionData, getGenerator(), regionData.getBiomes(g, getType()), getType(), (int) (rawX + offx), (int) (rawZ + offz), false); } } diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java index cf5c29146..2a2d5616e 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java @@ -41,14 +41,14 @@ public class GenLayerBiome extends GenLayer this.iris = iris; riverRandom = iris.getMasterRandom().nextParallelRNG(-324778); lakeRandom = iris.getMasterRandom().nextParallelRNG(-868778); - seaProvider = new BiomeDataProvider(this, InferredType.SEA, rng); - landProvider = new BiomeDataProvider(this, InferredType.LAND, rng); - shoreProvider = new BiomeDataProvider(this, InferredType.SHORE, rng); - caveProvider = new BiomeDataProvider(this, InferredType.CAVE, rng); - riverProvider = new BiomeDataProvider(this, InferredType.RIVER, rng); - lakeProvider = new BiomeDataProvider(this, InferredType.LAKE, rng); - regionGenerator = iris.getDimension().getRegionStyle().create(rng.nextParallelRNG(1188519)).bake().scale(1D / iris.getDimension().getRegionZoom()); - bridgeGenerator = iris.getDimension().getContinentalStyle().create(rng.nextParallelRNG(1541462)).bake().scale(1D / iris.getDimension().getContinentZoom()); + seaProvider = new BiomeDataProvider(this, InferredType.SEA, !iris.getDimension().isAggressiveBiomeReshuffle() ? rng : rng.nextParallelRNG((int) (29866777 * iris.getDimension().getCoordFractureZoom()))); + landProvider = new BiomeDataProvider(this, InferredType.LAND, !iris.getDimension().isAggressiveBiomeReshuffle() ? rng : rng.nextParallelRNG(-38356777 * iris.getMasterRandom().nextParallelRNG(2344).nextInt())); + shoreProvider = new BiomeDataProvider(this, InferredType.SHORE, !iris.getDimension().isAggressiveBiomeReshuffle() ? rng : rng.nextParallelRNG(29899571 + iris.getMasterRandom().nextParallelRNG(-222344).nextInt())); + caveProvider = new BiomeDataProvider(this, InferredType.CAVE, !iris.getDimension().isAggressiveBiomeReshuffle() ? rng : rng.nextParallelRNG(983564346 * -iris.getMasterRandom().nextParallelRNG(-44).nextInt())); + riverProvider = new BiomeDataProvider(this, InferredType.RIVER, !iris.getDimension().isAggressiveBiomeReshuffle() ? rng : rng.nextParallelRNG(-266717 - iris.getMasterRandom().nextParallelRNG(8100044).nextInt())); + lakeProvider = new BiomeDataProvider(this, InferredType.LAKE, !iris.getDimension().isAggressiveBiomeReshuffle() ? rng : rng.nextParallelRNG((int) (-298356111 * iris.getTarget().getSeed()))); + regionGenerator = iris.getDimension().getRegionStyle().create(rng.nextParallelRNG(1188519 + (iris.getDimension().isAggressiveBiomeReshuffle() ? 329395 + (iris.getDimension().getName().hashCode()) : 0))).bake().scale(1D / iris.getDimension().getRegionZoom()); + bridgeGenerator = iris.getDimension().getContinentalStyle().create(rng.nextParallelRNG(1541462 + (iris.getDimension().isAggressiveBiomeReshuffle() ? 29355 * (iris.getDimension().getRegions().size()) : 0))).bake().scale(1D / iris.getDimension().getContinentZoom()); } public IrisRegion getRegion(double bx, double bz) diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java index cd49f0444..c1010b095 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java @@ -3,7 +3,6 @@ package com.volmit.iris.gen.layer; import java.util.function.Function; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import com.volmit.iris.gen.TopographicTerrainProvider; import com.volmit.iris.gen.atomics.AtomicSliver; @@ -14,6 +13,7 @@ import com.volmit.iris.noise.FastNoiseDouble.NoiseType; import com.volmit.iris.object.IrisCaveLayer; import com.volmit.iris.util.B; import com.volmit.iris.util.CaveResult; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.GenLayer; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; @@ -21,8 +21,8 @@ import com.volmit.iris.util.RNG; public class GenLayerCave extends GenLayer { public static boolean bad = false; - public static final BlockData CAVE_AIR = B.getBlockData("CAVE_AIR"); - public static final BlockData AIR = B.getBlockData("AIR"); + public static final FastBlockData CAVE_AIR = B.getBlockData("CAVE_AIR"); + public static final FastBlockData AIR = B.getBlockData("AIR"); private static final KList EMPTY = new KList<>(); private final FastNoiseDouble gg; @@ -56,7 +56,7 @@ public class GenLayerCave extends GenLayer public void generateCave(KList result, double wxx, double wzz, int x, int z, AtomicSliver data, IrisCaveLayer layer, int seed) { double scale = layer.getCaveZoom(); - Function fluid = (height) -> + Function fluid = (height) -> { if(!layer.getFluid().hasFluid(iris.getData())) { @@ -161,15 +161,15 @@ public class GenLayerCave extends GenLayer } } - public boolean dig(int x, int y, int z, AtomicSliver data, Function caveFluid) + public boolean dig(int x, int y, int z, AtomicSliver data, Function caveFluid) { Material a = data.getTypeSafe(y); Material c = data.getTypeSafe(y + 1); Material d = data.getTypeSafe(y + 2); Material e = data.getTypeSafe(y + 3); Material f = data.getTypeSafe(y - 1); - BlockData b = caveFluid.apply(y); - BlockData b2 = caveFluid.apply(y + 1); + FastBlockData b = caveFluid.apply(y); + FastBlockData b2 = caveFluid.apply(y + 1); if(can(a) && canAir(c, b) && canAir(f, b) && canWater(d) && canWater(e)) { @@ -181,9 +181,9 @@ public class GenLayerCave extends GenLayer return false; } - public boolean canAir(Material m, BlockData caveFluid) + public boolean canAir(Material m, FastBlockData caveFluid) { - return (B.isSolid(m) || (B.isDecorant(m)) || m.equals(Material.AIR) || m.equals(caveFluid.getMaterial()) || m.equals(B.mat("CAVE_AIR"))) && !m.equals(Material.BEDROCK); + return (B.isSolid(m) || (B.isDecorant(FastBlockData.of(m))) || m.equals(Material.AIR) || m.equals(caveFluid.getMaterial()) || m.equals(B.mat("CAVE_AIR").getMaterial())) && !m.equals(Material.BEDROCK); } public boolean canWater(Material m) diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerRavine.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerRavine.java index bf1db2001..d2b4eed7b 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerRavine.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerRavine.java @@ -1,7 +1,6 @@ package com.volmit.iris.gen.layer; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import com.volmit.iris.gen.TopographicTerrainProvider; import com.volmit.iris.gen.atomics.AtomicSliverMap; @@ -12,6 +11,7 @@ import com.volmit.iris.util.B; import com.volmit.iris.util.BiomeMap; import com.volmit.iris.util.BlockPosition; import com.volmit.iris.util.ChunkPosition; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.GenLayer; import com.volmit.iris.util.HeightMap; import com.volmit.iris.util.MathHelper; @@ -24,8 +24,8 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = false) public class GenLayerRavine extends GenLayer { - private static final BlockData CAVE_AIR = B.get("CAVE_AIR"); - private static final BlockData LAVA = B.get("LAVA"); + private static final FastBlockData CAVE_AIR = B.get("CAVE_AIR"); + private static final FastBlockData LAVA = B.get("LAVA"); private CNG cng; public GenLayerRavine(TopographicTerrainProvider iris, RNG rng) @@ -40,9 +40,9 @@ public class GenLayerRavine extends GenLayer return 0; } - private void set(TerrainChunk pos, int x, int y, int z, BlockData b, HeightMap h, AtomicSliverMap map) + private void set(TerrainChunk pos, int x, int y, int z, FastBlockData b, HeightMap h, AtomicSliverMap map) { - pos.setBlock(x, y, z, b); + pos.setBlock(x, y, z, b.getBlockData()); map.getSliver(x, z).set(y, b); if(h.getHeight(x, z) > y) @@ -51,12 +51,12 @@ public class GenLayerRavine extends GenLayer } } - private BlockData get(TerrainChunk pos, int x, int y, int z) + private FastBlockData get(TerrainChunk pos, int x, int y, int z) { - return pos.getBlockData(x, y, z); + return FastBlockData.of(pos.getBlockData(x, y, z)); } - private BlockData getSurfaceBlock(BiomeMap map, int n6, int i, RNG rmg) + private FastBlockData getSurfaceBlock(BiomeMap map, int n6, int i, RNG rmg) { return map.getBiome(n6, i).getSurfaceBlock(n6, i, rmg, iris.getData()); } @@ -164,7 +164,7 @@ public class GenLayerRavine extends GenLayer continue; } - BlockData bb = get(terrain, i, j, n6); + FastBlockData bb = get(terrain, i, j, n6); if(B.isWater(bb)) { @@ -201,7 +201,7 @@ public class GenLayerRavine extends GenLayer continue; } - BlockData blockData = get(terrain, n6, j, i); + FastBlockData blockData = get(terrain, n6, j, i); if(isSurface(blockData)) { @@ -243,7 +243,7 @@ public class GenLayerRavine extends GenLayer return bb; } - private boolean isDirt(BlockData d) + private boolean isDirt(FastBlockData d) { //@builder Material m = d.getMaterial(); @@ -253,7 +253,7 @@ public class GenLayerRavine extends GenLayer //@done } - private boolean isSurface(BlockData d) + private boolean isSurface(FastBlockData d) { //@builder Material m = d.getMaterial(); diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerText.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerText.java index 133d085ba..077de310d 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerText.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerText.java @@ -5,20 +5,19 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.Iris; import com.volmit.iris.gen.TopographicTerrainProvider; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.object.IrisMaterialPalette; import com.volmit.iris.object.IrisObject; import com.volmit.iris.util.B; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.GenLayer; import com.volmit.iris.util.RNG; public class GenLayerText extends GenLayer { - public static final BlockData AIR = B.getBlockData("AIR"); + public static final FastBlockData AIR = B.getBlockData("AIR"); private final AtomicCache debug = new AtomicCache<>(); @@ -29,11 +28,10 @@ public class GenLayerText extends GenLayer public IrisObject getDebug() { - return debug.aquire(() -> - createTextObject("Test", "Impact", 24, B.get("STONE"))); + return debug.aquire(() -> createTextObject("Test", "Impact", 24, B.get("STONE"))); } - public IrisObject createTextObject(String text, String font, int size, BlockData b) + public IrisObject createTextObject(String text, String font, int size, FastBlockData b) { Font f = new Font(font, Font.PLAIN, size); int w = ((Graphics2D) new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB).getGraphics()).getFontMetrics(f).stringWidth(text); diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java index f1e6b8ae6..9393d803b 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java @@ -6,7 +6,6 @@ import org.bukkit.Chunk; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; @@ -25,6 +24,7 @@ import com.volmit.iris.object.IrisLootTable; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.LootMode; import com.volmit.iris.util.B; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.IrisStructureResult; import com.volmit.iris.util.KList; import com.volmit.iris.util.PrecisionStopwatch; @@ -62,7 +62,7 @@ public class GenLayerUpdate extends BlockPopulator { return; } - + PrecisionStopwatch p = PrecisionStopwatch.start(); ((IrisTerrainProvider) gen).spawnInitials(c, rx); p.end(); @@ -129,14 +129,14 @@ public class GenLayerUpdate extends BlockPopulator public void update(Chunk c, int x, int y, int z, int rx, int rz, RNG rng) { Block b = c.getBlock(x, y, z); - BlockData d = b.getBlockData(); + FastBlockData d = FastBlockData.of(b.getBlockData()); - if(B.isLit(d.getMaterial())) + if(B.isLit(d)) { updateLight(b, d); } - else if(B.isStorage(d.getMaterial())) + else if(B.isStorage(d)) { updateStorage(b, d, rx, rz, rng); } @@ -219,11 +219,11 @@ public class GenLayerUpdate extends BlockPopulator scramble(inv, rng); } - public void updateStorage(Block b, BlockData data, int rx, int rz, RNG rng) + public void updateStorage(Block b, FastBlockData data, int rx, int rz, RNG rng) { InventorySlotType slot = null; - if(B.isStorageChest(data.getMaterial())) + if(B.isStorageChest(data)) { slot = InventorySlotType.STORAGE; } @@ -307,9 +307,9 @@ public class GenLayerUpdate extends BlockPopulator } } - public void updateLight(Block b, BlockData data) + public void updateLight(Block b, FastBlockData data) { b.setType(Material.AIR, false); - b.setBlockData(data, false); + b.setBlockData(data.getBlockData(), false); } } diff --git a/src/main/java/com/volmit/iris/gen/post/PostMasterPatcher.java b/src/main/java/com/volmit/iris/gen/post/PostMasterPatcher.java index be8f338e6..34dcea43e 100644 --- a/src/main/java/com/volmit/iris/gen/post/PostMasterPatcher.java +++ b/src/main/java/com/volmit/iris/gen/post/PostMasterPatcher.java @@ -1,7 +1,6 @@ package com.volmit.iris.gen.post; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Slab.Type; @@ -13,14 +12,15 @@ import com.volmit.iris.object.IrisBiome; import com.volmit.iris.util.B; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.IrisPostBlockFilter; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; public class PostMasterPatcher extends IrisPostBlockFilter { - private static final BlockData WATER = B.getBlockData("WATER"); - private static final BlockData AIR = B.getBlockData("AIR"); + private static final FastBlockData WATER = B.getBlockData("WATER"); + private static final FastBlockData AIR = B.getBlockData("AIR"); private final RNG rng; @DontObfuscate @@ -82,8 +82,8 @@ public class PostMasterPatcher extends IrisPostBlockFilter if(g >= 3) { - BlockData bc = getPostBlock(x, h, z, currentPostX, currentPostZ, currentData); - BlockData b = getPostBlock(x, h + 1, z, currentPostX, currentPostZ, currentData); + FastBlockData bc = getPostBlock(x, h, z, currentPostX, currentPostZ, currentData); + FastBlockData b = getPostBlock(x, h + 1, z, currentPostX, currentPostZ, currentData); Material m = bc.getMaterial(); if(m.isSolid()) @@ -105,10 +105,10 @@ public class PostMasterPatcher extends IrisPostBlockFilter if(g >= 3) { - BlockData ba = getPostBlock(x, ha, z, currentPostX, currentPostZ, currentData); - BlockData bb = getPostBlock(x, hb, z, currentPostX, currentPostZ, currentData); - BlockData bc = getPostBlock(x, hc, z, currentPostX, currentPostZ, currentData); - BlockData bd = getPostBlock(x, hd, z, currentPostX, currentPostZ, currentData); + FastBlockData ba = getPostBlock(x, ha, z, currentPostX, currentPostZ, currentData); + FastBlockData bb = getPostBlock(x, hb, z, currentPostX, currentPostZ, currentData); + FastBlockData bc = getPostBlock(x, hc, z, currentPostX, currentPostZ, currentData); + FastBlockData bd = getPostBlock(x, hd, z, currentPostX, currentPostZ, currentData); g = 0; g = B.isSolid(ba) ? g + 1 : g; g = B.isSolid(bb) ? g + 1 : g; @@ -138,7 +138,7 @@ public class PostMasterPatcher extends IrisPostBlockFilter for(int i = h; i > h - max; i--) { - BlockData d = biome.getWall().get(rng, x + i, i + h, z + i, gen.getData()); + FastBlockData d = biome.getWall().get(rng, x + i, i + h, z + i, gen.getData()); if(d != null) { @@ -170,7 +170,7 @@ public class PostMasterPatcher extends IrisPostBlockFilter || (hd == h + 1 && isSolidNonSlab(x, hd, z - 1, currentPostX, currentPostZ, currentData))) //@done { - BlockData d = biome.getSlab().get(rng, x, h, z, gen.getData()); + FastBlockData d = biome.getSlab().get(rng, x, h, z, gen.getData()); if(d != null) { @@ -202,11 +202,11 @@ public class PostMasterPatcher extends IrisPostBlockFilter } // Waterlogging - BlockData b = getPostBlock(x, h, z, currentPostX, currentPostZ, currentData); + FastBlockData b = getPostBlock(x, h, z, currentPostX, currentPostZ, currentData); - if(b instanceof Waterlogged) + if(b.getBlockData() instanceof Waterlogged) { - Waterlogged ww = (Waterlogged) b; + Waterlogged ww = (Waterlogged) b.getBlockData(); boolean w = false; if(isWaterOrWaterlogged(x, h + 1, z, currentPostX, currentPostZ, currentData)) { @@ -221,7 +221,7 @@ public class PostMasterPatcher extends IrisPostBlockFilter if(w != ww.isWaterlogged()) { ww.setWaterlogged(w); - setPostBlock(x, h, z, ww, currentPostX, currentPostZ, currentData); + setPostBlock(x, h, z, b, currentPostX, currentPostZ, currentData); } } @@ -279,7 +279,7 @@ public class PostMasterPatcher extends IrisPostBlockFilter if(g >= 3) { - BlockData bc = getPostBlock(x, f, z, currentPostX, currentPostZ, currentData); + FastBlockData bc = getPostBlock(x, f, z, currentPostX, currentPostZ, currentData); b = getPostBlock(x, f + 1, z, currentPostX, currentPostZ, currentData); Material m = bc.getMaterial(); @@ -302,10 +302,10 @@ public class PostMasterPatcher extends IrisPostBlockFilter if(g >= 3) { - BlockData ba = getPostBlock(x, fa, z, currentPostX, currentPostZ, currentData); - BlockData bb = getPostBlock(x, fb, z, currentPostX, currentPostZ, currentData); - BlockData bc = getPostBlock(x, fc, z, currentPostX, currentPostZ, currentData); - BlockData bd = getPostBlock(x, fd, z, currentPostX, currentPostZ, currentData); + FastBlockData ba = getPostBlock(x, fa, z, currentPostX, currentPostZ, currentData); + FastBlockData bb = getPostBlock(x, fb, z, currentPostX, currentPostZ, currentData); + FastBlockData bc = getPostBlock(x, fc, z, currentPostX, currentPostZ, currentData); + FastBlockData bd = getPostBlock(x, fd, z, currentPostX, currentPostZ, currentData); g = 0; g = B.isSolid(ba) ? g + 1 : g; g = B.isSolid(bb) ? g + 1 : g; @@ -330,7 +330,7 @@ public class PostMasterPatcher extends IrisPostBlockFilter || (fd == f + 1 && isSolidNonSlab(x, fd, z - 1, currentPostX, currentPostZ, currentData))) //@done { - BlockData d = cave.getSlab().get(rng, x, f, z, gen.getData()); + FastBlockData d = cave.getSlab().get(rng, x, f, z, gen.getData()); if(d != null) { @@ -365,7 +365,7 @@ public class PostMasterPatcher extends IrisPostBlockFilter || (cd == c - 1 && isSolidNonSlab(x, cd, z - 1, currentPostX, currentPostZ, currentData))) //@done { - BlockData d = cave.getSlab().get(rng, x, c, z, gen.getData()); + FastBlockData d = cave.getSlab().get(rng, x, c, z, gen.getData()); if(d != null) { @@ -376,7 +376,7 @@ public class PostMasterPatcher extends IrisPostBlockFilter cancel = true; } - if(!(d instanceof Slab)) + if(!(d.getBlockData() instanceof Slab)) { cancel = true; } @@ -388,9 +388,9 @@ public class PostMasterPatcher extends IrisPostBlockFilter if(!cancel && isAirOrWater(x, c, z, currentPostX, currentPostZ, currentData)) { - Slab slab = (Slab) d.clone(); + Slab slab = (Slab) d.getBlockData(); slab.setType(Type.TOP); - setPostBlock(x, c, z, slab, currentPostX, currentPostZ, currentData); + setPostBlock(x, c, z, d, currentPostX, currentPostZ, currentData); } } } diff --git a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java index 2c474e5de..872bce6f8 100644 --- a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java +++ b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java @@ -10,7 +10,6 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; @@ -21,6 +20,7 @@ import com.volmit.iris.gen.scaffold.Provisioned; import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainProvider; import com.volmit.iris.util.ChunkPosition; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; import com.volmit.iris.util.RNG; @@ -92,7 +92,7 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned { for(int k = 0; k < 16; k++) { - BlockData b = snapshot.getBlockData(i, (h * 16) + j, k); + FastBlockData b = FastBlockData.of(snapshot.getBlockData(i, (h * 16) + j, k)); if(!Iris.edit.get(cachedWorld, i + cx, (h * 16) + j, k + cz).equals(b)) { diff --git a/src/main/java/com/volmit/iris/manager/EditManager.java b/src/main/java/com/volmit/iris/manager/EditManager.java index fed60cb9b..938247234 100644 --- a/src/main/java/com/volmit/iris/manager/EditManager.java +++ b/src/main/java/com/volmit/iris/manager/EditManager.java @@ -3,7 +3,6 @@ package com.volmit.iris.manager; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldUnloadEvent; @@ -12,6 +11,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.edit.BlockEditor; import com.volmit.iris.edit.BukkitBlockEditor; import com.volmit.iris.edit.WEBlockEditor; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KMap; import com.volmit.iris.util.M; @@ -26,14 +26,14 @@ public class EditManager implements Listener Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::update, 0, 0); } - public BlockData get(World world, int x, int y, int z) + public FastBlockData get(World world, int x, int y, int z) { - return open(world).get(x, y, z); + return FastBlockData.of(open(world).get(x, y, z)); } - public void set(World world, int x, int y, int z, BlockData d) + public void set(World world, int x, int y, int z, FastBlockData d) { - open(world).set(x, y, z, d); + open(world).set(x, y, z, d.getBlockData()); } public void setBiome(World world, int x, int y, int z, Biome d) diff --git a/src/main/java/com/volmit/iris/manager/WandManager.java b/src/main/java/com/volmit/iris/manager/WandManager.java index 0747aa06c..b84f703ba 100644 --- a/src/main/java/com/volmit/iris/manager/WandManager.java +++ b/src/main/java/com/volmit/iris/manager/WandManager.java @@ -26,6 +26,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.object.IrisObject; import com.volmit.iris.util.C; import com.volmit.iris.util.Cuboid; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import com.volmit.iris.util.M; @@ -202,7 +203,7 @@ public class WandManager implements Listener } BlockVector bv = b.getLocation().subtract(c.getLowerNE().toVector()).toVector().toBlockVector(); - s.setUnsigned(bv.getBlockX(), bv.getBlockY(), bv.getBlockZ(), b.getBlockData()); + s.setUnsigned(bv.getBlockX(), bv.getBlockY(), bv.getBlockZ(), FastBlockData.of(b.getBlockData())); } return s; diff --git a/src/main/java/com/volmit/iris/object/IrisBiome.java b/src/main/java/com/volmit/iris/object/IrisBiome.java index c64c08af4..028f228ee 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiome.java +++ b/src/main/java/com/volmit/iris/object/IrisBiome.java @@ -3,7 +3,6 @@ package com.volmit.iris.object; import java.awt.Color; import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; import com.volmit.iris.Iris; import com.volmit.iris.gen.ContextualTerrainProvider; @@ -15,6 +14,7 @@ import com.volmit.iris.util.B; import com.volmit.iris.util.DependsOn; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.IRare; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; @@ -349,14 +349,14 @@ public class IrisBiome extends IrisRegistrant implements IRare return childrenCell.aquire(() -> getChildStyle().create(random.nextParallelRNG(sig * 2137)).bake().scale(scale).bake()); } - public KList generateLayers(double wx, double wz, RNG random, int maxDepth, int height, IrisDataManager rdata) + public KList generateLayers(double wx, double wz, RNG random, int maxDepth, int height, IrisDataManager rdata) { if(isLockLayers()) { return generateLockedLayers(wx, wz, random, maxDepth, height, rdata); } - KList data = new KList<>(); + KList data = new KList<>(); if(maxDepth <= 0) { @@ -400,10 +400,10 @@ public class IrisBiome extends IrisRegistrant implements IRare return data; } - public KList generateLockedLayers(double wx, double wz, RNG random, int maxDepthf, int height, IrisDataManager rdata) + public KList generateLockedLayers(double wx, double wz, RNG random, int maxDepthf, int height, IrisDataManager rdata) { - KList data = new KList<>(); - KList real = new KList<>(); + KList data = new KList<>(); + KList real = new KList<>(); int maxDepth = Math.min(maxDepthf, getLockLayersMax()); if(maxDepth <= 0) { @@ -470,9 +470,9 @@ public class IrisBiome extends IrisRegistrant implements IRare return this; } - public KList generateSeaLayers(double wx, double wz, RNG random, int maxDepth, IrisDataManager rdata) + public KList generateSeaLayers(double wx, double wz, RNG random, int maxDepth, IrisDataManager rdata) { - KList data = new KList<>(); + KList data = new KList<>(); for(int i = 0; i < seaLayers.size(); i++) { @@ -660,7 +660,7 @@ public class IrisBiome extends IrisRegistrant implements IRare return getBiomeGenerator(rng).fit(biomeScatter, x, y, z); } - public BlockData getSurfaceBlock(int x, int z, RNG rng, IrisDataManager idm) + public FastBlockData getSurfaceBlock(int x, int z, RNG rng, IrisDataManager idm) { if(getLayers().isEmpty()) { diff --git a/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java b/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java index cbb8fc267..ccc0e509f 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java +++ b/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java @@ -1,7 +1,5 @@ package com.volmit.iris.object; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.Iris; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.manager.IrisDataManager; @@ -10,6 +8,7 @@ import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.DependsOn; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import com.volmit.iris.util.MaxNumber; import com.volmit.iris.util.MinNumber; @@ -91,7 +90,7 @@ public class IrisBiomeDecorator private final transient AtomicCache layerGenerator = new AtomicCache<>(); private final transient AtomicCache varianceGenerator = new AtomicCache<>(); private final transient AtomicCache heightGenerator = new AtomicCache<>(); - private final transient AtomicCache> blockData = new AtomicCache<>(); + private final transient AtomicCache> blockData = new AtomicCache<>(); public int getHeight(RNG rng, double x, double z, IrisDataManager data) { @@ -127,7 +126,7 @@ public class IrisBiomeDecorator return palette; } - public BlockData getBlockData(IrisBiome b, RNG rng, double x, double z, IrisDataManager data) + public FastBlockData getBlockData(IrisBiome b, RNG rng, double x, double z, IrisDataManager data) { if(getBlockData(data).isEmpty()) { @@ -151,14 +150,14 @@ public class IrisBiomeDecorator return null; } - public KList getBlockData(IrisDataManager data) + public KList getBlockData(IrisDataManager data) { return blockData.aquire(() -> { - KList blockData = new KList<>(); + KList blockData = new KList<>(); for(IrisBlockData i : palette) { - BlockData bx = i.getBlockData(data); + FastBlockData bx = i.getBlockData(data); if(bx != null) { blockData.add(bx); diff --git a/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java b/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java index dcabeecb8..324e04912 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java +++ b/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java @@ -1,7 +1,5 @@ package com.volmit.iris.object; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.noise.CNG; @@ -9,6 +7,7 @@ import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.DependsOn; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import com.volmit.iris.util.MaxNumber; import com.volmit.iris.util.MinNumber; @@ -56,7 +55,7 @@ public class IrisBiomePaletteLayer @Desc("The palette of blocks to be used in this layer") private KList palette = new KList().qadd(new IrisBlockData("GRASS_BLOCK")); - private final transient AtomicCache> blockData = new AtomicCache<>(); + private final transient AtomicCache> blockData = new AtomicCache<>(); private final transient AtomicCache layerGenerator = new AtomicCache<>(); private final transient AtomicCache heightGenerator = new AtomicCache<>(); @@ -65,7 +64,7 @@ public class IrisBiomePaletteLayer return heightGenerator.aquire(() -> CNG.signature(rng.nextParallelRNG(minHeight * maxHeight + getBlockData(data).size()))); } - public BlockData get(RNG rng, double x, double y, double z, IrisDataManager data) + public FastBlockData get(RNG rng, double x, double y, double z, IrisDataManager data) { if(getBlockData(data).isEmpty()) { @@ -96,14 +95,14 @@ public class IrisBiomePaletteLayer return palette; } - public KList getBlockData(IrisDataManager data) + public KList getBlockData(IrisDataManager data) { return blockData.aquire(() -> { - KList blockData = new KList<>(); + KList blockData = new KList<>(); for(IrisBlockData ix : palette) { - BlockData bx = ix.getBlockData(data); + FastBlockData bx = ix.getBlockData(data); if(bx != null) { for(int i = 0; i < ix.getWeight(); i++) diff --git a/src/main/java/com/volmit/iris/object/IrisBlockData.java b/src/main/java/com/volmit/iris/object/IrisBlockData.java index 8660f5f0b..c11911295 100644 --- a/src/main/java/com/volmit/iris/object/IrisBlockData.java +++ b/src/main/java/com/volmit/iris/object/IrisBlockData.java @@ -1,13 +1,12 @@ package com.volmit.iris.object; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.Iris; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.util.B; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; import com.volmit.iris.util.MaxNumber; @@ -57,7 +56,7 @@ public class IrisBlockData extends IrisRegistrant @Desc("Optional properties for this block data such as 'waterlogged': true") private KMap data = new KMap<>(); - private final transient AtomicCache blockdata = new AtomicCache<>(); + private final transient AtomicCache blockdata = new AtomicCache<>(); private final transient AtomicCache realProperties = new AtomicCache<>(); public IrisBlockData(String b) @@ -87,11 +86,11 @@ public class IrisBlockData extends IrisRegistrant return computeProperties(getData()); } - public BlockData getBlockData(IrisDataManager data) + public FastBlockData getBlockData(IrisDataManager data) { return blockdata.aquire(() -> { - BlockData b = null; + FastBlockData b = null; IrisBlockData customData = data.getBlockLoader().load(getBlock(), false); @@ -103,7 +102,7 @@ public class IrisBlockData extends IrisRegistrant { b = b.clone(); - String st = b.getAsString(true); + String st = b.getBlockData().getAsString(true); if(st.contains("[")) { @@ -124,7 +123,7 @@ public class IrisBlockData extends IrisRegistrant Iris.warn("Debug block data " + sx + " (CUSTOM)"); } - BlockData bx = B.get(sx); + FastBlockData bx = B.get(sx); if(bx != null) { diff --git a/src/main/java/com/volmit/iris/object/IrisBlockDrops.java b/src/main/java/com/volmit/iris/object/IrisBlockDrops.java index 0fc808e40..007a69c33 100644 --- a/src/main/java/com/volmit/iris/object/IrisBlockDrops.java +++ b/src/main/java/com/volmit/iris/object/IrisBlockDrops.java @@ -1,6 +1,5 @@ package com.volmit.iris.object; -import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; import com.volmit.iris.gen.atomics.AtomicCache; @@ -8,6 +7,7 @@ import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; import com.volmit.iris.util.Required; @@ -46,17 +46,17 @@ public class IrisBlockDrops @Desc("Removes the default vanilla block drops and only drops the given items & any parent loot tables specified for this block type.") private boolean replaceVanillaDrops = false; - private final transient AtomicCache> data = new AtomicCache<>(); + private final transient AtomicCache> data = new AtomicCache<>(); - public boolean shouldDropFor(BlockData data, IrisDataManager rdata) + public boolean shouldDropFor(FastBlockData data, IrisDataManager rdata) { - KList list = this.data.aquire(() -> + KList list = this.data.aquire(() -> { - KList b = new KList<>(); + KList b = new KList<>(); for(IrisBlockData i : getBlocks()) { - BlockData dd = i.getBlockData(rdata); + FastBlockData dd = i.getBlockData(rdata); if(dd != null) { @@ -67,7 +67,7 @@ public class IrisBlockDrops return b.removeDuplicates(); }); - for(BlockData i : list) + for(FastBlockData i : list) { if(exactBlocks ? i.equals(data) : i.getMaterial().equals(data.getMaterial())) { diff --git a/src/main/java/com/volmit/iris/object/IrisCaveFluid.java b/src/main/java/com/volmit/iris/object/IrisCaveFluid.java index 72681671b..19e8d05de 100644 --- a/src/main/java/com/volmit/iris/object/IrisCaveFluid.java +++ b/src/main/java/com/volmit/iris/object/IrisCaveFluid.java @@ -1,12 +1,11 @@ package com.volmit.iris.object; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.util.B; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.MaxNumber; import com.volmit.iris.util.MinNumber; import com.volmit.iris.util.Required; @@ -40,18 +39,18 @@ public class IrisCaveFluid @Desc("The fluid type that should spawn here") private IrisBlockData fluidType = new IrisBlockData("CAVE_AIR"); - private final transient AtomicCache fluidData = new AtomicCache<>(); + private final transient AtomicCache fluidData = new AtomicCache<>(); public boolean hasFluid(IrisDataManager rdata) { return !B.isAir(getFluid(rdata)); } - public BlockData getFluid(IrisDataManager rdata) + public FastBlockData getFluid(IrisDataManager rdata) { return fluidData.aquire(() -> { - BlockData b = getFluidType().getBlockData(rdata); + FastBlockData b = getFluidType().getBlockData(rdata); if(b != null) { diff --git a/src/main/java/com/volmit/iris/object/IrisCompat.java b/src/main/java/com/volmit/iris/object/IrisCompat.java index 7d558cd12..281134f9c 100644 --- a/src/main/java/com/volmit/iris/object/IrisCompat.java +++ b/src/main/java/com/volmit/iris/object/IrisCompat.java @@ -4,11 +4,11 @@ import java.io.File; import java.io.IOException; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.volmit.iris.util.B; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.IO; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; @@ -20,7 +20,7 @@ public class IrisCompat { private KList blockFilters = new KList<>(); private KList itemFilters = new KList<>(); - private transient KMap blockResolves = new KMap<>(); + private transient KMap blockResolves = new KMap<>(); private transient KMap itemResolves = new KMap<>(); public IrisCompat() @@ -29,7 +29,7 @@ public class IrisCompat itemFilters = getDefaultItemCompatabilityFilters(); } - public BlockData getBlock(String n) + public FastBlockData getBlock(String n) { return blockResolves.compute(n, (k, v) -> { @@ -41,7 +41,7 @@ public class IrisCompat String buf = k; int err = 16; - BlockData tx = B.parseBlockDataOrNull(buf); + FastBlockData tx = B.parseBlockDataOrNull(buf); if(tx != null) { @@ -59,7 +59,7 @@ public class IrisCompat { if(i.getWhen().equalsIgnoreCase(buf)) { - BlockData b = i.getReplace(); + FastBlockData b = i.getReplace(); if(b != null) { @@ -121,29 +121,29 @@ public class IrisCompat } buf = k; - BlockData tx = B.parseBlockDataOrNull(buf); + FastBlockData tx = B.parseBlockDataOrNull(buf); if(tx != null) { - return tx.getMaterial(); + return tx.getType(); } searching: while(true) { if(err-- <= 0) { - return B.parseBlockDataOrNull("STONE").getMaterial(); + return B.parseBlockDataOrNull("STONE").getType(); } for(IrisCompatabilityBlockFilter i : blockFilters) { if(i.getWhen().equalsIgnoreCase(buf)) { - BlockData b = i.getReplace(); + FastBlockData b = i.getReplace(); if(b != null) { - return b.getMaterial(); + return b.getType(); } buf = i.getSupplement(); @@ -151,7 +151,7 @@ public class IrisCompat } } - return B.parseBlockDataOrNull("STONE").getMaterial(); + return B.parseBlockDataOrNull("STONE").getType(); } }); } diff --git a/src/main/java/com/volmit/iris/object/IrisCompatabilityBlockFilter.java b/src/main/java/com/volmit/iris/object/IrisCompatabilityBlockFilter.java index 86ca701ff..ccd8d6021 100644 --- a/src/main/java/com/volmit/iris/object/IrisCompatabilityBlockFilter.java +++ b/src/main/java/com/volmit/iris/object/IrisCompatabilityBlockFilter.java @@ -1,12 +1,11 @@ package com.volmit.iris.object; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.Iris; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.util.B; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.Required; import lombok.AllArgsConstructor; @@ -35,31 +34,30 @@ public class IrisCompatabilityBlockFilter @Desc("If exact is true, it compares block data for example minecraft:some_log[axis=x]") private boolean exact = false; - private final transient AtomicCache findData = new AtomicCache<>(true); - private final transient AtomicCache replaceData = new AtomicCache<>(true); + private final transient AtomicCache findData = new AtomicCache<>(true); + private final transient AtomicCache replaceData = new AtomicCache<>(true); public IrisCompatabilityBlockFilter(String when, String supplement) { this(when, supplement, false); } - - public BlockData getFind() + public FastBlockData getFind() { return findData.aquire(() -> B.getBlockData(when)); } - public BlockData getReplace() + public FastBlockData getReplace() { return replaceData.aquire(() -> { - BlockData b = B.parseBlockDataOrNull(supplement); + FastBlockData b = B.parseBlockDataOrNull(supplement); if(b == null) { return null; } - + Iris.warn("Compat: Using " + supplement + " in place of " + when + " since this server doesnt support '" + supplement + "'"); return b; diff --git a/src/main/java/com/volmit/iris/object/IrisDepositGenerator.java b/src/main/java/com/volmit/iris/object/IrisDepositGenerator.java index 6f1e10e7b..4577382f8 100644 --- a/src/main/java/com/volmit/iris/object/IrisDepositGenerator.java +++ b/src/main/java/com/volmit/iris/object/IrisDepositGenerator.java @@ -12,6 +12,7 @@ import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.B; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.HeightMap; import com.volmit.iris.util.KList; import com.volmit.iris.util.MaxNumber; @@ -86,7 +87,7 @@ public class IrisDepositGenerator private int varience = 3; private final transient AtomicCache> objects = new AtomicCache<>(); - private final transient AtomicCache> blockData = new AtomicCache<>(); + private final transient AtomicCache> blockData = new AtomicCache<>(); public IrisObject getClump(RNG rng, IrisDataManager rdata) { @@ -136,20 +137,20 @@ public class IrisDepositGenerator return o; } - private BlockData nextBlock(RNG rngv, IrisDataManager rdata) + private FastBlockData nextBlock(RNG rngv, IrisDataManager rdata) { return getBlockData(rdata).get(rngv.i(0, getBlockData(rdata).size() - 1)); } - public KList getBlockData(IrisDataManager rdata) + public KList getBlockData(IrisDataManager rdata) { return blockData.aquire(() -> { - KList blockData = new KList<>(); + KList blockData = new KList<>(); for(IrisBlockData ix : palette) { - BlockData bx = ix.getBlockData(rdata); + FastBlockData bx = ix.getBlockData(rdata); if(bx != null) { @@ -220,8 +221,8 @@ public class IrisDepositGenerator if(!allow) { - BlockData b = data.getBlockData(nx, ny, nz); - for(BlockData f : g.getDimension().getRockPalette().getBlockData(g.getData())) + FastBlockData b = FastBlockData.of(data.getBlockData(nx, ny, nz)); + for(FastBlockData f : g.getDimension().getRockPalette().getBlockData(g.getData())) { if(f.getMaterial().equals(b.getMaterial())) { @@ -235,7 +236,7 @@ public class IrisDepositGenerator { BlockData b = data.getBlockData(nx, ny, nz); - if(b.getMaterial().equals(Material.ICE) || b.getMaterial().equals(Material.PACKED_ICE) || b.getMaterial().equals(B.mat("BLUE_ICE")) || b.getMaterial().equals(B.mat("FROSTED_ICE")) || b.getMaterial().equals(Material.SAND) || b.getMaterial().equals(Material.RED_SAND) || !B.isSolid(b.getMaterial())) + if(b.getMaterial().equals(Material.ICE) || b.getMaterial().equals(Material.PACKED_ICE) || b.getMaterial().equals(B.mat("BLUE_ICE").getMaterial()) || b.getMaterial().equals(B.mat("FROSTED_ICE").getMaterial()) || b.getMaterial().equals(Material.SAND) || b.getMaterial().equals(Material.RED_SAND) || !B.isSolid(b.getMaterial())) { allow = false; } @@ -243,7 +244,7 @@ public class IrisDepositGenerator if(allow) { - data.setBlock(nx, ny, nz, clump.getBlocks().get(j)); + data.setBlock(nx, ny, nz, clump.getBlocks().get(j).getBlockData()); } } } diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index 414963fa4..8f2fd8b05 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -14,6 +14,7 @@ import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.Form; import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.IrisPostBlockFilter; @@ -54,6 +55,10 @@ public class IrisDimension extends IrisRegistrant @Desc("Create an inverted dimension in the sky (like the nether)") private IrisDimension sky = null; + @DontObfuscate + @Desc("Improves the biome grid variation by shuffling the cell grid more depending on the seed. This makes biomes across multiple seeds look far different than before.") + private boolean aggressiveBiomeReshuffle = false; + @DontObfuscate @Desc("Upon joining this world, Iris will send a resource pack request to the client. If they have previously selected yes, it will auto-switch depending on which dimension they go to.") private String resourcePack = ""; @@ -498,7 +503,7 @@ public class IrisDimension extends IrisRegistrant }); } - public BlockData resolveBlock(String bd) + public FastBlockData resolveBlock(String bd) { return Iris.compat.getBlock(bd); } diff --git a/src/main/java/com/volmit/iris/object/IrisMaterialPalette.java b/src/main/java/com/volmit/iris/object/IrisMaterialPalette.java index 633fd7bb0..12cd9e6bb 100644 --- a/src/main/java/com/volmit/iris/object/IrisMaterialPalette.java +++ b/src/main/java/com/volmit/iris/object/IrisMaterialPalette.java @@ -1,13 +1,12 @@ package com.volmit.iris.object; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import com.volmit.iris.util.MinNumber; import com.volmit.iris.util.RNG; @@ -40,11 +39,11 @@ public class IrisMaterialPalette @Desc("The palette of blocks to be used in this layer") private KList palette = new KList().qadd(new IrisBlockData("STONE")); - private final transient AtomicCache> blockData = new AtomicCache<>(); + private final transient AtomicCache> blockData = new AtomicCache<>(); private final transient AtomicCache layerGenerator = new AtomicCache<>(); private final transient AtomicCache heightGenerator = new AtomicCache<>(); - public BlockData get(RNG rng, double x, double y, double z, IrisDataManager rdata) + public FastBlockData get(RNG rng, double x, double y, double z, IrisDataManager rdata) { if(getBlockData(rdata).isEmpty()) { @@ -88,14 +87,14 @@ public class IrisMaterialPalette return this; } - public KList getBlockData(IrisDataManager rdata) + public KList getBlockData(IrisDataManager rdata) { return blockData.aquire(() -> { - KList blockData = new KList<>(); + KList blockData = new KList<>(); for(IrisBlockData ix : palette) { - BlockData bx = ix.getBlockData(rdata); + FastBlockData bx = ix.getBlockData(rdata); if(bx != null) { for(int i = 0; i < ix.getWeight(); i++) diff --git a/src/main/java/com/volmit/iris/object/IrisObject.java b/src/main/java/com/volmit/iris/object/IrisObject.java index 3fb5d7e87..d04a51760 100644 --- a/src/main/java/com/volmit/iris/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/object/IrisObject.java @@ -12,7 +12,6 @@ import java.util.function.Consumer; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Leaves; import org.bukkit.util.BlockVector; @@ -23,6 +22,7 @@ import com.volmit.iris.util.B; import com.volmit.iris.util.BlockPosition; import com.volmit.iris.util.CarveResult; import com.volmit.iris.util.ChunkPosition; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.IObjectPlacer; import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KMap; @@ -30,7 +30,6 @@ import com.volmit.iris.util.RNG; import lombok.Data; import lombok.EqualsAndHashCode; - import lombok.experimental.Accessors; @Accessors(chain = true) @@ -38,12 +37,12 @@ import lombok.experimental.Accessors; @EqualsAndHashCode(callSuper = false) public class IrisObject extends IrisRegistrant { - private static final BlockData AIR = B.getBlockData("CAVE_AIR"); - private static final BlockData VAIR = B.getBlockData("VOID_AIR"); - private static final BlockData VAIR_DEBUG = B.getBlockData("COBWEB"); - private static final BlockData[] SNOW_LAYERS = new BlockData[] {B.getBlockData("minecraft:snow[layers=1]"), B.getBlockData("minecraft:snow[layers=2]"), B.getBlockData("minecraft:snow[layers=3]"), B.getBlockData("minecraft:snow[layers=4]"), B.getBlockData("minecraft:snow[layers=5]"), B.getBlockData("minecraft:snow[layers=6]"), B.getBlockData("minecraft:snow[layers=7]"), B.getBlockData("minecraft:snow[layers=8]")}; + private static final FastBlockData AIR = B.getBlockData("CAVE_AIR"); + private static final FastBlockData VAIR = B.getBlockData("VOID_AIR"); + private static final FastBlockData VAIR_DEBUG = B.getBlockData("COBWEB"); + private static final FastBlockData[] SNOW_LAYERS = new FastBlockData[] {B.getBlockData("minecraft:snow[layers=1]"), B.getBlockData("minecraft:snow[layers=2]"), B.getBlockData("minecraft:snow[layers=3]"), B.getBlockData("minecraft:snow[layers=4]"), B.getBlockData("minecraft:snow[layers=5]"), B.getBlockData("minecraft:snow[layers=6]"), B.getBlockData("minecraft:snow[layers=7]"), B.getBlockData("minecraft:snow[layers=8]")}; public static boolean shitty = false; - private KMap blocks; + private KMap blocks; private int w; private int d; private int h; @@ -278,7 +277,7 @@ public class IrisObject extends IrisRegistrant dos.writeShort(i.getBlockX()); dos.writeShort(i.getBlockY()); dos.writeShort(i.getBlockZ()); - dos.writeUTF(blocks.get(i).getAsString(true)); + dos.writeUTF(blocks.get(i).getBlockData().getAsString(true)); } } @@ -288,7 +287,7 @@ public class IrisObject extends IrisRegistrant { return; } - KMap d = blocks.copy(); + KMap d = blocks.copy(); blocks.clear(); for(BlockVector i : d.k()) @@ -297,7 +296,7 @@ public class IrisObject extends IrisRegistrant } } - public void setUnsigned(int x, int y, int z, BlockData block) + public void setUnsigned(int x, int y, int z, FastBlockData block) { if(shitty) { @@ -327,7 +326,7 @@ public class IrisObject extends IrisRegistrant { return; } - place(x, -1, z, placer, config, rng,rdata); + place(x, -1, z, placer, config, rng, rdata); } public void place(int x, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, CarveResult c, IrisDataManager rdata) @@ -336,12 +335,12 @@ public class IrisObject extends IrisRegistrant { return; } - place(x, -1, z, placer, config, rng, null, c,rdata); + place(x, -1, z, placer, config, rng, null, c, rdata); } public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, IrisDataManager rdata) { - return place(x, yv, z, placer, config, rng, null, null,rdata); + return place(x, yv, z, placer, config, rng, null, null, rdata); } public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, Consumer listener, CarveResult c, IrisDataManager rdata) @@ -509,25 +508,25 @@ public class IrisObject extends IrisRegistrant BlockVector i = g.clone(); i = config.getRotation().rotate(i.clone(), spinx, spiny, spinz).clone(); i = config.getTranslate().translate(i.clone(), config.getRotation(), spinx, spiny, spinz).clone(); - BlockData data = blocks.get(g).clone(); + FastBlockData data = blocks.get(g).clone(); if(stilting && i.getBlockY() < lowest && !B.isAir(data)) { lowest = i.getBlockY(); } - if(placer.isPreventingDecay() && data instanceof Leaves && !((Leaves) data).isPersistent()) + if(placer.isPreventingDecay() && (data.getBlockData()) instanceof Leaves && !((Leaves) (data.getBlockData())).isPersistent()) { - ((Leaves) data).setPersistent(true); + ((Leaves) data.getBlockData()).setPersistent(true); } for(IrisObjectReplace j : config.getEdit()) { - for(BlockData k : j.getFind(rdata)) + for(FastBlockData k : j.getFind(rdata)) { if(j.isExact() ? k.matches(data) : k.getMaterial().equals(data.getMaterial())) { - data = j.getReplace(rng, i.getX() + x, i.getY() + y, i.getZ() + z,rdata).clone(); + data = j.getReplace(rng, i.getX() + x, i.getY() + y, i.getZ() + z, rdata).clone(); } } } @@ -597,7 +596,7 @@ public class IrisObject extends IrisRegistrant continue; } - BlockData d = blocks.get(i); + FastBlockData d = blocks.get(i); if(d == null || B.isAir(d)) { @@ -655,7 +654,7 @@ public class IrisObject extends IrisRegistrant return; } - KMap v = blocks.copy(); + KMap v = blocks.copy(); blocks.clear(); for(BlockVector i : v.keySet()) @@ -673,7 +672,7 @@ public class IrisObject extends IrisRegistrant for(BlockVector i : blocks.keySet()) { - at.clone().add(0, getCenter().getY(), 0).add(i).getBlock().setBlockData(blocks.get(i), false); + at.clone().add(0, getCenter().getY(), 0).add(i).getBlock().setBlockData(blocks.get(i).getBlockData(), false); } } } diff --git a/src/main/java/com/volmit/iris/object/IrisObjectReplace.java b/src/main/java/com/volmit/iris/object/IrisObjectReplace.java index 33aa9f45c..485326e34 100644 --- a/src/main/java/com/volmit/iris/object/IrisObjectReplace.java +++ b/src/main/java/com/volmit/iris/object/IrisObjectReplace.java @@ -1,13 +1,12 @@ package com.volmit.iris.object; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; import com.volmit.iris.util.Required; @@ -40,18 +39,18 @@ public class IrisObjectReplace private boolean exact = false; private final transient AtomicCache replaceGen = new AtomicCache<>(); - private final transient AtomicCache> findData = new AtomicCache<>(); - private final transient AtomicCache> replaceData = new AtomicCache<>(); + private final transient AtomicCache> findData = new AtomicCache<>(); + private final transient AtomicCache> replaceData = new AtomicCache<>(); - public KList getFind(IrisDataManager rdata) + public KList getFind(IrisDataManager rdata) { return findData.aquire(() -> { - KList b = new KList<>(); + KList b = new KList<>(); for(IrisBlockData i : find) { - BlockData bx = i.getBlockData(rdata); + FastBlockData bx = i.getBlockData(rdata); if(bx != null) { @@ -63,7 +62,7 @@ public class IrisObjectReplace }); } - public BlockData getReplace(RNG seed, double x, double y, double z, IrisDataManager rdata) + public FastBlockData getReplace(RNG seed, double x, double y, double z, IrisDataManager rdata) { return getReplace().get(seed, x, y, z, rdata); } diff --git a/src/main/java/com/volmit/iris/object/IrisObjectRotation.java b/src/main/java/com/volmit/iris/object/IrisObjectRotation.java index 5ac9681af..12f23b920 100644 --- a/src/main/java/com/volmit/iris/object/IrisObjectRotation.java +++ b/src/main/java/com/volmit/iris/object/IrisObjectRotation.java @@ -11,6 +11,7 @@ import org.bukkit.util.BlockVector; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.KList; import lombok.AllArgsConstructor; @@ -111,15 +112,16 @@ public class IrisObjectRotation return BlockFace.SOUTH; } - public BlockData rotate(BlockData d, int spinxx, int spinyy, int spinzz) + public FastBlockData rotate(FastBlockData dd, int spinxx, int spinyy, int spinzz) { + BlockData d = dd.getBlockData(); int spinx = (int) (90D * (Math.ceil(Math.abs((spinxx % 360D) / 90D)))); int spiny = (int) (90D * (Math.ceil(Math.abs((spinyy % 360D) / 90D)))); int spinz = (int) (90D * (Math.ceil(Math.abs((spinzz % 360D) / 90D)))); if(!canRotate()) { - return d; + return FastBlockData.of(d); } if(d instanceof Directional) @@ -179,7 +181,7 @@ public class IrisObjectRotation } } - return d; + return FastBlockData.of(d); } public BlockVector rotate(BlockVector b, int spinx, int spiny, int spinz) diff --git a/src/main/java/com/volmit/iris/structure/StructureTemplate.java b/src/main/java/com/volmit/iris/structure/StructureTemplate.java index 5944eb8ae..053995c04 100644 --- a/src/main/java/com/volmit/iris/structure/StructureTemplate.java +++ b/src/main/java/com/volmit/iris/structure/StructureTemplate.java @@ -10,7 +10,6 @@ import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -42,6 +41,7 @@ import com.volmit.iris.util.B; import com.volmit.iris.util.C; import com.volmit.iris.util.ChronoLatch; import com.volmit.iris.util.Cuboid; +import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.Form; import com.volmit.iris.util.IO; import com.volmit.iris.util.IObjectPlacer; @@ -70,9 +70,9 @@ public class StructureTemplate implements Listener, IObjectPlacer private Location center; private ChronoLatch u = new ChronoLatch(50); private World world; - private static final BlockData STONE = B.get("STONE"); - private static final BlockData RED = B.get("RED_STAINED_GLASS"); - private static final BlockData GREEN = B.get("LIME_STAINED_GLASS"); + private static final FastBlockData STONE = B.get("STONE"); + private static final FastBlockData RED = B.get("RED_STAINED_GLASS"); + private static final FastBlockData GREEN = B.get("LIME_STAINED_GLASS"); private int task; private ChronoLatch dirtyLatch; private ChronoLatch gLatch; @@ -446,7 +446,7 @@ public class StructureTemplate implements Listener, IObjectPlacer Location loc = new Location(world, b.getX(), b.getY(), b.getZ()); BlockVector v = loc.clone().subtract(min).subtract(o.getCenter()).toVector().toBlockVector(); v = r.getPlacement().getRotation().rotate(v, 0, 0, 0); - BlockData next = r.getPlacement().getRotation().rotate(b.getBlockData(), 0, 0, 0); + FastBlockData next = r.getPlacement().getRotation().rotate(FastBlockData.of(b.getBlockData()), 0, 0, 0); o.getBlocks().put(v, next); } @@ -789,7 +789,7 @@ public class StructureTemplate implements Listener, IObjectPlacer } @Override - public void set(int x, int y, int z, BlockData d) + public void set(int x, int y, int z, FastBlockData d) { if(get(x, y, z).equals(d)) { @@ -800,9 +800,9 @@ public class StructureTemplate implements Listener, IObjectPlacer } @Override - public BlockData get(int x, int y, int z) + public FastBlockData get(int x, int y, int z) { - return world.getBlockAt(x, y, z).getBlockData(); + return FastBlockData.of(world.getBlockAt(x, y, z).getBlockData()); } @Override diff --git a/src/main/java/com/volmit/iris/util/B.java b/src/main/java/com/volmit/iris/util/B.java index b20e2d5c1..a9fb36599 100644 --- a/src/main/java/com/volmit/iris/util/B.java +++ b/src/main/java/com/volmit/iris/util/B.java @@ -1,54 +1,128 @@ package com.volmit.iris.util; +import java.util.concurrent.TimeUnit; + import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Leaves; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; import com.volmit.iris.Iris; import com.volmit.iris.object.IrisDimension; public class B { - private static final BlockData AIR = Material.AIR.createBlockData(); - private static final KMap bdc = new KMap<>(); + private static final FastBlockData AIR = FastBlockData.of(Material.AIR); + private static final LoadingCache bdc = Caffeine.newBuilder().expireAfterAccess(60000, TimeUnit.MILLISECONDS).build((c) -> null); private static final KList nulls = new KList<>(); - private static final KList storage = new KList<>(); - private static final KList storageChest = new KList<>(); - private static final KList lit = new KList<>(); - private static final KList updatable = new KList<>(); - private static final KList notUpdatable = new KList<>(); + private static final KList storage = new KList<>(); + private static final KList storageChest = new KList<>(); + private static final KList lit = new KList<>(); + private static final KList updatable = new KList<>(); + private static final KList notUpdatable = new KList<>(); private static final KList canPlaceOn = new KList<>(); - private static final KList decorant = new KList<>(); + private static final KList decorant = new KList<>(); private static final IrisDimension defaultCompat = new IrisDimension(); private static final KMap solid = new KMap<>(); - private static final KMap types = new KMap<>(); - private static final KMap typesb = new KMap<>(); + private static final LoadingCache types = Caffeine.newBuilder().expireAfterAccess(30000, TimeUnit.MILLISECONDS).build((c) -> null); + private static final LoadingCache typesb = Caffeine.newBuilder().expireAfterAccess(30000, TimeUnit.MILLISECONDS).build((c) -> null); private static IrisLock lock = new IrisLock("Typelock"); - public static BlockData get(String bd) + public static FastBlockData get(String bd) { return getBlockData(bd); } - public static boolean isWater(BlockData b) + public static boolean isWater(FastBlockData b) { return b.getMaterial().equals(Material.WATER); } + public static FastBlockData getAir() + { + return AIR; + } + + public static LoadingCache getBdc() + { + return bdc; + } + + public static KList getNulls() + { + return nulls; + } + + public static KList getStorage() + { + return storage; + } + + public static KList getStoragechest() + { + return storageChest; + } + + public static KList getLit() + { + return lit; + } + + public static KList getUpdatable() + { + return updatable; + } + + public static KList getNotupdatable() + { + return notUpdatable; + } + + public static KList getCanplaceon() + { + return canPlaceOn; + } + + public static KList getDecorant() + { + return decorant; + } + + public static IrisDimension getDefaultcompat() + { + return defaultCompat; + } + + public static KMap getSolid() + { + return solid; + } + + public static LoadingCache getTypes() + { + return types; + } + + public static LoadingCache getTypesb() + { + return typesb; + } + + public static IrisLock getLock() + { + return lock; + } + public static Material getMaterial(String bdx) { String bd = bdx.trim().toUpperCase(); - return typesb.compute(bd, (k, v) -> - { - if(k != null && v != null) - { - return v; - } + return typesb.get(bd, (k) -> + { try { - return Material.valueOf(k); + return FastBlockData.of(Material.valueOf(k)); } catch(Throwable e) @@ -56,23 +130,19 @@ public class B } - return defaultCompat.resolveItem(bdx); - }); + return FastBlockData.of(defaultCompat.resolveItem(bdx)); + }).getType(); } public static Material getMaterialOrNull(String bdx) { String bd = bdx.trim().toUpperCase(); - return types.compute(bd, (k, v) -> - { - if(k != null && v != null) - { - return v; - } + return typesb.get(bd, (k) -> + { try { - return Material.valueOf(k); + return FastBlockData.of(Material.valueOf(k)); } catch(Throwable e) @@ -81,10 +151,10 @@ public class B } return null; - }); + }).getType(); } - public static boolean isSolid(BlockData mat) + public static boolean isSolid(FastBlockData mat) { return isSolid(mat.getMaterial()); } @@ -99,14 +169,14 @@ public class B return solid.get(mat); } - public static Material mat(String bd) + public static FastBlockData mat(String bd) { - return getBlockData(bd).getMaterial(); + return getBlockData(bd); } - public static BlockData getBlockData(String bd) + public static FastBlockData getBlockData(String bd) { - return getBlockData(bd, defaultCompat); + return getBlockData(bd, defaultCompat).optimize(); } public static String[] getBlockTypes() @@ -149,18 +219,18 @@ public class B return bt.toArray(new String[bt.size()]); } - public static BlockData getBlockData(String bdxf, IrisDimension resolver) + public static FastBlockData getBlockData(String bdxf, IrisDimension resolver) { try { String bd = bdxf.trim(); - - if(bdc.containsKey(bd)) + FastBlockData fff = bdc.get(bd); + if(fff != null) { - return bdc.get(bd).clone(); + return fff.clone(); } - BlockData bdx = parseBlockData(bd); + FastBlockData bdx = parseBlockData(bd); if(bdx == null) { @@ -192,11 +262,11 @@ public class B return AIR; } - public static BlockData parseBlockDataOrNull(String ix) + public static FastBlockData parseBlockDataOrNull(String ix) { try { - BlockData bx = Bukkit.createBlockData(ix); + FastBlockData bx = FastBlockData.of(Bukkit.createBlockData(ix)); if(bx != null) { @@ -215,9 +285,7 @@ public class B try { - Material m = Material.valueOf(i); - - return m.createBlockData(); + return FastBlockData.of(Material.valueOf(i)); } catch(Throwable e) @@ -228,11 +296,11 @@ public class B return null; } - public static BlockData parseBlockData(String ix) + public static FastBlockData parseBlockData(String ix) { try { - BlockData bx = Bukkit.createBlockData(ix); + FastBlockData bx = FastBlockData.of(Bukkit.createBlockData(ix)); if(bx != null) { @@ -251,9 +319,7 @@ public class B try { - Material m = Material.valueOf(i); - - return m.createBlockData(); + return FastBlockData.of(Material.valueOf(i)); } catch(Throwable e) @@ -264,12 +330,7 @@ public class B return AIR; } - public static boolean isUpdatable(BlockData mat) - { - return isUpdatable(mat.getMaterial()); - } - - public static boolean isStorage(Material mat) + public static boolean isStorage(FastBlockData mat) { if(storage.contains(mat)) { @@ -291,7 +352,7 @@ public class B return false; } - public static boolean isStorageChest(Material mat) + public static boolean isStorageChest(FastBlockData mat) { if(storageChest.contains(mat)) { @@ -313,7 +374,7 @@ public class B return false; } - public static boolean isLit(Material mat) + public static boolean isLit(FastBlockData mat) { if(lit.contains(mat)) { @@ -321,7 +382,7 @@ public class B } // @NoArgsConstructor - boolean str = mat.equals(B.mat("GLOWSTONE")) || mat.equals(B.mat("END_ROD")) || mat.equals(B.mat("SOUL_SAND")) || mat.equals(B.mat("TORCH")) || mat.equals(Material.REDSTONE_TORCH) || mat.equals(B.mat("SOUL_TORCH")) || mat.equals(Material.REDSTONE_WALL_TORCH) || mat.equals(Material.WALL_TORCH) || mat.equals(B.mat("SOUL_WALL_TORCH")) || mat.equals(B.mat("LANTERN")) || mat.equals(Material.JACK_O_LANTERN) || mat.equals(Material.REDSTONE_LAMP) || mat.equals(Material.MAGMA_BLOCK) || mat.equals(B.mat("SHROOMLIGHT")) || mat.equals(B.mat("SEA_LANTERN")) || mat.equals(B.mat("SOUL_LANTERN")) || mat.equals(Material.FIRE) || mat.equals(B.mat("SOUL_FIRE")) || mat.equals(B.mat("SEA_PICKLE")) || mat.equals(Material.BREWING_STAND) || mat.equals(Material.REDSTONE_ORE); + boolean str = mat.equals(B.mat("GLOWSTONE")) || mat.equals(B.mat("END_ROD")) || mat.equals(B.mat("SOUL_SAND")) || mat.equals(B.mat("TORCH")) || mat.getType().equals(Material.REDSTONE_TORCH) || mat.equals(B.mat("SOUL_TORCH")) || mat.getType().equals(Material.REDSTONE_WALL_TORCH) || mat.getType().equals(Material.WALL_TORCH) || mat.equals(B.mat("SOUL_WALL_TORCH")) || mat.equals(B.mat("LANTERN")) || mat.getType().equals(Material.JACK_O_LANTERN) || mat.getType().equals(Material.REDSTONE_LAMP) || mat.getType().equals(Material.MAGMA_BLOCK) || mat.equals(B.mat("SHROOMLIGHT")) || mat.equals(B.mat("SEA_LANTERN")) || mat.equals(B.mat("SOUL_LANTERN")) || mat.getType().equals(Material.FIRE) || mat.equals(B.mat("SOUL_FIRE")) || mat.equals(B.mat("SEA_PICKLE")) || mat.getType().equals(Material.BREWING_STAND) || mat.getType().equals(Material.REDSTONE_ORE); //@done if(str) { @@ -334,7 +395,7 @@ public class B return false; } - public static boolean isUpdatable(Material mat) + public static boolean isUpdatable(FastBlockData mat) { if(updatable.contains(mat)) { @@ -362,16 +423,16 @@ public class B return false; } - public static boolean isFoliage(BlockData d) + public static boolean isFoliage(FastBlockData d) { if(isFluid(d) || isAir(d) || isSolid(d)) { return false; } - Material mat = d.getMaterial(); + FastBlockData mat = d; // @NoArgsConstructor - return mat.equals(Material.POPPY) || mat.equals(Material.DANDELION) || mat.equals(B.mat("CORNFLOWER")) || mat.equals(B.mat("SWEET_BERRY_BUSH")) || mat.equals(B.mat("CRIMSON_ROOTS")) || mat.equals(B.mat("WARPED_ROOTS")) || mat.equals(B.mat("NETHER_SPROUTS")) || mat.equals(B.mat("ALLIUM")) || mat.equals(B.mat("AZURE_BLUET")) || mat.equals(B.mat("BLUE_ORCHID")) || mat.equals(B.mat("POPPY")) || mat.equals(B.mat("DANDELION")) || mat.equals(B.mat("OXEYE_DAISY")) || mat.equals(B.mat("LILY_OF_THE_VALLEY")) || mat.equals(B.mat("WITHER_ROSE")) || mat.equals(Material.DARK_OAK_SAPLING) || mat.equals(Material.ACACIA_SAPLING) || mat.equals(Material.JUNGLE_SAPLING) || mat.equals(Material.BIRCH_SAPLING) || mat.equals(Material.SPRUCE_SAPLING) || mat.equals(Material.OAK_SAPLING) || mat.equals(Material.ORANGE_TULIP) || mat.equals(Material.PINK_TULIP) || mat.equals(Material.RED_TULIP) || mat.equals(Material.WHITE_TULIP) || mat.equals(Material.FERN) || mat.equals(Material.LARGE_FERN) || mat.equals(Material.GRASS) || mat.equals(Material.TALL_GRASS); + return mat.getType().equals(Material.POPPY) || mat.getType().equals(Material.DANDELION) || mat.equals(B.mat("CORNFLOWER")) || mat.equals(B.mat("SWEET_BERRY_BUSH")) || mat.equals(B.mat("CRIMSON_ROOTS")) || mat.equals(B.mat("WARPED_ROOTS")) || mat.equals(B.mat("NETHER_SPROUTS")) || mat.equals(B.mat("ALLIUM")) || mat.equals(B.mat("AZURE_BLUET")) || mat.equals(B.mat("BLUE_ORCHID")) || mat.equals(B.mat("POPPY")) || mat.equals(B.mat("DANDELION")) || mat.equals(B.mat("OXEYE_DAISY")) || mat.equals(B.mat("LILY_OF_THE_VALLEY")) || mat.equals(B.mat("WITHER_ROSE")) || mat.getType().equals(Material.DARK_OAK_SAPLING) || mat.getType().equals(Material.ACACIA_SAPLING) || mat.getType().equals(Material.JUNGLE_SAPLING) || mat.getType().equals(Material.BIRCH_SAPLING) || mat.getType().equals(Material.SPRUCE_SAPLING) || mat.getType().equals(Material.OAK_SAPLING) || mat.getType().equals(Material.ORANGE_TULIP) || mat.getType().equals(Material.PINK_TULIP) || mat.getType().equals(Material.RED_TULIP) || mat.getType().equals(Material.WHITE_TULIP) || mat.getType().equals(Material.FERN) || mat.getType().equals(Material.LARGE_FERN) || mat.getType().equals(Material.GRASS) || mat.getType().equals(Material.TALL_GRASS); //@done } @@ -395,7 +456,7 @@ public class B } } - if(onto.equals(Material.AIR) || onto.equals(B.mat("CAVE_AIR"))) + if(onto.equals(Material.AIR) || onto.equals(B.mat("CAVE_AIR").getMaterial())) { lock.lock(); canPlaceOn.add(key); @@ -436,7 +497,7 @@ public class B return true; } - public static boolean isDecorant(Material m) + public static boolean isDecorant(FastBlockData m) { if(decorant.contains(m)) { @@ -444,7 +505,7 @@ public class B } // @NoArgsConstructor - boolean str = m.equals(Material.GRASS) || m.equals(Material.TALL_GRASS) || m.equals(B.mat("CORNFLOWER")) || m.equals(Material.SUNFLOWER) || m.equals(Material.CHORUS_FLOWER) || m.equals(Material.POPPY) || m.equals(Material.DANDELION) || m.equals(Material.OXEYE_DAISY) || m.equals(Material.ORANGE_TULIP) || m.equals(Material.PINK_TULIP) || m.equals(Material.RED_TULIP) || m.equals(Material.WHITE_TULIP) || m.equals(Material.LILAC) || m.equals(Material.DEAD_BUSH) || m.equals(B.mat("SWEET_BERRY_BUSH")) || m.equals(Material.ROSE_BUSH) || m.equals(B.mat("WITHER_ROSE")) || m.equals(Material.ALLIUM) || m.equals(Material.BLUE_ORCHID) || m.equals(B.mat("LILY_OF_THE_VALLEY")) || m.equals(B.mat("CRIMSON_FUNGUS")) || m.equals(B.mat("WARPED_FUNGUS")) || m.equals(Material.RED_MUSHROOM) || m.equals(Material.BROWN_MUSHROOM) || m.equals(B.mat("CRIMSON_ROOTS")) || m.equals(B.mat("AZURE_BLUET")) || m.equals(B.mat("WEEPING_VINES")) || m.equals(B.mat("WEEPING_VINES_PLANT")) || m.equals(B.mat("WARPED_ROOTS")) || m.equals(B.mat("NETHER_SPROUTS")) || m.equals(B.mat("TWISTING_VINES")) || m.equals(B.mat("TWISTING_VINES_PLANT")) || m.equals(Material.SUGAR_CANE) || m.equals(Material.WHEAT) || m.equals(Material.POTATOES) || m.equals(Material.CARROTS) || m.equals(Material.BEETROOTS) || m.equals(Material.NETHER_WART) || m.equals(B.mat("SEA_PICKLE")) || m.equals(B.mat("SEAGRASS")) || m.equals(B.mat("ACACIA_BUTTON")) || m.equals(B.mat("BIRCH_BUTTON")) || m.equals(B.mat("CRIMSON_BUTTON")) || m.equals(B.mat("DARK_OAK_BUTTON")) || m.equals(B.mat("JUNGLE_BUTTON")) || m.equals(B.mat("OAK_BUTTON")) || m.equals(B.mat("POLISHED_BLACKSTONE_BUTTON")) || m.equals(B.mat("SPRUCE_BUTTON")) || m.equals(B.mat("STONE_BUTTON")) || m.equals(B.mat("WARPED_BUTTON")) || m.equals(Material.TORCH) || m.equals(B.mat("SOUL_TORCH")); + boolean str = m.getType().equals(Material.GRASS) || m.getType().equals(Material.TALL_GRASS) || m.equals(B.mat("CORNFLOWER")) || m.getType().equals(Material.SUNFLOWER) || m.getType().equals(Material.CHORUS_FLOWER) || m.getType().equals(Material.POPPY) || m.getType().equals(Material.DANDELION) || m.getType().equals(Material.OXEYE_DAISY) || m.getType().equals(Material.ORANGE_TULIP) || m.getType().equals(Material.PINK_TULIP) || m.getType().equals(Material.RED_TULIP) || m.getType().equals(Material.WHITE_TULIP) || m.getType().equals(Material.LILAC) || m.getType().equals(Material.DEAD_BUSH) || m.equals(B.mat("SWEET_BERRY_BUSH")) || m.getType().equals(Material.ROSE_BUSH) || m.equals(B.mat("WITHER_ROSE")) || m.getType().equals(Material.ALLIUM) || m.getType().equals(Material.BLUE_ORCHID) || m.equals(B.mat("LILY_OF_THE_VALLEY")) || m.equals(B.mat("CRIMSON_FUNGUS")) || m.equals(B.mat("WARPED_FUNGUS")) || m.getType().equals(Material.RED_MUSHROOM) || m.getType().equals(Material.BROWN_MUSHROOM) || m.equals(B.mat("CRIMSON_ROOTS")) || m.equals(B.mat("AZURE_BLUET")) || m.equals(B.mat("WEEPING_VINES")) || m.equals(B.mat("WEEPING_VINES_PLANT")) || m.equals(B.mat("WARPED_ROOTS")) || m.equals(B.mat("NETHER_SPROUTS")) || m.equals(B.mat("TWISTING_VINES")) || m.equals(B.mat("TWISTING_VINES_PLANT")) || m.getType().equals(Material.SUGAR_CANE) || m.getType().equals(Material.WHEAT) || m.getType().equals(Material.POTATOES) || m.getType().equals(Material.CARROTS) || m.getType().equals(Material.BEETROOTS) || m.getType().equals(Material.NETHER_WART) || m.equals(B.mat("SEA_PICKLE")) || m.equals(B.mat("SEAGRASS")) || m.equals(B.mat("ACACIA_BUTTON")) || m.equals(B.mat("BIRCH_BUTTON")) || m.equals(B.mat("CRIMSON_BUTTON")) || m.equals(B.mat("DARK_OAK_BUTTON")) || m.equals(B.mat("JUNGLE_BUTTON")) || m.equals(B.mat("OAK_BUTTON")) || m.equals(B.mat("POLISHED_BLACKSTONE_BUTTON")) || m.equals(B.mat("SPRUCE_BUTTON")) || m.equals(B.mat("STONE_BUTTON")) || m.equals(B.mat("WARPED_BUTTON")) || m.getType().equals(Material.TORCH) || m.equals(B.mat("SOUL_TORCH")); //@done if(str) @@ -456,13 +517,13 @@ public class B return false; } - public static KList getBlockData(KList find) + public static KList getBlockData(KList find) { - KList b = new KList<>(); + KList b = new KList<>(); for(String i : find) { - BlockData bd = getBlockData(i); + FastBlockData bd = getBlockData(i); if(bd != null) { @@ -473,22 +534,22 @@ public class B return b; } - public static boolean isFoliagePlantable(BlockData d) + public static boolean isFoliagePlantable(FastBlockData d) { return d.getMaterial().equals(Material.GRASS_BLOCK) || d.getMaterial().equals(Material.DIRT) || d.getMaterial().equals(Material.COARSE_DIRT) || d.getMaterial().equals(Material.PODZOL); } - public static boolean isFluid(BlockData d) + public static boolean isFluid(FastBlockData d) { return d.getMaterial().equals(Material.WATER) || d.getMaterial().equals(Material.LAVA); } - public static boolean isAirOrFluid(BlockData d) + public static boolean isAirOrFluid(FastBlockData d) { return isAir(d) || isFluid(d); } - public static boolean isAir(BlockData d) + public static boolean isAir(FastBlockData d) { if(d == null) { diff --git a/src/main/java/com/volmit/iris/util/FastBlockData.java b/src/main/java/com/volmit/iris/util/FastBlockData.java index 720dadb74..6abf1c759 100644 --- a/src/main/java/com/volmit/iris/util/FastBlockData.java +++ b/src/main/java/com/volmit/iris/util/FastBlockData.java @@ -13,6 +13,7 @@ public class FastBlockData { this.blockData = d; this.type = null; + optimize(); } private FastBlockData(Material m) @@ -21,6 +22,11 @@ public class FastBlockData this.blockData = null; } + public Material getMaterial() + { + return type != null ? type : blockData.getMaterial(); + } + public static FastBlockData of(Material type) { return new FastBlockData(type); @@ -40,7 +46,7 @@ public class FastBlockData { if(hasBlockData()) { - BlockData f = getDefaultBlockData(type); + BlockData f = getDefaultBlockData(getMaterial()); if(f.hashCode() == getBlockData().hashCode()) { @@ -63,7 +69,7 @@ public class FastBlockData return blockData != null; } - public BlockData getBlockData() + public BlockData createBlockData() { if(blockData != null) { @@ -72,4 +78,60 @@ public class FastBlockData return type.createBlockData(); } + + public BlockData getBlockData() + { + if(blockData == null) + { + blockData = createBlockData(); + } + + return blockData; + } + + @Override + public int hashCode() + { + if(hasBlockData()) + { + return getBlockData().hashCode(); + } + + return getType().hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if(this == obj) + { + return true; + } + if(obj == null) + { + return false; + } + if(getClass() != obj.getClass()) + { + return false; + } + FastBlockData other = (FastBlockData) obj; + + if(other.hashCode() == hashCode()) + { + return true; + } + + return false; + } + + public FastBlockData clone() + { + return hasBlockData() ? new FastBlockData(blockData.clone()) : new FastBlockData(getType()); + } + + public boolean matches(FastBlockData data) + { + return (data.hasBlockData() && hasBlockData() && getBlockData().matches(data.getBlockData())) || (!data.hasBlockData() && !hasBlockData() && getType().equals(data.getType())); + } } diff --git a/src/main/java/com/volmit/iris/util/IObjectPlacer.java b/src/main/java/com/volmit/iris/util/IObjectPlacer.java index 10a7eef07..95e8a58d4 100644 --- a/src/main/java/com/volmit/iris/util/IObjectPlacer.java +++ b/src/main/java/com/volmit/iris/util/IObjectPlacer.java @@ -1,16 +1,14 @@ package com.volmit.iris.util; -import org.bukkit.block.data.BlockData; - public interface IObjectPlacer { public int getHighest(int x, int z); public int getHighest(int x, int z, boolean ignoreFluid); - public void set(int x, int y, int z, BlockData d); + public void set(int x, int y, int z, FastBlockData d); - public BlockData get(int x, int y, int z); + public FastBlockData get(int x, int y, int z); public boolean isPreventingDecay(); diff --git a/src/main/java/com/volmit/iris/util/IPostBlockAccess.java b/src/main/java/com/volmit/iris/util/IPostBlockAccess.java index 631d341ad..eee6924e9 100644 --- a/src/main/java/com/volmit/iris/util/IPostBlockAccess.java +++ b/src/main/java/com/volmit/iris/util/IPostBlockAccess.java @@ -1,13 +1,12 @@ package com.volmit.iris.util; -import org.bukkit.block.data.BlockData; import org.bukkit.generator.ChunkGenerator.ChunkData; public interface IPostBlockAccess { - public BlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData); + public FastBlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData); - public void setPostBlock(int x, int y, int z, BlockData d, int currentPostX, int currentPostZ, ChunkData currentData); + public void setPostBlock(int x, int y, int z, FastBlockData d, int currentPostX, int currentPostZ, ChunkData currentData); public int highestTerrainOrFluidBlock(int x, int z); diff --git a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java index 9aa830cde..6705399c6 100644 --- a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java +++ b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java @@ -1,7 +1,6 @@ package com.volmit.iris.util; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Levelled; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Slab; @@ -33,13 +32,13 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess public abstract void onPost(int x, int z, int currentPostX, int currentPostZ, ChunkData currentData, KList q); @Override - public BlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) + public FastBlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { return gen.getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); } @Override - public void setPostBlock(int x, int y, int z, BlockData d, int currentPostX, int currentPostZ, ChunkData currentData) + public void setPostBlock(int x, int y, int z, FastBlockData d, int currentPostX, int currentPostZ, ChunkData currentData) { gen.setPostBlock(x, y, z, d, currentPostX, currentPostZ, currentData); } @@ -63,62 +62,62 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess public boolean isAir(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.AIR) || d.getMaterial().equals(Material.CAVE_AIR); } public boolean hasGravity(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.SAND) || d.getMaterial().equals(Material.RED_SAND) || d.getMaterial().equals(Material.BLACK_CONCRETE_POWDER) || d.getMaterial().equals(Material.BLUE_CONCRETE_POWDER) || d.getMaterial().equals(Material.BROWN_CONCRETE_POWDER) || d.getMaterial().equals(Material.CYAN_CONCRETE_POWDER) || d.getMaterial().equals(Material.GRAY_CONCRETE_POWDER) || d.getMaterial().equals(Material.GREEN_CONCRETE_POWDER) || d.getMaterial().equals(Material.LIGHT_BLUE_CONCRETE_POWDER) || d.getMaterial().equals(Material.LIGHT_GRAY_CONCRETE_POWDER) || d.getMaterial().equals(Material.LIME_CONCRETE_POWDER) || d.getMaterial().equals(Material.MAGENTA_CONCRETE_POWDER) || d.getMaterial().equals(Material.ORANGE_CONCRETE_POWDER) || d.getMaterial().equals(Material.PINK_CONCRETE_POWDER) || d.getMaterial().equals(Material.PURPLE_CONCRETE_POWDER) || d.getMaterial().equals(Material.RED_CONCRETE_POWDER) || d.getMaterial().equals(Material.WHITE_CONCRETE_POWDER) || d.getMaterial().equals(Material.YELLOW_CONCRETE_POWDER); } public boolean isSolid(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().isSolid(); } public boolean isSolidNonSlab(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); - return d.getMaterial().isSolid() && !(d instanceof Slab); + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + return d.getMaterial().isSolid() && !(d.getBlockData() instanceof Slab); } public boolean isAirOrWater(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.WATER) || d.getMaterial().equals(Material.AIR) || d.getMaterial().equals(Material.CAVE_AIR); } public boolean isSlab(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); - return d instanceof Slab; + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + return d.getBlockData() instanceof Slab; } public boolean isSnowLayer(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.SNOW); } public boolean isWater(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.WATER); } public boolean isWaterOrWaterlogged(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); - return d.getMaterial().equals(Material.WATER) || (d instanceof Waterlogged && ((Waterlogged) d).isWaterlogged()); + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + return d.getMaterial().equals(Material.WATER) || (d.getBlockData() instanceof Waterlogged && ((Waterlogged) d.getBlockData()).isWaterlogged()); } public boolean isLiquid(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); - return d instanceof Levelled; + FastBlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); + return d.getBlockData() instanceof Levelled; } @Override diff --git a/src/main/java/com/volmit/iris/util/ParallaxSection.java b/src/main/java/com/volmit/iris/util/ParallaxSection.java index 9ff1284a8..6d1a63262 100644 --- a/src/main/java/com/volmit/iris/util/ParallaxSection.java +++ b/src/main/java/com/volmit/iris/util/ParallaxSection.java @@ -20,7 +20,7 @@ public class ParallaxSection implements Writable public ParallaxSection() { updates = new KSet(); - this.block = new DataPalette(B.get("AIR")) + this.block = new DataPalette(B.get("AIR").getBlockData()) { @Override public void writeType(BlockData t, DataOutputStream o) throws IOException @@ -31,7 +31,7 @@ public class ParallaxSection implements Writable @Override public BlockData readType(DataInputStream i) throws IOException { - return B.get(i.readUTF()); + return B.get(i.readUTF()).getBlockData(); } }; } @@ -55,7 +55,7 @@ public class ParallaxSection implements Writable { block.set(x, y, z, d); - if(B.isUpdatable(d)) + if(B.isUpdatable(FastBlockData.of(d))) { update(x, y, z); }