From 4c4495776446417ad2901994dc2ee145219eedf4 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 11 Nov 2020 16:46:36 -0500 Subject: [PATCH] Performance & Fixes --- src/main/java/com/volmit/iris/Iris.java | 65 +- .../java/com/volmit/iris/IrisSettings.java | 18 +- .../volmit/iris/generator/IrisComplex.java | 63 +- .../com/volmit/iris/generator/IrisEngine.java | 2 +- .../generator/actuator/IrisBiomeActuator.java | 2 +- .../generator/modifier/IrisCaveModifier.java | 10 +- .../generator/modifier/IrisPostModifier.java | 4 +- .../com/volmit/iris/object/IrisCompat.java | 243 ++--- .../object/IrisCompatabilityBlockFilter.java | 4 +- .../com/volmit/iris/object/IrisDimension.java | 10 - .../com/volmit/iris/object/IrisObject.java | 10 +- .../volmit/iris/scaffold/engine/Engine.java | 4 +- .../engine/EngineParallaxManager.java | 41 +- .../scaffold/hunk/io/HunkRegionSlice.java | 15 +- .../hunk/io/PaletteHunkIOAdapter.java | 4 +- .../scaffold/parallax/ParallaxRegion.java | 11 +- .../iris/scaffold/parallax/ParallaxWorld.java | 2 +- src/main/java/com/volmit/iris/util/B.java | 987 +++++++++--------- 18 files changed, 706 insertions(+), 789 deletions(-) diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 63b89d234..0f64988b5 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -170,6 +170,33 @@ public class Iris extends VolmitPlugin super.onEnable(); } + public void onDisable() + { + if(IrisSettings.get().isStudio()) + { + proj.close(); + + for(World i : Bukkit.getWorlds()) + { + if(IrisWorlds.isIrisWorld(i)) + { + IrisWorlds.access(i).close(); + } + } + + for(GroupedExecutor i : executors) + { + i.close(); + } + } + + executors.clear(); + board.disable(); + Bukkit.getScheduler().cancelTasks(this); + HandlerList.unregisterAll((Plugin) this); + super.onDisable(); + } + public static void sq(Runnable r) { synchronized(syncJobs) @@ -206,10 +233,10 @@ public class Iris extends VolmitPlugin private void bstats() { - J.s(() -> + if(IrisSettings.get().isMetrics()) { - new MetricsLite(Iris.instance, 8757); - }); + J.s(() ->new MetricsLite(Iris.instance, 8757)); + } } public static File getTemp() @@ -217,33 +244,6 @@ public class Iris extends VolmitPlugin return instance.getDataFolder("cache", "temp"); } - public void onDisable() - { - if(IrisSettings.get().isStudio()) - { - proj.close(); - - for(World i : Bukkit.getWorlds()) - { - if(IrisWorlds.isIrisWorld(i)) - { - IrisWorlds.access(i).close(); - } - } - - for(GroupedExecutor i : executors) - { - i.close(); - } - } - - executors.clear(); - board.disable(); - Bukkit.getScheduler().cancelTasks(this); - HandlerList.unregisterAll((Plugin) this); - super.onDisable(); - } - @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { @@ -410,6 +410,11 @@ public class Iris extends VolmitPlugin public void splash() { + if(!IrisSettings.get().isSplash()) + { + return; + } + // @NoArgsConstructor String padd = Form.repeat(" ", 8); String padd2 = Form.repeat(" ", 4); diff --git a/src/main/java/com/volmit/iris/IrisSettings.java b/src/main/java/com/volmit/iris/IrisSettings.java index 16ab14995..cc23a93a8 100644 --- a/src/main/java/com/volmit/iris/IrisSettings.java +++ b/src/main/java/com/volmit/iris/IrisSettings.java @@ -1,18 +1,12 @@ package com.volmit.iris; +import com.google.gson.Gson; +import com.volmit.iris.util.*; +import lombok.Data; + import java.io.File; import java.io.IOException; -import com.google.gson.Gson; -import com.volmit.iris.util.Desc; -import com.volmit.iris.util.DontObfuscate; -import com.volmit.iris.util.IO; -import com.volmit.iris.util.J; -import com.volmit.iris.util.JSONException; -import com.volmit.iris.util.JSONObject; - -import lombok.Data; - @Data public class IrisSettings { @@ -114,6 +108,10 @@ public class IrisSettings @Desc("Collects anonymous metrics for bstats") public boolean metrics = true; + @DontObfuscate + @Desc("Splash the screen") + public boolean splash = true; + @DontObfuscate @Desc("Skips preparing spawn by using nms to hijack the world init phase") public boolean skipPrepareSpawnNMS = true; diff --git a/src/main/java/com/volmit/iris/generator/IrisComplex.java b/src/main/java/com/volmit/iris/generator/IrisComplex.java index 04682b2a9..d66fc86c6 100644 --- a/src/main/java/com/volmit/iris/generator/IrisComplex.java +++ b/src/main/java/com/volmit/iris/generator/IrisComplex.java @@ -1,21 +1,21 @@ package com.volmit.iris.generator; +import com.volmit.iris.Iris; +import com.volmit.iris.generator.actuator.IrisTerrainActuator; +import com.volmit.iris.generator.modifier.IrisCaveModifier; +import com.volmit.iris.generator.noise.CNG; +import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.object.*; -import com.volmit.iris.util.*; import com.volmit.iris.scaffold.data.DataProvider; import com.volmit.iris.scaffold.engine.Engine; +import com.volmit.iris.scaffold.stream.ProceduralStream; +import com.volmit.iris.scaffold.stream.interpolation.Interpolated; +import com.volmit.iris.util.*; +import lombok.Data; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; -import com.volmit.iris.Iris; -import com.volmit.iris.scaffold.stream.ProceduralStream; -import com.volmit.iris.scaffold.stream.interpolation.Interpolated; -import com.volmit.iris.manager.IrisDataManager; -import com.volmit.iris.generator.noise.CNG; - -import lombok.Data; - @Data public class IrisComplex implements DataProvider { @@ -37,6 +37,7 @@ public class IrisComplex implements DataProvider private ProceduralStream maxHeightStream; private ProceduralStream overlayStream; private ProceduralStream heightFluidStream; + private ProceduralStream trueHeightStream; private ProceduralStream slopeStream; private ProceduralStream rngStream; private ProceduralStream chunkRngStream; @@ -77,8 +78,8 @@ public class IrisComplex implements DataProvider public IrisComplex(Engine engine) { - int cacheSize = 1024; - BlockData glass = B.getBlockData("GLASS"); + int cacheSize = 8192; + BlockData glass = B.get("GLASS"); this.rng = new RNG(engine.getWorld().getSeed()); this.data = engine.getData(); double height = engine.getHeight(); @@ -169,6 +170,46 @@ public class IrisComplex implements DataProvider .convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SHORE_LINE)); seaSurfaceDecoration = trueBiomeStream .convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SEA_SURFACE)); + trueHeightStream = ProceduralStream.of((x, z) -> { + int rx = (int) Math.round(engine.modifyX(x)); + int rz = (int) Math.round(engine.modifyZ(z)); + int heightf = (int) Math.round(getHeightStream().get(rx, rz)); + int m = heightf; + + if(engine.getDimension().isCarving()) + { + if(engine.getDimension().isCarved(rx, m, rz, ((IrisTerrainActuator)engine.getFramework().getTerrainActuator()).getRng(), heightf)) + { + m--; + + while(engine.getDimension().isCarved(rx, m, rz, ((IrisTerrainActuator)engine.getFramework().getTerrainActuator()).getRng(), heightf)) + { + m--; + } + } + } + + if(engine.getDimension().isCaves()) + { + KList caves = ((IrisCaveModifier)engine.getFramework().getCaveModifier()).genCaves(rx, rz, 0, 0, null); + boolean again = true; + + while(again) + { + again = false; + for(CaveResult i : caves) + { + if(i.getCeiling() > m && i.getFloor() < m) + { + m = i.getFloor(); + again = true; + } + } + } + } + + return m; + }, Interpolated.INT).cache2D(cacheSize); //@done } diff --git a/src/main/java/com/volmit/iris/generator/IrisEngine.java b/src/main/java/com/volmit/iris/generator/IrisEngine.java index 287bddb91..9fd2683e6 100644 --- a/src/main/java/com/volmit/iris/generator/IrisEngine.java +++ b/src/main/java/com/volmit/iris/generator/IrisEngine.java @@ -80,7 +80,7 @@ public class IrisEngine extends BlockPopulator implements Engine @Override public void generate(int x, int z, Hunk vblocks, Hunk vbiomes) { - Hunk biomes = vbiomes.synchronize(); + Hunk biomes = vbiomes; Hunk blocks = vblocks.synchronize().listen((xx,y,zz,t) -> catchBlockUpdates(x+xx,y+getMinHeight(),z+zz, t)); MultiBurst.burst.burst( diff --git a/src/main/java/com/volmit/iris/generator/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/generator/actuator/IrisBiomeActuator.java index 74d5164c6..36c31abad 100644 --- a/src/main/java/com/volmit/iris/generator/actuator/IrisBiomeActuator.java +++ b/src/main/java/com/volmit/iris/generator/actuator/IrisBiomeActuator.java @@ -20,7 +20,7 @@ public class IrisBiomeActuator extends EngineAssignedActuator { for(zf = 0; zf < h.getDepth(); zf++) { - v = getComplex().getTrueBiomeDerivativeStream().get(modX(xf+x), modZ(zf+z)); + v = getComplex().getTrueBiomeStream().get(modX(xf+x), modZ(zf+z)).getDerivative(); for(i = 0; i < h.getHeight(); i++) { diff --git a/src/main/java/com/volmit/iris/generator/modifier/IrisCaveModifier.java b/src/main/java/com/volmit/iris/generator/modifier/IrisCaveModifier.java index afe5be588..e1149ef7f 100644 --- a/src/main/java/com/volmit/iris/generator/modifier/IrisCaveModifier.java +++ b/src/main/java/com/volmit/iris/generator/modifier/IrisCaveModifier.java @@ -17,8 +17,8 @@ import java.util.function.Function; public class IrisCaveModifier extends EngineAssignedModifier { - public static final BlockData CAVE_AIR = B.getBlockData("CAVE_AIR"); - public static final BlockData AIR = B.getBlockData("AIR"); + public static final BlockData CAVE_AIR = B.get("CAVE_AIR"); + public static final BlockData AIR = B.get("AIR"); private static final KList EMPTY = new KList<>(); private final FastNoiseDouble gg; private final RNG rng; @@ -237,7 +237,11 @@ public class IrisCaveModifier extends EngineAssignedModifier public boolean canAir(Material m, BlockData caveFluid) { - return (B.isSolid(m) || (B.isDecorant(m.createBlockData())) || m.equals(Material.AIR) || m.equals(caveFluid.getMaterial()) || m.equals(B.mat("CAVE_AIR").getMaterial())) && !m.equals(Material.BEDROCK); + return (B.isSolid(m) || + (B.isDecorant(m.createBlockData())) || m.equals(Material.AIR) + || m.equals(caveFluid.getMaterial()) || + m.equals(B.getMaterial("CAVE_AIR"))) + && !m.equals(Material.BEDROCK); } public boolean canWater(Material m) diff --git a/src/main/java/com/volmit/iris/generator/modifier/IrisPostModifier.java b/src/main/java/com/volmit/iris/generator/modifier/IrisPostModifier.java index b9041a984..37d46b727 100644 --- a/src/main/java/com/volmit/iris/generator/modifier/IrisPostModifier.java +++ b/src/main/java/com/volmit/iris/generator/modifier/IrisPostModifier.java @@ -14,8 +14,8 @@ import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Slab; public class IrisPostModifier extends EngineAssignedModifier { - private static final BlockData AIR = B.getBlockData("CAVE_AIR"); - private static final BlockData WATER = B.getBlockData("WATER"); + private static final BlockData AIR = B.get("CAVE_AIR"); + private static final BlockData WATER = B.get("WATER"); private final RNG rng; public IrisPostModifier(Engine engine) { diff --git a/src/main/java/com/volmit/iris/object/IrisCompat.java b/src/main/java/com/volmit/iris/object/IrisCompat.java index 45672d996..3db32af2b 100644 --- a/src/main/java/com/volmit/iris/object/IrisCompat.java +++ b/src/main/java/com/volmit/iris/object/IrisCompat.java @@ -1,27 +1,20 @@ package com.volmit.iris.object; +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import com.volmit.iris.util.*; +import lombok.Data; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; + import java.io.File; import java.io.IOException; -import org.bukkit.Material; - -import com.google.gson.Gson; -import com.google.gson.JsonSyntaxException; -import com.volmit.iris.util.B; -import com.volmit.iris.util.IO; -import com.volmit.iris.util.KList; -import com.volmit.iris.util.KMap; - -import lombok.Data; -import org.bukkit.block.data.BlockData; - @Data public class IrisCompat { - private KList blockFilters = new KList<>(); - private KList itemFilters = new KList<>(); - private transient KMap blockResolves = new KMap<>(); - private transient KMap itemResolves = new KMap<>(); + private KList blockFilters; + private KList itemFilters; public IrisCompat() { @@ -31,162 +24,140 @@ public class IrisCompat public BlockData getBlock(String n) { - return blockResolves.compute(n, (k, v) -> + String buf = n; + int err = 16; + + BlockData tx = B.getOrNull(buf); + + if(tx != null) { - if(k != null && v != null) + return tx; + } + + searching: while(true) + { + if(err-- <= 0) { - return v; + return B.get("STONE"); } - String buf = k; - int err = 16; - - BlockData tx = B.parseBlockDataOrNull(buf); - - if(tx != null) + for(IrisCompatabilityBlockFilter i : blockFilters) { - return tx; - } - - searching: while(true) - { - if(err-- <= 0) + if(i.getWhen().equalsIgnoreCase(buf)) { - return B.parseBlockDataOrNull("STONE"); - } + BlockData b = i.getReplace(); - for(IrisCompatabilityBlockFilter i : blockFilters) - { - if(i.getWhen().equalsIgnoreCase(buf)) + if(b != null) { - BlockData b = i.getReplace(); - - if(b != null) - { - return b; - } - - buf = i.getSupplement(); - continue searching; + return b; } - } - return B.parseBlockDataOrNull("STONE"); + buf = i.getSupplement(); + continue searching; + } } - }); + + return B.get("STONE"); + } } public Material getItem(String n) { - return itemResolves.compute(n, (k, v) -> + String buf = n; + int err = 16; + Material txf = B.getMaterialOrNull(buf); + + if(txf != null) { - if(k != null && v != null) + return txf; + } + + int nomore = 64; + + searching: while(true) + { + if(nomore < 0) { - return v; + return B.getMaterial("STONE"); } - String buf = k; - int err = 16; - Material txf = B.getMaterialOrNull(buf); - - if(txf != null) + nomore--; + if(err-- <= 0) { - return txf; - } - - int nomore = 64; - - searching: while(true) - { - if(nomore < 0) - { - return B.parseBlockDataOrNull("STONE").getMaterial(); - } - - nomore--; - if(err-- <= 0) - { - break; - } - - for(IrisCompatabilityItemFilter i : itemFilters) - { - if(i.getWhen().equalsIgnoreCase(buf)) - { - Material b = i.getReplace(); - - if(b != null) - { - return b; - } - - buf = i.getSupplement(); - continue searching; - } - } - break; } - buf = k; - BlockData tx = B.parseBlockDataOrNull(buf); - - if(tx != null) + for(IrisCompatabilityItemFilter i : itemFilters) { - return tx.getMaterial(); - } - nomore = 64; - - searching: while(true) - { - if(nomore < 0) + if(i.getWhen().equalsIgnoreCase(buf)) { - return B.parseBlockDataOrNull("STONE").getMaterial(); - } + Material b = i.getReplace(); - nomore--; - - if(err-- <= 0) - { - return B.parseBlockDataOrNull("STONE").getMaterial(); - } - - for(IrisCompatabilityBlockFilter i : blockFilters) - { - if(i.getWhen().equalsIgnoreCase(buf)) + if(b != null) { - BlockData b = i.getReplace(); - - if(b != null) - { - return b.getMaterial(); - } - - buf = i.getSupplement(); - continue searching; + return b; } - } - return B.parseBlockDataOrNull("STONE").getMaterial(); + buf = i.getSupplement(); + continue searching; + } } - }); + + break; + } + + buf = n; + BlockData tx = B.getOrNull(buf); + + if(tx != null) + { + return tx.getMaterial(); + } + nomore = 64; + + searching: while(true) + { + if(nomore < 0) + { + return B.getMaterial("STONE"); + } + + nomore--; + + if(err-- <= 0) + { + return B.getMaterial("STONE"); + } + + for(IrisCompatabilityBlockFilter i : blockFilters) + { + if(i.getWhen().equalsIgnoreCase(buf)) + { + BlockData b = i.getReplace(); + + if(b != null) + { + return b.getMaterial(); + } + + buf = i.getSupplement(); + continue searching; + } + } + + return B.getMaterial("STONE"); + } } public static IrisCompat configured(File f) { IrisCompat def = new IrisCompat(); + String defa = new JSONObject(new Gson().toJson(def)).toString(4); + J.attemptAsync(() -> IO.writeAll(new File(f.getParentFile(), "compat.default.json"), defa)); if(!f.exists()) { - try - { - IO.writeAll(f, new Gson().toJson(def)); - } - - catch(IOException e) - { - e.printStackTrace(); - } + J.attemptAsync(() -> IO.writeAll(f, defa)); } try @@ -195,12 +166,12 @@ public class IrisCompat for(IrisCompatabilityBlockFilter i : rea.getBlockFilters()) { - def.getBlockFilters().add(0, i); + def.getBlockFilters().add(i); } for(IrisCompatabilityItemFilter i : rea.getItemFilters()) { - def.getItemFilters().add(0, i); + def.getItemFilters().add(i); } } diff --git a/src/main/java/com/volmit/iris/object/IrisCompatabilityBlockFilter.java b/src/main/java/com/volmit/iris/object/IrisCompatabilityBlockFilter.java index 628ae3fd8..eeef26db5 100644 --- a/src/main/java/com/volmit/iris/object/IrisCompatabilityBlockFilter.java +++ b/src/main/java/com/volmit/iris/object/IrisCompatabilityBlockFilter.java @@ -44,14 +44,14 @@ public class IrisCompatabilityBlockFilter public BlockData getFind() { - return findData.aquire(() -> B.getBlockData(when)); + return findData.aquire(() -> B.get(when)); } public BlockData getReplace() { return replaceData.aquire(() -> { - BlockData b = B.parseBlockDataOrNull(supplement); + BlockData b = B.getOrNull(supplement); if(b == null) { diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index 63109f23d..174aad175 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -401,16 +401,6 @@ public class IrisDimension extends IrisRegistrant return r; } - public BlockData resolveBlock(String bd) - { - return Iris.compat.getBlock(bd); - } - - public Material resolveItem(String bd) - { - return Iris.compat.getItem(bd); - } - public IrisGeneratorStyle getBiomeStyle(InferredType type) { switch(type) diff --git a/src/main/java/com/volmit/iris/object/IrisObject.java b/src/main/java/com/volmit/iris/object/IrisObject.java index f04c5ea61..9e1d0f82f 100644 --- a/src/main/java/com/volmit/iris/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/object/IrisObject.java @@ -37,10 +37,10 @@ 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 BlockData AIR = B.get("CAVE_AIR"); + private static final BlockData VAIR = B.get("VOID_AIR"); + private static final BlockData VAIR_DEBUG = B.get("COBWEB"); + private static final BlockData[] SNOW_LAYERS = new BlockData[] {B.get("minecraft:snow[layers=1]"), B.get("minecraft:snow[layers=2]"), B.get("minecraft:snow[layers=3]"), B.get("minecraft:snow[layers=4]"), B.get("minecraft:snow[layers=5]"), B.get("minecraft:snow[layers=6]"), B.get("minecraft:snow[layers=7]"), B.get("minecraft:snow[layers=8]")}; public static boolean shitty = false; private KMap blocks; private int w; @@ -234,7 +234,7 @@ public class IrisObject extends IrisRegistrant for(int i = 0; i < s; i++) { - blocks.put(new BlockVector(din.readShort(), din.readShort(), din.readShort()), B.getBlockData(din.readUTF())); + blocks.put(new BlockVector(din.readShort(), din.readShort(), din.readShort()), B.get(din.readUTF())); } } diff --git a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java index 2cd1afb87..195565441 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/Engine.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/Engine.java @@ -7,9 +7,7 @@ import com.volmit.iris.scaffold.cache.Cache; import com.volmit.iris.scaffold.data.DataProvider; import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.scaffold.parallax.ParallaxAccess; -import com.volmit.iris.util.B; -import com.volmit.iris.util.KList; -import com.volmit.iris.util.RNG; +import com.volmit.iris.util.*; import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.block.Biome; diff --git a/src/main/java/com/volmit/iris/scaffold/engine/EngineParallaxManager.java b/src/main/java/com/volmit/iris/scaffold/engine/EngineParallaxManager.java index 77323c13c..16d856a43 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/EngineParallaxManager.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/EngineParallaxManager.java @@ -2,8 +2,6 @@ package com.volmit.iris.scaffold.engine; import com.volmit.iris.Iris; import com.volmit.iris.generator.IrisComplex; -import com.volmit.iris.generator.actuator.IrisTerrainActuator; -import com.volmit.iris.generator.modifier.IrisCaveModifier; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.object.*; import com.volmit.iris.scaffold.cache.Cache; @@ -332,44 +330,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer default int trueHeight(int x, int z) { - int rx = (int) Math.round(getEngine().modifyX(x)); - int rz = (int) Math.round(getEngine().modifyZ(z)); - int height = (int) Math.round(getComplex().getHeightStream().get(rx, rz)); - int m = height; - - if(getEngine().getDimension().isCarving()) - { - if(getEngine().getDimension().isCarved(rx, m, rz, ((IrisTerrainActuator)getFramework().getTerrainActuator()).getRng(), height)) - { - m--; - - while(getEngine().getDimension().isCarved(rx, m, rz, ((IrisTerrainActuator)getFramework().getTerrainActuator()).getRng(), height)) - { - m--; - } - } - } - - if(getEngine().getDimension().isCaves()) - { - KList caves = ((IrisCaveModifier)getFramework().getCaveModifier()).genCaves(rx, rz, 0, 0, null); - boolean again = true; - - while(again) - { - again = false; - for(CaveResult i : caves) - { - if(i.getCeiling() > m && i.getFloor() < m) - { - m = i.getFloor(); - again = true; - } - } - } - } - - return m; + return getComplex().getTrueHeightStream().get(x, z); } @Override diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/io/HunkRegionSlice.java b/src/main/java/com/volmit/iris/scaffold/hunk/io/HunkRegionSlice.java index 22e606344..3b9a438ab 100644 --- a/src/main/java/com/volmit/iris/scaffold/hunk/io/HunkRegionSlice.java +++ b/src/main/java/com/volmit/iris/scaffold/hunk/io/HunkRegionSlice.java @@ -1,18 +1,17 @@ package com.volmit.iris.scaffold.hunk.io; -import java.io.IOException; - -import com.volmit.iris.util.*; -import org.bukkit.block.data.BlockData; - import com.volmit.iris.Iris; import com.volmit.iris.scaffold.hunk.Hunk; +import com.volmit.iris.util.*; +import org.bukkit.block.data.BlockData; + +import java.io.IOException; public class HunkRegionSlice { - public static final Function2> BLOCKDATA = (h, c) -> new HunkRegionSlice<>(h, Hunk::newAtomicHunk, new BlockDataHunkIOAdapter(), c, "blockdata"); - public static final Function3> STRING = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newAtomicHunk, new StringHunkIOAdapter(), c, t); - public static final Function3> BOOLEAN = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newAtomicHunk, new BooleanHunkIOAdapter(), c, t); + public static final Function2> BLOCKDATA = (h, c) -> new HunkRegionSlice<>(h, Hunk::newMappedHunk, new BlockDataHunkIOAdapter(), c, "blockdata"); + public static final Function3> STRING = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newMappedHunk, new StringHunkIOAdapter(), c, t); + public static final Function3> BOOLEAN = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newMappedHunk, new BooleanHunkIOAdapter(), c, t); private final Function3> factory; private final HunkIOAdapter adapter; private final CompoundTag compound; diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/io/PaletteHunkIOAdapter.java b/src/main/java/com/volmit/iris/scaffold/hunk/io/PaletteHunkIOAdapter.java index 8c4b60263..2e28cab8b 100644 --- a/src/main/java/com/volmit/iris/scaffold/hunk/io/PaletteHunkIOAdapter.java +++ b/src/main/java/com/volmit/iris/scaffold/hunk/io/PaletteHunkIOAdapter.java @@ -18,7 +18,7 @@ public abstract class PaletteHunkIOAdapter implements HunkIOAdapter { AtomicInteger nonNull = new AtomicInteger(0); DataPalette palette = new DataPalette(); - t.iterate(0, (x,y,z,w) -> { + t.iterateSync((x,y,z,w) -> { if(w != null) { palette.getIndex(w); @@ -29,7 +29,7 @@ public abstract class PaletteHunkIOAdapter implements HunkIOAdapter { palette.write(this, dos); dos.writeInt(nonNull.get() + Integer.MIN_VALUE); AtomicBoolean failure = new AtomicBoolean(false); - t.iterate(0, (x,y,z,w) -> { + t.iterateSync((x,y,z,w) -> { if(w != null) { try diff --git a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java index 2981281a7..28abe35da 100644 --- a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java +++ b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java @@ -1,15 +1,18 @@ package com.volmit.iris.scaffold.parallax; -import java.io.File; -import java.io.IOException; - import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.scaffold.hunk.io.HunkIOAdapter; import com.volmit.iris.scaffold.hunk.io.HunkRegion; import com.volmit.iris.scaffold.hunk.io.HunkRegionSlice; -import com.volmit.iris.util.*; +import com.volmit.iris.util.ByteArrayTag; +import com.volmit.iris.util.CompoundTag; +import com.volmit.iris.util.M; +import com.volmit.iris.util.Tag; import org.bukkit.block.data.BlockData; +import java.io.File; +import java.io.IOException; + public class ParallaxRegion extends HunkRegion { private boolean dirtyMeta; diff --git a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java index 6326a53d4..7243b1021 100644 --- a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java +++ b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java @@ -194,7 +194,7 @@ public class ParallaxWorld implements ParallaxAccess public void cleanup() { - cleanup(10000, 1000); + cleanup(15000, 5000); } @Override diff --git a/src/main/java/com/volmit/iris/util/B.java b/src/main/java/com/volmit/iris/util/B.java index 1312065cd..3f28ea96a 100644 --- a/src/main/java/com/volmit/iris/util/B.java +++ b/src/main/java/com/volmit/iris/util/B.java @@ -1,30 +1,25 @@ package com.volmit.iris.util; +import com.volmit.iris.Iris; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.type.Leaves; - -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 KList nulls = new KList<>(); - private static final KList canPlaceOn = 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 IrisLock lock = new IrisLock("Typelock"); - - public static BlockData get(String bd) - { - return getBlockData(bd); - } + private static final Material AIR_MATERIAL = Material.AIR; + private static final BlockData AIR = AIR_MATERIAL.createBlockData(); + private static final KSet nullBlockDataCache = new KSet<>(); + private static final KSet nullMaterialCache = new KSet<>(); + private static final KMap solidCache = new KMap<>(); + private static final KMap updatableCache = new KMap<>(); + private static final KMap foliageCache = new KMap<>(); + private static final KMap litCache = new KMap<>(); + private static final KMap decorantCache = new KMap<>(); + private static final KMap storageCache = new KMap<>(); + private static final KMap storageChestCache = new KMap<>(); + private static final KMap blockDataCache = new KMap<>(); + private static final KMap materialCache = new KMap<>(); public static boolean isWater(BlockData b) { @@ -36,87 +31,44 @@ public class B return AIR; } - public static KMap getBdc() - { - return bdc; - } - - public static KList getNulls() - { - return nulls; - } - - 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 KMap getTypes() - { - return types; - } - - public static KMap 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) -> + Material mat = getMaterialOrNull(bdx); + + if(mat != null) { - if(v != null) - { - return v; - } - - try - { - return Material.valueOf(k); - } - - catch(Throwable e) - { - - } - - return defaultCompat.resolveItem(bdx); - }); + return mat; + } + + return AIR_MATERIAL; } - public static Material getMaterialOrNull(String bdx) + public static Material getMaterialOrNull(String bdxx) { - String bd = bdx.trim().toUpperCase(); + String bx = bdxx.trim().toUpperCase(); + if(nullMaterialCache.contains(bx)) + { + return null; + } + + Material mat = materialCache.get(bx); + + if(mat != null) + { + return mat; + } + try { - return Material.valueOf(bd); + Material mm = Material.valueOf(bx); + materialCache.put(bx, mm); + return mm; } catch(Throwable e) { + nullMaterialCache.add(bx); return null; } } @@ -128,19 +80,442 @@ public class B public static boolean isSolid(Material mat) { - return mat.isSolid(); + Boolean solid = solidCache.get(mat); + + if(solid != null) + { + return solid; + } + + solid = mat.isSolid(); + solidCache.put(mat, solid); + + return solid; } - public static BlockData mat(String bd) + public static BlockData getOrNull(String bdxf) { - return getBlockData(bd); + try + { + String bd = bdxf.trim(); + + BlockData bdx = parseBlockData(bd); + + if(bdx == null) + { + Iris.warn("Unknown Block Data '" + bd + "'"); + return AIR; + } + + return bdx; + } + + catch(Throwable e) + { + Iris.warn("Unknown Block Data '" + bdxf + "'"); + } + + return null; } - public static BlockData getBlockData(String bd) + public static BlockData get(String bdxf) { - return getBlockData(bd, defaultCompat); + BlockData bd = getOrNull(bdxf); + + if(bd != null) + { + return bd; + } + + return AIR; } + private static BlockData parseBlockDataOrNull(String ix) + { + if(nullBlockDataCache.contains(ix)) + { + return null; + } + + try + { + BlockData bb = blockDataCache.get(ix); + + if(bb != null) + { + return bb; + } + + BlockData bx = Bukkit.createBlockData(ix); + blockDataCache.put(ix, bx); + return bx; + } + + catch(Throwable e) + { + + } + + String i = ix.toUpperCase().trim(); + i = i.equals("WOOL") ? "WHITE_WOOL" : i; + i = i.equals("CONCRETE") ? "WHITE_CONCRETE" : i; + + try + { + BlockData bd = Material.valueOf(i).createBlockData(); + blockDataCache.put(ix, bd); + } + + catch(Throwable e) + { + + } + + nullBlockDataCache.add(ix); + return null; + } + + private static BlockData parseBlockData(String ix) + { + BlockData bd = parseBlockDataOrNull(ix); + + if(bd != null) + { + return bd; + } + + return AIR; + } + + public static boolean isStorage(BlockData mat) + { + Material mm = mat.getMaterial(); + Boolean f = storageCache.get(mm); + + if(f != null) + { + return f; + } + + f = mm.equals(B.getMaterial("CHEST")) + || mm.equals(B.getMaterial("TRAPPED_CHEST")) + || mm.equals(B.getMaterial("SHULKER_BOX")) + || mm.equals(B.getMaterial("WHITE_SHULKER_BOX")) + || mm.equals(B.getMaterial("ORANGE_SHULKER_BOX")) + || mm.equals(B.getMaterial("MAGENTA_SHULKER_BOX")) + || mm.equals(B.getMaterial("LIGHT_BLUE_SHULKER_BOX")) + || mm.equals(B.getMaterial("YELLOW_SHULKER_BOX")) + || mm.equals(B.getMaterial("LIME_SHULKER_BOX")) + || mm.equals(B.getMaterial("PINK_SHULKER_BOX")) + || mm.equals(B.getMaterial("GRAY_SHULKER_BOX")) + || mm.equals(B.getMaterial("LIGHT_GRAY_SHULKER_BOX")) + || mm.equals(B.getMaterial("CYAN_SHULKER_BOX")) + || mm.equals(B.getMaterial("PURPLE_SHULKER_BOX")) + || mm.equals(B.getMaterial("BLUE_SHULKER_BOX")) + || mm.equals(B.getMaterial("BROWN_SHULKER_BOX")) + || mm.equals(B.getMaterial("GREEN_SHULKER_BOX")) + || mm.equals(B.getMaterial("RED_SHULKER_BOX")) + || mm.equals(B.getMaterial("BLACK_SHULKER_BOX")) + || mm.equals(B.getMaterial("BARREL")) + || mm.equals(B.getMaterial("DISPENSER")) + || mm.equals(B.getMaterial("DROPPER")) + || mm.equals(B.getMaterial("HOPPER")) + || mm.equals(B.getMaterial("FURNACE")) + || mm.equals(B.getMaterial("BLAST_FURNACE")) + || mm.equals(B.getMaterial("SMOKER")); + storageCache.put(mm, f); + return f; + } + + public static boolean isStorageChest(BlockData mat) + { + if(!isStorage(mat)) + { + return false; + } + + Material mm = mat.getMaterial(); + Boolean f = storageChestCache.get(mm); + + if(f != null) + { + return f; + } + + f = mm.equals(B.getMaterial("CHEST")) + || mm.equals(B.getMaterial("TRAPPED_CHEST")) + || mm.equals(B.getMaterial("SHULKER_BOX")) + || mm.equals(B.getMaterial("WHITE_SHULKER_BOX")) + || mm.equals(B.getMaterial("ORANGE_SHULKER_BOX")) + || mm.equals(B.getMaterial("MAGENTA_SHULKER_BOX")) + || mm.equals(B.getMaterial("LIGHT_BLUE_SHULKER_BOX")) + || mm.equals(B.getMaterial("YELLOW_SHULKER_BOX")) + || mm.equals(B.getMaterial("LIME_SHULKER_BOX")) + || mm.equals(B.getMaterial("PINK_SHULKER_BOX")) + || mm.equals(B.getMaterial("GRAY_SHULKER_BOX")) + || mm.equals(B.getMaterial("LIGHT_GRAY_SHULKER_BOX")) + || mm.equals(B.getMaterial("CYAN_SHULKER_BOX")) + || mm.equals(B.getMaterial("PURPLE_SHULKER_BOX")) + || mm.equals(B.getMaterial("BLUE_SHULKER_BOX")) + || mm.equals(B.getMaterial("BROWN_SHULKER_BOX")) + || mm.equals(B.getMaterial("GREEN_SHULKER_BOX")) + || mm.equals(B.getMaterial("RED_SHULKER_BOX")) + || mm.equals(B.getMaterial("BLACK_SHULKER_BOX")) + || mm.equals(B.getMaterial("BARREL")) + || mm.equals(B.getMaterial("DISPENSER")) + || mm.equals(B.getMaterial("DROPPER")) + || mm.equals(B.getMaterial("HOPPER")); + storageChestCache.put(mm, f); + return f; + } + + public static boolean isLit(BlockData mat) + { + Material mm = mat.getMaterial(); + Boolean f = litCache.get(mm); + + if(f != null) + { + return f; + } + + f = mm.equals(B.getMaterial("GLOWSTONE")) + || mm.equals(B.getMaterial("END_ROD")) + || mm.equals(B.getMaterial("SOUL_SAND")) + || mm.equals(B.getMaterial("TORCH")) + || mm.equals(Material.REDSTONE_TORCH) + || mm.equals(B.getMaterial("SOUL_TORCH")) + || mm.equals(Material.REDSTONE_WALL_TORCH) + || mm.equals(Material.WALL_TORCH) + || mm.equals(B.getMaterial("SOUL_WALL_TORCH")) + || mm.equals(B.getMaterial("LANTERN")) + || mm.equals(Material.JACK_O_LANTERN) + || mm.equals(Material.REDSTONE_LAMP) + || mm.equals(Material.MAGMA_BLOCK) + || mm.equals(B.getMaterial("SHROOMLIGHT")) + || mm.equals(B.getMaterial("SEA_LANTERN")) + || mm.equals(B.getMaterial("SOUL_LANTERN")) + || mm.equals(Material.FIRE) + || mm.equals(B.getMaterial("SOUL_FIRE")) + || mm.equals(B.getMaterial("SEA_PICKLE")) + || mm.equals(Material.BREWING_STAND) + || mm.equals(Material.REDSTONE_ORE); + litCache.put(mm, f); + return f; + } + + public static boolean isUpdatable(BlockData mat) + { + Boolean u = updatableCache.get(mat.getMaterial()); + + if(u != null) + { + return u; + } + + u = isLit(mat) || isStorage(mat); + updatableCache.put(mat.getMaterial(), u); + return u; + } + + public static boolean isFoliage(BlockData d) + { + Boolean f = foliageCache.get(d.getMaterial()); + if(f != null) + { + return f; + } + + if(isFluid(d) || isAir(d) || isSolid(d)) + { + foliageCache.put(d.getMaterial(), false); + return false; + } + + Material mat = d.getMaterial(); + f = mat.equals(Material.POPPY) + || mat.equals(Material.DANDELION) + || mat.equals(B.getMaterial("CORNFLOWER")) + || mat.equals(B.getMaterial("SWEET_BERRY_BUSH")) + || mat.equals(B.getMaterial("CRIMSON_ROOTS")) + || mat.equals(B.getMaterial("WARPED_ROOTS")) + || mat.equals(B.getMaterial("NETHER_SPROUTS")) + || mat.equals(B.getMaterial("ALLIUM")) + || mat.equals(B.getMaterial("AZURE_BLUET")) + || mat.equals(B.getMaterial("BLUE_ORCHID")) + || mat.equals(B.getMaterial("POPPY")) + || mat.equals(B.getMaterial("DANDELION")) + || mat.equals(B.getMaterial("OXEYE_DAISY")) + || mat.equals(B.getMaterial("LILY_OF_THE_VALLEY")) + || mat.equals(B.getMaterial("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); + foliageCache.put(d.getMaterial(), f); + return f; + } + + public static boolean canPlaceOnto(Material mat, Material onto) + { + String key = mat.name() + "" + onto.name(); + + if(isFoliage(B.get(mat.name()))) + { + if(!isFoliagePlantable(B.get(onto.name()))) + { + return false; + } + } + + if(onto.equals(Material.AIR) || onto.equals(B.getMaterial("CAVE_AIR"))) + { + return false; + } + + if(onto.equals(Material.GRASS_BLOCK) && mat.equals(Material.DEAD_BUSH)) + { + return false; + } + + if(onto.equals(Material.GRASS_PATH)) + { + if(!mat.isSolid()) + { + return false; + } + } + + if(onto.equals(Material.ACACIA_LEAVES) || onto.equals(Material.BIRCH_LEAVES) + || onto.equals(Material.DARK_OAK_LEAVES) + || onto.equals(Material.JUNGLE_LEAVES) + || onto.equals(Material.OAK_LEAVES) + || onto.equals(Material.SPRUCE_LEAVES)) + { + if(!mat.isSolid()) + { + return false; + } + } + + return true; + } + + public static boolean isDecorant(BlockData m) + { + Material mm = m.getMaterial(); + Boolean f = decorantCache.get(mm); + + f = mm.equals(Material.GRASS) + || mm.equals(Material.TALL_GRASS) + || mm.equals(B.getMaterial("CORNFLOWER")) + || mm.equals(Material.SUNFLOWER) + || mm.equals(Material.CHORUS_FLOWER) + || mm.equals(Material.POPPY) + || mm.equals(Material.DANDELION) + || mm.equals(Material.OXEYE_DAISY) + || mm.equals(Material.ORANGE_TULIP) + || mm.equals(Material.PINK_TULIP) + || mm.equals(Material.RED_TULIP) + || mm.equals(Material.WHITE_TULIP) + || mm.equals(Material.LILAC) + || mm.equals(Material.DEAD_BUSH) + || mm.equals(B.getMaterial("SWEET_BERRY_BUSH")) + || mm.equals(Material.ROSE_BUSH) + || mm.equals(B.getMaterial("WITHER_ROSE")) + || mm.equals(Material.ALLIUM) + || mm.equals(Material.BLUE_ORCHID) + || mm.equals(B.getMaterial("LILY_OF_THE_VALLEY")) + || mm.equals(B.getMaterial("CRIMSON_FUNGUS")) + || mm.equals(B.getMaterial("WARPED_FUNGUS")) + || mm.equals(Material.RED_MUSHROOM) + || mm.equals(Material.BROWN_MUSHROOM) + || mm.equals(B.getMaterial("CRIMSON_ROOTS")) + || mm.equals(B.getMaterial("AZURE_BLUET")) + || mm.equals(B.getMaterial("WEEPING_VINES")) + || mm.equals(B.getMaterial("WEEPING_VINES_PLANT")) + || mm.equals(B.getMaterial("WARPED_ROOTS")) + || mm.equals(B.getMaterial("NETHER_SPROUTS")) + || mm.equals(B.getMaterial("TWISTING_VINES")) + || mm.equals(B.getMaterial("TWISTING_VINES_PLANT")) + || mm.equals(Material.SUGAR_CANE) + || mm.equals(Material.WHEAT) + || mm.equals(Material.POTATOES) + || mm.equals(Material.CARROTS) + || mm.equals(Material.BEETROOTS) + || mm.equals(Material.NETHER_WART) + || mm.equals(B.getMaterial("SEA_PICKLE")) + || mm.equals(B.getMaterial("SEAGRASS")) + || mm.equals(B.getMaterial("ACACIA_BUTTON")) + || mm.equals(B.getMaterial("BIRCH_BUTTON")) + || mm.equals(B.getMaterial("CRIMSON_BUTTON")) + || mm.equals(B.getMaterial("DARK_OAK_BUTTON")) + || mm.equals(B.getMaterial("JUNGLE_BUTTON")) + || mm.equals(B.getMaterial("OAK_BUTTON")) + || mm.equals(B.getMaterial("POLISHED_BLACKSTONE_BUTTON")) + || mm.equals(B.getMaterial("SPRUCE_BUTTON")) + || mm.equals(B.getMaterial("STONE_BUTTON")) + || mm.equals(B.getMaterial("WARPED_BUTTON")) + || mm.equals(Material.TORCH) + || mm.equals(B.getMaterial("SOUL_TORCH")); + decorantCache.put(mm, f); + return f; + } + + public static KList get(KList find) + { + KList b = new KList<>(); + + for(String i : find) + { + BlockData bd = get(i); + + if(bd != null) + { + b.add(bd); + } + } + + return b; + } + + public static boolean isFoliagePlantable(BlockData 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) + { + return d.getMaterial().equals(Material.WATER) || d.getMaterial().equals(Material.LAVA); + } + + public static boolean isAirOrFluid(BlockData d) + { + return isAir(d) || isFluid(d); + } + + public static boolean isAir(BlockData d) + { + if(d == null) + { + return true; + } + + return d.getMaterial().equals(Material.AIR) || d.getMaterial().equals(Material.CAVE_AIR) || d.getMaterial().equals(Material.VOID_AIR); + } + + + public static String[] getBlockTypes() { KList bt = new KList(); @@ -180,432 +555,4 @@ public class B return bt.toArray(new String[bt.size()]); } - - public static BlockData getBlockData(String bdxf, IrisDimension resolver) - { - try - { - String bd = bdxf.trim(); - BlockData fff = bdc.get(bd); - if(fff != null) - { - return fff.clone(); - } - - BlockData bdx = parseBlockData(bd); - - if(bdx == null) - { - bdx = resolver.resolveBlock(bd); - } - - if(bdx == null) - { - Iris.warn("Unknown Block Data '" + bd + "'"); - nulls.add(bd); - return AIR; - } - - if(resolver.isPreventLeafDecay() && bdx instanceof Leaves) - { - ((Leaves) bdx).setPersistent(true); - } - - bdc.put(bd, bdx); - - return bdx; - } - - catch(Throwable e) - { - Iris.warn("Unknown Block Data '" + bdxf + "'"); - } - - return AIR; - } - - public static BlockData parseBlockDataOrNull(String ix) - { - try - { - BlockData bx = Bukkit.createBlockData(ix); - - if(bx != null) - { - return bx; - } - } - - catch(Throwable e) - { - - } - - String i = ix.toUpperCase().trim(); - i = i.equals("WOOL") ? "WHITE_WOOL" : i; - i = i.equals("CONCRETE") ? "WHITE_CONCRETE" : i; - - try - { - return Material.valueOf(i).createBlockData(); - } - - catch(Throwable e) - { - - } - - return null; - } - - public static BlockData parseBlockData(String ix) - { - try - { - BlockData bx = Bukkit.createBlockData(ix); - - if(bx != null) - { - return bx; - } - } - - catch(Throwable e) - { - - } - - String i = ix.toUpperCase().trim(); - i = i.equals("WOOL") ? "WHITE_WOOL" : i; - i = i.equals("CONCRETE") ? "WHITE_CONCRETE" : i; - - try - { - return Material.valueOf(i).createBlockData(); - } - - catch(Throwable e) - { - - } - - return AIR; - } - - public static boolean isStorage(BlockData mat) - { - // @builder - return mat.getMaterial().equals(B.mat("CHEST").getMaterial()) - || mat.getMaterial().equals(B.mat("TRAPPED_CHEST").getMaterial()) - || mat.getMaterial().equals(B.mat("SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("WHITE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("ORANGE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("MAGENTA_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("LIGHT_BLUE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("YELLOW_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("LIME_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("PINK_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("GRAY_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("LIGHT_GRAY_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("CYAN_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("PURPLE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("BLUE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("BROWN_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("GREEN_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("RED_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("BLACK_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("BARREL").getMaterial()) - || mat.getMaterial().equals(B.mat("DISPENSER").getMaterial()) - || mat.getMaterial().equals(B.mat("DROPPER").getMaterial()) - || mat.getMaterial().equals(B.mat("HOPPER").getMaterial()) - || mat.getMaterial().equals(B.mat("FURNACE").getMaterial()) - || mat.getMaterial().equals(B.mat("BLAST_FURNACE").getMaterial()) - || mat.getMaterial().equals(B.mat("SMOKER").getMaterial()); - //@done - } - - public static boolean isStorageChest(BlockData mat) - { - // @builder - return mat.getMaterial().equals(B.mat("CHEST").getMaterial()) - || mat.getMaterial().equals(B.mat("TRAPPED_CHEST").getMaterial()) - || mat.getMaterial().equals(B.mat("SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("WHITE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("ORANGE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("MAGENTA_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("LIGHT_BLUE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("YELLOW_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("LIME_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("PINK_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("GRAY_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("LIGHT_GRAY_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("CYAN_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("PURPLE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("BLUE_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("BROWN_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("GREEN_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("RED_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("BLACK_SHULKER_BOX").getMaterial()) - || mat.getMaterial().equals(B.mat("BARREL").getMaterial()) - || mat.getMaterial().equals(B.mat("DISPENSER").getMaterial()) - || mat.getMaterial().equals(B.mat("DROPPER").getMaterial()) - || mat.getMaterial().equals(B.mat("HOPPER").getMaterial()); - //@done - } - - public static boolean isTrulyLit(BlockData mat) - { - return isLit(mat) || mat.getMaterial().equals(Material.LAVA); - } - - public static boolean isLit(BlockData mat) - { - // @builder - return mat.getMaterial().equals(B.mat("GLOWSTONE").getMaterial()) - || mat.getMaterial().equals(B.mat("END_ROD").getMaterial()) - || mat.getMaterial().equals(B.mat("SOUL_SAND").getMaterial()) - || mat.getMaterial().equals(B.mat("TORCH").getMaterial()) - || mat.getMaterial().equals(Material.REDSTONE_TORCH) - || mat.getMaterial().equals(B.mat("SOUL_TORCH").getMaterial()) - || mat.getMaterial().equals(Material.REDSTONE_WALL_TORCH) - || mat.getMaterial().equals(Material.WALL_TORCH) - || mat.getMaterial().equals(B.mat("SOUL_WALL_TORCH").getMaterial()) - || mat.getMaterial().equals(B.mat("LANTERN").getMaterial()) - || mat.getMaterial().equals(Material.JACK_O_LANTERN) - || mat.getMaterial().equals(Material.REDSTONE_LAMP) - || mat.getMaterial().equals(Material.MAGMA_BLOCK) - || mat.getMaterial().equals(B.mat("SHROOMLIGHT").getMaterial()) - || mat.getMaterial().equals(B.mat("SEA_LANTERN").getMaterial()) - || mat.getMaterial().equals(B.mat("SOUL_LANTERN").getMaterial()) - || mat.getMaterial().equals(Material.FIRE) - || mat.getMaterial().equals(B.mat("SOUL_FIRE").getMaterial()) - || mat.getMaterial().equals(B.mat("SEA_PICKLE").getMaterial()) - || mat.getMaterial().equals(Material.BREWING_STAND) - || mat.getMaterial().equals(Material.REDSTONE_ORE); - //@done - } - - public static boolean isUpdatable(BlockData mat) - { - return isLit(mat) || isStorage(mat); - } - - public static boolean isFoliage(BlockData d) - { - if(isFluid(d) || isAir(d) || isSolid(d)) - { - return false; - } - - BlockData mat = d; - // @builder - return mat.getMaterial().equals(Material.POPPY) - || mat.getMaterial().equals(Material.DANDELION) - || mat.getMaterial().equals(B.mat("CORNFLOWER").getMaterial()) - || mat.getMaterial().equals(B.mat("SWEET_BERRY_BUSH").getMaterial()) - || mat.getMaterial().equals(B.mat("CRIMSON_ROOTS").getMaterial()) - || mat.getMaterial().equals(B.mat("WARPED_ROOTS").getMaterial()) - || mat.getMaterial().equals(B.mat("NETHER_SPROUTS").getMaterial()) - || mat.getMaterial().equals(B.mat("ALLIUM").getMaterial()) - || mat.getMaterial().equals(B.mat("AZURE_BLUET").getMaterial()) - || mat.getMaterial().equals(B.mat("BLUE_ORCHID").getMaterial()) - || mat.getMaterial().equals(B.mat("POPPY").getMaterial()) - || mat.getMaterial().equals(B.mat("DANDELION").getMaterial()) - || mat.getMaterial().equals(B.mat("OXEYE_DAISY").getMaterial()) - || mat.getMaterial().equals(B.mat("LILY_OF_THE_VALLEY").getMaterial()) - || mat.getMaterial().equals(B.mat("WITHER_ROSE").getMaterial()) - || mat.getMaterial().equals(Material.DARK_OAK_SAPLING) - || mat.getMaterial().equals(Material.ACACIA_SAPLING) - || mat.getMaterial().equals(Material.JUNGLE_SAPLING) - || mat.getMaterial().equals(Material.BIRCH_SAPLING) - || mat.getMaterial().equals(Material.SPRUCE_SAPLING) - || mat.getMaterial().equals(Material.OAK_SAPLING) - || mat.getMaterial().equals(Material.ORANGE_TULIP) - || mat.getMaterial().equals(Material.PINK_TULIP) - || mat.getMaterial().equals(Material.RED_TULIP) - || mat.getMaterial().equals(Material.WHITE_TULIP) - || mat.getMaterial().equals(Material.FERN) - || mat.getMaterial().equals(Material.LARGE_FERN) - || mat.getMaterial().equals(Material.GRASS) - || mat.getMaterial().equals(Material.TALL_GRASS); - //@done - } - - public static boolean canPlaceOnto(Material mat, Material onto) - { - String key = mat.name() + "" + onto.name(); - - if(canPlaceOn.contains(key)) - { - return false; - } - - if(isFoliage(B.get(mat.name()))) - { - if(!isFoliagePlantable(B.get(onto.name()))) - { - lock.lock(); - canPlaceOn.add(key); - lock.unlock(); - return false; - } - } - - if(onto.equals(Material.AIR) || onto.equals(B.mat("CAVE_AIR").getMaterial())) - { - lock.lock(); - canPlaceOn.add(key); - lock.unlock(); - return false; - } - - if(onto.equals(Material.GRASS_BLOCK) && mat.equals(Material.DEAD_BUSH)) - { - lock.lock(); - canPlaceOn.add(key); - lock.unlock(); - return false; - } - - if(onto.equals(Material.GRASS_PATH)) - { - if(!mat.isSolid()) - { - lock.lock(); - canPlaceOn.add(key); - lock.unlock(); - return false; - } - } - - if(onto.equals(Material.ACACIA_LEAVES) || onto.equals(Material.BIRCH_LEAVES) - || onto.equals(Material.DARK_OAK_LEAVES) - || onto.equals(Material.JUNGLE_LEAVES) - || onto.equals(Material.OAK_LEAVES) - || onto.equals(Material.SPRUCE_LEAVES)) - { - if(!mat.isSolid()) - { - lock.lock(); - canPlaceOn.add(key); - lock.unlock(); - return false; - } - } - - return true; - } - - public static boolean isDecorant(BlockData m) - { - if(decorant.contains(m)) - { - return true; - } - - // @builder - boolean str = m.getMaterial().equals(Material.GRASS) - || m.getMaterial().equals(Material.TALL_GRASS) - || m.equals(B.mat("CORNFLOWER")) - || m.getMaterial().equals(Material.SUNFLOWER) - || m.getMaterial().equals(Material.CHORUS_FLOWER) - || m.getMaterial().equals(Material.POPPY) - || m.getMaterial().equals(Material.DANDELION) - || m.getMaterial().equals(Material.OXEYE_DAISY) - || m.getMaterial().equals(Material.ORANGE_TULIP) - || m.getMaterial().equals(Material.PINK_TULIP) - || m.getMaterial().equals(Material.RED_TULIP) - || m.getMaterial().equals(Material.WHITE_TULIP) - || m.getMaterial().equals(Material.LILAC) - || m.getMaterial().equals(Material.DEAD_BUSH) - || m.equals(B.mat("SWEET_BERRY_BUSH")) - || m.getMaterial().equals(Material.ROSE_BUSH) - || m.equals(B.mat("WITHER_ROSE")) - || m.getMaterial().equals(Material.ALLIUM) - || m.getMaterial().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.getMaterial().equals(Material.RED_MUSHROOM) - || m.getMaterial().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.getMaterial().equals(Material.SUGAR_CANE) - || m.getMaterial().equals(Material.WHEAT) - || m.getMaterial().equals(Material.POTATOES) - || m.getMaterial().equals(Material.CARROTS) - || m.getMaterial().equals(Material.BEETROOTS) - || m.getMaterial().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.getMaterial().equals(Material.TORCH) - || m.equals(B.mat("SOUL_TORCH")); - //@done - - if(str) - { - decorant.add(m); - return true; - } - - return false; - } - - public static KList getBlockData(KList find) - { - KList b = new KList<>(); - - for(String i : find) - { - BlockData bd = getBlockData(i); - - if(bd != null) - { - b.add(bd); - } - } - - return b; - } - - public static boolean isFoliagePlantable(BlockData 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) - { - return d.getMaterial().equals(Material.WATER) || d.getMaterial().equals(Material.LAVA); - } - - public static boolean isAirOrFluid(BlockData d) - { - return isAir(d) || isFluid(d); - } - - public static boolean isAir(BlockData d) - { - if(d == null) - { - return true; - } - - return d.getMaterial().equals(Material.AIR) || d.getMaterial().equals(Material.CAVE_AIR) || d.getMaterial().equals(Material.VOID_AIR); - } }