diff --git a/core/src/main/java/com/volmit/iris/core/loader/IrisData.java b/core/src/main/java/com/volmit/iris/core/loader/IrisData.java index 10dc795a6..bd17e6ceb 100644 --- a/core/src/main/java/com/volmit/iris/core/loader/IrisData.java +++ b/core/src/main/java/com/volmit/iris/core/loader/IrisData.java @@ -34,6 +34,8 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.format.C; +import com.volmit.iris.util.mantle.flag.MantleFlagAdapter; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.MultiBurst; @@ -329,6 +331,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { .addSerializationExclusionStrategy(this) .setLenient() .registerTypeAdapterFactory(this) + .registerTypeAdapter(MantleFlag.class, new MantleFlagAdapter()) .setPrettyPrinting(); loaders.clear(); File packs = dataFolder; diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/ChunkUpdater.java b/core/src/main/java/com/volmit/iris/core/pregenerator/ChunkUpdater.java index 572ce98d4..bb5bea83b 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/ChunkUpdater.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/ChunkUpdater.java @@ -8,7 +8,7 @@ import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RollingSequence; diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java index 3289c64d8..9d537232d 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -43,7 +43,7 @@ import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.io.IO; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.matter.MatterStructurePOI; diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java index e58324ad7..10d12aa9d 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java @@ -31,7 +31,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.Mantle; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import lombok.*; import java.io.File; diff --git a/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java index 95ba698c9..e44ac8700 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -29,7 +29,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.mantle.Mantle; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index 6343df022..15c63933f 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -48,7 +48,7 @@ import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.format.C; import com.volmit.iris.util.function.Function2; import com.volmit.iris.util.hunk.Hunk; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.BlockPosition; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/ComponentFlag.java b/core/src/main/java/com/volmit/iris/engine/mantle/ComponentFlag.java index 1c7fe20b2..0ed617a7d 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/ComponentFlag.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/ComponentFlag.java @@ -1,6 +1,6 @@ package com.volmit.iris.engine.mantle; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.ReservedFlag; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -10,5 +10,5 @@ import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface ComponentFlag { - MantleFlag value(); + ReservedFlag value(); } diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index d37814e0c..695bc8b16 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -40,7 +40,7 @@ import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.mantle.MantleChunk; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.matter.*; import com.volmit.iris.util.matter.slices.UpdateMatter; import com.volmit.iris.util.parallel.BurstExecutor; diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java index cfe72ae39..ec99fd32c 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java @@ -18,7 +18,7 @@ package com.volmit.iris.engine.mantle; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java index 64c69d5c6..43a61c65c 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java @@ -24,7 +24,7 @@ import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.mantle.Mantle; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.parallel.BurstExecutor; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java index eca862c79..19bd89b32 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java @@ -28,17 +28,17 @@ import com.volmit.iris.engine.object.IrisCarving; import com.volmit.iris.engine.object.IrisRegion; import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.documentation.ChunkCoordinates; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.ReservedFlag; import com.volmit.iris.util.math.RNG; import lombok.Getter; @Getter -@ComponentFlag(MantleFlag.CARVED) +@ComponentFlag(ReservedFlag.CARVED) public class MantleCarvingComponent extends IrisMantleComponent { private final int radius = computeRadius(); public MantleCarvingComponent(EngineMantle engineMantle) { - super(engineMantle, MantleFlag.CARVED, 0); + super(engineMantle, ReservedFlag.CARVED, 0); } @Override diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java index 15389715e..dcfe9653d 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java @@ -28,17 +28,17 @@ import com.volmit.iris.engine.object.IrisFluidBodies; import com.volmit.iris.engine.object.IrisRegion; import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.documentation.ChunkCoordinates; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.ReservedFlag; import com.volmit.iris.util.math.RNG; import lombok.Getter; @Getter -@ComponentFlag(MantleFlag.FLUID_BODIES) +@ComponentFlag(ReservedFlag.FLUID_BODIES) public class MantleFluidBodyComponent extends IrisMantleComponent { private final int radius = computeRadius(); public MantleFluidBodyComponent(EngineMantle engineMantle) { - super(engineMantle, MantleFlag.FLUID_BODIES, 0); + super(engineMantle, ReservedFlag.FLUID_BODIES, 0); } @Override diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java index e5f551872..22d31800e 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java @@ -30,7 +30,7 @@ import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.ReservedFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.matter.slices.container.JigsawStructuresContainer; @@ -40,14 +40,14 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -@ComponentFlag(MantleFlag.JIGSAW) +@ComponentFlag(ReservedFlag.JIGSAW) public class MantleJigsawComponent extends IrisMantleComponent { @Getter private final int radius = computeRadius(); private final CNG cng; public MantleJigsawComponent(EngineMantle engineMantle) { - super(engineMantle, MantleFlag.JIGSAW, 1); + super(engineMantle, ReservedFlag.JIGSAW, 1); cng = NoiseStyle.STATIC.create(new RNG(jigsaw())); } diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java index a4ca6dd7a..bc48a9969 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java @@ -33,7 +33,7 @@ import com.volmit.iris.util.data.B; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.ReservedFlag; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.matter.MatterStructurePOI; import com.volmit.iris.util.noise.CNG; @@ -48,12 +48,12 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; @Getter -@ComponentFlag(MantleFlag.OBJECT) +@ComponentFlag(ReservedFlag.OBJECT) public class MantleObjectComponent extends IrisMantleComponent { private final int radius = computeRadius(); public MantleObjectComponent(EngineMantle engineMantle) { - super(engineMantle, MantleFlag.OBJECT, 1); + super(engineMantle, ReservedFlag.OBJECT, 1); } @Override diff --git a/core/src/main/java/com/volmit/iris/engine/modifier/IrisCustomModifier.java b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCustomModifier.java index 161600101..eca550cd2 100644 --- a/core/src/main/java/com/volmit/iris/engine/modifier/IrisCustomModifier.java +++ b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCustomModifier.java @@ -5,7 +5,7 @@ import com.volmit.iris.engine.framework.EngineAssignedModifier; import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.hunk.Hunk; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.MultiBurst; import org.bukkit.block.data.BlockData; diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java index 44dc73f3b..0688f3ea9 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java @@ -35,7 +35,8 @@ import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.json.JSONObject; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; +import com.volmit.iris.util.mantle.flag.ReservedFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.CNG; @@ -243,9 +244,9 @@ public class IrisDimension extends IrisRegistrant { @Desc("The Subterrain Fluid Layer Height") private int caveLavaHeight = 8; @RegistryListFunction(ComponentFlagFunction.class) - @ArrayType(type = MantleFlag.class) + @ArrayType(type = ReservedFlag.class) @Desc("Collection of disabled components") - private KList disabledComponents = new KList<>(); + private KList disabledComponents = new KList<>(); @Desc("A list of globally applied pre-processors") @ArrayType(type = IrisPreProcessors.class) private KList globalPreProcessors = new KList<>(); diff --git a/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ComponentFlagFunction.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ComponentFlagFunction.java index 7a0c01755..fb8738ffe 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ComponentFlagFunction.java +++ b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ComponentFlagFunction.java @@ -6,7 +6,7 @@ import com.volmit.iris.engine.framework.ListFunction; import com.volmit.iris.engine.mantle.ComponentFlag; import com.volmit.iris.engine.mantle.MantleComponent; import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import java.util.Objects; diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 6e1e56e54..ef6fb0cd7 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -35,6 +35,7 @@ import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Consumer4; import com.volmit.iris.util.io.IO; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.M; import com.volmit.iris.util.matter.Matter; import com.volmit.iris.util.matter.MatterSlice; diff --git a/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java b/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java index ae4fd1701..86c810331 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/MantleChunk.java @@ -23,9 +23,11 @@ import com.volmit.iris.util.data.Varint; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.function.Consumer4; import com.volmit.iris.util.io.CountingDataInputStream; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.matter.IrisMatter; import com.volmit.iris.util.matter.Matter; import com.volmit.iris.util.matter.MatterSlice; +import com.volmit.iris.util.parallel.AtomicBooleanArray; import lombok.Getter; import java.io.ByteArrayOutputStream; @@ -33,7 +35,6 @@ import java.io.DataOutputStream; import java.io.IOException; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicIntegerArray; import java.util.concurrent.atomic.AtomicReferenceArray; /** @@ -45,7 +46,7 @@ public class MantleChunk { private final int x; @Getter private final int z; - private final AtomicIntegerArray flags; + private final AtomicBooleanArray flags; private final AtomicReferenceArray sections; private final Semaphore ref = new Semaphore(Integer.MAX_VALUE, true); private final AtomicBoolean closed = new AtomicBoolean(false); @@ -58,13 +59,9 @@ public class MantleChunk { @ChunkCoordinates public MantleChunk(int sectionHeight, int x, int z) { sections = new AtomicReferenceArray<>(sectionHeight); - flags = new AtomicIntegerArray(MantleFlag.values().length); + flags = new AtomicBooleanArray(MantleFlag.MAX_ORDINAL + 1); this.x = x; this.z = z; - - for (int i = 0; i < flags.length(); i++) { - flags.set(i, 0); - } } /** @@ -78,10 +75,20 @@ public class MantleChunk { public MantleChunk(int version, int sectionHeight, CountingDataInputStream din) throws IOException { this(sectionHeight, din.readByte(), din.readByte()); int s = din.readByte(); - int l = version < 0 ? flags.length() : Varint.readUnsignedVarInt(din); + int l = version < 0 ? MantleFlag.RESERVED_FLAGS : Varint.readUnsignedVarInt(din); - for (int i = 0; i < flags.length() && i < l; i++) { - flags.set(i, din.readBoolean() ? 1 : 0); + if (version >= 1) { + int count = Math.ceilDiv(flags.length(), Byte.SIZE); + for (int i = 0; i < count;) { + byte f = din.readByte(); + for (int j = 0; j < Byte.SIZE && i < flags.length(); j++, i++) { + flags.set(i, (f & (1 << j)) != 0); + } + } + } else { + for (int i = 0; i < flags.length() && i < l; i++) { + flags.set(i, din.readBoolean()); + } } for (int i = 0; i < s; i++) { @@ -132,7 +139,7 @@ public class MantleChunk { public void flag(MantleFlag flag, boolean f) { if (closed.get()) throw new IllegalStateException("Chunk is closed!"); - flags.set(flag.ordinal(), f ? 1 : 0); + flags.set(flag.ordinal(), f); } public void raiseFlag(MantleFlag flag, Runnable r) { @@ -144,7 +151,7 @@ public class MantleChunk { } public boolean isFlagged(MantleFlag flag) { - return flags.get(flag.ordinal()) == 1; + return flags.get(flag.ordinal()); } /** @@ -218,8 +225,13 @@ public class MantleChunk { dos.writeByte(sections.length()); Varint.writeUnsignedVarInt(flags.length(), dos); - for (int i = 0; i < flags.length(); i++) { - dos.writeBoolean(flags.get(i) == 1); + int count = Math.ceilDiv(flags.length(), Byte.SIZE); + for (int i = 0; i < count;) { + int f = 0; + for (int j = 0; j < Byte.SIZE && i < flags.length(); j++, i++) { + f |= flags.get(i) ? (1 << j) : 0; + } + dos.write(f); } var bytes = new ByteArrayOutputStream(8192); diff --git a/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java b/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java deleted file mode 100644 index 81c4a8504..000000000 --- a/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Iris is a World Generator for Minecraft Bukkit Servers - * Copyright (c) 2022 Arcane Arts (Volmit Software) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.volmit.iris.util.mantle; - -import com.volmit.iris.util.collection.StateList; - -public enum MantleFlag { - OBJECT, - UPDATE, - JIGSAW, - FEATURE, - INITIAL_SPAWNED, - REAL, - CARVED, - FLUID_BODIES, - INITIAL_SPAWNED_MARKER, - CLEANED, - PLANNED, - ETCHED, - TILE, - CUSTOM, - DISCOVERED, - CUSTOM_ACTIVE; - - static StateList getStateList() { - return new StateList(MantleFlag.values()); - } -} diff --git a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java index 101019023..9e343402b 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java @@ -48,7 +48,7 @@ import java.util.concurrent.atomic.AtomicReferenceArray; public class TectonicPlate { private static final ThreadLocal errors = ThreadLocal.withInitial(() -> false); public static final int MISSING = -1; - public static final int CURRENT = 0; + public static final int CURRENT = 1; private final int sectionHeight; private final AtomicReferenceArray chunks; diff --git a/core/src/main/java/com/volmit/iris/util/mantle/flag/CustomFlag.java b/core/src/main/java/com/volmit/iris/util/mantle/flag/CustomFlag.java new file mode 100644 index 000000000..5b239e1a1 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/mantle/flag/CustomFlag.java @@ -0,0 +1,28 @@ +package com.volmit.iris.util.mantle.flag; + +import org.jetbrains.annotations.NotNull; + +record CustomFlag(String name, int ordinal) implements MantleFlag { + + @Override + public @NotNull String toString() { + return name; + } + + @Override + public boolean isCustom() { + return false; + } + + @Override + public boolean equals(Object object) { + if (!(object instanceof CustomFlag that)) + return false; + return ordinal == that.ordinal; + } + + @Override + public int hashCode() { + return ordinal; + } +} diff --git a/core/src/main/java/com/volmit/iris/util/mantle/flag/MantleFlag.java b/core/src/main/java/com/volmit/iris/util/mantle/flag/MantleFlag.java new file mode 100644 index 000000000..4e5b86c25 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/mantle/flag/MantleFlag.java @@ -0,0 +1,57 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2022 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.mantle.flag; + +import org.jetbrains.annotations.Contract; + +public sealed interface MantleFlag permits CustomFlag, ReservedFlag { + int MIN_ORDINAL = 64; + int MAX_ORDINAL = 255; + + MantleFlag OBJECT = ReservedFlag.OBJECT; + MantleFlag UPDATE = ReservedFlag.UPDATE; + MantleFlag JIGSAW = ReservedFlag.JIGSAW; + MantleFlag FEATURE = ReservedFlag.FEATURE; + MantleFlag INITIAL_SPAWNED = ReservedFlag.INITIAL_SPAWNED; + MantleFlag REAL = ReservedFlag.REAL; + MantleFlag CARVED = ReservedFlag.CARVED; + MantleFlag FLUID_BODIES = ReservedFlag.FLUID_BODIES; + MantleFlag INITIAL_SPAWNED_MARKER = ReservedFlag.INITIAL_SPAWNED_MARKER; + MantleFlag CLEANED = ReservedFlag.CLEANED; + MantleFlag PLANNED = ReservedFlag.PLANNED; + MantleFlag ETCHED = ReservedFlag.ETCHED; + MantleFlag TILE = ReservedFlag.TILE; + MantleFlag CUSTOM = ReservedFlag.CUSTOM; + MantleFlag DISCOVERED = ReservedFlag.DISCOVERED; + MantleFlag CUSTOM_ACTIVE = ReservedFlag.CUSTOM_ACTIVE; + + int RESERVED_FLAGS = ReservedFlag.values().length; + + String name(); + int ordinal(); + + boolean isCustom(); + + @Contract(value = "_ -> new", pure = true) + static MantleFlag of(int ordinal) { + if (ordinal < MIN_ORDINAL || ordinal > MAX_ORDINAL) + throw new IllegalArgumentException("Ordinal must be between " + MIN_ORDINAL + " and " + MAX_ORDINAL); + return new CustomFlag("custom:"+ordinal, ordinal); + } +} diff --git a/core/src/main/java/com/volmit/iris/util/mantle/flag/MantleFlagAdapter.java b/core/src/main/java/com/volmit/iris/util/mantle/flag/MantleFlagAdapter.java new file mode 100644 index 000000000..12f889211 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/mantle/flag/MantleFlagAdapter.java @@ -0,0 +1,31 @@ +package com.volmit.iris.util.mantle.flag; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + +import java.io.IOException; + +public class MantleFlagAdapter extends TypeAdapter { + private static final String CUSTOM = "custom:"; + private static final int CUSTOM_LENGTH = CUSTOM.length(); + + @Override + public void write(JsonWriter out, MantleFlag value) throws IOException { + if (value == null) out.nullValue(); + else out.value(value.toString()); + } + + @Override + public MantleFlag read(JsonReader in) throws IOException { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + return null; + } + String s = in.nextString(); + if (s.startsWith(CUSTOM) && s.length() > CUSTOM_LENGTH) + return MantleFlag.of(Integer.parseInt(s.substring(CUSTOM_LENGTH))); + return ReservedFlag.valueOf(s); + } +} diff --git a/core/src/main/java/com/volmit/iris/util/mantle/flag/ReservedFlag.java b/core/src/main/java/com/volmit/iris/util/mantle/flag/ReservedFlag.java new file mode 100644 index 000000000..c6ea07b64 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/mantle/flag/ReservedFlag.java @@ -0,0 +1,25 @@ +package com.volmit.iris.util.mantle.flag; + +public enum ReservedFlag implements MantleFlag { + OBJECT, + UPDATE, + JIGSAW, + FEATURE, + INITIAL_SPAWNED, + REAL, + CARVED, + FLUID_BODIES, + INITIAL_SPAWNED_MARKER, + CLEANED, + PLANNED, + ETCHED, + TILE, + CUSTOM, + DISCOVERED, + CUSTOM_ACTIVE; + + @Override + public boolean isCustom() { + return false; + } +} diff --git a/core/src/main/java/com/volmit/iris/util/parallel/AtomicBooleanArray.java b/core/src/main/java/com/volmit/iris/util/parallel/AtomicBooleanArray.java new file mode 100644 index 000000000..e85bd40fb --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/parallel/AtomicBooleanArray.java @@ -0,0 +1,50 @@ +package com.volmit.iris.util.parallel; + +import java.io.Serializable; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; + +public class AtomicBooleanArray implements Serializable { + private static final VarHandle AA = MethodHandles.arrayElementVarHandle(boolean[].class); + private final boolean[] array; + + public AtomicBooleanArray(int length) { + array = new boolean[length]; + } + + public final int length() { + return array.length; + } + + public final boolean get(int index) { + return (boolean) AA.getVolatile(array, index); + } + + public final void set(int index, boolean newValue) { + AA.setVolatile(array, index, newValue); + } + + public final boolean compareAndSet(int index, boolean expectedValue, boolean newValue) { + return (boolean) AA.compareAndSet(array, index, expectedValue, newValue); + } + + public final boolean weakCompareAndSet(int index, boolean expectedValue, boolean newValue) { + return (boolean) AA.weakCompareAndSetPlain(array, index, expectedValue, newValue); + } + + @Override + public String toString() { + int iMax = array.length - 1; + if (iMax == -1) + return "[]"; + + StringBuilder b = new StringBuilder(); + b.append('['); + for (int i = 0; ; i++) { + b.append(get(i)); + if (i == iMax) + return b.append(']').toString(); + b.append(',').append(' '); + } + } +} diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/IrisChunkGenerator.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/IrisChunkGenerator.java index bebaf4f36..ab6208ae2 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/IrisChunkGenerator.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/IrisChunkGenerator.java @@ -11,7 +11,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/IrisChunkGenerator.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/IrisChunkGenerator.java index e2dae5081..abe671586 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/IrisChunkGenerator.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/IrisChunkGenerator.java @@ -11,7 +11,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/IrisChunkGenerator.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/IrisChunkGenerator.java index 957901b41..5587599e8 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/IrisChunkGenerator.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/IrisChunkGenerator.java @@ -11,10 +11,9 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; -import com.volmit.iris.util.scheduling.S; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -28,7 +27,6 @@ import net.minecraft.tags.StructureTags; import net.minecraft.tags.TagKey; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.item.EnderEyeItem; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.NoiseColumn; import net.minecraft.world.level.StructureManager; diff --git a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/IrisChunkGenerator.java b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/IrisChunkGenerator.java index 728638cc3..f8af4ad86 100644 --- a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/IrisChunkGenerator.java +++ b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/IrisChunkGenerator.java @@ -11,7 +11,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; diff --git a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/IrisChunkGenerator.java b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/IrisChunkGenerator.java index 046c6a283..b9d4dc4d5 100644 --- a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/IrisChunkGenerator.java +++ b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/IrisChunkGenerator.java @@ -11,7 +11,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; diff --git a/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/IrisChunkGenerator.java b/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/IrisChunkGenerator.java index a2d273393..4b6abd4c1 100644 --- a/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/IrisChunkGenerator.java +++ b/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/IrisChunkGenerator.java @@ -11,7 +11,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; diff --git a/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/IrisChunkGenerator.java b/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/IrisChunkGenerator.java index ef96101ac..a26bb67cc 100644 --- a/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/IrisChunkGenerator.java +++ b/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/IrisChunkGenerator.java @@ -11,7 +11,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.*; @@ -24,7 +24,6 @@ import net.minecraft.tags.StructureTags; import net.minecraft.tags.TagKey; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.item.EnderEyeItem; import net.minecraft.world.level.*; import net.minecraft.world.level.biome.*; import net.minecraft.world.level.chunk.ChunkAccess; @@ -33,7 +32,6 @@ import net.minecraft.world.level.chunk.ChunkGeneratorStructureState; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.RandomState; import net.minecraft.world.level.levelgen.blending.Blender; -import net.minecraft.world.level.levelgen.structure.BuiltinStructures; import net.minecraft.world.level.levelgen.structure.Structure; import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; diff --git a/nms/v1_21_R4/src/main/java/com/volmit/iris/core/nms/v1_21_R4/IrisChunkGenerator.java b/nms/v1_21_R4/src/main/java/com/volmit/iris/core/nms/v1_21_R4/IrisChunkGenerator.java index 28513cd77..11621ad98 100644 --- a/nms/v1_21_R4/src/main/java/com/volmit/iris/core/nms/v1_21_R4/IrisChunkGenerator.java +++ b/nms/v1_21_R4/src/main/java/com/volmit/iris/core/nms/v1_21_R4/IrisChunkGenerator.java @@ -11,7 +11,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.*; diff --git a/nms/v1_21_R5/src/main/java/com/volmit/iris/core/nms/v1_21_R5/IrisChunkGenerator.java b/nms/v1_21_R5/src/main/java/com/volmit/iris/core/nms/v1_21_R5/IrisChunkGenerator.java index c156c09df..740511f77 100644 --- a/nms/v1_21_R5/src/main/java/com/volmit/iris/core/nms/v1_21_R5/IrisChunkGenerator.java +++ b/nms/v1_21_R5/src/main/java/com/volmit/iris/core/nms/v1_21_R5/IrisChunkGenerator.java @@ -11,7 +11,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.mantle.flag.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.*;