diff --git a/src/main/java/com/volmit/iris/ProjectManager.java b/src/main/java/com/volmit/iris/ProjectManager.java index 24d921909..4ee5776a2 100644 --- a/src/main/java/com/volmit/iris/ProjectManager.java +++ b/src/main/java/com/volmit/iris/ProjectManager.java @@ -42,6 +42,7 @@ import com.volmit.iris.object.IrisStructureTile; import com.volmit.iris.object.NoiseStyle; import com.volmit.iris.object.StructureTileCondition; import com.volmit.iris.util.ArrayType; +import com.volmit.iris.util.C; import com.volmit.iris.util.ChronoLatch; import com.volmit.iris.util.DependsOn; import com.volmit.iris.util.Desc; @@ -121,6 +122,7 @@ public class ProjectManager public void open(MortarSender sender, String dimm, Runnable onDone) { Iris.globaldata.dump(); + Iris.globaldata.preferFolder(null); IrisDimension d = Iris.globaldata.getDimensionLoader().load(dimm); J.attemptAsync(() -> { @@ -179,10 +181,16 @@ public class ProjectManager { double last = 0; int req = 740; + double lpc = 0; + boolean c = false; + while(!done.get()) { boolean derp = false; + double v = (double) gx.getGenerated() / (double) req; + c = lpc != v; + lpc = v; if(last > v || v > 1) { @@ -195,7 +203,11 @@ public class ProjectManager last = v; } - sender.sendMessage("Generating " + Form.pc(v) + (derp ? " (Waiting on Server...)" : "")); + if(c) + { + sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + (derp ? (C.GRAY + " (Waiting on Server...)") : (C.GRAY + " (" + (req - gx.getGenerated()) + " Left)"))); + } + J.sleep(3000); if(gx.isFailing()) @@ -237,6 +249,7 @@ public class ProjectManager Bukkit.unloadWorld(currentProject.getWorld(), false); currentProject = null; Iris.globaldata.dump(); + Iris.globaldata.preferFolder(null); J.attemptAsync(() -> IO.delete(folder)); } } @@ -244,6 +257,7 @@ public class ProjectManager public File compilePackage(MortarSender sender, String dim, boolean obfuscate) { Iris.globaldata.dump(); + Iris.globaldata.preferFolder(null); String dimm = dim; IrisDimension dimension = Iris.globaldata.getDimensionLoader().load(dimm); File folder = new File(Iris.instance.getDataFolder(), "exports/" + dimension.getLoadKey()); diff --git a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java index 5bba7c72b..1e8230752 100644 --- a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java @@ -61,7 +61,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple public void onInit(World world, RNG rng) { super.onInit(world, rng); - parallaxMap = new AtomicWorldData(world, "floor"); + parallaxMap = new AtomicWorldData(world); glText = new GenLayerText(this, rng.nextParallelRNG(32485)); } diff --git a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java index 080e96126..881daa79d 100644 --- a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java @@ -59,6 +59,8 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator protected abstract void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map); + protected abstract void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map); + protected int sampleHeight(int x, int z) { return onSampleColumnHeight(x >> 4, z >> 4, x, z, x & 15, z & 15); @@ -76,6 +78,8 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator BiomeMap biomeMap = new BiomeMap(); int ii, jj; + onPreGenerate(random, x, z, data, grid, height, biomeMap, map); + for(ii = 0; ii < 16; ii++) { int i = ii; diff --git a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java index 49483439d..4ee1e3543 100644 --- a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java @@ -82,6 +82,12 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator return glCave.genCaves(x, z, x & 15, z & 15, null); } + @Override + protected void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) + { + + } + @Override protected void onGenerateColumn(int cx, int cz, int rx, int rz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, boolean sampled) { diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicMulticache.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicMulticache.java index 0e7fc1da5..080ac9be8 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/AtomicMulticache.java +++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicMulticache.java @@ -51,7 +51,7 @@ public class AtomicMulticache return -5784; } - Long pos = pos(x, z); + long pos = pos(x, z); Double r = height.get(pos); if(r == null) @@ -65,7 +65,7 @@ public class AtomicMulticache public IrisRegion getRegion(int x, int z, Supplier g) { - Long pos = pos(x, z); + long pos = pos(x, z); IrisRegion r = region.get(pos); if(r == null) @@ -79,7 +79,7 @@ public class AtomicMulticache public BiomeResult getBiome(int x, int z, Supplier g) { - Long pos = pos(x, z); + long pos = pos(x, z); BiomeResult r = biome.get(pos); if(r == null) @@ -97,7 +97,7 @@ public class AtomicMulticache { return null; } - Long pos = pos(x, z); + long pos = pos(x, z); BiomeResult r = rawBiome.get(pos); if(r == null) diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java index ac041cb98..dcc78450d 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java +++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java @@ -23,9 +23,8 @@ public class AtomicWorldData private KList unloadRegions; private KList unloadChunks; private long last = M.ms(); - private String prefix; - public AtomicWorldData(World world, String prefix) + public AtomicWorldData(World world) { this.world = world; loadedSections = new KMap<>(); @@ -34,7 +33,6 @@ public class AtomicWorldData lastChunk = new KMap<>(); unloadRegions = new KList<>(); unloadChunks = new KList<>(); - this.prefix = prefix; getSubregionFolder().mkdirs(); } @@ -256,7 +254,7 @@ public class AtomicWorldData public File getSubregionFolder() { - return new File(world.getWorldFolder(), "subregion-" + prefix); + return new File(world.getWorldFolder(), "region-parallax"); } public KMap getLoadedChunks() diff --git a/src/main/java/com/volmit/iris/object/IrisEffect.java b/src/main/java/com/volmit/iris/object/IrisEffect.java index f0b5a70fb..71913877b 100644 --- a/src/main/java/com/volmit/iris/object/IrisEffect.java +++ b/src/main/java/com/volmit/iris/object/IrisEffect.java @@ -23,7 +23,8 @@ import lombok.Data; @Desc("An iris effect") @Data -public class IrisEffect { +public class IrisEffect +{ @DontObfuscate @Desc("The potion effect to apply in this area") private String potionEffect = ""; @@ -32,45 +33,45 @@ public class IrisEffect { @Desc("The particle effect to apply in the area") private Particle particleEffect = null; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @MinNumber(-32) @MaxNumber(32) @DontObfuscate @Desc("Randomly offset from the surface to this surface+value") private int particleOffset = 0; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @MinNumber(-8) @MaxNumber(8) @DontObfuscate @Desc("The alt x, usually represents motion if the particle count is zero. Otherwise an offset.") private double particleAltX = 0; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @MinNumber(-8) @MaxNumber(8) @DontObfuscate @Desc("The alt y, usually represents motion if the particle count is zero. Otherwise an offset.") private double particleAltY = 0; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @MinNumber(-8) @MaxNumber(8) @DontObfuscate @Desc("The alt z, usually represents motion if the particle count is zero. Otherwise an offset.") private double particleAltZ = 0; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @DontObfuscate @Desc("Randomize the altX by -altX to altX") private boolean randomAltX = true; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @DontObfuscate @Desc("Randomize the altY by -altY to altY") private boolean randomAltY = false; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @DontObfuscate @Desc("Randomize the altZ by -altZ to altZ") private boolean randomAltZ = true; @@ -79,74 +80,74 @@ public class IrisEffect { @Desc("The sound to play") private Sound sound = null; - @DependsOn({ "sound" }) + @DependsOn({"sound"}) @MinNumber(0) @MaxNumber(512) @DontObfuscate @Desc("The max distance from the player the sound will play") private int soundDistance = 12; - @DependsOn({ "sound", "maxPitch" }) + @DependsOn({"sound", "maxPitch"}) @MinNumber(0.01) @MaxNumber(1.99) @DontObfuscate @Desc("The minimum sound pitch") private double minPitch = 0.5D; - @DependsOn({ "sound", "minVolume" }) + @DependsOn({"sound", "minVolume"}) @MinNumber(0.01) @MaxNumber(1.99) @DontObfuscate @Desc("The max sound pitch") private double maxPitch = 1.5D; - @DependsOn({ "sound" }) + @DependsOn({"sound"}) @MinNumber(0.001) @MaxNumber(512) @DontObfuscate @Desc("The sound volume.") private double volume = 1.5D; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @MinNumber(0) @MaxNumber(512) @DontObfuscate @Desc("The particle count. Try setting to zero for using the alt xyz to a motion value instead of an offset") private int particleCount = 0; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @MinNumber(0) @MaxNumber(64) @DontObfuscate @Desc("How far away from the player particles can play") private int particleDistance = 20; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @MinNumber(0) @MaxNumber(128) @DontObfuscate @Desc("How wide the particles can play (player's view left and right) RADIUS") private int particleDistanceWidth = 24; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @DontObfuscate @Desc("An extra value for some particles... Which bukkit doesn't even document.") private double extra = 0; - @DependsOn({ "potionEffect" }) + @DependsOn({"potionEffect"}) @MinNumber(-1) @MaxNumber(1024) @DontObfuscate @Desc("The Potion Strength or -1 to disable") private int potionStrength = -1; - @DependsOn({ "potionEffect", "potionTicksMin" }) + @DependsOn({"potionEffect", "potionTicksMin"}) @MinNumber(1) @DontObfuscate @Desc("The max time the potion will last for") private int potionTicksMax = 155; - @DependsOn({ "potionEffect", "potionTicksMax" }) + @DependsOn({"potionEffect", "potionTicksMax"}) @MinNumber(1) @DontObfuscate @Desc("The min time the potion will last for") @@ -158,7 +159,7 @@ public class IrisEffect { @Desc("The effect interval in milliseconds") private int interval = 150; - @DependsOn({ "particleEffect" }) + @DependsOn({"particleEffect"}) @MinNumber(0) @MaxNumber(16) @DontObfuscate @@ -174,25 +175,33 @@ public class IrisEffect { private transient AtomicCache pt = new AtomicCache<>(); private transient AtomicCache latch = new AtomicCache<>(); - public IrisEffect() { + public IrisEffect() + { } - public boolean canTick() { + public boolean canTick() + { return latch.aquire(() -> new ChronoLatch(interval)).flip(); } - public PotionEffectType getRealType() { - return pt.aquire(() -> { + public PotionEffectType getRealType() + { + return pt.aquire(() -> + { PotionEffectType t = PotionEffectType.LUCK; - if (getPotionEffect().isEmpty()) { + if(getPotionEffect().isEmpty()) + { return t; } - try { - for (PotionEffectType i : PotionEffectType.values()) { - if (i.getName().toUpperCase().replaceAll("\\Q \\E", "_").equals(getPotionEffect())) { + try + { + for(PotionEffectType i : PotionEffectType.values()) + { + if(i.getName().toUpperCase().replaceAll("\\Q \\E", "_").equals(getPotionEffect())) + { t = i; return t; @@ -200,7 +209,8 @@ public class IrisEffect { } } - catch (Throwable e) { + catch(Throwable e) + { } @@ -210,57 +220,55 @@ public class IrisEffect { }); } - public void apply(Player p, IrisChunkGenerator g) { - if (!canTick()) { + public void apply(Player p, IrisChunkGenerator g) + { + if(!canTick()) + { return; } - if (RNG.r.nextInt(chance) != 0) { + if(RNG.r.nextInt(chance) != 0) + { return; } - if (sound != null) { - Location part = p.getLocation().clone().add(RNG.r.i(-soundDistance, soundDistance), - RNG.r.i(-soundDistance, soundDistance), RNG.r.i(-soundDistance, soundDistance)); + if(sound != null) + { + Location part = p.getLocation().clone().add(RNG.r.i(-soundDistance, soundDistance), RNG.r.i(-soundDistance, soundDistance), RNG.r.i(-soundDistance, soundDistance)); p.playSound(part, getSound(), (float) volume, (float) RNG.r.d(minPitch, maxPitch)); } - if (particleEffect != null) { - Location part = p.getLocation().clone() - .add(p.getLocation().getDirection().clone().multiply(RNG.r.i(particleDistance) + particleAway)) - .clone().add(p.getLocation().getDirection().clone().rotateAroundY(Math.toRadians(90)) - .multiply(RNG.r.d(-particleDistanceWidth, particleDistanceWidth))); + if(particleEffect != null) + { + Location part = p.getLocation().clone().add(p.getLocation().getDirection().clone().multiply(RNG.r.i(particleDistance) + particleAway)).clone().add(p.getLocation().getDirection().clone().rotateAroundY(Math.toRadians(90)).multiply(RNG.r.d(-particleDistanceWidth, particleDistanceWidth))); part.setY(Math.round(g.getTerrainHeight(part.getBlockX(), part.getBlockZ())) + 1); part.add(RNG.r.d(), 0, RNG.r.d()); - if (extra != 0) { - p.spawnParticle(particleEffect, part.getX(), part.getY() + RNG.r.i(particleOffset), part.getZ(), - particleCount, randomAltX ? RNG.r.d(-particleAltX, particleAltX) : particleAltX, - randomAltY ? RNG.r.d(-particleAltY, particleAltY) : particleAltY, - randomAltZ ? RNG.r.d(-particleAltZ, particleAltZ) : particleAltZ, extra); + if(extra != 0) + { + p.spawnParticle(particleEffect, part.getX(), part.getY() + RNG.r.i(particleOffset), part.getZ(), particleCount, randomAltX ? RNG.r.d(-particleAltX, particleAltX) : particleAltX, randomAltY ? RNG.r.d(-particleAltY, particleAltY) : particleAltY, randomAltZ ? RNG.r.d(-particleAltZ, particleAltZ) : particleAltZ, extra); } - else { - p.spawnParticle(particleEffect, part.getX(), part.getY() + RNG.r.i(particleOffset), part.getZ(), - particleCount, randomAltX ? RNG.r.d(-particleAltX, particleAltX) : particleAltX, - randomAltY ? RNG.r.d(-particleAltY, particleAltY) : particleAltY, - randomAltZ ? RNG.r.d(-particleAltZ, particleAltZ) : particleAltZ); + else + { + p.spawnParticle(particleEffect, part.getX(), part.getY() + RNG.r.i(particleOffset), part.getZ(), particleCount, randomAltX ? RNG.r.d(-particleAltX, particleAltX) : particleAltX, randomAltY ? RNG.r.d(-particleAltY, particleAltY) : particleAltY, randomAltZ ? RNG.r.d(-particleAltZ, particleAltZ) : particleAltZ); } } - if (potionStrength > -1) { - if (p.hasPotionEffect(getRealType())) { + if(potionStrength > -1) + { + if(p.hasPotionEffect(getRealType())) + { PotionEffect e = p.getPotionEffect(getRealType()); - if (e.getAmplifier() > getPotionStrength()) { + if(e.getAmplifier() > getPotionStrength()) + { return; } p.removePotionEffect(getRealType()); } - p.addPotionEffect(new PotionEffect(getRealType(), - RNG.r.i(Math.min(potionTicksMax, potionTicksMin), Math.max(potionTicksMax, potionTicksMin)), - getPotionStrength(), true, false, false)); + p.addPotionEffect(new PotionEffect(getRealType(), RNG.r.i(Math.min(potionTicksMax, potionTicksMin), Math.max(potionTicksMax, potionTicksMin)), getPotionStrength(), true, false, false)); } } } diff --git a/src/main/java/com/volmit/iris/object/IrisGeneratorStyle.java b/src/main/java/com/volmit/iris/object/IrisGeneratorStyle.java index 6cc8c9c96..f375cb736 100644 --- a/src/main/java/com/volmit/iris/object/IrisGeneratorStyle.java +++ b/src/main/java/com/volmit/iris/object/IrisGeneratorStyle.java @@ -13,7 +13,8 @@ import lombok.Data; @Desc("A gen style") @Data -public class IrisGeneratorStyle { +public class IrisGeneratorStyle +{ @Required @DontObfuscate @@ -42,23 +43,33 @@ public class IrisGeneratorStyle { private final transient AtomicCache cng = new AtomicCache(); - public IrisGeneratorStyle() { + public IrisGeneratorStyle() + { } - public IrisGeneratorStyle(NoiseStyle s) { + public IrisGeneratorStyle(NoiseStyle s) + { this.style = s; } - public CNG create(RNG rng) { - return cng.aquire(() -> { + public CNG create(RNG rng) + { + return cng.aquire(() -> + { CNG cng = style.create(rng).bake().scale(1D / zoom).pow(exponent).bake(); - if (fracture != null) { + if(fracture != null) + { cng.fractureWith(fracture.create(rng.nextParallelRNG(2934)), fracture.getMultiplier()); } return cng; }); } + + public boolean isFlat() + { + return style.equals(NoiseStyle.FLAT); + } } diff --git a/src/main/java/com/volmit/iris/object/IrisObject.java b/src/main/java/com/volmit/iris/object/IrisObject.java index f4a52547e..2f67fb530 100644 --- a/src/main/java/com/volmit/iris/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/object/IrisObject.java @@ -191,6 +191,7 @@ public class IrisObject extends IrisRegistrant public int place(int x, int yv, int z, IObjectPlacer placer, IrisObjectPlacement config, RNG rng, Consumer listener) { + boolean warped = !config.getWarp().isFlat(); boolean stilting = (config.getMode().equals(ObjectPlaceMode.STILT) || config.getMode().equals(ObjectPlaceMode.FAST_STILT)); KMap lowmap = stilting ? new KMap<>() : null; KMap lowmapData = stilting ? new KMap<>() : null; @@ -366,6 +367,12 @@ public class IrisObject extends IrisRegistrant int yy = y + (int) Math.round(i.getY()); int zz = z + (int) Math.round(i.getZ()); + if(warped) + { + xx += config.warp(rng, i.getX() + x, i.getY() + y, i.getZ() + z); + zz += config.warp(rng, i.getZ() + z, i.getY() + y, i.getX() + x); + } + if(yv < 0 && config.getMode().equals(ObjectPlaceMode.PAINT)) { yy = (int) Math.round(i.getY()) + Math.floorDiv(h, 2) + placer.getHighest(xx, zz, config.isUnderwater()); diff --git a/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java b/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java index 78f797601..72b789363 100644 --- a/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java +++ b/src/main/java/com/volmit/iris/object/IrisObjectPlacement.java @@ -2,6 +2,8 @@ package com.volmit.iris.object; import com.volmit.iris.Iris; import com.volmit.iris.gen.ContextualChunkGenerator; +import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; @@ -110,11 +112,30 @@ public class IrisObjectPlacement @Desc("If set to true, air will be placed before the schematic places.") private boolean bore = false; + @DontObfuscate + @Desc("Use a generator to warp the field of coordinates. Using simplex for example would make a square placement warp like a flag") + private IrisGeneratorStyle warp = new IrisGeneratorStyle(NoiseStyle.FLAT); + + private transient AtomicCache surfaceWarp = new AtomicCache<>(); + public IrisObjectPlacement() { } + public CNG getSurfaceWarp(RNG rng) + { + return surfaceWarp.aquire(() -> + { + return getWarp().create(rng); + }); + } + + public double warp(RNG rng, double x, double y, double z) + { + return getSurfaceWarp(rng).fitDouble(-(getWarp().getMultiplier() / 2D), (getWarp().getMultiplier() / 2D), x, y, z); + } + public IrisObject getSchematic(ContextualChunkGenerator g, RNG random) { if(place.isEmpty()) diff --git a/src/main/java/com/volmit/iris/object/IrisTextRenderer.java b/src/main/java/com/volmit/iris/object/IrisTextRenderer.java index 95fa2ab86..a5d647804 100644 --- a/src/main/java/com/volmit/iris/object/IrisTextRenderer.java +++ b/src/main/java/com/volmit/iris/object/IrisTextRenderer.java @@ -49,10 +49,6 @@ public class IrisTextRenderer @Desc("The palette of blocks to use when drawing text") private IrisMaterialPalette blockPalette = new IrisMaterialPalette(); - @DontObfuscate - @Desc("Use a generator to shuffle the surface field of coordinates. Using simplex for example would make the text rendered wavy. Use the multiplier to stretch further.") - private IrisGeneratorStyle surfaceField = new IrisGeneratorStyle(NoiseStyle.FLAT); - private transient AtomicCache> objects = new AtomicCache<>(); private transient AtomicCache fontData = new AtomicCache<>(); private transient AtomicCache fontMetrics = new AtomicCache<>(); diff --git a/src/main/java/com/volmit/iris/util/B.java b/src/main/java/com/volmit/iris/util/B.java index 994aa3eac..e5afeb03e 100644 --- a/src/main/java/com/volmit/iris/util/B.java +++ b/src/main/java/com/volmit/iris/util/B.java @@ -12,6 +12,13 @@ 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 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 IrisDimension defaultCompat = new IrisDimension(); private static final KMap solid = new KMap<>(); private static final KMap types = new KMap<>(); @@ -145,8 +152,13 @@ public class B public static boolean isStorage(Material mat) { + if(storage.contains(mat)) + { + return true; + } + //@builder - return mat.equals(B.mat("CHEST")) + boolean str = mat.equals(B.mat("CHEST")) || mat.equals(B.mat("TRAPPED_CHEST")) || mat.equals(B.mat("SHULKER_BOX")) || mat.equals(B.mat("WHITE_SHULKER_BOX")) @@ -173,12 +185,25 @@ public class B || mat.equals(B.mat("BLAST_FURNACE")) || mat.equals(B.mat("SMOKER")); //@done + + if(str) + { + storage.add(mat); + return true; + } + + return false; } public static boolean isStorageChest(Material mat) { + if(storageChest.contains(mat)) + { + return true; + } + //@builder - return mat.equals(B.mat("CHEST")) + boolean str = mat.equals(B.mat("CHEST")) || mat.equals(B.mat("TRAPPED_CHEST")) || mat.equals(B.mat("SHULKER_BOX")) || mat.equals(B.mat("WHITE_SHULKER_BOX")) @@ -202,12 +227,25 @@ public class B || mat.equals(B.mat("DROPPER")) || mat.equals(B.mat("HOPPER")); //@done + + if(str) + { + storageChest.add(mat); + return true; + } + + return false; } public static boolean isLit(Material mat) { + if(lit.contains(mat)) + { + return true; + } + //@builder - return mat.equals(B.mat("GLOWSTONE")) + boolean str = mat.equals(B.mat("GLOWSTONE")) || mat.equals(B.mat("END_ROD")) || mat.equals(B.mat("SOUL_SAND")) || mat.equals(B.mat("TORCH")) @@ -229,22 +267,57 @@ public class B || mat.equals(Material.BREWING_STAND) || mat.equals(Material.REDSTONE_ORE); //@done + if(str) + { + lit.add(mat); + return true; + } + + return false; } public static boolean isUpdatable(Material mat) { - return isLit(mat) || isStorage(mat); + if(updatable.contains(mat)) + { + return true; + } + + if(notUpdatable.contains(mat)) + { + return false; + } + + boolean str = isLit(mat) || isStorage(mat); + + if(str) + { + updatable.add(mat); + return true; + } + + notUpdatable.add(mat); + return false; } public static boolean canPlaceOnto(Material mat, Material onto) { + String key = mat.name() + "" + onto.name(); + + if(canPlaceOn.contains(key)) + { + return false; + } + if(onto.equals(Material.AIR) || onto.equals(B.mat("CAVE_AIR"))) { + canPlaceOn.add(key); return false; } if(onto.equals(Material.GRASS_BLOCK) && mat.equals(Material.DEAD_BUSH)) { + canPlaceOn.add(key); return false; } @@ -252,6 +325,7 @@ public class B { if(!mat.isSolid()) { + canPlaceOn.add(key); return false; } } @@ -260,6 +334,7 @@ public class B { if(mat.equals(Material.POPPY) || mat.equals(Material.DANDELION) || mat.equals(B.mat("CORNFLOWER")) || 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)) { + canPlaceOn.add(key); return false; } } @@ -268,6 +343,7 @@ public class B { if(!mat.isSolid()) { + canPlaceOn.add(key); return false; } } @@ -277,8 +353,13 @@ public class B public static boolean isDecorant(Material m) { + if(decorant.contains(m)) + { + return true; + } + //@builder - return m.equals(Material.GRASS) + boolean str = m.equals(Material.GRASS) || m.equals(Material.TALL_GRASS) || m.equals(B.mat("CORNFLOWER")) || m.equals(Material.SUNFLOWER) @@ -331,6 +412,14 @@ public class B || m.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)