From c537605880fc74c9123543209cc8d110e6bdaa1b Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 28 Dec 2025 20:53:51 -0700 Subject: [PATCH 01/47] rename MaterialSet --- .../terra/addons/flora/FloraTemplate.java | 6 +++--- .../addons/flora/flora/gen/TerraFlora.java | 6 +++--- .../pattern/BlockSetMatchPatternTemplate.java | 4 ++-- .../dfsek/terra/addons/ore/OreTemplate.java | 6 +++--- .../terra/addons/ore/ores/VanillaOre.java | 8 ++++---- .../addons/ore/ores/VanillaScatteredOre.java | 4 ++-- .../addons/ore/utils/VanillaOreUtils.java | 4 ++-- .../{MaterialSet.java => BlockStateSet.java} | 18 +++++++++--------- .../com/dfsek/terra/config/GenericLoaders.java | 4 ++-- .../config/loaders/MaterialSetLoader.java | 10 +++++----- 10 files changed, 35 insertions(+), 35 deletions(-) rename common/api/src/main/java/com/dfsek/terra/api/util/collection/{MaterialSet.java => BlockStateSet.java} (89%) diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java index 6be89444ec..0f94a9e82a 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraTemplate.java @@ -17,7 +17,7 @@ import com.dfsek.terra.addons.flora.flora.gen.BlockLayer; import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; @SuppressWarnings({ "FieldMayBeFinal", "unused" }) @@ -27,7 +27,7 @@ public class FloraTemplate implements AbstractableTemplate { private String id; @Value("rotatable") @Default - private @Meta MaterialSet rotatable = MaterialSet.empty(); + private @Meta BlockStateSet rotatable = BlockStateSet.empty(); @Value("physics") @Default @@ -63,7 +63,7 @@ public boolean isCeiling() { return ceiling; } - public MaterialSet getRotatable() { + public BlockStateSet getRotatable() { return rotatable; } } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java index 26c8fbd261..43128f137a 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java @@ -20,7 +20,7 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.properties.enums.Direction; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.WritableWorld; @@ -30,14 +30,14 @@ public class TerraFlora implements Structure { private final boolean physics; private final boolean ceiling; - private final MaterialSet testRotation; + private final BlockStateSet testRotation; private final Sampler distribution; private final String id; public TerraFlora(List layers, boolean physics, boolean ceiling, - MaterialSet testRotation, + BlockStateSet testRotation, Sampler distribution, String id) { this.physics = physics; this.testRotation = testRotation; diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java index 08116ae0c3..cf97dc5583 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java @@ -13,13 +13,13 @@ import com.dfsek.terra.addons.feature.locator.patterns.MatchPattern; import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; import com.dfsek.terra.api.util.range.Range; public class BlockSetMatchPatternTemplate implements ObjectTemplate { @Value("blocks") - private @Meta MaterialSet blocks; + private @Meta BlockStateSet blocks; @Value("offset") private @Meta Range offset; diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java index d10d03e026..82c16ba119 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreTemplate.java @@ -19,7 +19,7 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.AbstractableTemplate; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; @SuppressWarnings({ "unused", "FieldMayBeFinal" }) @@ -36,7 +36,7 @@ public class OreTemplate implements AbstractableTemplate { private @Meta Map<@Meta BlockType, @Meta BlockState> materials = new HashMap<>(); @Value("replace") - private @Meta MaterialSet replaceable; + private @Meta BlockStateSet replaceable; @Value("physics") @Default @@ -62,7 +62,7 @@ public BlockState getMaterial() { return material; } - public MaterialSet getReplaceable() { + public BlockStateSet getReplaceable() { return replaceable; } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java index a3f5b8d004..be19715295 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java @@ -20,7 +20,7 @@ import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; import com.dfsek.terra.api.world.WritableWorld; import static com.dfsek.terra.addons.ore.utils.VanillaOreUtils.shouldPlace; @@ -31,12 +31,12 @@ public class VanillaOre implements Structure { protected final BlockState material; protected final double size; - protected final MaterialSet replaceable; + protected final BlockStateSet replaceable; protected final boolean applyGravity; protected final double exposed; protected final Map materials; - public VanillaOre(BlockState material, double size, MaterialSet replaceable, boolean applyGravity, + public VanillaOre(BlockState material, double size, BlockStateSet replaceable, boolean applyGravity, double exposed, Map materials) { this.material = material; this.size = size; @@ -171,7 +171,7 @@ public BlockState getMaterial(BlockType replace) { return materials.getOrDefault(replace, material); } - public MaterialSet getReplaceable() { + public BlockStateSet getReplaceable() { return replaceable; } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java index 708450a35f..9f7e701684 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; import com.dfsek.terra.api.world.WritableWorld; import static com.dfsek.terra.addons.ore.utils.VanillaOreUtils.shouldPlace; @@ -17,7 +17,7 @@ public class VanillaScatteredOre extends VanillaOre { protected final int spread; - public VanillaScatteredOre(BlockState material, double size, MaterialSet replaceable, boolean applyGravity, double exposed, + public VanillaScatteredOre(BlockState material, double size, BlockStateSet replaceable, boolean applyGravity, double exposed, Map materials, int spread) { super(material, size, replaceable, applyGravity, exposed, materials); diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java index 4f892db376..993d808ef9 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java @@ -3,7 +3,7 @@ import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.BlockType; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; import com.dfsek.terra.api.world.WritableWorld; @@ -14,7 +14,7 @@ private static boolean shouldExpose(RandomGenerator random, double exposedChance return random.nextFloat() < exposedChance; } - public static boolean shouldPlace(MaterialSet replaceable, BlockType type, Double exposedChance, RandomGenerator random, + public static boolean shouldPlace(BlockStateSet replaceable, BlockType type, Double exposedChance, RandomGenerator random, WritableWorld world, int x, int y, int z) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/BlockStateSet.java similarity index 89% rename from common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java rename to common/api/src/main/java/com/dfsek/terra/api/util/collection/BlockStateSet.java index 7875535e6e..a23c6ea0f6 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/collection/BlockStateSet.java @@ -21,35 +21,35 @@ import com.dfsek.terra.api.block.state.BlockState; -public class MaterialSet extends HashSet { +public class BlockStateSet extends HashSet { @Serial private static final long serialVersionUID = 3056512763631017301L; - public static MaterialSet singleton(BlockType material) { + public static BlockStateSet singleton(BlockType material) { return new Singleton(material); } - public static MaterialSet get(BlockType... materials) { - MaterialSet set = new MaterialSet(); + public static BlockStateSet get(BlockType... materials) { + BlockStateSet set = new BlockStateSet(); set.addAll(Arrays.asList(materials)); return set; } - public static MaterialSet get(BlockState... materials) { - MaterialSet set = new MaterialSet(); + public static BlockStateSet get(BlockState... materials) { + BlockStateSet set = new BlockStateSet(); Arrays.stream(materials).forEach(set::add); return set; } - public static MaterialSet empty() { - return new MaterialSet(); + public static BlockStateSet empty() { + return new BlockStateSet(); } private void add(BlockState data) { add(data.getBlockType()); } - private static final class Singleton extends MaterialSet { + private static final class Singleton extends BlockStateSet { private final BlockType element; Singleton(BlockType e) { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index bdb243e71d..23500f90a7 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -29,7 +29,7 @@ import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.tectonic.LoaderRegistrar; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.config.loaders.ExpressionParserOptionsTemplate; @@ -53,7 +53,7 @@ public void register(TypeRegistry registry) { registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) .registerLoader(Range.class, new RangeLoader()) .registerLoader(Version.class, new VersionLoader()) - .registerLoader(MaterialSet.class, new MaterialSetLoader()) + .registerLoader(BlockStateSet.class, new MaterialSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()) .registerLoader(ParseOptions.class, ExpressionParserOptionsTemplate::new); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java index 8d2f0fb5f6..3cfe3fa533 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java @@ -27,21 +27,21 @@ import java.util.List; import com.dfsek.terra.api.block.BlockType; -import com.dfsek.terra.api.util.collection.MaterialSet; +import com.dfsek.terra.api.util.collection.BlockStateSet; @SuppressWarnings("unchecked") -public class MaterialSetLoader implements TypeLoader { +public class MaterialSetLoader implements TypeLoader { @Override - public MaterialSet load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) + public BlockStateSet load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { List stringData = (List) o; if(stringData.size() == 1) { - return MaterialSet.singleton(configLoader.loadType(BlockType.class, stringData.get(0), depthTracker)); + return BlockStateSet.singleton(configLoader.loadType(BlockType.class, stringData.get(0), depthTracker)); } - MaterialSet set = new MaterialSet(); + BlockStateSet set = new BlockStateSet(); for(String string : stringData) { try { From 9c64353111f49a8229654ac978945d677724da9e Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 28 Dec 2025 20:54:16 -0700 Subject: [PATCH 02/47] rename MaterialSetLoader --- .../src/main/java/com/dfsek/terra/config/GenericLoaders.java | 4 ++-- .../{MaterialSetLoader.java => BlockStateSetLoader.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/{MaterialSetLoader.java => BlockStateSetLoader.java} (96%) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index 23500f90a7..d1ec057351 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -34,7 +34,7 @@ import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.config.loaders.ExpressionParserOptionsTemplate; import com.dfsek.terra.config.loaders.LinkedHashMapLoader; -import com.dfsek.terra.config.loaders.MaterialSetLoader; +import com.dfsek.terra.config.loaders.BlockStateSetLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; import com.dfsek.terra.config.loaders.VersionLoader; @@ -53,7 +53,7 @@ public void register(TypeRegistry registry) { registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) .registerLoader(Range.class, new RangeLoader()) .registerLoader(Version.class, new VersionLoader()) - .registerLoader(BlockStateSet.class, new MaterialSetLoader()) + .registerLoader(BlockStateSet.class, new BlockStateSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()) .registerLoader(ParseOptions.class, ExpressionParserOptionsTemplate::new); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/BlockStateSetLoader.java similarity index 96% rename from common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java rename to common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/BlockStateSetLoader.java index 3cfe3fa533..aa2fc96036 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/BlockStateSetLoader.java @@ -31,7 +31,7 @@ @SuppressWarnings("unchecked") -public class MaterialSetLoader implements TypeLoader { +public class BlockStateSetLoader implements TypeLoader { @Override public BlockStateSet load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { From b851b2f8817f86a12ac4de784b0f402cc7e1557d Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 28 Dec 2025 22:03:03 -0700 Subject: [PATCH 03/47] start addon impl --- .../shortcut-blockstate-fallback/LICENSE | 21 +++++++++++ .../build.gradle.kts | 5 +++ .../BlockStateFallbackTemplate.java | 35 +++++++++++++++++++ .../blockstate/FallbackConfigType.java | 35 +++++++++++++++++++ .../ShortcutBlockStateFallbackAddon.java | 31 ++++++++++++++++ .../src/main/resources/terra.addon.yml | 12 +++++++ 6 files changed, 139 insertions(+) create mode 100644 common/addons/shortcut-blockstate-fallback/LICENSE create mode 100644 common/addons/shortcut-blockstate-fallback/build.gradle.kts create mode 100644 common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/BlockStateFallbackTemplate.java create mode 100644 common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/FallbackConfigType.java create mode 100644 common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java create mode 100644 common/addons/shortcut-blockstate-fallback/src/main/resources/terra.addon.yml diff --git a/common/addons/shortcut-blockstate-fallback/LICENSE b/common/addons/shortcut-blockstate-fallback/LICENSE new file mode 100644 index 0000000000..da43ecc81a --- /dev/null +++ b/common/addons/shortcut-blockstate-fallback/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2025 Polyhedral Development + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/common/addons/shortcut-blockstate-fallback/build.gradle.kts b/common/addons/shortcut-blockstate-fallback/build.gradle.kts new file mode 100644 index 0000000000..9d0aac37fb --- /dev/null +++ b/common/addons/shortcut-blockstate-fallback/build.gradle.kts @@ -0,0 +1,5 @@ +version = version("1.0.0") + +dependencies { + compileOnlyApi(project(":common:addons:manifest-addon-loader")) +} diff --git a/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/BlockStateFallbackTemplate.java b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/BlockStateFallbackTemplate.java new file mode 100644 index 0000000000..8a15d009c3 --- /dev/null +++ b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/BlockStateFallbackTemplate.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.addons.shortcut.blockstate; + +import com.dfsek.tectonic.api.config.template.annotations.Final; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.api.config.AbstractableTemplate; +import com.dfsek.terra.api.config.meta.Meta; + +import java.util.List; + + +public class BlockStateFallbackTemplate implements AbstractableTemplate { + @Value("id") + @Final + private String id; + + @Value("target") + private @Meta String target; + + @Value("alternatives") + private @Meta List<@Meta String> alternatives; + + @Override + public String getID() { + return id; + } + + public String getTarget() { + return target; + } + + public List getAlternatives() { + return alternatives; + } +} diff --git a/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/FallbackConfigType.java b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/FallbackConfigType.java new file mode 100644 index 0000000000..a2adbcb99a --- /dev/null +++ b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/FallbackConfigType.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.addons.shortcut.blockstate; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; + +import com.dfsek.tectonic.api.exception.LoadException; + +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.config.ConfigFactory; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.config.ConfigType; +import com.dfsek.terra.api.util.reflection.TypeKey; + + +public class FallbackConfigType implements ConfigType, ConfigFactory { + @Override + public BlockStateFallbackTemplate getTemplate(ConfigPack pack, Platform platform) { + return null; + } + + @Override + public ConfigFactory getFactory() { + return this; + } + + @Override + public TypeKey getTypeKey() { + return null; + } + + @Override + public BlockState build(BlockStateFallbackTemplate config, Platform platform) throws LoadException { + return null; + } +} diff --git a/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java new file mode 100644 index 0000000000..fac98e382e --- /dev/null +++ b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.addons.shortcut.blockstate; + +import com.dfsek.terra.addons.manifest.api.AddonInitializer; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.event.functional.FunctionalEventHandler; +import com.dfsek.terra.api.inject.annotations.Inject; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class ShortcutBlockStateFallbackAddon implements AddonInitializer { + @Inject + private BaseAddon addon; + @Inject + private Platform platform; + + @Override + public void initialize() { + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(addon, ConfigPackPreLoadEvent.class) + .then(event -> event.getPack() + .registerShortcut(Palette.class, "FALLBACK", + (configLoader, input, tracker) -> new SingletonPalette( + configLoader.loadType(BlockState.class, input, tracker)))) + .failThrough(); + + } +} diff --git a/common/addons/shortcut-blockstate-fallback/src/main/resources/terra.addon.yml b/common/addons/shortcut-blockstate-fallback/src/main/resources/terra.addon.yml new file mode 100644 index 0000000000..c7c92d787b --- /dev/null +++ b/common/addons/shortcut-blockstate-fallback/src/main/resources/terra.addon.yml @@ -0,0 +1,12 @@ +schema-version: 1 +contributors: + - Terra contributors +id: shortcut-blockstate-fallback +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.shortcut.blockstate.ShortcutBlockstateFallbackAddon" +website: + issues: https://github.com/PolyhedralDev/Terra/issues + source: https://github.com/PolyhedralDev/Terra + docs: https://terra.polydev.org +license: MIT License \ No newline at end of file From 4f672dfb7b56df7ded1c13fb1fa4198aac0377ff Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 28 Dec 2025 22:27:08 -0700 Subject: [PATCH 04/47] make either not bad --- .../ShortcutBlockStateFallbackAddon.java | 5 +- .../api/util/function/FunctionUtils.java | 17 +++ .../terra/api/util/generic/either/Either.java | 144 +++++++++++------- 3 files changed, 104 insertions(+), 62 deletions(-) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java diff --git a/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java index fac98e382e..25d176b059 100644 --- a/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java +++ b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java @@ -21,10 +21,7 @@ public void initialize() { platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) - .then(event -> event.getPack() - .registerShortcut(Palette.class, "FALLBACK", - (configLoader, input, tracker) -> new SingletonPalette( - configLoader.loadType(BlockState.class, input, tracker)))) + .failThrough(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java new file mode 100644 index 0000000000..22466a196f --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.api.util.function; + +import java.util.function.Consumer; +import java.util.function.Function; + + +public final class FunctionUtils { + private FunctionUtils() {} + + public static Function lift(Consumer c) { + return co -> { + c.accept(co); + return co; + }; + } + +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java index 7b05d1afbb..3fce7ce21b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java @@ -7,81 +7,109 @@ package com.dfsek.terra.api.util.generic.either; +import com.dfsek.terra.api.util.function.FunctionUtils; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; +import java.util.function.Function; -public final class Either { - private final L left; - private final R right; - private final boolean leftPresent; - - private Either(L left, R right, boolean leftPresent) { - this.left = left; - this.right = right; - this.leftPresent = leftPresent; +public interface Either { + default Either ifLeft(Consumer action) { + return mapLeft(FunctionUtils.lift(action)); } - - @NotNull - @Contract("_ -> new") - public static Either left(L1 left) { - return new Either<>(Objects.requireNonNull(left), null, true); + default Either ifRight(Consumer action) { + return mapRight(FunctionUtils.lift(action)); } - @NotNull - @Contract("_ -> new") - public static Either right(R1 right) { - return new Either<>(null, Objects.requireNonNull(right), false); - } - - @NotNull - @Contract("_ -> this") - public Either ifLeft(Consumer action) { - if(leftPresent) action.accept(left); - return this; - } + Either mapLeft(Function f); + Either mapRight(Function f); - @NotNull - @Contract("_ -> this") - public Either ifRight(Consumer action) { - if(!leftPresent) action.accept(right); - return this; - } + Optional getLeft(); + Optional getRight(); + boolean isLeft(); + boolean isRight(); + @SuppressWarnings({ "rawtypes", "unchecked" }) @NotNull - public Optional getLeft() { - if(leftPresent) return Optional.of(left); - return Optional.empty(); + @Contract("_ -> new") + static Either left(L1 left) { + return new Left(Objects.requireNonNull(left)); } + @SuppressWarnings({ "rawtypes", "unchecked" }) @NotNull - public Optional getRight() { - if(!leftPresent) return Optional.of(right); - return Optional.empty(); - } - - public boolean hasLeft() { - return leftPresent; - } - - public boolean hasRight() { - return !leftPresent; + @Contract("_ -> new") + static Either right(R1 right) { + return new Right(Objects.requireNonNull(right)); } - - @Override - public int hashCode() { - return Objects.hash(left, right); + record Left(T value) implements Either { + + @Override + public Either mapLeft(Function f) { + return new Left<>(f.apply(value)); + } + + @SuppressWarnings({ "unchecked" }) + @Override + public Either mapRight(Function f) { + return (Either) this; + } + + @Override + public Optional getLeft() { + return Optional.of(value); + } + + @Override + public Optional getRight() { + return Optional.empty(); + } + + @Override + public boolean isLeft() { + return true; + } + + @Override + public boolean isRight() { + return false; + } } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof Either that)) return false; - - return (this.leftPresent && that.leftPresent && Objects.equals(this.left, that.left)) - || (!this.leftPresent && !that.leftPresent && Objects.equals(this.right, that.right)); + record Right(T value) implements Either { + @SuppressWarnings({ "unchecked" }) + @Override + public Either mapLeft(Function f) { + return (Either) this; + } + + @Override + public Either mapRight(Function f) { + return new Right<>(f.apply(value)); + } + + @Override + public Optional getLeft() { + return Optional.empty(); + } + + @Override + public Optional getRight() { + return Optional.of(value); + } + + @Override + public boolean isLeft() { + return false; + } + + @Override + public boolean isRight() { + return true; + } } -} +} \ No newline at end of file From ef088dd3f7ece0e18d90462b641963035a9ef3bf Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 28 Dec 2025 23:59:46 -0700 Subject: [PATCH 05/47] add basic functional types again --- .../terra/api/util/function/FunctionUtils.java | 8 ++++++++ .../dfsek/terra/api/util/generic/Functor.java | 8 ++++++++ .../com/dfsek/terra/api/util/generic/Maybe.java | 10 ++++++++++ .../com/dfsek/terra/api/util/generic/Monad.java | 17 +++++++++++++++++ .../dfsek/terra/api/util/generic/Monoid.java | 8 ++++++++ .../dfsek/terra/api/util/generic/Semigroup.java | 5 +++++ 6 files changed, 56 insertions(+) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 22466a196f..5d47a73a11 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -1,5 +1,8 @@ package com.dfsek.terra.api.util.function; +import com.dfsek.terra.api.util.generic.either.Either; + +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; @@ -14,4 +17,9 @@ public static Function lift(Consumer c) { }; } + @SuppressWarnings("unchecked") + public static Either toEither(Optional o, L de) { + return (Either) o.map(Either::right).orElseGet(() -> Either.left(de)); + } + } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java new file mode 100644 index 0000000000..4e3cb27bfa --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.util.generic; + +import java.util.function.Function; + + +public interface Functor> { + Functor map(Function map); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java new file mode 100644 index 0000000000..61da298609 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.util.generic; + +import java.util.Optional; + + +public interface Maybe { + default Optional toOptional() { + + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java new file mode 100644 index 0000000000..fab00529a6 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.api.util.generic; + +import java.util.function.Function; + + +/** + * A monad is a monoid in the category of endofunctors. + */ +public interface Monad> extends Functor, Monoid { + Monad bind(Function> map); + Monad pure(T2 t); + + @Override + default Monad map(Function map) { + return bind(m -> pure(map.apply(m))); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java new file mode 100644 index 0000000000..cee923ded1 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.util.generic; + +public interface Monoid> extends Semigroup{ + Monoid pure(T1 t); + + @Override + Monoid multiply(M t); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java new file mode 100644 index 0000000000..19acd04650 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.util.generic; + +public interface Semigroup> { + Semigroup multiply(S t); +} From f684c60039d1f0a520088ccda2cde3c80f0b0d71 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 16:02:18 -0700 Subject: [PATCH 06/47] experimenting with kinds and higher order types, not done yet --- .../terra/api/util/generic/Applicative.java | 10 ++++++++++ .../dfsek/terra/api/util/generic/Functor.java | 4 ++-- .../com/dfsek/terra/api/util/generic/K.java | 11 ++++++++++ .../dfsek/terra/api/util/generic/Maybe.java | 19 +++++++++++++++++- .../dfsek/terra/api/util/generic/Monad.java | 20 +++++++++++++++---- .../dfsek/terra/api/util/generic/Monoid.java | 4 ++-- .../terra/api/util/generic/Semigroup.java | 2 +- 7 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java new file mode 100644 index 0000000000..20b1ac7205 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.util.generic; + +import java.util.function.Function; + + +public interface Applicative> extends Functor { + > Applicative pure(U t); + + > Applicative apply(K> amap); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java index 4e3cb27bfa..ca67b235c7 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java @@ -3,6 +3,6 @@ import java.util.function.Function; -public interface Functor> { - Functor map(Function map); +public interface Functor { + Functor map(Function map); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java new file mode 100644 index 0000000000..23a621813c --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.util.generic; + +/** + * Kind + */ +public interface K { + @SuppressWarnings("unchecked") + default T self() { + return (T) this; + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java index 61da298609..5b2b54c80c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java @@ -1,10 +1,27 @@ package com.dfsek.terra.api.util.generic; import java.util.Optional; +import java.util.function.Function; -public interface Maybe { +public interface Maybe extends Monad> { + @Override + Maybe bind(Function>> map); + + @Override + Maybe identity(); + + @Override + Maybe map(Function map); + + @Override + Monad> multiply(Maybe t); + default Optional toOptional() { } + + record Just(T value) implements Maybe { + + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java index fab00529a6..829c7cf30f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java @@ -6,12 +6,24 @@ /** * A monad is a monoid in the category of endofunctors. */ -public interface Monad> extends Functor, Monoid { - Monad bind(Function> map); - Monad pure(T2 t); +public interface Monad> extends Applicative, Monoid{ + > Monad bind(Function> map); + @Override + > Monad identity(); + + @Override + > Monad pure(U t); + + @Override + Monad multiply(M t); @Override - default Monad map(Function map) { + default > Monad map(Function map) { return bind(m -> pure(map.apply(m))); } + + @Override + default > Monad apply(K> amap) { + amap.self() + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java index cee923ded1..e92727064b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.util.generic; -public interface Monoid> extends Semigroup{ - Monoid pure(T1 t); +public interface Monoid> extends Semigroup{ + > Monoid identity(); @Override Monoid multiply(M t); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java index 19acd04650..56748b937b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java @@ -1,5 +1,5 @@ package com.dfsek.terra.api.util.generic; -public interface Semigroup> { +public interface Semigroup> { Semigroup multiply(S t); } From 3777fda64142a32714acfe6edd8a59e22885c510 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 16:07:36 -0700 Subject: [PATCH 07/47] Add 2-argument higher-order type and move kinds to their own package I don't think that we will have higher-order types with more than 2 parameters, so I only made K and K2 --- .../java/com/dfsek/terra/api/util/generic/Applicative.java | 2 ++ .../main/java/com/dfsek/terra/api/util/generic/Monad.java | 2 ++ .../main/java/com/dfsek/terra/api/util/generic/Monoid.java | 3 +++ .../java/com/dfsek/terra/api/util/generic/Semigroup.java | 3 +++ .../com/dfsek/terra/api/util/generic/{ => kinds}/K.java | 2 +- .../java/com/dfsek/terra/api/util/generic/kinds/K2.java | 7 +++++++ 6 files changed, 18 insertions(+), 1 deletion(-) rename common/api/src/main/java/com/dfsek/terra/api/util/generic/{ => kinds}/K.java (73%) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K2.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java index 20b1ac7205..0a9a2e6022 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.util.generic; +import com.dfsek.terra.api.util.generic.kinds.K; + import java.util.function.Function; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java index 829c7cf30f..c1429c69fb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.util.generic; +import com.dfsek.terra.api.util.generic.kinds.K; + import java.util.function.Function; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java index e92727064b..36d0a82777 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java @@ -1,5 +1,8 @@ package com.dfsek.terra.api.util.generic; +import com.dfsek.terra.api.util.generic.kinds.K; + + public interface Monoid> extends Semigroup{ > Monoid identity(); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java index 56748b937b..a3e089316e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java @@ -1,5 +1,8 @@ package com.dfsek.terra.api.util.generic; +import com.dfsek.terra.api.util.generic.kinds.K; + + public interface Semigroup> { Semigroup multiply(S t); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java similarity index 73% rename from common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java index 23a621813c..f770931c81 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/K.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.util.generic; +package com.dfsek.terra.api.util.generic.kinds; /** * Kind diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K2.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K2.java new file mode 100644 index 0000000000..9de538f303 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K2.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.util.generic.kinds; + +/** + * Kind of the type T + */ +public interface K2 { +} From e5d30183ef6b756cbdda5403fc6e51c2f05c78ba Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 16:57:29 -0700 Subject: [PATCH 08/47] fix functional utils --- .../addons/commands/locate/BiomeLocator.java | 2 +- .../commands/locate/LocateCommandAddon.java | 2 +- .../api/util/function/FunctionUtils.java | 2 +- .../terra/api/util/generic/Applicative.java | 12 ------- .../dfsek/terra/api/util/generic/Functor.java | 8 ----- .../dfsek/terra/api/util/generic/Monad.java | 31 ------------------- .../dfsek/terra/api/util/generic/Monoid.java | 11 ------- .../terra/api/util/generic/Semigroup.java | 8 ----- .../terra/api/util/generic/control/Monad.java | 26 ++++++++++++++++ .../terra/api/util/generic/data/Functor.java | 10 ++++++ .../terra/api/util/generic/data/Monoid.java | 11 +++++++ .../api/util/generic/data/Semigroup.java | 8 +++++ .../{either => data/types}/Either.java | 2 +- .../util/generic/{ => data/types}/Maybe.java | 4 ++- .../dfsek/terra/api/util/generic/kinds/K.java | 2 +- 15 files changed, 63 insertions(+), 76 deletions(-) delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java rename common/api/src/main/java/com/dfsek/terra/api/util/generic/{either => data/types}/Either.java (98%) rename common/api/src/main/java/com/dfsek/terra/api/util/generic/{ => data/types}/Maybe.java (81%) diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java index d29e7d86ce..1799f0fc10 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java @@ -2,7 +2,7 @@ import com.dfsek.seismic.type.vector.Vector2Int; import com.dfsek.seismic.type.vector.Vector3Int; -import com.dfsek.terra.api.util.generic.either.Either; +import com.dfsek.terra.api.util.generic.data.types.Either; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java index 159b12957f..3d6d863587 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java @@ -21,7 +21,7 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.util.generic.either.Either; +import com.dfsek.terra.api.util.generic.data.types.Either; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 5d47a73a11..3e25463d01 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.util.function; -import com.dfsek.terra.api.util.generic.either.Either; +import com.dfsek.terra.api.util.generic.data.types.Either; import java.util.Optional; import java.util.function.Consumer; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java deleted file mode 100644 index 0a9a2e6022..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Applicative.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import com.dfsek.terra.api.util.generic.kinds.K; - -import java.util.function.Function; - - -public interface Applicative> extends Functor { - > Applicative pure(U t); - - > Applicative apply(K> amap); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java deleted file mode 100644 index ca67b235c7..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Functor.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import java.util.function.Function; - - -public interface Functor { - Functor map(Function map); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java deleted file mode 100644 index c1429c69fb..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monad.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import com.dfsek.terra.api.util.generic.kinds.K; - -import java.util.function.Function; - - -/** - * A monad is a monoid in the category of endofunctors. - */ -public interface Monad> extends Applicative, Monoid{ - > Monad bind(Function> map); - @Override - > Monad identity(); - - @Override - > Monad pure(U t); - - @Override - Monad multiply(M t); - - @Override - default > Monad map(Function map) { - return bind(m -> pure(map.apply(m))); - } - - @Override - default > Monad apply(K> amap) { - amap.self() - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java deleted file mode 100644 index 36d0a82777..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Monoid.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import com.dfsek.terra.api.util.generic.kinds.K; - - -public interface Monoid> extends Semigroup{ - > Monoid identity(); - - @Override - Monoid multiply(M t); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java deleted file mode 100644 index a3e089316e..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Semigroup.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.util.generic; - -import com.dfsek.terra.api.util.generic.kinds.K; - - -public interface Semigroup> { - Semigroup multiply(S t); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java new file mode 100644 index 0000000000..dda469b546 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.util.generic.control; + +import com.dfsek.terra.api.util.generic.data.Functor; +import com.dfsek.terra.api.util.generic.kinds.K; + +import java.util.function.Function; + + +/** + * A monad is a monoid in the category of endofunctors. + */ +public interface Monad> extends Functor, K { + > Monad bind(Function> map); + + > Monad pure(T1 t); + + @Override + default Monad map(Function map) { + return bind(map.andThen(this::pure)); + } + + // almost all well-known applicative functors are also monads, so we can just put that here. + default Monad apply(Monad, M> amap) { + return amap.bind(this::map); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java new file mode 100644 index 0000000000..452f1ea85b --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.util.generic.data; + +import com.dfsek.terra.api.util.generic.kinds.K; + +import java.util.function.Function; + + +public interface Functor> extends K { + Functor map(Function map); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java new file mode 100644 index 0000000000..7725067b8d --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.util.generic.data; + +import com.dfsek.terra.api.util.generic.kinds.K; + + +public interface Monoid> extends Semigroup, K{ + > Monoid identity(); + + @Override + Monoid multiply(M t); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java new file mode 100644 index 0000000000..26ec7f36f1 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.util.generic.data; + +import com.dfsek.terra.api.util.generic.kinds.K; + + +public interface Semigroup> extends K { + Semigroup multiply(S t); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java similarity index 98% rename from common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 3fce7ce21b..95a44e31ac 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -5,7 +5,7 @@ * reference the LICENSE file in the common/api directory. */ -package com.dfsek.terra.api.util.generic.either; +package com.dfsek.terra.api.util.generic.data.types; import com.dfsek.terra.api.util.function.FunctionUtils; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java similarity index 81% rename from common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 5b2b54c80c..a639e34d1f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -1,4 +1,6 @@ -package com.dfsek.terra.api.util.generic; +package com.dfsek.terra.api.util.generic.data.types; + +import com.dfsek.terra.api.util.generic.control.Monad; import java.util.Optional; import java.util.function.Function; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java index f770931c81..7b89b0e1f9 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.util.generic.kinds; /** - * Kind + * Kind of the type T */ public interface K { @SuppressWarnings("unchecked") From 8bfff6b0101c87edfd3f70d78e29db765cfb2068 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 16:58:37 -0700 Subject: [PATCH 09/47] redo maybe --- .../api/util/generic/data/types/Maybe.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index a639e34d1f..5973ef04c9 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -6,24 +6,22 @@ import java.util.function.Function; -public interface Maybe extends Monad> { - @Override - Maybe bind(Function>> map); +public interface Maybe{ - @Override - Maybe identity(); + Optional toOptional(); - @Override - Maybe map(Function map); - - @Override - Monad> multiply(Maybe t); - - default Optional toOptional() { + record Just(T value) implements Maybe { + @Override + public Optional toOptional() { + return Optional.of(value); + } } + record Nothing() implements Maybe { - record Just(T value) implements Maybe { - + @Override + public Optional toOptional() { + return Optional.empty(); + } } } From f03f39f1d7d245ade29bb8c0876c8a0b9e92f11b Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 17:05:18 -0700 Subject: [PATCH 10/47] implement Monad (Maybe a) --- .../terra/api/util/generic/control/Monad.java | 4 +-- .../api/util/generic/data/types/Maybe.java | 27 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java index dda469b546..29ae017c0a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java @@ -10,9 +10,9 @@ * A monad is a monoid in the category of endofunctors. */ public interface Monad> extends Functor, K { - > Monad bind(Function> map); + Monad bind(Function> map); - > Monad pure(T1 t); + Monad pure(T1 t); @Override default Monad map(Function map) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 5973ef04c9..5bce277fec 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -6,19 +6,44 @@ import java.util.function.Function; -public interface Maybe{ +public interface Maybe extends Monad> { + @Override + default Maybe pure(T1 t) { + return just(t); + } + + @Override + Maybe bind(Function>> map); Optional toOptional(); + static Maybe just(T1 t) { + return new Just<>(t); + } + + static Maybe nothing() { + return new Nothing<>(); + } + record Just(T value) implements Maybe { @Override public Optional toOptional() { return Optional.of(value); } + + @Override + public Maybe bind(Function>> map) { + return (Maybe) map.apply(value); + } } record Nothing() implements Maybe { + @Override + public Maybe bind(Function>> map) { + return nothing(); + } + @Override public Optional toOptional() { return Optional.empty(); From 292be6bceca98d7b15c09229ed680f7fab750f05 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 17:08:40 -0700 Subject: [PATCH 11/47] add bifunctor --- .../terra/api/util/generic/data/BiFunctor.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java new file mode 100644 index 0000000000..7ec3411eb3 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.util.generic.data; + +import java.util.function.Function; + + +public interface BiFunctor> extends Functor { + @Override + default BiFunctor map(Function map) { + return mapLeft(map); + } + + BiFunctor mapLeft(Function map); + BiFunctor mapRight(Function map); +} From 87e437f889b808342b1aa49864295800b980bdfd Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 18:06:16 -0700 Subject: [PATCH 12/47] finish either --- .../api/util/function/FunctionUtils.java | 10 ++ .../api/util/generic/data/BiFunctor.java | 7 +- .../api/util/generic/data/types/Either.java | 170 +++++++++++------- 3 files changed, 115 insertions(+), 72 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 3e25463d01..4813418eee 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -22,4 +22,14 @@ public static Either toEither(Optional o, L de) { return (Either) o.map(Either::right).orElseGet(() -> Either.left(de)); } + public static Function> liftTry(Function f) { + return s -> { + try { + return Either.right(f.apply(s)); + } catch(Exception e) { + return Either.left(e); + } + }; + } + } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java index 7ec3411eb3..05daf80a26 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java @@ -3,12 +3,7 @@ import java.util.function.Function; -public interface BiFunctor> extends Functor { - @Override - default BiFunctor map(Function map) { - return mapLeft(map); - } - +public interface BiFunctor> { BiFunctor mapLeft(Function map); BiFunctor mapRight(Function map); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 95a44e31ac..7c47f35162 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -9,6 +9,10 @@ import com.dfsek.terra.api.util.function.FunctionUtils; +import com.dfsek.terra.api.util.generic.control.Monad; + +import com.dfsek.terra.api.util.generic.data.BiFunctor; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -18,26 +22,87 @@ import java.util.function.Function; -public interface Either { +public interface Either extends Monad>, BiFunctor> { default Either ifLeft(Consumer action) { return mapLeft(FunctionUtils.lift(action)); } + default Either ifRight(Consumer action) { return mapRight(FunctionUtils.lift(action)); } + // Either is a functor in its right parameter. + @Override + default Either map(Function map) { + return mapRight(map); + } + + @Override + default Either pure(T1 t) { + return right(t); + } + + @Override + Either bind(Function>> map); + + @Override Either mapLeft(Function f); + + @Override Either mapRight(Function f); Optional getLeft(); + Optional getRight(); + boolean isLeft(); + boolean isRight(); - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({ "unchecked" }) @NotNull @Contract("_ -> new") static Either left(L1 left) { + record Left(T value) implements Either { + + @Override + @SuppressWarnings("unchecked") + public Either bind(Function>> map) { + return (Either) this; + } + + @Override + public Either mapLeft(Function f) { + return new Left<>(f.apply(value)); + } + + @SuppressWarnings({ "unchecked" }) + @Override + public Either mapRight(Function f) { + return (Either) this; + } + + @Override + public Optional getLeft() { + return Optional.of(value); + } + + @Override + public Optional getRight() { + return Optional.empty(); + } + + @Override + public boolean isLeft() { + return true; + } + + @Override + public boolean isRight() { + return false; + } + } + return new Left(Objects.requireNonNull(left)); } @@ -45,71 +110,44 @@ static Either left(L1 left) { @NotNull @Contract("_ -> new") static Either right(R1 right) { - return new Right(Objects.requireNonNull(right)); - } - record Left(T value) implements Either { - - @Override - public Either mapLeft(Function f) { - return new Left<>(f.apply(value)); - } - - @SuppressWarnings({ "unchecked" }) - @Override - public Either mapRight(Function f) { - return (Either) this; - } - - @Override - public Optional getLeft() { - return Optional.of(value); - } - - @Override - public Optional getRight() { - return Optional.empty(); - } - - @Override - public boolean isLeft() { - return true; - } - - @Override - public boolean isRight() { - return false; + record Right(T value) implements Either { + @Override + public Either bind(Function>> map) { + return (Either) map.apply(value); + } + + @SuppressWarnings({ "unchecked" }) + @Override + public Either mapLeft(Function f) { + return (Either) this; + } + + @Override + public Either mapRight(Function f) { + return new Right<>(f.apply(value)); + } + + @Override + public Optional getLeft() { + return Optional.empty(); + } + + @Override + public Optional getRight() { + return Optional.of(value); + } + + @Override + public boolean isLeft() { + return false; + } + + @Override + public boolean isRight() { + return true; + } } + return new Right(Objects.requireNonNull(right)); } - record Right(T value) implements Either { - @SuppressWarnings({ "unchecked" }) - @Override - public Either mapLeft(Function f) { - return (Either) this; - } - @Override - public Either mapRight(Function f) { - return new Right<>(f.apply(value)); - } - - @Override - public Optional getLeft() { - return Optional.empty(); - } - - @Override - public Optional getRight() { - return Optional.of(value); - } - - @Override - public boolean isLeft() { - return false; - } - - @Override - public boolean isRight() { - return true; - } - } } \ No newline at end of file From 7d3382e623b04095ffce918d65c3698d82503227 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 18:18:14 -0700 Subject: [PATCH 13/47] more either stuff --- .../api/util/generic/data/BiFunctor.java | 4 ++ .../api/util/generic/data/types/Either.java | 62 +++++++++++++------ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java index 05daf80a26..537b9aca2d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java @@ -6,4 +6,8 @@ public interface BiFunctor> { BiFunctor mapLeft(Function map); BiFunctor mapRight(Function map); + + default BiFunctor bimap(Function left, Function right) { + return mapLeft(left).mapRight(right); + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 7c47f35162..4e01be3b85 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -59,36 +59,40 @@ default Either pure(T1 t) { boolean isRight(); + Either flip(); + + U collect(Function left, Function right); + @SuppressWarnings({ "unchecked" }) @NotNull @Contract("_ -> new") static Either left(L1 left) { - record Left(T value) implements Either { + record Left(L value) implements Either { @Override @SuppressWarnings("unchecked") - public Either bind(Function>> map) { - return (Either) this; + public Either bind(Function>> map) { + return (Either) this; } @Override - public Either mapLeft(Function f) { + public Either mapLeft(Function f) { return new Left<>(f.apply(value)); } @SuppressWarnings({ "unchecked" }) @Override - public Either mapRight(Function f) { - return (Either) this; + public Either mapRight(Function f) { + return (Either) this; } @Override - public Optional getLeft() { + public Optional getLeft() { return Optional.of(value); } @Override - public Optional getRight() { + public Optional getRight() { return Optional.empty(); } @@ -101,39 +105,49 @@ public boolean isLeft() { public boolean isRight() { return false; } + + @Override + public Either flip() { + return right(value); + } + + @Override + public U collect(Function left, Function right) { + return left.apply(value); + } } - return new Left(Objects.requireNonNull(left)); + return new Left<>(Objects.requireNonNull(left)); } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"unchecked" }) @NotNull @Contract("_ -> new") static Either right(R1 right) { - record Right(T value) implements Either { + record Right(R value) implements Either { @Override - public Either bind(Function>> map) { - return (Either) map.apply(value); + public Either bind(Function>> map) { + return (Either) map.apply(value); } @SuppressWarnings({ "unchecked" }) @Override - public Either mapLeft(Function f) { - return (Either) this; + public Either mapLeft(Function f) { + return (Either) this; } @Override - public Either mapRight(Function f) { + public Either mapRight(Function f) { return new Right<>(f.apply(value)); } @Override - public Optional getLeft() { + public Optional getLeft() { return Optional.empty(); } @Override - public Optional getRight() { + public Optional getRight() { return Optional.of(value); } @@ -146,8 +160,18 @@ public boolean isLeft() { public boolean isRight() { return true; } + + @Override + public Either flip() { + return left(value); + } + + @Override + public U collect(Function left, Function right) { + return right.apply(value); + } } - return new Right(Objects.requireNonNull(right)); + return new Right<>(Objects.requireNonNull(right)); } } \ No newline at end of file From d52cd0d7cf442fef00d80ce230ec24cac13e1524 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 18:23:42 -0700 Subject: [PATCH 14/47] finish maybe --- .../api/util/generic/data/types/Maybe.java | 71 +++++++++++++------ 1 file changed, 51 insertions(+), 20 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 5bce277fec..4144ff96cf 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.Supplier; public interface Maybe extends Monad> { @@ -17,36 +18,66 @@ default Maybe pure(T1 t) { Optional toOptional(); - static Maybe just(T1 t) { - return new Just<>(t); + Either toEither(L l); + T get(Supplier def); + + default T get(T def) { + return get(() -> def); } - static Maybe nothing() { - return new Nothing<>(); + default Maybe overwrite(Maybe m) { + return bind(ignore -> m); } - record Just(T value) implements Maybe { + static Maybe just(T1 t) { + record Just(T value) implements Maybe { + + @Override + public Optional toOptional() { + return Optional.of(value); + } - @Override - public Optional toOptional() { - return Optional.of(value); - } + @Override + public Either toEither(L l) { + return Either.right(value); + } - @Override - public Maybe bind(Function>> map) { - return (Maybe) map.apply(value); + @Override + public T get(Supplier def) { + return value; + } + + @Override + public Maybe bind(Function>> map) { + return (Maybe) map.apply(value); + } } + return new Just<>(t); } - record Nothing() implements Maybe { - @Override - public Maybe bind(Function>> map) { - return nothing(); - } + static Maybe nothing() { + record Nothing() implements Maybe { - @Override - public Optional toOptional() { - return Optional.empty(); + @Override + public Maybe bind(Function>> map) { + return nothing(); + } + + @Override + public Optional toOptional() { + return Optional.empty(); + } + + @Override + public Either toEither(L l) { + return Either.left(l); + } + + @Override + public T get(Supplier def) { + return def.get(); + } } + return new Nothing<>(); } } From 16705057e0a897aa40a375cc44669a30a77a45b5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 18:59:57 -0700 Subject: [PATCH 15/47] update most things to use new maybe and either --- .../extrusion/BiomeExtrusionProvider.java | 5 +- .../biome/image/ImageBiomeProvider.java | 5 +- .../biome/pipeline/PipelineBiomeProvider.java | 7 +- .../biome/single/SingleBiomeProvider.java | 13 +- .../interpolation/ElevationInterpolator.java | 2 +- .../addons/commands/locate/BiomeLocator.java | 116 +++++++++--------- .../commands/locate/LocateCommandAddon.java | 31 ++--- .../api/util/function/FunctionUtils.java | 4 + .../api/util/generic/data/types/Maybe.java | 56 +++++++++ .../world/biome/generation/BiomeProvider.java | 7 +- .../generation/CachingBiomeProvider.java | 12 +- 11 files changed, 161 insertions(+), 97 deletions(-) diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionProvider.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionProvider.java index df9bc1a941..c0bd350b90 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionProvider.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionProvider.java @@ -9,6 +9,7 @@ import com.dfsek.terra.addons.biome.extrusion.utils.ExtrusionPipeline; import com.dfsek.terra.addons.biome.extrusion.utils.ExtrusionPipelineFactory; import com.dfsek.terra.api.util.Column; +import com.dfsek.terra.api.util.generic.data.types.Maybe; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -39,11 +40,11 @@ public Biome getBiome(int x, int y, int z, long seed) { public Column getColumn(int x, int z, long seed, int min, int max) { return delegate.getBaseBiome(x, z, seed) .map(base -> (Column) new BaseBiomeColumn(this, base, min, max, x, z, seed)) - .orElseGet(() -> BiomeProvider.super.getColumn(x, z, seed, min, max)); + .get(() -> BiomeProvider.super.getColumn(x, z, seed, min, max)); } @Override - public Optional getBaseBiome(int x, int z, long seed) { + public Maybe getBaseBiome(int x, int z, long seed) { return delegate.getBaseBiome(x, z, seed); } diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java index 30c00ad6e8..2f83d47bf6 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -11,6 +11,7 @@ import com.dfsek.terra.addons.image.colorsampler.ColorSampler; import com.dfsek.terra.addons.image.converter.ColorConverter; +import com.dfsek.terra.api.util.generic.data.types.Maybe; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -40,8 +41,8 @@ public Biome getBiome(int x, int z) { } @Override - public Optional getBaseBiome(int x, int z, long seed) { - return Optional.of(getBiome(x, z)); + public Maybe getBaseBiome(int x, int z, long seed) { + return Maybe.just(getBiome(x, z)); } @Override diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java index 5344cf8fe1..8bcc091be7 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java @@ -8,6 +8,9 @@ package com.dfsek.terra.addons.biome.pipeline; import com.dfsek.seismic.type.sampler.Sampler; + +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; @@ -106,8 +109,8 @@ public Iterable getBiomes() { } @Override - public Optional getBaseBiome(int x, int z, long seed) { - return Optional.of(getBiome(x, z, seed)); + public Maybe getBaseBiome(int x, int z, long seed) { + return Maybe.just(getBiome(x, z, seed)); } @Override diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java index 04b16d7238..97b87b25c8 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java @@ -8,18 +8,13 @@ package com.dfsek.terra.addons.biome.single; import java.util.Collections; -import java.util.Optional; +import com.dfsek.terra.api.util.generic.data.types.Maybe; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -public class SingleBiomeProvider implements BiomeProvider { - private final Biome biome; - - public SingleBiomeProvider(Biome biome) { - this.biome = biome; - } +public record SingleBiomeProvider(Biome biome) implements BiomeProvider { @Override public Biome getBiome(int x, int y, int z, long seed) { @@ -27,8 +22,8 @@ public Biome getBiome(int x, int y, int z, long seed) { } @Override - public Optional getBaseBiome(int x, int z, long seed) { - return Optional.of(biome); + public Maybe getBaseBiome(int x, int z, long seed) { + return Maybe.just(biome); } @Override diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java index 8d9a6cc848..6842828711 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java @@ -30,7 +30,7 @@ public ElevationInterpolator(long seed, int chunkX, int chunkZ, BiomeProvider pr gens[x + 1 + smooth][z + 1 + smooth] = provider .getBaseBiome(bx, bz, seed) - .orElseGet(() -> provider.getBiome(bx, 0, bz, seed)) // kind of a hack + .get(() -> provider.getBiome(bx, 0, bz, seed)) // kind of a hack .getContext() .get(noisePropertiesKey); } diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java index 1799f0fc10..3655d32665 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java @@ -2,10 +2,13 @@ import com.dfsek.seismic.type.vector.Vector2Int; import com.dfsek.seismic.type.vector.Vector3Int; + import com.dfsek.terra.api.util.generic.data.types.Either; +import com.dfsek.terra.api.util.generic.data.types.Maybe; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; + import org.jetbrains.annotations.NotNull; import java.util.Optional; @@ -14,6 +17,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; + public class BiomeLocator { /** @@ -27,9 +31,10 @@ public class BiomeLocator { * @param step The search step/increment. Higher values are faster but less accurate. * @param filter The condition to match the biome. * @param search3D If true, searches the entire vertical column at each step. If false, only checks originY. + * * @return An Optional containing the location of the found biome, or empty if not found. */ - public static Optional> search( + public static Maybe> search( @NotNull BiomeProvider provider, @NotNull WorldProperties properties, int originX, @@ -44,64 +49,63 @@ public static Optional> search( int maxHeight = properties.getMaxHeight(); // 1. Check the exact center first - Optional> centerResult = check(provider, seed, originX, originZ, step, filter, search3D, minHeight, maxHeight); - if (centerResult.isPresent()) { - return centerResult; - } + return + check(provider, seed, originX, originZ, step, filter, search3D, minHeight, maxHeight) - // 2. Begin Parallel Square Spiral Search - // We iterate rings sequentially to guarantee finding the *nearest* result. - // However, we process all points within a specific ring in parallel. - for (int r = step; r <= radius; r += step) { - final int currentRadius = r; - final int minX = -currentRadius; - final int maxX = currentRadius; - final int minZ = -currentRadius; - final int maxZ = currentRadius; - - Stream northSide = IntStream.iterate(minX, n -> n < maxX, n -> n + step) - .mapToObj(x -> new int[]{x, minZ}); // Fixed Z (min), varying X - - Stream eastSide = IntStream.iterate(minZ, n -> n < maxZ, n -> n + step) - .mapToObj(z -> new int[]{maxX, z}); // Fixed X (max), varying Z - - Stream southSide = IntStream.iterate(maxX, n -> n > minX, n -> n - step) - .mapToObj(x -> new int[]{x, maxZ}); // Fixed Z (max), varying X - - Stream westSide = IntStream.iterate(maxZ, n -> n > minZ, n -> n - step) - .mapToObj(z -> new int[]{minX, z}); // Fixed X (min), varying Z - - Optional> ringResult = Stream.of(northSide, eastSide, southSide, westSide) - .flatMap(Function.identity()) - .parallel() - .map(coords -> check( - provider, - seed, - originX + coords[0], - originZ + coords[1], - step, - filter, - search3D, - minHeight, - maxHeight - )) - .filter(Optional::isPresent) - .map(Optional::get) - .findFirst(); // findFirst() respects encounter order (North -> East -> South -> West) - - if (ringResult.isPresent()) { - return ringResult; - } - } + // 2. Begin Parallel Square Spiral Search + // We iterate rings sequentially to guarantee finding the *nearest* result. + // However, we process all points within a specific ring in parallel. + .or(() -> { + for(int r = step; r <= radius; r += step) { + final int currentRadius = r; + final int minX = -currentRadius; + final int maxX = currentRadius; + final int minZ = -currentRadius; + final int maxZ = currentRadius; + + Stream northSide = IntStream.iterate(minX, n -> n < maxX, n -> n + step) + .mapToObj(x -> new int[]{ x, minZ }); // Fixed Z (min), varying X + + Stream eastSide = IntStream.iterate(minZ, n -> n < maxZ, n -> n + step) + .mapToObj(z -> new int[]{ maxX, z }); // Fixed X (max), varying Z + + Stream southSide = IntStream.iterate(maxX, n -> n > minX, n -> n - step) + .mapToObj(x -> new int[]{ x, maxZ }); // Fixed Z (max), varying X + + Stream westSide = IntStream.iterate(maxZ, n -> n > minZ, n -> n - step) + .mapToObj(z -> new int[]{ minX, z }); // Fixed X (min), varying Z + + Optional> ringResult = Stream.of(northSide, eastSide, southSide, westSide) + .flatMap(Function.identity()) + .parallel() + .map(coords -> check( + provider, + seed, + originX + coords[0], + originZ + coords[1], + step, + filter, + search3D, + minHeight, + maxHeight + )) + .flatMap(Maybe::toStream) + .findFirst(); // findFirst() respects encounter order (North -> East -> South -> West) + + if(ringResult.isPresent()) { + return Maybe.fromOptional(ringResult); + } + } + return Maybe.nothing(); + }); - return Optional.empty(); } /** * Helper to check a specific coordinate column or point. * This logic is executed inside the worker threads. */ - private static Optional> check( + private static Maybe> check( BiomeProvider provider, long seed, int x, @@ -112,14 +116,14 @@ private static Optional> check( int minHeight, int maxHeight ) { - if (search3D) { + if(search3D) { // Iterate from bottom to top of the world using the step - for (int y = minHeight; y < maxHeight; y += step) { - if (filter.test(provider.getBiome(x, y, z, seed))) { - return Optional.of(Either.left(Vector3Int.of(x, y, z))); + for(int y = minHeight; y < maxHeight; y += step) { + if(filter.test(provider.getBiome(x, y, z, seed))) { + return Maybe.just(Either.left(Vector3Int.of(x, y, z))); } } - return Optional.empty(); + return Maybe.nothing(); } else { // 2D Mode: Check only the base biome // We use a flatMap approach here to be safe with Optionals inside the stream diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java index 3d6d863587..11a62ee520 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java @@ -3,6 +3,10 @@ import com.dfsek.seismic.type.vector.Vector2Int; import com.dfsek.seismic.type.vector.Vector3Int; + +import com.dfsek.terra.api.util.function.FunctionUtils; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import org.incendo.cloud.CommandManager; import org.incendo.cloud.component.DefaultValue; import org.incendo.cloud.context.CommandContext; @@ -26,6 +30,8 @@ import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.Biome; +import static com.dfsek.terra.api.util.function.FunctionUtils.collapse; + public class LocateCommandAddon implements AddonInitializer { @Inject @@ -83,7 +89,7 @@ public void initialize() { context.sender().sendMessage( "Searching for " + targetBiome.getID() + " within " + radius + " blocks" + modeMsg + "..."); - Optional> result; + Maybe> result; // 3. Execute Search Loop while(true) { @@ -100,7 +106,7 @@ public void initialize() { // Exit Conditions: // 1. Found a result - if(result.isPresent()) { + if(result.isJust()) { break; } // 2. Not in auto mode (only run once) @@ -118,22 +124,11 @@ public void initialize() { } // 4. Handle Result - if(result.isPresent()) { - Either location = result.get(); - String coords; - - if(location.hasLeft()) { // 3D Result - Vector3Int vec = location.getLeft().get(); - coords = String.format("%d, %d, %d", vec.getX(), vec.getY(), vec.getZ()); - } else { // 2D Result - Vector2Int vec = location.getRight().get(); - coords = String.format("%d, ~, %d", vec.getX(), vec.getZ()); - } - - context.sender().sendMessage("Found " + targetBiome.getID() + " at [" + coords + "]"); - } else { - context.sender().sendMessage("Could not find " + targetBiome.getID() + " within " + radius + " blocks."); - } + context.sender().sendMessage(collapse(result.map(location -> location.collect( + left -> String.format("%d, %d, %d", left.getX(), left.getY(), left.getZ()), + right -> String.format("%d, ~, %d", right.getX(), right.getZ()))) + .map(coords -> "Found " + targetBiome.getID() + " at [" + coords + "]") + .toEither("Could not find " + targetBiome.getID() + " within " + radius + " blocks."))); }) .permission("terra.locate.biome") ); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 4813418eee..8a36eca81a 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -22,6 +22,10 @@ public static Either toEither(Optional o, L de) { return (Either) o.map(Either::right).orElseGet(() -> Either.left(de)); } + public static T collapse(Either either) { + return either.collect(Function.identity(), Function.identity()); + } + public static Function> liftTry(Function f) { return s -> { try { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 4144ff96cf..72e09d1193 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -4,7 +4,9 @@ import java.util.Optional; import java.util.function.Function; +import java.util.function.Predicate; import java.util.function.Supplier; +import java.util.stream.Stream; public interface Maybe extends Monad> { @@ -21,6 +23,11 @@ default Maybe pure(T1 t) { Either toEither(L l); T get(Supplier def); + boolean isJust(); + + @Override + Maybe map(Function map); + default T get(T def) { return get(() -> def); } @@ -29,6 +36,24 @@ default Maybe overwrite(Maybe m) { return bind(ignore -> m); } + Maybe or(Supplier> or); + + default Maybe or(Maybe or) { + return or(() -> or); + } + + default Stream toStream() { + return map(Stream::of).get(Stream.empty()); + } + + default Maybe filter(Predicate filter) { + return bind(o -> filter.test(o) ? this : nothing()); + } + + static Maybe fromOptional(Optional op) { + return op.map(Maybe::just).orElseGet(Maybe::nothing); + } + static Maybe just(T1 t) { record Just(T value) implements Maybe { @@ -47,6 +72,21 @@ public T get(Supplier def) { return value; } + @Override + public boolean isJust() { + return true; + } + + @Override + public Maybe map(Function map) { + return just(map.apply(value)); + } + + @Override + public Maybe or(Supplier> or) { + return this; + } + @Override public Maybe bind(Function>> map) { return (Maybe) map.apply(value); @@ -77,6 +117,22 @@ public Either toEither(L l) { public T get(Supplier def) { return def.get(); } + + @Override + public boolean isJust() { + return false; + } + + @Override + @SuppressWarnings("unchecked") + public Maybe map(Function map) { + return (Maybe) this; + } + + @Override + public Maybe or(Supplier> or) { + return or.get(); + } } return new Nothing<>(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java index eedaaa491b..822dad1a2d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java @@ -9,6 +9,9 @@ import com.dfsek.seismic.type.vector.Vector3; import com.dfsek.seismic.type.vector.Vector3Int; + +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import org.jetbrains.annotations.Contract; import java.util.Optional; @@ -64,8 +67,8 @@ default Biome getBiome(Vector3Int vector3, long seed) { return getBiome(vector3.getX(), vector3.getY(), vector3.getZ(), seed); } - default Optional getBaseBiome(int x, int z, long seed) { - return Optional.empty(); + default Maybe getBaseBiome(int x, int z, long seed) { + return Maybe.nothing(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java index c11775faba..aaeab8a2de 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.world.biome.generation; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; import com.github.benmanes.caffeine.cache.Scheduler; @@ -25,14 +27,14 @@ public class CachingBiomeProvider implements BiomeProvider, Handle { protected final BiomeProvider delegate; private final int res; private final ThreadLocal>> cache; - private final ThreadLocal>>> baseCache; + private final ThreadLocal>>> baseCache; protected CachingBiomeProvider(BiomeProvider delegate) { this.delegate = delegate; this.res = delegate.resolution(); this.baseCache = ThreadLocal.withInitial(() -> { - LoadingCache> cache = Caffeine + LoadingCache> cache = Caffeine .newBuilder() .executor(CACHE_EXECUTOR) .scheduler(Scheduler.systemScheduler()) @@ -56,7 +58,7 @@ protected CachingBiomeProvider(BiomeProvider delegate) { } - private Optional sampleBiome(SeededVector2Key vec) { + private Maybe sampleBiome(SeededVector2Key vec) { this.baseCache.get().setLeft(new SeededVector2Key(0, 0, 0)); return this.delegate.getBaseBiome(vec.x * res, vec.z * res, vec.seed); } @@ -80,8 +82,8 @@ public Biome getBiome(int x, int y, int z, long seed) { } @Override - public Optional getBaseBiome(int x, int z, long seed) { - Mutable>> cachePair = baseCache.get(); + public Maybe getBaseBiome(int x, int z, long seed) { + Mutable>> cachePair = baseCache.get(); SeededVector2Key mutableKey = cachePair.getLeft(); mutableKey.set(x, z, seed); return cachePair.getRight().get(mutableKey); From 9a16336f53929949036d87d83bd3c64ca73b8306 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 21:11:11 -0700 Subject: [PATCH 16/47] convert a bunch of stuff to new APIs --- .../config/ReplaceableBiomeLoader.java | 2 +- .../pipeline/config/PipelineBiomeLoader.java | 3 +- .../commands/locate/LocateCommandAddon.java | 4 +- .../structure/StructureCommandAddon.java | 4 +- .../script/functions/LootFunction.java | 6 +-- .../script/functions/StructureFunction.java | 4 +- .../terra/api/command/CommandSender.java | 7 ++-- .../command/arguments/RegistryArgument.java | 24 +++++------ .../dfsek/terra/api/registry/Registry.java | 18 ++++---- .../api/util/function/FunctionUtils.java | 9 ++++ .../api/util/generic/data/types/Either.java | 25 ++++++----- .../api/util/generic/data/types/Maybe.java | 41 +++++++++++++++++++ .../GenericTemplateSupplierLoader.java | 6 ++- .../dfsek/terra/config/pack/MetaPackImpl.java | 11 +++-- .../terra/registry/CheckedRegistryImpl.java | 5 ++- .../terra/registry/LockedRegistryImpl.java | 5 ++- .../terra/registry/OpenRegistryImpl.java | 17 +++++--- .../src/test/java/registry/RegistryTest.java | 15 ++++--- .../com/dfsek/terra/allay/AllayPlatform.java | 2 +- .../generator/AllayGeneratorWrapper.java | 10 ++++- .../terra/bukkit/CloudCommandSender.java | 14 ++++--- .../com/dfsek/terra/bukkit/PlatformImpl.java | 2 +- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 6 +-- .../bukkit/listeners/CommonListener.java | 2 +- .../java/com/dfsek/terra/cli/TerraCLI.java | 2 +- .../terra/minestom/TerraMinestomPlatform.java | 2 +- .../api/TerraMinestomWorldBuilder.java | 4 +- .../java/com/dfsek/terra/mod/data/Codecs.java | 2 +- .../terra/lifecycle/LifecyclePlatform.java | 2 +- 29 files changed, 167 insertions(+), 87 deletions(-) diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/ReplaceableBiomeLoader.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/ReplaceableBiomeLoader.java index 79bd46e213..7c77877409 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/ReplaceableBiomeLoader.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/config/ReplaceableBiomeLoader.java @@ -27,6 +27,6 @@ public ReplaceableBiome load(@NotNull AnnotatedType t, @NotNull Object c, @NotNu return biomeRegistry .getByID((String) c) .map(ReplaceableBiome::of) - .orElseThrow(() -> new LoadException("No such biome: " + c, depthTracker)); + .collectThrow(left -> new LoadException("No such biome: " + c + ": " + left, depthTracker)); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java index afd249c254..80e6d26c9c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/config/PipelineBiomeLoader.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; +import java.util.function.Function; import com.dfsek.terra.addons.biome.pipeline.api.biome.PipelineBiome; import com.dfsek.terra.api.registry.Registry; @@ -27,6 +28,6 @@ public PipelineBiome load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull return biomeRegistry .getByID((String) c) .map(PipelineBiome::from) - .orElseGet(() -> PipelineBiome.placeholder((String) c)); + .collect(left -> PipelineBiome.placeholder((String) c), Function.identity()); } } diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java index 11a62ee520..aede6dd224 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java @@ -41,7 +41,7 @@ public class LocateCommandAddon implements AddonInitializer { private BaseAddon addon; private static Registry getBiomeRegistry(CommandContext sender) { - return sender.sender().getEntity().orElseThrow().world().getPack().getRegistry(Biome.class); + return sender.sender().getEntity().orThrow().world().getPack().getRegistry(Biome.class); } @Override @@ -69,7 +69,7 @@ public void initialize() { .handler(context -> { // 1. Gather Context & Arguments Biome targetBiome = context.get("biome"); - Entity sender = context.sender().getEntity().orElseThrow( + Entity sender = context.sender().getEntity().orThrow( () -> new Error("Only entities can run this command.")); World world = sender.world(); diff --git a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java index 0ec8f38915..9e60e90bc9 100644 --- a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java +++ b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java @@ -34,7 +34,7 @@ public class StructureCommandAddon implements AddonInitializer { private BaseAddon addon; private static Registry getStructureRegistry(CommandContext sender) { - return sender.sender().getEntity().orElseThrow().world().getPack().getRegistry(Structure.class); + return sender.sender().getEntity().orThrow().world().getPack().getRegistry(Structure.class); } @Override @@ -55,7 +55,7 @@ public void initialize() { .optional("rotation", EnumParser.enumParser(Rotation.class), DefaultValue.constant(Rotation.NONE)) .handler(context -> { Structure structure = context.get("structure"); - Entity sender = context.sender().getEntity().orElseThrow(); + Entity sender = context.sender().getEntity().orThrow(); structure.generate( sender.position().toInt(), sender.world(), diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index 5176116f81..5fcf23ad16 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java @@ -64,7 +64,7 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) registry.get(RegistryKey.parse(id)) - .ifPresentOrElse(table -> { + .consume(table -> { Vector3 apply = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope) .intValue(), @@ -91,8 +91,8 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) LOGGER.error("Could not apply loot at {}", apply, e); e.printStackTrace(); } - }, - () -> LOGGER.error("No such loot table {}", id)); + } + ).ifNothing(() -> LOGGER.error("No such loot table {}", id)); return null; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java index 4fe8b45aff..2660421f5b 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java @@ -91,10 +91,10 @@ public Boolean apply(ImplementationArguments implementationArguments, Scope scop FloatingPointFunctions.round(xz.getZ())), arguments.getRandom(), arguments.getRotation().rotate(rotation1)); - }).orElseGet(() -> { + }).collect(left -> { LOGGER.error("No such structure {}", app); return false; - }); + }, java.util.function.Function.identity()); } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java index 9755c2005f..9172270ec5 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java @@ -7,17 +7,16 @@ package com.dfsek.terra.api.command; -import java.util.Optional; - import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.Player; +import com.dfsek.terra.api.util.generic.data.types.Maybe; public interface CommandSender extends Handle { void sendMessage(String message); - Optional getEntity(); + Maybe getEntity(); - Optional getPlayer(); + Maybe getPlayer(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java index 8e15c18ceb..735b533a41 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.command.arguments; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.component.CommandComponent; @@ -100,20 +102,16 @@ private RegistryArgumentParser(Function, Registry> registry Registry registry = registryFunction.apply(commandContext); - Optional result; - try { - result = registry.get(RegistryKey.parse(input)); - } catch(IllegalArgumentException e) { - try { - result = registry.getByID(input); - } catch(IllegalArgumentException e1) { - return ArgumentParseResult.failure(e1); - } - } - - return result + String finalInput = input; + return registry.get(RegistryKey.parse(input)) .map(ArgumentParseResult::success) - .orElse(ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + input))); + .orJust(() -> + registry.getByID(finalInput).collect( + left -> ArgumentParseResult.failure(new IllegalArgumentException(left)), + ArgumentParseResult::success + )) + .get(() -> ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + finalInput))); + } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index a034214fbd..432d296122 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -8,6 +8,10 @@ package com.dfsek.terra.api.registry; import com.dfsek.tectonic.api.loader.type.TypeLoader; + +import com.dfsek.terra.api.util.generic.data.types.Either; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -32,7 +36,7 @@ public interface Registry extends TypeLoader { * @return Value matching the identifier, {@code null} if no value is present. */ @Contract(pure = true) - Optional get(@NotNull RegistryKey key); + Maybe get(@NotNull RegistryKey key); /** * Check if the registry contains a value. @@ -82,13 +86,13 @@ default Class getRawType() { return getType().getRawType(); } - default Optional getByID(String id) { + default Either getByID(String id) { return getByID(id, map -> { - if(map.isEmpty()) return Optional.empty(); + if(map.isEmpty()) return Either.left("No such element."); if(map.size() == 1) { - return map.values().stream().findFirst(); // only one value. + return Either.right(map.values().stream().findFirst().get()); // only one value. } - throw new IllegalArgumentException("ID \"" + id + "\" is ambiguous; matches: " + map + return Either.left("ID \"" + id + "\" is ambiguous; matches: " + map .keySet() .stream() .map(RegistryKey::toString) @@ -102,9 +106,9 @@ default Collection getAllWithID(String id) { Map getMatches(String id); - default Optional getByID(String attempt, Function, Optional> reduction) { + default Either getByID(String attempt, Function, Either> reduction) { if(attempt.contains(":")) { - return get(RegistryKey.parse(attempt)); + return get(RegistryKey.parse(attempt)).toEither("No such value."); } return reduction.apply(getMatches(attempt)); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 8a36eca81a..1961c754d6 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -26,6 +26,15 @@ public static T collapse(Either either) { return either.collect(Function.identity(), Function.identity()); } + public static U throw_(T e) throws T { + throw e; + } + + @SuppressWarnings("unchecked") + public static U sneakyThrow(Throwable e) throws E { + throw (E) e; + } + public static Function> liftTry(Function f) { return s -> { try { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 4e01be3b85..3058f68bed 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -51,9 +51,9 @@ default Either pure(T1 t) { @Override Either mapRight(Function f); - Optional getLeft(); + Maybe getLeft(); - Optional getRight(); + Maybe getRight(); boolean isLeft(); @@ -63,6 +63,11 @@ default Either pure(T1 t) { U collect(Function left, Function right); + @SuppressWarnings("Convert2MethodRef") + default R collectThrow(Function left) throws T{ + return mapLeft(left).collect(l -> FunctionUtils.sneakyThrow(l), Function.identity()); + } + @SuppressWarnings({ "unchecked" }) @NotNull @Contract("_ -> new") @@ -87,13 +92,13 @@ public Either mapRight(Function f) { } @Override - public Optional getLeft() { - return Optional.of(value); + public Maybe getLeft() { + return Maybe.just(value); } @Override - public Optional getRight() { - return Optional.empty(); + public Maybe getRight() { + return Maybe.nothing(); } @Override @@ -142,13 +147,13 @@ public Either mapRight(Function f) { } @Override - public Optional getLeft() { - return Optional.empty(); + public Maybe getLeft() { + return Maybe.nothing(); } @Override - public Optional getRight() { - return Optional.of(value); + public Maybe getRight() { + return Maybe.just(value); } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 72e09d1193..3b7ecfb634 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -2,7 +2,9 @@ import com.dfsek.terra.api.util.generic.control.Monad; +import java.util.NoSuchElementException; import java.util.Optional; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -21,6 +23,7 @@ default Maybe pure(T1 t) { Optional toOptional(); Either toEither(L l); + T get(Supplier def); boolean isJust(); @@ -32,12 +35,45 @@ default T get(T def) { return get(() -> def); } + default Maybe consume(Consumer c) { + return map(m -> { + c.accept(m); + return m; + }); + } + + default Maybe ifNothing(Runnable r) { + if(!isJust()) { + r.run(); + } + return this; + } + default Maybe overwrite(Maybe m) { return bind(ignore -> m); } Maybe or(Supplier> or); + default Maybe orJust(Supplier or) { + return or(() -> just(or.get())); + } + + + @Deprecated + default T orThrow() { + return get(() -> { throw new NoSuchElementException("No value present."); }); + } + + @Deprecated + default T orThrow(Supplier e) throws X { + if(isJust()) { + return orThrow(); + } + throw e.get(); + } + + default Maybe or(Maybe or) { return or(() -> or); } @@ -54,6 +90,11 @@ static Maybe fromOptional(Optional op) { return op.map(Maybe::just).orElseGet(Maybe::nothing); } + static Maybe ofNullable(T t) { + if(t == null) return nothing(); + return just(t); + } + static Maybe just(T1 t) { record Just(T value) implements Maybe { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java index 5a23e54b86..9ae3e3d61d 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java @@ -23,10 +23,14 @@ import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.type.TypeLoader; import com.dfsek.tectonic.impl.MapConfiguration; + +import com.dfsek.terra.api.util.function.FunctionUtils; + import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; import java.util.Map; +import java.util.function.Function; import java.util.function.Supplier; import com.dfsek.terra.api.registry.Registry; @@ -46,7 +50,7 @@ public T load(@NotNull AnnotatedType t, @NotNull Object c, ConfigLoader loader, String type = (String) map.get("type"); return loader .load(registry.getByID(type) - .orElseThrow(() -> new LoadException("No such entry: " + map.get("type"), depthTracker)) + .collect(left -> FunctionUtils.throw_(new LoadException("Failed to load entry " + map.get("type") + ": " + left, depthTracker)), Function.identity()) .get(), new MapConfiguration(map), depthTracker.intrinsic("With type \"" + type + "\"")).get(); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java index 8ae68c8e8e..685708698e 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java @@ -105,12 +105,11 @@ public MetaPackImpl(Path path, Platform platform, ConfigRegistry configRegistry) template.getPacks().forEach((k, v) -> { RegistryKey registryKey = RegistryKey.parse(v); - if(configRegistry.contains(registryKey)) { - packs.put(k, configRegistry.get(registryKey).get()); - logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); - } else { - logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); - } + configRegistry.get(registryKey).consume(pack -> { + packs.put(k, pack); + logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); + }) + .ifNothing(() -> logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id)); }); HashSet authors = new HashSet<>(); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java index 52b22e6349..f09d01593a 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java @@ -20,6 +20,9 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; + +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import org.jetbrains.annotations.ApiStatus.Internal; import org.jetbrains.annotations.NotNull; @@ -61,7 +64,7 @@ public void register(@NotNull RegistryKey identifier, @NotNull T value) throws D } @Override - public Optional get(@NotNull RegistryKey key) { + public Maybe get(@NotNull RegistryKey key) { return registry.get(key); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java index 153f3792a5..77c9aeaeab 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java @@ -20,6 +20,9 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; + +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; @@ -48,7 +51,7 @@ public LockedRegistryImpl(Registry registry) { } @Override - public Optional get(@NotNull RegistryKey key) { + public Maybe get(@NotNull RegistryKey key) { return registry.get(key); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java index 60bea757e1..1adeaac074 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java @@ -20,6 +20,10 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; + +import com.dfsek.terra.api.util.function.FunctionUtils; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import org.jetbrains.annotations.NotNull; @@ -35,6 +39,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; import com.dfsek.terra.api.registry.OpenRegistry; @@ -68,9 +73,11 @@ protected OpenRegistryImpl(Map> init, TypeKey typeKey) @Override public T load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { - return getByID((String) o).orElseThrow(() -> new LoadException("No such " + type.getType().getTypeName() + " matching \"" + o + - "\" was found in this registry. Registry contains items: " + - getItemsFormatted(), depthTracker)); + return getByID((String) o) + .collect(left -> FunctionUtils.throw_(new LoadException("Unable to retrieve " + type.getType().getTypeName() + " matching \"" + o + + "\" was found in this registry. Registry contains items: " + + getItemsFormatted() + "\n\nError:" + left, depthTracker)), + Function.identity()); } private String getItemsFormatted() { @@ -112,8 +119,8 @@ private boolean register(RegistryKey identifier, Entry value) { @SuppressWarnings("unchecked") @Override - public Optional get(@NotNull RegistryKey key) { - return Optional.ofNullable(objects.getOrDefault(key, (Entry) NULL).getValue()); + public Maybe get(@NotNull RegistryKey key) { + return Maybe.ofNullable(objects.getOrDefault(key, (Entry) NULL).getValue()); } @Override diff --git a/common/implementation/base/src/test/java/registry/RegistryTest.java b/common/implementation/base/src/test/java/registry/RegistryTest.java index 4ea1326feb..ee4d9d050a 100644 --- a/common/implementation/base/src/test/java/registry/RegistryTest.java +++ b/common/implementation/base/src/test/java/registry/RegistryTest.java @@ -17,6 +17,8 @@ package registry; +import com.dfsek.terra.api.util.generic.data.types.Either; + import org.junit.jupiter.api.Test; import com.dfsek.terra.api.registry.CheckedRegistry; @@ -37,7 +39,7 @@ public void openRegistry() { test.register(RegistryKey.parse("test:test"), "bazinga"); - assertEquals(test.get(RegistryKey.parse("test:test")).orElseThrow(), "bazinga"); + assertEquals(test.get(RegistryKey.parse("test:test")).orThrow(), "bazinga"); } @Test @@ -60,7 +62,7 @@ public void checkedRegistry() { test.register(RegistryKey.parse("test:test"), "bazinga"); - assertEquals(test.get(RegistryKey.parse("test:test")).orElseThrow(), "bazinga"); + assertEquals(test.get(RegistryKey.parse("test:test")).orThrow(), "bazinga"); try { test.register(RegistryKey.parse("test:test"), "bazinga2"); @@ -76,7 +78,7 @@ public void getID() { test.register(RegistryKey.parse("test:test"), "bazinga"); - assertEquals(test.getByID("test").orElseThrow(), "bazinga"); + assertEquals(test.getByID("test").collectThrow(RuntimeException::new), "bazinga"); } @Test @@ -86,11 +88,8 @@ public void getIDAmbiguous() { test.registerChecked(RegistryKey.parse("test:test"), "bazinga"); test.registerChecked(RegistryKey.parse("test2:test"), "bazinga"); - try { - test.getByID("test"); - fail("Shouldn't be able to get with ambiguous ID!"); - } catch(IllegalArgumentException ignore) { + Either result = test.getByID("test"); + assertTrue(result.isLeft()); - } } } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java index f9cb5831ff..4d2e545a51 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/AllayPlatform.java @@ -42,7 +42,7 @@ public boolean reload() { boolean succeed = loadConfigPacks(); GENERATOR_WRAPPERS.forEach(wrapper -> { - getConfigRegistry().get(wrapper.getConfigPack().getRegistryKey()).ifPresent(pack -> { + getConfigRegistry().get(wrapper.getConfigPack().getRegistryKey()).consume(pack -> { wrapper.setConfigPack(pack); var dimension = wrapper.getAllayWorldGenerator().getDimension(); TerraAllayPlugin.instance.getPluginLogger().info( diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java index 9ffc029f7e..1fe968d967 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/generator/AllayGeneratorWrapper.java @@ -1,5 +1,7 @@ package com.dfsek.terra.allay.generator; +import com.dfsek.terra.api.util.function.FunctionUtils; + import com.google.common.base.Preconditions; import org.allaymc.api.utils.AllayStringUtils; import org.allaymc.api.world.biome.BiomeType; @@ -24,6 +26,8 @@ import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; import com.dfsek.terra.api.world.info.WorldProperties; +import java.util.function.Function; + /** * @author daoge_cmd @@ -91,14 +95,16 @@ protected static ConfigPack getConfigPackById(String packId) { return TerraAllayPlugin.platform .getConfigRegistry() .getByID(packId) - .orElseThrow(() -> new IllegalArgumentException("Cant find terra config pack named " + packId)); + .collectThrow( + left -> new IllegalArgumentException("Cant find terra config pack named " + packId + ": " + left)); } protected static ConfigPack getConfigPackByMeta(String metaPackId, DimensionInfo dimensionInfo) { return TerraAllayPlugin.platform .getMetaConfigRegistry() .getByID(metaPackId) - .orElseThrow(() -> new IllegalArgumentException("Cant find terra meta pack named " + metaPackId)) + .collectThrow( + left -> new IllegalArgumentException("Cant find terra meta pack named " + metaPackId + ": " + left)) .packs() .get(Mapping.dimensionIdBeToJe(dimensionInfo.toString())); } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java index 0160180a9a..a4077eaccc 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java @@ -1,5 +1,7 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import io.papermc.paper.command.brigadier.CommandSourceStack; import org.bukkit.ChatColor; @@ -24,19 +26,19 @@ public void sendMessage(String message) { } @Override - public Optional getEntity() { + public Maybe getEntity() { if(delegate instanceof org.bukkit.entity.Entity entity) { - return Optional.of(BukkitAdapter.adapt(entity)); + return Maybe.just(BukkitAdapter.adapt(entity)); } - return Optional.empty(); + return Maybe.nothing(); } @Override - public Optional getPlayer() { + public Maybe getPlayer() { if(delegate instanceof org.bukkit.entity.Player player) { - return Optional.of(BukkitAdapter.adapt(player)); + return Maybe.just(BukkitAdapter.adapt(player)); } - return Optional.empty(); + return Maybe.nothing(); } @Override diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java index 84efbc0cf1..87ee04c6b3 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/PlatformImpl.java @@ -73,7 +73,7 @@ public boolean reload() { Bukkit.getWorlds().forEach(world -> { if(world.getGenerator() instanceof BukkitChunkGeneratorWrapper wrapper) { - getConfigRegistry().get(wrapper.getPack().getRegistryKey()).ifPresent(pack -> { + getConfigRegistry().get(wrapper.getPack().getRegistryKey()).consume(pack -> { wrapper.setPack(pack); LOGGER.info("Replaced pack in chunk generator for world {}", world); }); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index fe18d290d5..d019da7cd8 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -182,10 +182,10 @@ private boolean doVersionCheck() { ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) { if(id == null || id.trim().isEmpty()) { return null; } return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> { - ConfigPack pack = platform.getConfigRegistry().getByID(id).orElseThrow( - () -> new IllegalArgumentException("No such config pack \"" + id + "\"")); + ConfigPack pack = platform.getConfigRegistry().getByID(id).collectThrow( + left -> new IllegalArgumentException("No such config pack \"" + id + "\": " + left)); return pack.getGeneratorProvider().newInstance(pack); - }), platform.getRawConfigRegistry().getByID(id).orElseThrow(), platform.getWorldHandle().air()); + }), platform.getRawConfigRegistry().getByID(id).collectThrow(RuntimeException::new), platform.getWorldHandle().air()); } public AsyncScheduler getAsyncScheduler() { diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index 5cb6ab4e6d..aa348614d8 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -80,7 +80,7 @@ private void applyWolfVariant(Wolf wolf) { return; } - ConfigPack pack = platform.getConfigRegistry().get(wrapper.getPack().getRegistryKey()).orElse(null); + ConfigPack pack = platform.getConfigRegistry().get(wrapper.getPack().getRegistryKey()).get((ConfigPack) null); if(pack == null) { return; } diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java index c271f98cf0..5463d44fd6 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java @@ -51,7 +51,7 @@ public Integer call() { CLIPlatform platform = new CLIPlatform(); platform.getEventManager().callEvent(new PlatformInitializationEvent()); - ConfigPack generate = platform.getConfigRegistry().getByID(pack).orElseThrow(); + ConfigPack generate = platform.getConfigRegistry().getByID(pack).collectThrow(RuntimeException::new); CLIWorld world = new CLIWorld(size, seed, maxHeight, minHeight, generate, noSave); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java index 810426f830..c936167314 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java @@ -95,7 +95,7 @@ public boolean reload() { MinecraftServer.getInstanceManager().getInstances().forEach(world -> { if(world.generator() instanceof MinestomChunkGeneratorWrapper wrapper) { - getConfigRegistry().get(wrapper.getPack().getRegistryKey()).ifPresent(pack -> { + getConfigRegistry().get(wrapper.getPack().getRegistryKey()).consume(pack -> { wrapper.setPack(pack); LOGGER.info("Replaced pack in chunk generator for instance {}", world.getUuid()); }); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index 337276839c..19412a195c 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java @@ -39,14 +39,14 @@ public TerraMinestomWorldBuilder pack(ConfigPack pack) { } public TerraMinestomWorldBuilder packById(String id) { - this.pack = platform.getConfigRegistry().getByID(id).orElseThrow(); + this.pack = platform.getConfigRegistry().getByID(id).collectThrow(RuntimeException::new); return this; } public TerraMinestomWorldBuilder packByMeta(String metaPack, RegistryKey<@NonNull DimensionType> dimensionType) { this.pack = platform.getMetaConfigRegistry() .getByID(metaPack) - .orElseThrow(() -> new RuntimeException("MetaPack " + metaPack + " could not be found")) + .collectThrow(left -> new RuntimeException("MetaPack " + metaPack + " could not be found: " + left)) .packs() .get(dimensionType.key().asString()); return this; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java index 8cdc42c6bf..b1dc66b172 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java @@ -31,7 +31,7 @@ public final class Codecs { .apply(config, config.stable(id -> CommonPlatform.get() .getConfigRegistry() .get(id) - .orElseThrow(() -> new IllegalArgumentException( + .orThrow(() -> new IllegalArgumentException( "No such config pack " + id))))); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java index 5f9d6a651b..5319fc86cc 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java @@ -92,7 +92,7 @@ public boolean reload() { }).join(); server.getWorlds().forEach(world -> { if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { - getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { + getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).consume(pack -> { chunkGeneratorWrapper.setPack(pack); LOGGER.info("Replaced pack in chunk generator for world {}", world); }); From cb084015360d459b1b165e77c4a8c370156351e8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 22:18:44 -0700 Subject: [PATCH 17/47] start working on error handling stuff --- .../dfsek/terra/addon/loader/ApiAddon.java | 2 +- .../terra/addon/loader/ApiAddonLoader.java | 2 +- .../commands/addons/AddonsCommandAddon.java | 6 ++--- .../commands/locate/LocateCommandAddon.java | 7 ++---- .../structure/StructureCommandAddon.java | 4 ++-- .../addons/flora/flora/gen/TerraFlora.java | 2 +- .../pattern/AirMatchPatternTemplate.java | 2 +- .../pattern/BlockSetMatchPatternTemplate.java | 2 +- .../pattern/SolidMatchPatternTemplate.java | 2 +- .../locator/locators/SurfaceLocator.java | 2 +- .../feature/locator/locators/TopLocator.java | 2 +- .../terra/addons/ore/ores/VanillaOre.java | 2 +- .../addons/ore/ores/VanillaScatteredOre.java | 2 +- .../addons/ore/utils/VanillaOreUtils.java | 12 +++++----- .../addons/manifest/impl/ManifestAddon.java | 4 ++-- .../manifest/impl/ManifestAddonLoader.java | 2 +- .../src/main/resources/terra.addon.yml | 2 +- .../script/functions/BlockFunction.java | 2 +- .../script/functions/CheckBlockFunction.java | 2 +- .../script/functions/PullFunction.java | 2 +- .../com/dfsek/terra/api/addon/BaseAddon.java | 6 ++--- .../com/dfsek/terra/api/block/BlockType.java | 6 ++--- .../terra/api/block/state/BlockState.java | 12 +++++----- .../api/block/state/BlockStateExtended.java | 6 ++--- .../terra/api/command/CommandSender.java | 4 ++-- .../command/arguments/RegistryArgument.java | 23 ++++++++++--------- .../com/dfsek/terra/api/data/Extendable.java | 2 +- .../terra/api/entity/EntityTypeExtended.java | 2 +- .../com/dfsek/terra/api/error/Invalid.java | 12 ++++++++++ .../api/error/InvalidBlockStateError.java | 8 +++++++ .../dfsek/terra/api/handle/WorldHandle.java | 5 +++- .../dfsek/terra/api/registry/key/Keyed.java | 4 ++-- .../terra/api/registry/key/Namespaced.java | 4 ++-- .../terra/api/registry/key/RegistryKey.java | 2 +- .../api/util/collection/BlockStateSet.java | 2 +- .../api/util/generic/data/types/Maybe.java | 6 ++--- .../com/dfsek/terra/AbstractPlatform.java | 2 +- .../dfsek/terra/addon/DependencySorter.java | 10 ++++---- .../com/dfsek/terra/addon/EphemeralAddon.java | 2 +- .../com/dfsek/terra/addon/InternalAddon.java | 2 +- .../dfsek/terra/config/GenericLoaders.java | 2 +- .../event/FunctionalEventHandlerImpl.java | 2 +- .../terra/addon/BootstrapAddonLoader.java | 4 ++-- .../terra/allay/delegate/AllayBlockState.java | 6 ++--- .../terra/allay/delegate/AllayBlockType.java | 6 ++--- .../terra/allay/handle/AllayWorldHandle.java | 13 ++++++++--- .../com/dfsek/terra/bukkit/BukkitAddon.java | 2 +- .../terra/bukkit/CloudCommandSender.java | 4 ++-- .../bukkit/handles/BukkitWorldHandle.java | 15 ++++++++---- .../world/block/BukkitBlockTypeAndItem.java | 6 ++--- .../world/block/data/BukkitBlockState.java | 6 ++--- .../terra/bukkit/nms/NMSBiomeInjector.java | 2 +- .../dfsek/terra/cli/block/CLIBlockState.java | 6 ++--- .../dfsek/terra/cli/block/CLIBlockType.java | 6 ++--- .../terra/cli/handle/CLIWorldHandle.java | 6 +++-- .../terra/minestom/addon/MinestomAddon.java | 2 +- .../minestom/block/MinestomBlockState.java | 6 ++--- .../minestom/block/MinestomBlockType.java | 6 ++--- .../minestom/world/MinestomWorldHandle.java | 11 +++++++-- .../com/dfsek/terra/mod/MinecraftAddon.java | 2 +- .../java/com/dfsek/terra/mod/data/Codecs.java | 2 +- .../MinecraftChunkGeneratorWrapper.java | 8 +++---- .../mod/handle/MinecraftWorldHandle.java | 11 +++++---- .../terra/block/BlockMixin.java | 6 ++--- .../entity/MobSpawnerBlockEntityMixin.java | 2 +- .../block/state/BlockStateArgumentMixin.java | 10 ++++---- .../terra/block/state/BlockStateMixin.java | 6 ++--- .../terra/chunk/ChunkRegionMixin.java | 2 +- .../terra/chunk/WorldChunkMixin.java | 2 +- .../terra/chunk/data/ProtoChunkMixin.java | 4 ++-- .../entity/ServerCommandSourceMixin.java | 14 +++++------ .../terra/world/ChunkRegionMixin.java | 2 +- .../terra/world/ServerWorldMixin.java | 2 +- .../com/dfsek/terra/mod/util/BiomeUtil.java | 2 +- .../dfsek/terra/mod/util/MinecraftUtil.java | 4 ++-- .../com/dfsek/terra/mod/util/PresetUtil.java | 4 ++-- 76 files changed, 212 insertions(+), 165 deletions(-) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java create mode 100644 common/api/src/main/java/com/dfsek/terra/api/error/InvalidBlockStateError.java diff --git a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java b/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java index 6fb9658501..16d7db8443 100644 --- a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java +++ b/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java @@ -15,7 +15,7 @@ public ApiAddon(Version version, String id) { } @Override - public Version getVersion() { + public Version version() { return version; } diff --git a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java b/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java index 4d16b43c91..3677df900b 100644 --- a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java +++ b/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java @@ -33,7 +33,7 @@ public String getID() { } @Override - public Version getVersion() { + public Version version() { return VERSION; } } diff --git a/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java b/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java index a1c0cfb748..ba7c0f550c 100644 --- a/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java +++ b/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java @@ -39,7 +39,7 @@ public void initialize() { .append(" - ") .append(addon.getID()) .append('@') - .append(addon.getVersion().getFormatted()) + .append(addon.version().getFormatted()) .append('\n')); context.sender().sendMessage(addons.toString()); }) @@ -52,10 +52,10 @@ public void initialize() { BaseAddon addon = context.get("addon"); StringBuilder addonInfo = new StringBuilder("Addon ").append(addon.getID()).append('\n'); - addonInfo.append("Version: ").append(addon.getVersion().getFormatted()).append('\n'); + addonInfo.append("Version: ").append(addon.version().getFormatted()).append('\n'); addonInfo.append("Dependencies:\n"); - addon.getDependencies().forEach((id, versions) -> addonInfo + addon.dependencies().forEach((id, versions) -> addonInfo .append(" - ") .append(id) .append('@') diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java index aede6dd224..b60caef03b 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java @@ -4,7 +4,6 @@ import com.dfsek.seismic.type.vector.Vector2Int; import com.dfsek.seismic.type.vector.Vector3Int; -import com.dfsek.terra.api.util.function.FunctionUtils; import com.dfsek.terra.api.util.generic.data.types.Maybe; import org.incendo.cloud.CommandManager; @@ -13,8 +12,6 @@ import org.incendo.cloud.description.Description; import org.incendo.cloud.parser.standard.IntegerParser; -import java.util.Optional; - import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -41,7 +38,7 @@ public class LocateCommandAddon implements AddonInitializer { private BaseAddon addon; private static Registry getBiomeRegistry(CommandContext sender) { - return sender.sender().getEntity().orThrow().world().getPack().getRegistry(Biome.class); + return sender.sender().entity().orThrow().world().getPack().getRegistry(Biome.class); } @Override @@ -69,7 +66,7 @@ public void initialize() { .handler(context -> { // 1. Gather Context & Arguments Biome targetBiome = context.get("biome"); - Entity sender = context.sender().getEntity().orThrow( + Entity sender = context.sender().entity().orThrow( () -> new Error("Only entities can run this command.")); World world = sender.world(); diff --git a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java index 9e60e90bc9..e10d7bf1dd 100644 --- a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java +++ b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java @@ -34,7 +34,7 @@ public class StructureCommandAddon implements AddonInitializer { private BaseAddon addon; private static Registry getStructureRegistry(CommandContext sender) { - return sender.sender().getEntity().orThrow().world().getPack().getRegistry(Structure.class); + return sender.sender().entity().orThrow().world().getPack().getRegistry(Structure.class); } @Override @@ -55,7 +55,7 @@ public void initialize() { .optional("rotation", EnumParser.enumParser(Rotation.class), DefaultValue.constant(Rotation.NONE)) .handler(context -> { Structure structure = context.get("structure"); - Entity sender = context.sender().getEntity().orThrow(); + Entity sender = context.sender().entity().orThrow(); structure.generate( sender.position().toInt(), sender.world(), diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java index 43128f137a..07a959a11b 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java @@ -55,7 +55,7 @@ public TerraFlora(List layers, boolean physics, boolean ceiling, private void test(EnumSet faces, Direction f, Vector3Int b, WritableWorld world) { if(testRotation.contains( - world.getBlockState(b.getX() + f.getModX(), b.getY() + f.getModY(), b.getZ() + f.getModZ()).getBlockType())) + world.getBlockState(b.getX() + f.getModX(), b.getY() + f.getModY(), b.getZ() + f.getModZ()).blockType())) faces.add(f); } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java index 673d28ce16..b7a0ce0f9f 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/AirMatchPatternTemplate.java @@ -24,6 +24,6 @@ public class AirMatchPatternTemplate implements ObjectTemplate { @Override public Pattern get() { - return new MatchPattern(offset, BlockState::isAir); + return new MatchPattern(offset, BlockState::air); } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java index cf97dc5583..6c47604062 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/BlockSetMatchPatternTemplate.java @@ -26,6 +26,6 @@ public class BlockSetMatchPatternTemplate implements ObjectTemplate { @Override public Pattern get() { - return new MatchPattern(offset, blockState -> blocks.contains(blockState.getBlockType())); + return new MatchPattern(offset, blockState -> blocks.contains(blockState.blockType())); } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java index ba5cb76b17..1ecfc94528 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/pattern/SolidMatchPatternTemplate.java @@ -21,6 +21,6 @@ public class SolidMatchPatternTemplate implements ObjectTemplate { @Override public Pattern get() { - return new MatchPattern(offset, blockState -> blockState.getBlockType().isSolid()); + return new MatchPattern(offset, blockState -> blockState.blockType().solid()); } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java index 4eafba82cc..af87653784 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/SurfaceLocator.java @@ -28,7 +28,7 @@ public BinaryColumn getSuitableCoordinates(Column column) { int min = Math.max(search.getMin(), column.getMinY()); if(min >= max) return builder.build(); for(int y = min; y < max; y++) { - if(column.getBlock(y).isAir() && !column.getBlock(y - 1).isAir()) { + if(column.getBlock(y).air() && !column.getBlock(y - 1).air()) { builder.set(y); } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java index ec8890fda8..d33c166c99 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java @@ -23,7 +23,7 @@ public TopLocator(Range search) { @Override public BinaryColumn getSuitableCoordinates(Column column) { for(int y = search.getMax(); y >= search.getMin(); y--) { - if(column.getBlock(y).isAir() && !column.getBlock(y - 1).isAir()) { + if(column.getBlock(y).air() && !column.getBlock(y - 1).air()) { return new BinaryColumn(y, y + 1, yi -> true); } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java index be19715295..39139b1229 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java @@ -149,7 +149,7 @@ public boolean generate(Vector3Int location, WritableWorld world, RandomGenerato if(!visited.get(index)) { // Skip blocks that have already been visited visited.set(index); - BlockType block = world.getBlockState(xi, yi, zi).getBlockType(); + BlockType block = world.getBlockState(xi, yi, zi).blockType(); if(shouldPlace(getReplaceable(), block, exposed, random, world, xi, yi, zi)) { world.setBlockState(xi, yi, zi, getMaterial(block), isApplyGravity()); ++blockCount; diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java index 9f7e701684..403f6de242 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaScatteredOre.java @@ -31,7 +31,7 @@ public boolean generate(Vector3Int location, WritableWorld world, RandomGenerato for(int j = 0; j < i; ++j) { this.setPos(mutable, random, location, Math.min(j, spread)); - BlockType block = world.getBlockState(mutable).getBlockType(); + BlockType block = world.getBlockState(mutable).blockType(); if(shouldPlace(getReplaceable(), block, exposed, random, world, mutable.getX(), mutable.getY(), mutable.getZ())) { world.setBlockState(mutable, getMaterial(block), isApplyGravity()); } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java index 993d808ef9..f430d2c025 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/utils/VanillaOreUtils.java @@ -21,12 +21,12 @@ public static boolean shouldPlace(BlockStateSet replaceable, BlockType type, Dou if(!replaceable.contains(type)) return false; if(shouldExpose(random, exposedChance)) return true; // Exposed blocks can be placed regardless of adjacency to air // Adjacency is checked after determining not exposed rather than vice-versa, assuming block checks are more expensive - boolean adjacentAir = world.getBlockState(x, y, z - 1).isAir() || - world.getBlockState(x, y, z + 1).isAir() || - world.getBlockState(x, y - 1, z).isAir() || - world.getBlockState(x, y + 1, z).isAir() || - world.getBlockState(x - 1, y, z).isAir() || - world.getBlockState(x + 1, y, z).isAir(); + boolean adjacentAir = world.getBlockState(x, y, z - 1).air() || + world.getBlockState(x, y, z + 1).air() || + world.getBlockState(x, y - 1, z).air() || + world.getBlockState(x, y + 1, z).air() || + world.getBlockState(x - 1, y, z).air() || + world.getBlockState(x + 1, y, z).air(); return !adjacentAir; // Exposed check did not pass earlier so only blocks not adjacent air should place } } diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java index c267dc9188..60754c44f6 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java @@ -66,12 +66,12 @@ public void initialize() { } @Override - public Map getDependencies() { + public Map dependencies() { return manifest.getDependencies(); } @Override - public Version getVersion() { + public Version version() { return manifest.getVersion(); } } diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java index 92671ac481..eacd7b4700 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java @@ -132,7 +132,7 @@ public String getID() { } @Override - public Version getVersion() { + public Version version() { return VERSION; } } diff --git a/common/addons/shortcut-blockstate-fallback/src/main/resources/terra.addon.yml b/common/addons/shortcut-blockstate-fallback/src/main/resources/terra.addon.yml index c7c92d787b..f0722c16b2 100644 --- a/common/addons/shortcut-blockstate-fallback/src/main/resources/terra.addon.yml +++ b/common/addons/shortcut-blockstate-fallback/src/main/resources/terra.addon.yml @@ -4,7 +4,7 @@ contributors: id: shortcut-blockstate-fallback version: @VERSION@ entrypoints: - - "com.dfsek.terra.addons.shortcut.blockstate.ShortcutBlockstateFallbackAddon" + - "com.dfsek.terra.addons.shortcut.blockstate.ShortcutBlockStateFallbackAddon" website: issues: https://github.com/PolyhedralDev/Terra/issues source: https://github.com/PolyhedralDev/Terra diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index 128647bd33..e8e4665889 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java @@ -76,7 +76,7 @@ void setBlock(ImplementationArguments implementationArguments, Scope scope, y.apply(implementationArguments, scope).doubleValue(), FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()); BlockState current = arguments.getWorld().getBlockState(set); - if(overwrite.apply(implementationArguments, scope) || current.isAir()) { + if(overwrite.apply(implementationArguments, scope) || current.air()) { arguments.getWorld().setBlockState(set, rot, physics.apply(implementationArguments, scope)); } } catch(RuntimeException e) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java index 66f2e30c5c..5df4ff074e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java @@ -45,7 +45,7 @@ public String apply(ImplementationArguments implementationArguments, Scope scope .add(Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope) .doubleValue(), FloatingPointFunctions.round(xz.getZ())))) - .getAsString(); + .asString(); if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties else return data; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java index 49141a6580..bb2646aba0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java @@ -48,7 +48,7 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) Vector3.Mutable mutable = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()); while(mutable.getY() > arguments.getWorld().getMinHeight()) { - if(!arguments.getWorld().getBlockState(mutable).isAir()) { + if(!arguments.getWorld().getBlockState(mutable).air()) { arguments.getWorld().setBlockState(mutable, data); break; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java b/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java index fef8829158..d4ba30abd2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java @@ -31,7 +31,7 @@ default void initialize() { } * * @return Map of dependency ID to {@link VersionRange} of dependency */ - default Map getDependencies() { + default Map dependencies() { return Collections.emptyMap(); } @@ -40,9 +40,9 @@ default Map getDependencies() { * * @return Version of addon */ - Version getVersion(); + Version version(); - default String getNamespace() { + default String namespace() { return getID(); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java b/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java index 01371f9a74..3c81724085 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java @@ -20,19 +20,19 @@ public interface BlockType extends Handle { * * @return Default block state */ - BlockState getDefaultState(); + BlockState defaultState(); /** * Get whether this block is solid. * * @return Whether this block is solid. */ - boolean isSolid(); + boolean solid(); /** * Get whether this block is water. * * @return Whether this block is water. */ - boolean isWater(); + boolean water(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java index 47086f49b4..837e69e779 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java @@ -23,7 +23,7 @@ public interface BlockState extends Handle, Extendable { /** * Whether this {@link BlockState} matches another. *

- * "matches" is defined as this {@link BlockState} holding a matching {@link #getBlockType()}. + * "matches" is defined as this {@link BlockState} holding a matching {@link #blockType()}. * * @param other Other {@link BlockState} * @@ -90,15 +90,15 @@ default > BlockState setIfPresent(Property property, * * @return Block type. */ - BlockType getBlockType(); + BlockType blockType(); /** * Get this state and its properties as a String * * @return String representation of this state */ - default String getAsString() { - return getAsString(true); + default String asString() { + return asString(true); } /** @@ -108,12 +108,12 @@ default String getAsString() { * * @return String representation of this state */ - String getAsString(boolean properties); + String asString(boolean properties); /** * Get whether this BlockState is air * * @return Whether this state is air */ - boolean isAir(); + boolean air(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockStateExtended.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockStateExtended.java index 1e0617119b..b1a3adf1eb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockStateExtended.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/BlockStateExtended.java @@ -9,7 +9,7 @@ public interface BlockStateExtended extends BlockState { * * @return BlockData of this BlockStateExtended */ - ExtendedData getData(); + ExtendedData data(); /** * Sets the BlockData. @@ -25,8 +25,8 @@ public interface BlockStateExtended extends BlockState { * * @return Raw BlockState of this BlockStateExtended */ - BlockState getState(); + BlockState state(); @Override - default boolean isExtended() { return true; } + default boolean extended() { return true; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java index 9172270ec5..5a116ce1de 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java @@ -16,7 +16,7 @@ public interface CommandSender extends Handle { void sendMessage(String message); - Maybe getEntity(); + Maybe entity(); - Maybe getPlayer(); + Maybe player(); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java index 735b533a41..e4af427d20 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java @@ -1,7 +1,5 @@ package com.dfsek.terra.api.command.arguments; -import com.dfsek.terra.api.util.generic.data.types.Maybe; - import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.component.CommandComponent; @@ -14,7 +12,6 @@ import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; @@ -103,15 +100,19 @@ private RegistryArgumentParser(Function, Registry> registry Registry registry = registryFunction.apply(commandContext); String finalInput = input; - return registry.get(RegistryKey.parse(input)) - .map(ArgumentParseResult::success) - .orJust(() -> - registry.getByID(finalInput).collect( - left -> ArgumentParseResult.failure(new IllegalArgumentException(left)), - ArgumentParseResult::success - )) - .get(() -> ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + finalInput))); + try { + return registry.get(RegistryKey.parse(input)) + .map(ArgumentParseResult::success) + .orJust(() -> + registry.getByID(finalInput).collect( + left -> ArgumentParseResult.failure(new IllegalArgumentException(left)), + ArgumentParseResult::success + )) + .get(() -> ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + finalInput))); + } catch(IllegalArgumentException e) { + return ArgumentParseResult.failure(e); + } } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/data/Extendable.java b/common/api/src/main/java/com/dfsek/terra/api/data/Extendable.java index 76303b505d..d79096fa85 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/data/Extendable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/data/Extendable.java @@ -7,5 +7,5 @@ public interface Extendable { * * @return Whether this state is extended. */ - default boolean isExtended() { return false; } + default boolean extended() { return false; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/entity/EntityTypeExtended.java b/common/api/src/main/java/com/dfsek/terra/api/entity/EntityTypeExtended.java index 5fdec1b420..43f5be7861 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/entity/EntityTypeExtended.java +++ b/common/api/src/main/java/com/dfsek/terra/api/entity/EntityTypeExtended.java @@ -28,5 +28,5 @@ public interface EntityTypeExtended extends EntityType { EntityType getType(); @Override - default boolean isExtended() { return true; } + default boolean extended() { return true; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java b/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java new file mode 100644 index 0000000000..2bb27b2ecb --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.error; + +import com.dfsek.terra.api.util.generic.data.types.Either; + + +public interface Invalid { + String message(); + + default Either left() { + return Either.left(this); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/error/InvalidBlockStateError.java b/common/api/src/main/java/com/dfsek/terra/api/error/InvalidBlockStateError.java new file mode 100644 index 0000000000..b32d959658 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/error/InvalidBlockStateError.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.error; + +public record InvalidBlockStateError(Exception exception) implements Invalid { + @Override + public String message() { + return exception.getMessage(); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java b/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java index 862791471e..d7bfe371cb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java +++ b/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java @@ -7,6 +7,9 @@ package com.dfsek.terra.api.handle; +import com.dfsek.terra.api.error.Invalid; +import com.dfsek.terra.api.util.generic.data.types.Either; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -20,7 +23,7 @@ public interface WorldHandle { @NotNull @Contract("_ -> new") - BlockState createBlockState(@NotNull String data); + Either createBlockState(@NotNull String data); @NotNull @Contract(pure = true) diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/key/Keyed.java b/common/api/src/main/java/com/dfsek/terra/api/registry/key/Keyed.java index 3ab262ca66..d6d9b0489c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/key/Keyed.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/key/Keyed.java @@ -5,8 +5,8 @@ public interface Keyed> extends Namespaced, StringIdentifiabl RegistryKey getRegistryKey(); @Override - default String getNamespace() { - return getRegistryKey().getNamespace(); + default String namespace() { + return getRegistryKey().namespace(); } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/key/Namespaced.java b/common/api/src/main/java/com/dfsek/terra/api/registry/key/Namespaced.java index 2e0f2f92ce..e3f38f20b2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/key/Namespaced.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/key/Namespaced.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.registry.key; public interface Namespaced { - String getNamespace(); + String namespace(); default RegistryKey key(String id) { - return RegistryKey.of(getNamespace(), id); + return RegistryKey.of(namespace(), id); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java b/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java index ebcf4b0a49..14c8709388 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java @@ -41,7 +41,7 @@ public static RegistryKey of(String namespace, String id) { } @Override - public String getNamespace() { + public String namespace() { return namespace; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/collection/BlockStateSet.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/BlockStateSet.java index a23c6ea0f6..5b4a4056a2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/collection/BlockStateSet.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/collection/BlockStateSet.java @@ -46,7 +46,7 @@ public static BlockStateSet empty() { } private void add(BlockState data) { - add(data.getBlockType()); + add(data.blockType()); } private static final class Singleton extends BlockStateSet { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 3b7ecfb634..cbd981f75c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -49,10 +49,10 @@ default Maybe ifNothing(Runnable r) { return this; } - default Maybe overwrite(Maybe m) { - return bind(ignore -> m); - } + /** + * Project a new value into this Maybe if it is Nothing. + */ Maybe or(Supplier> or); default Maybe orJust(Supplier or) { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java index aae1bc3ad5..bfe507b3f1 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -274,7 +274,7 @@ protected InternalAddon loadAddons() { .append("- ") .append(addon.getID()) .append("@") - .append(addon.getVersion().getFormatted()); + .append(addon.version().getFormatted()); } logger.info(builder.toString()); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/addon/DependencySorter.java b/common/implementation/base/src/main/java/com/dfsek/terra/addon/DependencySorter.java index 36b0a1faf7..a2e9d412ad 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/addon/DependencySorter.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/addon/DependencySorter.java @@ -41,13 +41,13 @@ public void add(BaseAddon addon) { } private void sortDependencies(BaseAddon addon, List sort) { - addon.getDependencies().forEach((id, range) -> { + addon.dependencies().forEach((id, range) -> { BaseAddon dependency = get(id, addon); - if(!range.isSatisfiedBy(dependency.getVersion())) { + if(!range.isSatisfiedBy(dependency.version())) { throw new DependencyVersionException( "Addon " + addon.getID() + " specifies dependency on " + id + ", versions " + range.getFormatted() + - ", but non-matching version " + dependency.getVersion().getFormatted() + " is installed."); + ", but non-matching version " + dependency.version().getFormatted() + " is installed."); } if(!visited.get(dependency.getID())) { // if we've not visited it yet @@ -63,14 +63,14 @@ private void sortDependencies(BaseAddon addon, List sort) { private BaseAddon get(String id, BaseAddon addon) { if(!addons.containsKey(id)) { throw new DependencyException("Addon " + addon.getID() + " specifies dependency on " + id + ", versions " + - addon.getDependencies().get(id).getFormatted() + + addon.dependencies().get(id).getFormatted() + ", but no such addon is installed."); } return addons.get(id); } private void checkDependencies(BaseAddon base, BaseAddon current) { - current.getDependencies().forEach((id, range) -> { + current.dependencies().forEach((id, range) -> { BaseAddon dependency = get(id, current); if(dependency.getID().equals(base.getID())) { throw new CircularDependencyException( diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/addon/EphemeralAddon.java b/common/implementation/base/src/main/java/com/dfsek/terra/addon/EphemeralAddon.java index cdc73a654e..352760ecce 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/addon/EphemeralAddon.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/addon/EphemeralAddon.java @@ -15,7 +15,7 @@ public EphemeralAddon(Version version, String id) { } @Override - public Version getVersion() { + public Version version() { return version; } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java b/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java index 1e013e8706..626d4bf022 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/addon/InternalAddon.java @@ -36,7 +36,7 @@ public String getID() { } @Override - public Version getVersion() { + public Version version() { return VERSION; } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index d1ec057351..8bf0772075 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -61,7 +61,7 @@ public void register(TypeRegistry registry) { if(platform != null) { registry.registerLoader(BaseAddon.class, platform.getAddons()) .registerLoader(BlockType.class, (type, object, configLoader, depthTracker) -> platform - .getWorldHandle().createBlockState((String) object).getBlockType()) + .getWorldHandle().createBlockState((String) object).blockType()) .registerLoader(BlockState.class, (type, object, configLoader, depthTracker) -> platform .getWorldHandle().createBlockState((String) object)); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java index 67f9846461..2d8f26985b 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/event/FunctionalEventHandlerImpl.java @@ -59,7 +59,7 @@ public void handle(Event event) { throw e; // Rethrow if it's fail-through. // else warn logger.warn("Exception occurred during event handling. Report this to the maintainers of {}@{}", - context.getAddon().getID(), context.getAddon().getVersion().getFormatted(), e); + context.getAddon().getID(), context.getAddon().version().getFormatted(), e); } }); } diff --git a/common/implementation/bootstrap-addon-loader/src/main/java/com/dfsek/terra/addon/BootstrapAddonLoader.java b/common/implementation/bootstrap-addon-loader/src/main/java/com/dfsek/terra/addon/BootstrapAddonLoader.java index 98bdc8a4b4..c7d5461881 100644 --- a/common/implementation/bootstrap-addon-loader/src/main/java/com/dfsek/terra/addon/BootstrapAddonLoader.java +++ b/common/implementation/bootstrap-addon-loader/src/main/java/com/dfsek/terra/addon/BootstrapAddonLoader.java @@ -63,7 +63,7 @@ private BootstrapBaseAddon loadAddon(Path addonPath, BootstrapAddonClassLoade } logger.debug("Loaded bootstrap addon {}@{} with entry point {}", - addon.getID(), addon.getVersion().getFormatted(), addonObject.getClass()); + addon.getID(), addon.version().getFormatted(), addonObject.getClass()); return addon; } catch(InvocationTargetException e) { throw new AddonLoadException("Exception occurred while instantiating addon", e); @@ -103,7 +103,7 @@ public String getID() { } @Override - public Version getVersion() { + public Version version() { return VERSION; } } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java index 29f0c38250..9906f28329 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockState.java @@ -48,17 +48,17 @@ public > com.dfsek.terra.api.block.state.BlockState set( } @Override - public BlockType getBlockType() { + public BlockType blockType() { return new AllayBlockType(allayBlockState.getBlockType()); } @Override - public String getAsString(boolean properties) { + public String asString(boolean properties) { return jeBlockState.toString(properties); } @Override - public boolean isAir() { + public boolean air() { return allayBlockState.getBlockType() == BlockTypes.AIR; } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java index 1585be9561..67f3645f27 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/delegate/AllayBlockType.java @@ -12,17 +12,17 @@ */ public record AllayBlockType(BlockType allayBlockType) implements com.dfsek.terra.api.block.BlockType { @Override - public BlockState getDefaultState() { + public BlockState defaultState() { return new AllayBlockState(allayBlockType.getDefaultState(), Mapping.blockStateBeToJe(allayBlockType.getDefaultState())); } @Override - public boolean isSolid() { + public boolean solid() { return allayBlockType.getDefaultState().getBlockStateData().isSolid(); } @Override - public boolean isWater() { + public boolean water() { return allayBlockType.hasBlockTag(BlockTags.WATER); } diff --git a/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java b/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java index fd4d643bcb..320a13e572 100644 --- a/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java +++ b/platforms/allay/src/main/java/com/dfsek/terra/allay/handle/AllayWorldHandle.java @@ -1,5 +1,8 @@ package com.dfsek.terra.allay.handle; +import com.dfsek.terra.api.error.Invalid; +import com.dfsek.terra.api.error.InvalidBlockStateError; +import com.dfsek.terra.api.util.generic.data.types.Either; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.allay.JeBlockState; @@ -16,9 +19,13 @@ public class AllayWorldHandle implements WorldHandle { @Override - public @NotNull BlockState createBlockState(@NotNull String data) { - JeBlockState jeBlockState = JeBlockState.fromString(data); - return new AllayBlockState(Mapping.blockStateJeToBe(jeBlockState), jeBlockState); + public @NotNull Either createBlockState(@NotNull String data) { + try { + JeBlockState jeBlockState = JeBlockState.fromString(data); + return Either.right(new AllayBlockState(Mapping.blockStateJeToBe(jeBlockState), jeBlockState)); + } catch(Exception e) { + return new InvalidBlockStateError(e).left(); + } } @Override diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java index 1fba7bda8b..dda6b4c3a9 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/BukkitAddon.java @@ -28,7 +28,7 @@ public void initialize() { } @Override - public Version getVersion() { + public Version version() { return VERSION; } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java index a4077eaccc..06fb94b9c0 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/CloudCommandSender.java @@ -26,7 +26,7 @@ public void sendMessage(String message) { } @Override - public Maybe getEntity() { + public Maybe entity() { if(delegate instanceof org.bukkit.entity.Entity entity) { return Maybe.just(BukkitAdapter.adapt(entity)); } @@ -34,7 +34,7 @@ public Maybe getEntity() { } @Override - public Maybe getPlayer() { + public Maybe player() { if(delegate instanceof org.bukkit.entity.Player player) { return Maybe.just(BukkitAdapter.adapt(player)); } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java index 0136d4389a..e241443ad1 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java @@ -17,6 +17,9 @@ package com.dfsek.terra.bukkit.handles; +import com.dfsek.terra.api.error.Invalid; +import com.dfsek.terra.api.error.InvalidBlockStateError; +import com.dfsek.terra.api.util.generic.data.types.Either; import org.bukkit.Bukkit; import org.bukkit.Material; import org.jetbrains.annotations.NotNull; @@ -39,10 +42,14 @@ public BukkitWorldHandle() { } @Override - public synchronized @NotNull BlockState createBlockState(@NotNull String data) { - org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData( - data); // somehow bukkit managed to make this not thread safe! :) - return BukkitBlockState.newInstance(bukkitData); + public synchronized @NotNull Either createBlockState(@NotNull String data) { + try { + org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData( + data); // somehow bukkit managed to make this not thread safe! :) + return Either.right(BukkitBlockState.newInstance(bukkitData)); + } catch(Exception e) { + return new InvalidBlockStateError(e).left(); + } } @Override diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java index 6d442343b9..55d57f5a57 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockTypeAndItem.java @@ -39,17 +39,17 @@ public Material getHandle() { } @Override - public BlockState getDefaultState() { + public BlockState defaultState() { return BukkitAdapter.adapt(delegate.createBlockData()); } @Override - public boolean isSolid() { + public boolean solid() { return delegate.isOccluding(); } @Override - public boolean isWater() { + public boolean water() { return delegate == Material.WATER; } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java index 492f531931..b00bb0c6e3 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockState.java @@ -61,17 +61,17 @@ public > BlockState set(Property property, T value) { } @Override - public BlockType getBlockType() { + public BlockType blockType() { return BukkitAdapter.adapt(delegate.getMaterial()); } @Override - public String getAsString(boolean properties) { + public String asString(boolean properties) { return delegate.getAsString(!properties); } @Override - public boolean isAir() { + public boolean air() { return delegate.getMaterial().isAir(); } } diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java index fea134c9ef..fef18f5a68 100644 --- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java @@ -98,6 +98,6 @@ public static Biome createBiome(Biome vanilla, VanillaBiomeProperties vanillaBio public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { return pack.getID() - .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); + .toLowerCase() + "/" + biomeID.namespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); } } diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockState.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockState.java index be21e7169d..248e2651c6 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockState.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockState.java @@ -64,17 +64,17 @@ public > BlockState set(Property property, T value) { } @Override - public BlockType getBlockType() { + public BlockType blockType() { return type; } @Override - public String getAsString(boolean properties) { + public String asString(boolean properties) { return value; } @Override - public boolean isAir() { + public boolean air() { return isAir; } diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java index 9f2bd12ebb..71772d0e5a 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java @@ -25,17 +25,17 @@ public String getHandle() { } @Override - public BlockState getDefaultState() { + public BlockState defaultState() { return defaultState.value(); } @Override - public boolean isSolid() { + public boolean solid() { return solid; } @Override - public boolean isWater() { + public boolean water() { return water; } } diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/handle/CLIWorldHandle.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/handle/CLIWorldHandle.java index c52181e728..1343d3fa24 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/handle/CLIWorldHandle.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/handle/CLIWorldHandle.java @@ -1,5 +1,7 @@ package com.dfsek.terra.cli.handle; +import com.dfsek.terra.api.error.Invalid; +import com.dfsek.terra.api.util.generic.data.types.Either; import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.block.state.BlockState; @@ -16,8 +18,8 @@ public static CLIBlockState getAIR() { } @Override - public @NotNull BlockState createBlockState(@NotNull String data) { - return new CLIBlockState(data); + public @NotNull Either createBlockState(@NotNull String data) { + return Either.right(new CLIBlockState(data)); } @Override diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/addon/MinestomAddon.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/addon/MinestomAddon.java index 1dc3bc0cc4..f7cb907af2 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/addon/MinestomAddon.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/addon/MinestomAddon.java @@ -36,7 +36,7 @@ public void initialize() { } @Override - public Version getVersion() { return VERSION; } + public Version version() { return VERSION; } @Override public String getID() { return "terra-minestom"; } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java index 6725e947fd..6967206511 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java @@ -114,12 +114,12 @@ public > BlockState set(Property property, T value) { } @Override - public BlockType getBlockType() { + public BlockType blockType() { return new MinestomBlockType(block); } @Override - public String getAsString(boolean properties) { + public String asString(boolean properties) { String name = block.key().asString(); if(!properties || block.properties().isEmpty()) { return name; @@ -132,7 +132,7 @@ public String getAsString(boolean properties) { } @Override - public boolean isAir() { + public boolean air() { return block.isAir(); } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java index e8602306f0..805e66b837 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockType.java @@ -14,17 +14,17 @@ public MinestomBlockType(Block block) { } @Override - public BlockState getDefaultState() { + public BlockState defaultState() { return new MinestomBlockState(block); } @Override - public boolean isSolid() { + public boolean solid() { return block.isSolid(); } @Override - public boolean isWater() { + public boolean water() { return block.isLiquid(); } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java index 3ff92ccf6a..8f08ac2488 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomWorldHandle.java @@ -1,5 +1,8 @@ package com.dfsek.terra.minestom.world; +import com.dfsek.terra.api.error.Invalid; +import com.dfsek.terra.api.error.InvalidBlockStateError; +import com.dfsek.terra.api.util.generic.data.types.Either; import net.minestom.server.instance.block.Block; import org.jetbrains.annotations.NotNull; @@ -14,8 +17,12 @@ public class MinestomWorldHandle implements WorldHandle { private static final MinestomBlockState AIR = new MinestomBlockState(Block.AIR); @Override - public @NotNull BlockState createBlockState(@NotNull String data) { - return MinestomBlockState.fromStateId(data); + public @NotNull Either createBlockState(@NotNull String data) { + try { + return Either.right(MinestomBlockState.fromStateId(data)); + } catch(Exception e) { + return new InvalidBlockStateError(e).left(); + } } @Override diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java index 4586dce2aa..f15cd6aee4 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/MinecraftAddon.java @@ -76,7 +76,7 @@ public void initialize() { } @Override - public Version getVersion() { + public Version version() { return VERSION; } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java index b1dc66b172..cbb7d13493 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/data/Codecs.java @@ -18,7 +18,7 @@ public final class Codecs { public static final Codec TERRA_REGISTRY_KEY = RecordCodecBuilder .create(registryKey -> registryKey.group(Codec.STRING.fieldOf("namespace") .stable() - .forGetter(RegistryKey::getNamespace), + .forGetter(RegistryKey::namespace), Codec.STRING.fieldOf("id") .stable() .forGetter(RegistryKey::getID)) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java index 4a19a6c85b..1a11879e26 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java @@ -138,11 +138,11 @@ private void beard(StructureAccessor structureAccessor, Chunk chunk, WorldProper com.dfsek.terra.api.block.state.BlockState data = delegate.getPalette(x + xi, y, z + zi, world, biomeProvider).get( depth, x + xi, y, z + zi, world.getSeed()); BlockPos blockPos = new BlockPos(x, y, z); - boolean isExtended = data.isExtended() && data.getClass().equals(BlockStateArgument.class); + boolean isExtended = data.extended() && data.getClass().equals(BlockStateArgument.class); if(isExtended) { BlockStateExtended blockStateExtended = (BlockStateExtended) data; - net.minecraft.block.BlockState blockState = (net.minecraft.block.BlockState) blockStateExtended.getState(); + net.minecraft.block.BlockState blockState = (net.minecraft.block.BlockState) blockStateExtended.state(); chunk.setBlockState(blockPos, blockState, 0); } else { chunk.setBlockState(blockPos, (net.minecraft.block.BlockState) data, 0); @@ -196,7 +196,7 @@ public int getHeight(int x, int z, Type heightmap, HeightLimitView height, Noise for(int y = height.getTopYInclusive() - 1; y >= min; y--) { com.dfsek.terra.api.block.state.BlockState terraBlockState = delegate.getBlock(properties, x, y, z, biomeProvider); BlockState blockState = - (BlockState) (terraBlockState.isExtended() ? ((BlockStateExtended) terraBlockState).getState() : terraBlockState); + (BlockState) (terraBlockState.extended() ? ((BlockStateExtended) terraBlockState).state() : terraBlockState); if(heightmap .getBlockPredicate() .test(blockState)) return y + 1; @@ -212,7 +212,7 @@ public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView height, for(int y = height.getTopYInclusive() - 1; y >= height.getBottomY(); y--) { com.dfsek.terra.api.block.state.BlockState terraBlockState = delegate.getBlock(properties, x, y, z, biomeProvider); BlockState blockState = - (BlockState) (terraBlockState.isExtended() ? ((BlockStateExtended) terraBlockState).getState() : terraBlockState); + (BlockState) (terraBlockState.extended() ? ((BlockStateExtended) terraBlockState).state() : terraBlockState); array[y - height.getBottomY()] = blockState; } return new VerticalBlockSample(height.getBottomY(), array); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java index b42b866e74..552897ef5b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java @@ -17,6 +17,9 @@ package com.dfsek.terra.mod.handle; +import com.dfsek.terra.api.error.Invalid; +import com.dfsek.terra.api.error.InvalidBlockStateError; +import com.dfsek.terra.api.util.generic.data.types.Either; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.BlockEntityProvider; @@ -51,7 +54,7 @@ public class MinecraftWorldHandle implements WorldHandle { @SuppressWarnings("DataFlowIssue") @Override - public @NotNull BlockState createBlockState(@NotNull String data) { + public @NotNull Either createBlockState(@NotNull String data) { try { BlockResult blockResult = BlockArgumentParser.block(Registries.BLOCK, data, true); BlockState blockState; @@ -76,10 +79,10 @@ public class MinecraftWorldHandle implements WorldHandle { blockState = (BlockState) blockResult.blockState(); } - if(blockState == null) throw new IllegalArgumentException("Invalid data: " + data); - return blockState; + if(blockState == null) return new InvalidBlockStateError(new IllegalArgumentException("Invalid data: " + data)).left(); + return Either.right(blockState); } catch(CommandSyntaxException e) { - throw new IllegalArgumentException(e); + return new InvalidBlockStateError(e).left(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/BlockMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/BlockMixin.java index 1665b2b8c0..d60c8a9094 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/BlockMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/BlockMixin.java @@ -29,16 +29,16 @@ @Mixin(Block.class) @Implements(@Interface(iface = BlockType.class, prefix = "terra$")) public abstract class BlockMixin { - public com.dfsek.terra.api.block.state.BlockState terra$getDefaultState() { + public com.dfsek.terra.api.block.state.BlockState terra$defaultState() { return (com.dfsek.terra.api.block.state.BlockState) ((Block) (Object) this).getDefaultState(); } - public boolean terra$isSolid() { + public boolean terra$solid() { return ((Block) (Object) this).getDefaultState().isOpaque(); } @SuppressWarnings("ConstantConditions") - public boolean terra$isWater() { + public boolean terra$water() { return ((Object) this) == Blocks.WATER; } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java index 4335f67ce0..d2cbcacc0c 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java @@ -68,7 +68,7 @@ private MobSpawnerBlockEntityMixin(BlockEntityType type, BlockPos pos, BlockS rand = Random.create(); } net.minecraft.entity.EntityType entityType = - (((net.minecraft.entity.EntityType) (creatureType.isExtended() && creatureType.getClass().equals( + (((net.minecraft.entity.EntityType) (creatureType.extended() && creatureType.getClass().equals( MinecraftEntityTypeExtended.class) ? ((MinecraftEntityTypeExtended) creatureType).getType() : creatureType))); setEntityType(entityType, rand); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java index 2798f05081..acf91ee558 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java @@ -57,17 +57,17 @@ public abstract class BlockStateArgumentMixin implements Predicate terra$getEntity() { - return Optional.ofNullable((Entity) getEntity()); + public Maybe terra$entity() { + return Maybe.ofNullable((Entity) getEntity()); } - public Optional terra$getPlayer() { + public Maybe terra$player() { try { - return Optional.ofNullable((Player) getPlayer()); + return Maybe.ofNullable((Player) getPlayer()); } catch(CommandSyntaxException e) { - return Optional.empty(); + return Maybe.nothing(); } } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java index 1c34c6a4d3..7939410f97 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java @@ -102,7 +102,7 @@ public void injectConstructor(net.minecraft.server.world.ServerWorld world, Boun state = arg.getBlockState(); setBlockState(blockPos, state, flags); net.minecraft.world.chunk.Chunk chunk = getChunk(blockPos); - NbtCompound nbt = ((NbtCompound) (Object) ((BlockStateExtended) data).getData()); + NbtCompound nbt = ((NbtCompound) (Object) ((BlockStateExtended) data).data()); MinecraftUtil.loadBlockEntity(chunk, world, blockPos, state, nbt); } else { state = (net.minecraft.block.BlockState) data; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java index fdba31a503..21c25a2306 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java @@ -101,7 +101,7 @@ protected ServerWorldMixin(MutableWorldProperties properties, RegistryKey state = arg.getBlockState(); setBlockState(blockPos, state, flags); net.minecraft.world.chunk.Chunk chunk = getWorldChunk(blockPos); - ((WorldChunkAccessor) chunk).invokeLoadBlockEntity(blockPos, ((NbtCompound) (Object) ((BlockStateExtended) data).getData())); + ((WorldChunkAccessor) chunk).invokeLoadBlockEntity(blockPos, ((NbtCompound) (Object) ((BlockStateExtended) data).data())); } else { state = (net.minecraft.block.BlockState) data; setBlockState(blockPos, state, flags); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java index fc8304d097..9fdf03b02f 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/BiomeUtil.java @@ -103,7 +103,7 @@ public static Biome createBiome(Biome vanilla, VanillaBiomeProperties vanillaBio public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { return pack.getID() - .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); + .toLowerCase() + "/" + biomeID.namespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); } public static Map> getTerraBiomeMap() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java index 076745ce8c..e13371a0dc 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java @@ -80,7 +80,7 @@ public static void schedulePhysics(BlockState blockState, BlockPos blockPos, Tic } public static boolean isCompatibleBlockStateExtended(com.dfsek.terra.api.block.state.BlockState blockState) { - return blockState.isExtended() && BlockStateArgument.class.isAssignableFrom(blockState.getClass()); + return blockState.extended() && BlockStateArgument.class.isAssignableFrom(blockState.getClass()); } //[Vanilla Copy] @@ -103,7 +103,7 @@ public static void loadBlockEntity(Chunk chunk, World world, BlockPos blockPos, } public static boolean isCompatibleEntityTypeExtended(EntityType entityType) { - return entityType.isExtended() && MinecraftEntityTypeExtended.class.isAssignableFrom(entityType.getClass()); + return entityType.extended() && MinecraftEntityTypeExtended.class.isAssignableFrom(entityType.getClass()); } public static void registerIntProviderTypes() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java index 1db7ade817..9a16c7231e 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java @@ -49,7 +49,7 @@ public static Pair createDefault(ConfigPack pack, ModPl Identifier generatorID = Identifier.tryParse( - "terra:" + pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( + "terra:" + pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.namespace().toLowerCase( Locale.ROOT)); PRESETS.add(Pair.of(generatorID, extended)); @@ -74,7 +74,7 @@ public static Pair createMetaPackPreset(MetaPack metaPa platform.multiNoiseBiomeSourceParameterListRegistry(); Identifier generatorID = Identifier.of("terra", - metaPack.getID().toLowerCase(Locale.ROOT) + "/" + metaPack.getNamespace().toLowerCase( + metaPack.getID().toLowerCase(Locale.ROOT) + "/" + metaPack.namespace().toLowerCase( Locale.ROOT)); PRESETS.add(Pair.of(generatorID, extended)); From c4a366112ec34580ae1c96c479893a5bd6be2614 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 22:33:07 -0700 Subject: [PATCH 18/47] refactor createBlockState to use new error API --- .../terra/addons/sponge/SpongeSchematicAddon.java | 5 ++++- .../terrascript/script/functions/BlockFunction.java | 13 +++++++++++-- .../terrascript/script/functions/PullFunction.java | 4 +++- .../java/com/dfsek/terra/api/error/Invalid.java | 4 ++++ .../java/com/dfsek/terra/config/GenericLoaders.java | 6 ++++-- .../dfsek/terra/minestom/TerraMinestomPlatform.java | 3 ++- 6 files changed, 28 insertions(+), 7 deletions(-) diff --git a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java index a5fe2d98b3..81392277d5 100644 --- a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java +++ b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java @@ -8,6 +8,9 @@ package com.dfsek.terra.addons.sponge; import com.dfsek.seismic.type.vector.Vector3Int; + +import com.dfsek.terra.api.error.Invalid; + import net.querz.nbt.io.NBTDeserializer; import net.querz.nbt.tag.ByteArrayTag; import net.querz.nbt.tag.CompoundTag; @@ -129,7 +132,7 @@ public SpongeStructure convert(InputStream in, String id) { for(int y = 0; y < hei; y++) { String block = data.get((int) arr[x + z * wid + y * wid * len]); if(block.startsWith("minecraft:structure_void")) continue; - states[x][z][y] = platform.getWorldHandle().createBlockState(block); + states[x][z][y] = platform.getWorldHandle().createBlockState(block).collectThrow(Invalid::toIllegal); } } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index e8e4665889..2b327f7e74 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java @@ -10,6 +10,10 @@ import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import com.dfsek.seismic.type.vector.Vector2; import com.dfsek.seismic.type.vector.Vector3; + +import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.api.handle.WorldHandle; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,7 +89,11 @@ void setBlock(ImplementationArguments implementationArguments, Scope scope, } protected BlockState getBlockState(ImplementationArguments arguments, Scope scope) { - return data.computeIfAbsent(blockData.apply(arguments, scope), platform.getWorldHandle()::createBlockState); + WorldHandle handle = platform.getWorldHandle(); + return data.computeIfAbsent(blockData.apply(arguments, scope), s -> handle.createBlockState(s).collect(left -> { + logger.error("Invalid block state \"" + s + "\": " + left.message()); + return handle.air(); + }, java.util.function.Function.identity())); } @@ -95,7 +103,8 @@ public static class Constant extends BlockFunction { public Constant(Returnable x, Returnable y, Returnable z, StringConstant blockData, Returnable overwrite, Returnable physics, Platform platform, Position position) { super(x, y, z, blockData, overwrite, physics, platform, position); - this.state = platform.getWorldHandle().createBlockState(blockData.getConstant()); + this.state = platform.getWorldHandle().createBlockState(blockData.getConstant()).collectThrow( + left -> new ParseException("Invalid block state: \"" + blockData.getConstant() + "\": " + left.message(), position)); } @Override diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java index bb2646aba0..3745ce3b7e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java @@ -33,7 +33,9 @@ public PullFunction(Returnable x, Returnable y, Returnable) data).getConstant()); + String constant = ((ConstantExpression) data).getConstant(); + this.data = platform.getWorldHandle().createBlockState(constant).collectThrow( + left -> new ParseException("Invalid block state: \"" + constant + "\": " + left.message(), position)); this.x = x; this.y = y; this.z = z; diff --git a/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java b/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java index 2bb27b2ecb..c5b01540d6 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java +++ b/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java @@ -9,4 +9,8 @@ public interface Invalid { default Either left() { return Either.left(this); } + + default IllegalArgumentException toIllegal() { + return new IllegalArgumentException(message()); + } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index 8bf0772075..58f5272ee0 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -24,6 +24,8 @@ import java.util.LinkedHashMap; +import com.dfsek.tectonic.api.exception.LoadException; + import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.block.BlockType; @@ -61,9 +63,9 @@ public void register(TypeRegistry registry) { if(platform != null) { registry.registerLoader(BaseAddon.class, platform.getAddons()) .registerLoader(BlockType.class, (type, object, configLoader, depthTracker) -> platform - .getWorldHandle().createBlockState((String) object).blockType()) + .getWorldHandle().createBlockState((String) object).collectThrow(left -> new LoadException(left.message(), depthTracker)).blockType()) .registerLoader(BlockState.class, (type, object, configLoader, depthTracker) -> platform - .getWorldHandle().createBlockState((String) object)); + .getWorldHandle().createBlockState((String) object).collectThrow(left -> new LoadException("Invalid BlockState \"" + object + "\": " + left.message(), depthTracker))); } } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java index c936167314..a85e912fc7 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java @@ -1,6 +1,7 @@ package com.dfsek.terra.minestom; import com.dfsek.tectonic.api.TypeRegistry; +import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.type.TypeLoader; import net.kyori.adventure.key.Key; import net.kyori.adventure.util.RGBLike; @@ -81,7 +82,7 @@ public void register(TypeRegistry registry) { .registerLoader(EntityType.class, (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> new MinestomEntityType((String) o)) .registerLoader(BlockState.class, - (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o)) + (TypeLoader) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o).collectThrow(left -> new LoadException("Invalid BlockState \"" + o + "\": " + left.message(), depthTracker))) .registerLoader(BiomeEffects.Particle.class, BiomeParticleConfigTemplate::new) .registerLoader(BiomeEffects.MoodSound.class, BiomeMoodSoundTemplate::new) .registerLoader(BiomeEffects.AdditionsSound.class, BiomeAdditionsSoundTemplate::new) From bdcd93f164434db6c161f8521be5c7d4ac0d547c Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 22:47:59 -0700 Subject: [PATCH 19/47] refactor some stuff to use new errors --- .../api/command/arguments/RegistryArgument.java | 2 +- .../com/dfsek/terra/api/error/InvalidLookup.java | 11 +++++++++++ .../com/dfsek/terra/api/registry/Registry.java | 15 +++++++++------ .../base/src/test/java/registry/RegistryTest.java | 6 ++++-- .../com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 4 +++- .../main/java/com/dfsek/terra/cli/TerraCLI.java | 5 ++++- .../minestom/api/TerraMinestomWorldBuilder.java | 4 +++- 7 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/error/InvalidLookup.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java index e4af427d20..ae1c38c452 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java @@ -105,7 +105,7 @@ private RegistryArgumentParser(Function, Registry> registry .map(ArgumentParseResult::success) .orJust(() -> registry.getByID(finalInput).collect( - left -> ArgumentParseResult.failure(new IllegalArgumentException(left)), + left -> ArgumentParseResult.failure(left.toIllegal()), ArgumentParseResult::success )) .get(() -> ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + finalInput))); diff --git a/common/api/src/main/java/com/dfsek/terra/api/error/InvalidLookup.java b/common/api/src/main/java/com/dfsek/terra/api/error/InvalidLookup.java new file mode 100644 index 0000000000..c32ee734b9 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/error/InvalidLookup.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.error; + +public interface InvalidLookup extends Invalid { + record NoSuchElement(String message) implements InvalidLookup { + + } + + record AmbiguousKey(String message) implements InvalidLookup { + + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index 432d296122..6296d536b0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -9,6 +9,9 @@ import com.dfsek.tectonic.api.loader.type.TypeLoader; +import com.dfsek.terra.api.error.InvalidLookup; +import com.dfsek.terra.api.error.InvalidLookup.AmbiguousKey; +import com.dfsek.terra.api.error.InvalidLookup.NoSuchElement; import com.dfsek.terra.api.util.generic.data.types.Either; import com.dfsek.terra.api.util.generic.data.types.Maybe; @@ -86,17 +89,17 @@ default Class getRawType() { return getType().getRawType(); } - default Either getByID(String id) { + default Either getByID(String id) { return getByID(id, map -> { - if(map.isEmpty()) return Either.left("No such element."); + if(map.isEmpty()) return Either.left(new NoSuchElement("No such value + \"" + id + "\"")); if(map.size() == 1) { return Either.right(map.values().stream().findFirst().get()); // only one value. } - return Either.left("ID \"" + id + "\" is ambiguous; matches: " + map + return Either.left(new AmbiguousKey("ID \"" + id + "\" is ambiguous; matches: " + map .keySet() .stream() .map(RegistryKey::toString) - .reduce("", (a, b) -> a + "\n - " + b)); + .reduce("", (a, b) -> a + "\n - " + b))); }); } @@ -106,9 +109,9 @@ default Collection getAllWithID(String id) { Map getMatches(String id); - default Either getByID(String attempt, Function, Either> reduction) { + default Either getByID(String attempt, Function, Either> reduction) { if(attempt.contains(":")) { - return get(RegistryKey.parse(attempt)).toEither("No such value."); + return get(RegistryKey.parse(attempt)).toEither(new NoSuchElement("No such value + \"" + attempt + "\"")); } return reduction.apply(getMatches(attempt)); } diff --git a/common/implementation/base/src/test/java/registry/RegistryTest.java b/common/implementation/base/src/test/java/registry/RegistryTest.java index ee4d9d050a..10ed433bfe 100644 --- a/common/implementation/base/src/test/java/registry/RegistryTest.java +++ b/common/implementation/base/src/test/java/registry/RegistryTest.java @@ -17,6 +17,8 @@ package registry; +import com.dfsek.terra.api.error.Invalid; +import com.dfsek.terra.api.error.InvalidLookup; import com.dfsek.terra.api.util.generic.data.types.Either; import org.junit.jupiter.api.Test; @@ -78,7 +80,7 @@ public void getID() { test.register(RegistryKey.parse("test:test"), "bazinga"); - assertEquals(test.getByID("test").collectThrow(RuntimeException::new), "bazinga"); + assertEquals(test.getByID("test").collectThrow(Invalid::toIllegal), "bazinga"); } @Test @@ -88,7 +90,7 @@ public void getIDAmbiguous() { test.registerChecked(RegistryKey.parse("test:test"), "bazinga"); test.registerChecked(RegistryKey.parse("test2:test"), "bazinga"); - Either result = test.getByID("test"); + Either result = test.getByID("test"); assertTrue(result.isLeft()); } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index d019da7cd8..a2b2720412 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -17,6 +17,8 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.error.Invalid; + import io.papermc.paper.threadedregions.scheduler.AsyncScheduler; import io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler; import org.bukkit.Bukkit; @@ -185,7 +187,7 @@ ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) { ConfigPack pack = platform.getConfigRegistry().getByID(id).collectThrow( left -> new IllegalArgumentException("No such config pack \"" + id + "\": " + left)); return pack.getGeneratorProvider().newInstance(pack); - }), platform.getRawConfigRegistry().getByID(id).collectThrow(RuntimeException::new), platform.getWorldHandle().air()); + }), platform.getRawConfigRegistry().getByID(id).collectThrow(Invalid::toIllegal), platform.getWorldHandle().air()); } public AsyncScheduler getAsyncScheduler() { diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java index 5463d44fd6..d817e385aa 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java @@ -1,6 +1,9 @@ package com.dfsek.terra.cli; import com.dfsek.seismic.type.vector.Vector2Int; + +import com.dfsek.terra.api.error.Invalid; + import net.querz.mca.MCAUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,7 +54,7 @@ public Integer call() { CLIPlatform platform = new CLIPlatform(); platform.getEventManager().callEvent(new PlatformInitializationEvent()); - ConfigPack generate = platform.getConfigRegistry().getByID(pack).collectThrow(RuntimeException::new); + ConfigPack generate = platform.getConfigRegistry().getByID(pack).collectThrow(Invalid::toIllegal); CLIWorld world = new CLIWorld(size, seed, maxHeight, minHeight, generate, noSave); diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index 19412a195c..887ca76770 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java @@ -1,5 +1,7 @@ package com.dfsek.terra.minestom.api; +import com.dfsek.terra.api.error.Invalid; + import net.minestom.server.instance.Instance; import net.minestom.server.registry.RegistryKey; import net.minestom.server.world.DimensionType; @@ -39,7 +41,7 @@ public TerraMinestomWorldBuilder pack(ConfigPack pack) { } public TerraMinestomWorldBuilder packById(String id) { - this.pack = platform.getConfigRegistry().getByID(id).collectThrow(RuntimeException::new); + this.pack = platform.getConfigRegistry().getByID(id).collectThrow(Invalid::toIllegal); return this; } From 1bbedf51b54b622250e81666db8b15444937c89b Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 29 Dec 2025 22:48:10 -0700 Subject: [PATCH 20/47] fix refactor in mixin --- .../terra/block/state/BlockStateArgumentMixin.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java index acf91ee558..83611bb12c 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java @@ -56,17 +56,17 @@ public abstract class BlockStateArgumentMixin implements Predicate Date: Mon, 29 Dec 2025 23:21:31 -0700 Subject: [PATCH 21/47] back ShortcutHolder with generic TypeLoader --- .../main/java/com/dfsek/terra/registry/ShortcutHolder.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java index 6678b053e0..080e3e1b1d 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java @@ -10,15 +10,14 @@ import java.util.HashMap; import java.util.Map; -import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.tectonic.ShortcutLoader; public class ShortcutHolder implements TypeLoader { private final Map> shortcuts = new HashMap<>(); - private final Registry back; + private final TypeLoader back; - public ShortcutHolder(Registry back) { + public ShortcutHolder(TypeLoader back) { this.back = back; } From efa4bf5bb43de67e194c428a75e2126ed0ac476b Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 30 Dec 2025 00:23:44 -0700 Subject: [PATCH 22/47] Generify shortcut configs to work on any type --- .../terra/config/pack/ConfigPackImpl.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 42530b81f5..99886b3b29 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -26,7 +26,11 @@ import com.dfsek.tectonic.api.loader.AbstractConfigLoader; import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.type.TypeLoader; +import com.dfsek.tectonic.impl.loading.object.ObjectTemplateLoader; import com.dfsek.tectonic.yaml.YamlConfiguration; + +import com.dfsek.terra.api.tectonic.ConfigLoadingDelegate; + import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import org.jetbrains.annotations.NotNull; @@ -47,9 +51,11 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.ServiceLoader.Provider; import java.util.Set; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; import java.util.function.Supplier; import com.dfsek.terra.api.Platform; @@ -99,6 +105,7 @@ public class ConfigPackImpl implements ConfigPack { private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); + private final Map> loaders = new HashMap<>(); private final Platform platform; private final Path rootPath; @@ -107,7 +114,7 @@ public class ConfigPackImpl implements ConfigPack { private final BiomeProvider seededBiomeProvider; private final Map> registryMap = new HashMap<>(); - private final Map> shortcuts = new HashMap<>(); + private final Map>> shortcuts = new HashMap<>(); private final OpenRegistry> configTypeRegistry; private final TreeMap>>> configTypes = new TreeMap<>(); @@ -142,10 +149,7 @@ public ConfigPackImpl(Path path, Platform platform) throws IOException { this.platform = platform; this.configTypeRegistry = createConfigRegistry(); - register(selfLoader); platform.register(selfLoader); - - register(abstractConfigLoader); platform.register(abstractConfigLoader); ConfigPackAddonsTemplate addonsTemplate = new ConfigPackAddonsTemplate(); @@ -163,6 +167,9 @@ public ConfigPackImpl(Path path, Platform platform) throws IOException { platform.getEventManager().callEvent( new ConfigPackPreLoadEvent(this, template -> selfLoader.load(template, packManifest))); + register(selfLoader); + register(abstractConfigLoader); + selfLoader.load(template, packManifest); String namespace; @@ -259,6 +266,7 @@ private void registerMeta(Map configurations) { public ConfigPackImpl applyLoader(Type type, TypeLoader loader) { abstractConfigLoader.registerLoader(type, loader); selfLoader.registerLoader(type, loader); + loaders.put(type, loader); return this; } @@ -266,6 +274,7 @@ public ConfigPackImpl applyLoader(Type type, TypeLoader loader) { public ConfigPackImpl applyLoader(Type type, Supplier> loader) { abstractConfigLoader.registerLoader(type, loader); selfLoader.registerLoader(type, loader); + loaders.put(type, new ObjectTemplateLoader<>(loader)); return this; } @@ -273,7 +282,7 @@ public ConfigPackImpl applyLoader(Type type, Supplier> loa public void register(TypeRegistry registry) { registry.registerLoader(ConfigType.class, configTypeRegistry); registryMap.forEach(registry::registerLoader); - shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present + shortcuts.forEach((k, v) -> registry.registerLoader(k, v.get())); // overwrite with delegated shortcuts if present } @Override @@ -357,11 +366,9 @@ public ParseOptions getExpressionParseOptions() { @SuppressWarnings("rawtypes") @Override public ConfigPack registerShortcut(TypeKey clazz, String shortcut, ShortcutLoader loader) { - ShortcutHolder holder = shortcuts - .computeIfAbsent(clazz.getType(), c -> new ShortcutHolder<>(getOrCreateRegistry(clazz))) - .register(shortcut, (ShortcutLoader) loader); - selfLoader.registerLoader(clazz.getType(), holder); - abstractConfigLoader.registerLoader(clazz.getType(), holder); + shortcuts.put(clazz.getType(), + () -> new ShortcutHolder<>(loaders.computeIfAbsent(clazz.getType(), t -> getOrCreateRegistry(clazz))).register(shortcut, + (ShortcutLoader) loader)); return this; } From 998b6478f33128e048e1368766657c294e963cf7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 30 Dec 2025 01:27:41 -0700 Subject: [PATCH 23/47] add more api helpers --- .../script/functions/LootFunction.java | 9 +++++---- .../com/dfsek/terra/api/error/InvalidKey.java | 4 ++++ .../com/dfsek/terra/api/registry/Registry.java | 12 +++++++++--- .../dfsek/terra/api/registry/key/RegistryKey.java | 11 ++++++++--- .../terra/api/util/generic/data/types/Either.java | 15 ++++++++++++--- .../com/dfsek/terra/config/pack/MetaPackImpl.java | 13 +++++++------ 6 files changed, 45 insertions(+), 19 deletions(-) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/error/InvalidKey.java diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index 5fcf23ad16..78eb2d267a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java @@ -62,9 +62,10 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) String id = data.apply(implementationArguments, scope); - - registry.get(RegistryKey.parse(id)) - .consume(table -> { + RegistryKey.parse(id) + .bind(registry::getEither) + .consume(left -> LOGGER.error("No such loot table {}", id), + table -> { Vector3 apply = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope) .intValue(), @@ -92,7 +93,7 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) e.printStackTrace(); } } - ).ifNothing(() -> LOGGER.error("No such loot table {}", id)); + ); return null; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/error/InvalidKey.java b/common/api/src/main/java/com/dfsek/terra/api/error/InvalidKey.java new file mode 100644 index 0000000000..2ef581ffba --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/error/InvalidKey.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.error; + +public record InvalidKey(String message) implements Invalid { +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index 6296d536b0..6449a2d628 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -9,6 +9,7 @@ import com.dfsek.tectonic.api.loader.type.TypeLoader; +import com.dfsek.terra.api.error.Invalid; import com.dfsek.terra.api.error.InvalidLookup; import com.dfsek.terra.api.error.InvalidLookup.AmbiguousKey; import com.dfsek.terra.api.error.InvalidLookup.NoSuchElement; @@ -41,6 +42,10 @@ public interface Registry extends TypeLoader { @Contract(pure = true) Maybe get(@NotNull RegistryKey key); + default Either getEither(@NotNull RegistryKey key) { + return get(key).toEither(new NoSuchElement("No such element " + key.toString())); + } + /** * Check if the registry contains a value. * @@ -89,7 +94,7 @@ default Class getRawType() { return getType().getRawType(); } - default Either getByID(String id) { + default Either getByID(String id) { return getByID(id, map -> { if(map.isEmpty()) return Either.left(new NoSuchElement("No such value + \"" + id + "\"")); if(map.size() == 1) { @@ -109,9 +114,10 @@ default Collection getAllWithID(String id) { Map getMatches(String id); - default Either getByID(String attempt, Function, Either> reduction) { + default Either getByID(String attempt, Function, Either> reduction) { if(attempt.contains(":")) { - return get(RegistryKey.parse(attempt)).toEither(new NoSuchElement("No such value + \"" + attempt + "\"")); + return RegistryKey.parse(attempt) + .bind(this::getEither); } return reduction.apply(getMatches(attempt)); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java b/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java index 14c8709388..65049fbd3e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java @@ -1,5 +1,10 @@ package com.dfsek.terra.api.registry.key; +import com.dfsek.terra.api.error.Invalid; +import com.dfsek.terra.api.error.InvalidKey; +import com.dfsek.terra.api.util.generic.data.types.Either; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + import java.util.Objects; import java.util.regex.Pattern; @@ -26,14 +31,14 @@ private RegistryKey(String namespace, String id) { this.id = id; } - public static RegistryKey parse(String key) { + public static Either parse(String key) { if(key.chars().filter(c -> c == ':').count() != 1) { - throw new IllegalArgumentException("Malformed RegistryKey: " + key); + return Either.left(new InvalidKey("Malformed RegistryKey: " + key)); } String namespace = key.substring(0, key.indexOf(":")); String id = key.substring(key.indexOf(":") + 1); - return new RegistryKey(namespace, id); + return Either.right(new RegistryKey(namespace, id)); } public static RegistryKey of(String namespace, String id) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 3058f68bed..19291b4a73 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -17,7 +17,6 @@ import org.jetbrains.annotations.NotNull; import java.util.Objects; -import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; @@ -63,8 +62,18 @@ default Either pure(T1 t) { U collect(Function left, Function right); + default Either consume(Consumer left, Consumer right) { + return mapLeft(l -> { + left.accept(l); + return l; + }).mapRight(r -> { + right.accept(r); + return r; + }); + } + @SuppressWarnings("Convert2MethodRef") - default R collectThrow(Function left) throws T{ + default R collectThrow(Function left) throws T { return mapLeft(left).collect(l -> FunctionUtils.sneakyThrow(l), Function.identity()); } @@ -125,7 +134,7 @@ public U collect(Function left, Function right) { return new Left<>(Objects.requireNonNull(left)); } - @SuppressWarnings({"unchecked" }) + @SuppressWarnings({ "unchecked" }) @NotNull @Contract("_ -> new") static Either right(R1 right) { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java index 685708698e..d5f50debfd 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/MetaPackImpl.java @@ -104,12 +104,13 @@ public MetaPackImpl(Path path, Platform platform, ConfigRegistry configRegistry) logger.info("Loading metapack \"{}:{}\"", id, namespace); template.getPacks().forEach((k, v) -> { - RegistryKey registryKey = RegistryKey.parse(v); - configRegistry.get(registryKey).consume(pack -> { - packs.put(k, pack); - logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); - }) - .ifNothing(() -> logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id)); + RegistryKey.parse(v) + .bind(configRegistry::getEither) + .consume(left -> logger.warn("Failed to link config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id), + right -> { + packs.put(k, right); + logger.info("Linked config pack \"{}\" to metapack \"{}:{}\".", v, namespace, id); + }); }); HashSet authors = new HashSet<>(); From 2215ea833684ac2eed6530c8a65b714314e7ad62 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 30 Dec 2025 01:43:13 -0700 Subject: [PATCH 24/47] tinker with cloud --- .../command/arguments/RegistryArgument.java | 27 ++++++++++--------- .../dfsek/terra/api/registry/Registry.java | 4 +-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java index ae1c38c452..444a74301c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java +++ b/common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java @@ -12,6 +12,7 @@ import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; @@ -21,8 +22,12 @@ import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.util.reflection.TypeKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class RegistryArgument { + private static final Logger logger = LoggerFactory.getLogger(RegistryArgument.class); public static Builder builder(String name, Registry registry) { return new Builder<>(name, registry); @@ -100,19 +105,15 @@ private RegistryArgumentParser(Function, Registry> registry Registry registry = registryFunction.apply(commandContext); String finalInput = input; - try { - return registry.get(RegistryKey.parse(input)) - .map(ArgumentParseResult::success) - .orJust(() -> - registry.getByID(finalInput).collect( - left -> ArgumentParseResult.failure(left.toIllegal()), - ArgumentParseResult::success - )) - .get(() -> ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + finalInput))); - } catch(IllegalArgumentException e) { - return ArgumentParseResult.failure(e); - - } + return RegistryKey.parse(finalInput) + .bind(registry::getEither) + .map(ArgumentParseResult::success) + .collect(l -> registry + .getByID(finalInput) + .collect( + left -> ArgumentParseResult.failure(left.toIllegal()), + ArgumentParseResult::success + ), Function.identity()); } @Override diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index 6449a2d628..accdb945e2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -43,7 +43,7 @@ public interface Registry extends TypeLoader { Maybe get(@NotNull RegistryKey key); default Either getEither(@NotNull RegistryKey key) { - return get(key).toEither(new NoSuchElement("No such element " + key.toString())); + return get(key).toEither(new NoSuchElement("No such element " + key)); } /** @@ -96,7 +96,7 @@ default Class getRawType() { default Either getByID(String id) { return getByID(id, map -> { - if(map.isEmpty()) return Either.left(new NoSuchElement("No such value + \"" + id + "\"")); + if(map.isEmpty()) return Either.left(new NoSuchElement("No such value \"" + id + "\"")); if(map.size() == 1) { return Either.right(map.values().stream().findFirst().get()); // only one value. } From 5dc9f419ac4b7f79fd38512e307faa0584aad249 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 30 Dec 2025 11:58:48 -0700 Subject: [PATCH 25/47] only apply shortcut if loaded config is a string --- .../src/main/java/com/dfsek/terra/registry/ShortcutHolder.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java index 080e3e1b1d..b0aa2dae01 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java @@ -35,8 +35,7 @@ public ShortcutHolder register(String id, ShortcutLoader loader) { @Override public T load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) throws LoadException { - String id = (String) o; - if(id.contains(":")) { + if(o instanceof String id && id.contains(":")) { String shortcut = id.substring(0, id.indexOf(":")); if(shortcuts.containsKey(shortcut)) { return shortcuts.get(shortcut).load(configLoader, id.substring(id.indexOf(":") + 1), From 8eb5a70d4d07139e4334f5c53bdd0475835777c5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 30 Dec 2025 12:01:40 -0700 Subject: [PATCH 26/47] fallback to base loader if shortcut doesnt exist --- .../src/main/java/com/dfsek/terra/registry/ShortcutHolder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java index b0aa2dae01..2282326b4c 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/ShortcutHolder.java @@ -41,7 +41,6 @@ public T load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull return shortcuts.get(shortcut).load(configLoader, id.substring(id.indexOf(":") + 1), depthTracker.intrinsic("Using shortcut \"" + shortcut + "\"")); } - throw new LoadException("Shortcut \"" + shortcut + "\" is not defined.", depthTracker); } return back.load(annotatedType, o, configLoader, depthTracker); } From eb6b3704d0bdfc04d0d862d38140c100da2c09d5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 1 Jan 2026 20:09:06 -0700 Subject: [PATCH 27/47] add linkedlist --- .../api/util/generic/data/LinkedList.java | 143 +++++++++++++ .../terra/api/util/generic/data/Monoid.java | 7 +- .../api/util/generic/data/Semigroup.java | 8 - .../api/util/generic/data/types/Either.java | 199 +++++++++--------- .../api/util/generic/data/types/Maybe.java | 169 ++++++++------- 5 files changed, 336 insertions(+), 190 deletions(-) create mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java new file mode 100644 index 0000000000..a14c925ce1 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java @@ -0,0 +1,143 @@ +package com.dfsek.terra.api.util.generic.data; + +import com.dfsek.terra.api.util.generic.control.Monad; +import com.dfsek.terra.api.util.generic.data.types.Maybe; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Function; + + +public sealed interface LinkedList extends Monad>, Monoid> { + @Override + LinkedList bind(Function>> map); + + @Override + default LinkedList pure(T1 t) { + return new Cons<>(t, empty()); + } + + @Override + LinkedList map(Function map); + + @Override + default LinkedList identity() { + return empty(); + } + + default Maybe head() { + return get(0); + } + + int length(); + + Maybe get(int index); + + LinkedList add(T value); + + > C toCollection(C collection); + + default List toList() { + return toCollection(new ArrayList<>()); + } + + default Set toSet() { + return toCollection(new HashSet<>()); + } + + @Override + LinkedList multiply(Monoid> t); + + static LinkedList of(T value) { + return new Cons<>(value, empty()); + } + + @SuppressWarnings("unchecked") + static Nil empty() { + return (Nil) Nil.INSTANCE; + } + + record Cons(T value, LinkedList tail) implements LinkedList { + @Override + public LinkedList bind(Function>> map) { + return ((LinkedList) map.apply(value)).multiply(tail.bind(map)); + } + + @Override + public LinkedList map(Function map) { + return new Cons<>(map.apply(value), tail.map(map)); + } + + @Override + public int length() { + return 1 + tail.length(); + } + + @Override + public Maybe get(int index) { + if(index == 0) return Maybe.just(value); + if(index > 0) return Maybe.nothing(); + return tail.get(index - 1); + } + + @Override + public LinkedList add(T value) { + return new Cons<>(value, tail.add(value)); + } + + @Override + public > C toCollection(C collection) { + collection.add(value); + return tail.toCollection(collection); + } + + @Override + public LinkedList multiply(Monoid> t) { + return new Cons<>(value, tail.multiply(t)); + } + } + + record Nil() implements LinkedList { + private static final Nil INSTANCE = new Nil<>(); + + @Override + @SuppressWarnings("unchecked") + public LinkedList bind(Function>> map) { + return (LinkedList) this; + } + + @Override + @SuppressWarnings("unchecked") + public LinkedList map(Function map) { + return (LinkedList) this; + } + + @Override + public int length() { + return 0; + } + + @Override + public Maybe get(int index) { + return Maybe.nothing(); + } + + @Override + public LinkedList add(T value) { + return new Cons<>(value, empty()); + } + + @Override + public > C toCollection(C collection) { + return collection; + } + + @Override + public LinkedList multiply(Monoid> t) { + return (LinkedList) t; + } + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java index 7725067b8d..ed5fb23343 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java @@ -3,9 +3,8 @@ import com.dfsek.terra.api.util.generic.kinds.K; -public interface Monoid> extends Semigroup, K{ - > Monoid identity(); +public interface Monoid> extends K{ + Monoid identity(); - @Override - Monoid multiply(M t); + Monoid multiply(Monoid t); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java deleted file mode 100644 index 26ec7f36f1..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Semigroup.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.util.generic.data; - -import com.dfsek.terra.api.util.generic.kinds.K; - - -public interface Semigroup> extends K { - Semigroup multiply(S t); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 19291b4a73..37d1e11cc5 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -21,7 +21,7 @@ import java.util.function.Function; -public interface Either extends Monad>, BiFunctor> { +public sealed interface Either extends Monad>, BiFunctor> { default Either ifLeft(Consumer action) { return mapLeft(FunctionUtils.lift(action)); } @@ -77,115 +77,114 @@ default R collectThrow(Function left) throws T { return mapLeft(left).collect(l -> FunctionUtils.sneakyThrow(l), Function.identity()); } - @SuppressWarnings({ "unchecked" }) @NotNull @Contract("_ -> new") static Either left(L1 left) { - record Left(L value) implements Either { - - @Override - @SuppressWarnings("unchecked") - public Either bind(Function>> map) { - return (Either) this; - } - - @Override - public Either mapLeft(Function f) { - return new Left<>(f.apply(value)); - } - - @SuppressWarnings({ "unchecked" }) - @Override - public Either mapRight(Function f) { - return (Either) this; - } - - @Override - public Maybe getLeft() { - return Maybe.just(value); - } - - @Override - public Maybe getRight() { - return Maybe.nothing(); - } - - @Override - public boolean isLeft() { - return true; - } - - @Override - public boolean isRight() { - return false; - } - - @Override - public Either flip() { - return right(value); - } - - @Override - public U collect(Function left, Function right) { - return left.apply(value); - } - } - return new Left<>(Objects.requireNonNull(left)); } - @SuppressWarnings({ "unchecked" }) @NotNull @Contract("_ -> new") static Either right(R1 right) { - record Right(R value) implements Either { - @Override - public Either bind(Function>> map) { - return (Either) map.apply(value); - } - - @SuppressWarnings({ "unchecked" }) - @Override - public Either mapLeft(Function f) { - return (Either) this; - } - - @Override - public Either mapRight(Function f) { - return new Right<>(f.apply(value)); - } - - @Override - public Maybe getLeft() { - return Maybe.nothing(); - } - - @Override - public Maybe getRight() { - return Maybe.just(value); - } - - @Override - public boolean isLeft() { - return false; - } - - @Override - public boolean isRight() { - return true; - } - - @Override - public Either flip() { - return left(value); - } - - @Override - public U collect(Function left, Function right) { - return right.apply(value); - } - } return new Right<>(Objects.requireNonNull(right)); } + record Left(L value) implements Either { + + @Override + @SuppressWarnings("unchecked") + public Either bind(Function>> map) { + return (Either) this; + } + + @Override + public Either mapLeft(Function f) { + return new Left<>(f.apply(value)); + } + + @SuppressWarnings({ "unchecked" }) + @Override + public Either mapRight(Function f) { + return (Either) this; + } + + @Override + public Maybe getLeft() { + return Maybe.just(value); + } + + @Override + public Maybe getRight() { + return Maybe.nothing(); + } + + @Override + public boolean isLeft() { + return true; + } + + @Override + public boolean isRight() { + return false; + } + + @Override + public Either flip() { + return right(value); + } + + @Override + public U collect(Function left, Function right) { + return left.apply(value); + } + } + + + record Right(R value) implements Either { + @Override + public Either bind(Function>> map) { + return (Either) map.apply(value); + } + + @SuppressWarnings({ "unchecked" }) + @Override + public Either mapLeft(Function f) { + return (Either) this; + } + + @Override + public Either mapRight(Function f) { + return new Right<>(f.apply(value)); + } + + @Override + public Maybe getLeft() { + return Maybe.nothing(); + } + + @Override + public Maybe getRight() { + return Maybe.just(value); + } + + @Override + public boolean isLeft() { + return false; + } + + @Override + public boolean isRight() { + return true; + } + + @Override + public Either flip() { + return left(value); + } + + @Override + public U collect(Function left, Function right) { + return right.apply(value); + } + } } \ No newline at end of file diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index cbd981f75c..7aa1b683ee 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.util.generic.data.types; import com.dfsek.terra.api.util.generic.control.Monad; +import com.dfsek.terra.api.util.generic.data.LinkedList; import java.util.NoSuchElementException; import java.util.Optional; @@ -11,7 +12,7 @@ import java.util.stream.Stream; -public interface Maybe extends Monad> { +public sealed interface Maybe extends Monad> { @Override default Maybe pure(T1 t) { return just(t); @@ -49,9 +50,20 @@ default Maybe ifNothing(Runnable r) { return this; } + default Maybe collapse(Runnable nothing, Consumer just) { + return consume(just).ifNothing(nothing); + } + + + default LinkedList toList() { + return map(LinkedList::of).get(LinkedList::empty); + } /** * Project a new value into this Maybe if it is Nothing. + * Effectively a bind operation over Nothing, treating it as a Void type. + *

+ * Converse of {@link #bind}. */ Maybe or(Supplier> or); @@ -59,7 +71,6 @@ default Maybe orJust(Supplier or) { return or(() -> just(or.get())); } - @Deprecated default T orThrow() { return get(() -> { throw new NoSuchElementException("No value present."); }); @@ -73,7 +84,6 @@ default T orThrow(Supplier e) throws X { throw e.get(); } - default Maybe or(Maybe or) { return or(() -> or); } @@ -96,85 +106,88 @@ static Maybe ofNullable(T t) { } static Maybe just(T1 t) { - record Just(T value) implements Maybe { - - @Override - public Optional toOptional() { - return Optional.of(value); - } - - @Override - public Either toEither(L l) { - return Either.right(value); - } - - @Override - public T get(Supplier def) { - return value; - } - - @Override - public boolean isJust() { - return true; - } - - @Override - public Maybe map(Function map) { - return just(map.apply(value)); - } - - @Override - public Maybe or(Supplier> or) { - return this; - } - - @Override - public Maybe bind(Function>> map) { - return (Maybe) map.apply(value); - } - } + return new Just<>(t); } static Maybe nothing() { - record Nothing() implements Maybe { - - @Override - public Maybe bind(Function>> map) { - return nothing(); - } - - @Override - public Optional toOptional() { - return Optional.empty(); - } - - @Override - public Either toEither(L l) { - return Either.left(l); - } - - @Override - public T get(Supplier def) { - return def.get(); - } - - @Override - public boolean isJust() { - return false; - } - - @Override - @SuppressWarnings("unchecked") - public Maybe map(Function map) { - return (Maybe) this; - } - - @Override - public Maybe or(Supplier> or) { - return or.get(); - } - } + return new Nothing<>(); } + + record Just(T value) implements Maybe { + @Override + public Optional toOptional() { + return Optional.of(value); + } + + @Override + public Either toEither(L l) { + return Either.right(value); + } + + @Override + public T get(Supplier def) { + return value; + } + + @Override + public boolean isJust() { + return true; + } + + @Override + public Maybe map(Function map) { + return just(map.apply(value)); + } + + @Override + public Maybe or(Supplier> or) { + return this; + } + + @Override + public Maybe bind(Function>> map) { + return (Maybe) map.apply(value); + } + } + + + record Nothing() implements Maybe { + @Override + public Maybe bind(Function>> map) { + return nothing(); + } + + @Override + public Optional toOptional() { + return Optional.empty(); + } + + @Override + public Either toEither(L l) { + return Either.left(l); + } + + @Override + public T get(Supplier def) { + return def.get(); + } + + @Override + public boolean isJust() { + return false; + } + + @Override + @SuppressWarnings("unchecked") + public Maybe map(Function map) { + return (Maybe) this; + } + + @Override + public Maybe or(Supplier> or) { + return or.get(); + } + } } From 47bdd66fe75a6cb4ccc51dfae058771d64f085a5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 1 Jan 2026 20:09:52 -0700 Subject: [PATCH 28/47] Make Pair a record --- .../addons/terrascript/parser/lang/Scope.java | 4 ++-- .../lang/keywords/looplike/IfKeyword.java | 4 ++-- .../terra/api/util/generic/pair/Pair.java | 22 +------------------ .../terra/config/pack/ConfigPackImpl.java | 10 +++------ .../MetaListLikePreprocessor.java | 6 ++--- .../preprocessor/MetaMapPreprocessor.java | 6 ++--- .../preprocessor/MetaStringPreprocessor.java | 2 +- .../preprocessor/MetaValuePreprocessor.java | 6 ++--- .../terra/registry/OpenRegistryImpl.java | 3 +-- .../java/com/dfsek/terra/cli/TerraCLI.java | 4 ++-- .../com/dfsek/terra/mod/util/TagUtil.java | 6 ++--- 11 files changed, 24 insertions(+), 49 deletions(-) diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java index 0c1fd8b2e0..26f17ce1cb 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java @@ -121,11 +121,11 @@ private void updateStrSize(int size) { } public int getIndex(String id) { - return indices.get(id).getLeft(); + return indices.get(id).left(); } public ReturnType getType(String id) { - return indices.get(id).getRight(); + return indices.get(id).right(); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java index aa299c7aa8..f9732e63c6 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java @@ -41,8 +41,8 @@ public Block.ReturnInfo apply(ImplementationArguments implementationArguments if(statement.apply(implementationArguments, scope)) return conditional.apply(implementationArguments, scope); else { for(Pair, Block> pair : elseIf) { - if(pair.getLeft().apply(implementationArguments, scope)) { - return pair.getRight().apply(implementationArguments, scope); + if(pair.left().apply(implementationArguments, scope)) { + return pair.right().apply(implementationArguments, scope); } } if(elseBlock != null) return elseBlock.apply(implementationArguments, scope); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java index 9c08d6bf65..7bdeaefd8f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java @@ -17,15 +17,8 @@ import java.util.function.Predicate; -public final class Pair { +public record Pair(L left, R right) implements Bifunctor{ private static final Pair NULL = new Pair<>(null, null); - private final L left; - private final R right; - - private Pair(L left, R right) { - this.left = left; - this.right = right; - } public static Function, Pair> mapLeft(Function function) { return pair -> of(function.apply(pair.left), pair.right); @@ -76,19 +69,6 @@ public Pair.Mutable mutable() { return Mutable.of(left, right); } - public R getRight() { - return right; - } - - public L getLeft() { - return left; - } - - @Override - public int hashCode() { - return Objects.hash(left, right); - } - @Override public boolean equals(Object obj) { if(!(obj instanceof Pair that)) return false; diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 99886b3b29..3dbac74da0 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -29,8 +29,6 @@ import com.dfsek.tectonic.impl.loading.object.ObjectTemplateLoader; import com.dfsek.tectonic.yaml.YamlConfiguration; -import com.dfsek.terra.api.tectonic.ConfigLoadingDelegate; - import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import org.jetbrains.annotations.NotNull; @@ -51,11 +49,9 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.ServiceLoader.Provider; import java.util.Set; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Consumer; import java.util.function.Supplier; import com.dfsek.terra.api.Platform; @@ -186,7 +182,7 @@ public ConfigPackImpl(Path path, Platform platform) throws IOException { logger.info("Loading config pack \"{}:{}\"", id, namespace); - configTypes.values().forEach(list -> list.forEach(pair -> configTypeRegistry.register(pair.getLeft(), pair.getRight()))); + configTypes.values().forEach(list -> list.forEach(pair -> configTypeRegistry.register(pair.left(), pair.right()))); ListMultimap, Configuration> multimap = configurations.values().parallelStream().collect( () -> Multimaps.newListMultimap(new ConcurrentHashMap<>(), ArrayList::new), (configs, configuration) -> { @@ -216,7 +212,7 @@ public ConfigPackImpl(Path path, Platform platform) throws IOException { return Pair.of(configuration.getID(), loaded); }) .toList() - .forEach(pair -> registry.register(key(pair.getLeft()), pair.getRight())); + .forEach(pair -> registry.register(key(pair.left()), pair.right())); platform.getEventManager().callEvent(new ConfigTypePostLoadEvent(configType, registry, this)); }); @@ -289,7 +285,7 @@ public void register(TypeRegistry registry) { public ConfigPack registerConfigType(ConfigType type, RegistryKey key, int priority) { Set contained = new HashSet<>(); configTypes.forEach((p, configs) -> configs.forEach(pair -> { - if(contained.contains(pair.getLeft())) throw new IllegalArgumentException("Duplicate config key: " + key); + if(contained.contains(pair.left())) throw new IllegalArgumentException("Duplicate config key: " + key); contained.add(key); })); configTypes.computeIfAbsent(priority, p -> new ArrayList<>()).add(Pair.of(key, type)); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java index 2e6707c9d9..9fcb938c81 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java @@ -64,7 +64,7 @@ public MetaListLikePreprocessor(Map configs) { Pair pair = getMetaValue(meta, depthTracker); - Object metaValue = pair.getRight(); + Object metaValue = pair.right(); if(!(metaValue instanceof List)) { throw new LoadException( @@ -86,10 +86,10 @@ public MetaListLikePreprocessor(Map configs) { indexLevel.getIndex() >= begin && indexLevel.getIndex() <= end) { String configName; - if(pair.getLeft().getName() == null) { + if(pair.left().getName() == null) { configName = "Anonymous Configuration"; } else { - configName = pair.getLeft().getName(); + configName = pair.left().getName(); } return Optional.of("From configuration \"" + configName + "\""); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java index 3a05e81122..d36d461131 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java @@ -60,7 +60,7 @@ public MetaMapPreprocessor(Map configs) { List keys = (List) loader.loadType(STRING_LIST.getAnnotatedType(), map.get("<<"), depthTracker); keys.forEach(key -> { Pair pair = getMetaValue(key, depthTracker); - Object meta = pair.getRight(); + Object meta = pair.right(); if(!(meta instanceof Map)) { throw new LoadException( "MetaMap injection candidate must be list, is type " + meta.getClass().getCanonicalName(), @@ -69,10 +69,10 @@ public MetaMapPreprocessor(Map configs) { newMap.putAll((Map) meta); String configName; - if(pair.getLeft().getName() == null) { + if(pair.left().getName() == null) { configName = "Anonymous Configuration"; } else { - configName = pair.getLeft().getName(); + configName = pair.left().getName(); } depthTracker.addIntrinsicLevel(level -> { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaStringPreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaStringPreprocessor.java index 8869a02285..6eb1cd07b7 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaStringPreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaStringPreprocessor.java @@ -41,7 +41,7 @@ public MetaStringPreprocessor(Map configs) { public @NotNull Result process(AnnotatedType t, T c, ConfigLoader loader, Meta annotation, DepthTracker depthTracker) { if(String.class.equals(t.getType()) && c instanceof String candidate) { // String is final so we use #equals StringSubstitutor substitutor = new StringSubstitutor(key -> { - Object meta = getMetaValue(key, depthTracker).getRight(); + Object meta = getMetaValue(key, depthTracker).right(); if(!(meta instanceof String) && !(meta instanceof Number) && !(meta instanceof Character) && !(meta instanceof Boolean)) { throw new LoadException("MetaString template injection candidate must be string or primitive, is type " + meta.getClass().getCanonicalName(), depthTracker); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaValuePreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaValuePreprocessor.java index ff0a50afc7..2f49049fe4 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaValuePreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaValuePreprocessor.java @@ -46,13 +46,13 @@ public MetaValuePreprocessor(Map configs) { Pair pair = getMetaValue(value.substring(1), depthTracker); String configName; - if(pair.getLeft().getName() == null) { + if(pair.left().getName() == null) { configName = "Anonymous Configuration"; } else { - configName = pair.getLeft().getName(); + configName = pair.left().getName(); } - return (Result) Result.overwrite(pair.getRight(), depthTracker.intrinsic("From configuration \"" + configName + "\"")); + return (Result) Result.overwrite(pair.right(), depthTracker.intrinsic("From configuration \"" + configName + "\"")); } } return Result.noOp(); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java index 1adeaac074..7837250d4c 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java @@ -33,7 +33,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -158,7 +157,7 @@ public Map getMatches(String id) { return objectIDs .get(id) .stream() - .collect(HashMap::new, (map, pair) -> map.put(pair.getLeft(), pair.getRight().getValue()), Map::putAll); + .collect(HashMap::new, (map, pair) -> map.put(pair.left(), pair.right().getValue()), Map::putAll); } public Map getDeadEntries() { diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java index d817e385aa..a5639f10c8 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java @@ -62,12 +62,12 @@ public Integer call() { if(!noSave) { world.serialize().parallel().forEach(mcaFile -> { - Vector2Int pos = mcaFile.getLeft(); + Vector2Int pos = mcaFile.left(); String name = MCAUtil.createNameFromRegionLocation(pos.getX(), pos.getZ()); LOGGER.info("Writing region ({}, {}) to {}", pos.getX(), pos.getZ(), name); try { - MCAUtil.write(mcaFile.getRight(), name); + MCAUtil.write(mcaFile.right(), name); } catch(IOException e) { e.printStackTrace(); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java index 9e23a96620..c69358e6cf 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java @@ -37,15 +37,15 @@ public static void registerWorldPresetTags(Registry registry) { PresetUtil .getPresets() .forEach(pair -> MinecraftUtil - .getEntry(registry, pair.getLeft()) + .getEntry(registry, pair.left()) .ifPresentOrElse( preset -> { - boolean useExtendedTag = pair.getRight(); // Get the boolean value from the pair + boolean useExtendedTag = pair.right(); // Get the boolean value from the pair collect .computeIfAbsent(useExtendedTag ? WorldPresetTags.EXTENDED : WorldPresetTags.NORMAL, tag -> new ArrayList<>()) .add(preset); }, - () -> logger.error("Preset {} does not exist!", pair.getLeft()))); + () -> logger.error("Preset {} does not exist!", pair.left()))); registry.startTagReload(new RegistryTags<>(registry.getKey(), collect)).apply(); From 86bb4d5a1a45c95121d6de055c2ae11bd8562e58 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 1 Jan 2026 20:15:05 -0700 Subject: [PATCH 29/47] implement Bifunctor Pair --- .../addons/noise/config/sampler/CacheSampler.java | 4 ++-- .../terra/addons/terrascript/parser/Parser.java | 2 +- .../addons/terrascript/parser/lang/Scope.java | 2 +- .../parser/lang/keywords/looplike/IfKeyword.java | 2 +- .../util/generic/{pair => data/types}/Pair.java | 14 ++++++++------ .../biome/generation/CachingBiomeProvider.java | 6 ++---- common/api/src/test/java/util/ColumnTest.java | 2 +- .../java/com/dfsek/terra/AbstractPlatform.java | 10 +++++----- .../dfsek/terra/config/pack/ConfigPackImpl.java | 2 +- .../preprocessor/MetaListLikePreprocessor.java | 2 +- .../config/preprocessor/MetaMapPreprocessor.java | 2 +- .../config/preprocessor/MetaPreprocessor.java | 2 +- .../config/preprocessor/MetaValuePreprocessor.java | 2 +- .../com/dfsek/terra/registry/OpenRegistryImpl.java | 2 +- .../java/com/dfsek/terra/cli/world/CLIWorld.java | 2 +- .../terra/minestom/chunk/GeneratedChunkCache.java | 1 - .../java/com/dfsek/terra/mod/util/PresetUtil.java | 2 +- 17 files changed, 29 insertions(+), 30 deletions(-) rename common/api/src/main/java/com/dfsek/terra/api/util/generic/{pair => data/types}/Pair.java (88%) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/sampler/CacheSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/sampler/CacheSampler.java index fb2c4090b2..0e5c3cc7dd 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/sampler/CacheSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/sampler/CacheSampler.java @@ -8,8 +8,8 @@ import com.dfsek.terra.api.util.cache.DoubleSeededVector2Key; import com.dfsek.terra.api.util.cache.DoubleSeededVector3Key; -import com.dfsek.terra.api.util.generic.pair.Pair; -import com.dfsek.terra.api.util.generic.pair.Pair.Mutable; +import com.dfsek.terra.api.util.generic.data.types.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair.Mutable; import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java index 484aa4ba40..a379597a7c 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java @@ -61,7 +61,7 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.Token; import com.dfsek.terra.addons.terrascript.tokenizer.Tokenizer; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; @SuppressWarnings("unchecked") diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java index 26f17ce1cb..5cb1c84dba 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java @@ -5,7 +5,7 @@ import java.util.Map; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; public class Scope { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java index f9732e63c6..97da3d18ff 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java @@ -17,7 +17,7 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; public class IfKeyword implements Keyword> { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java similarity index 88% rename from common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java index 7bdeaefd8f..9b450da74e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java @@ -5,7 +5,9 @@ * reference the LICENSE file in the common/api directory. */ -package com.dfsek.terra.api.util.generic.pair; +package com.dfsek.terra.api.util.generic.data.types; + +import com.dfsek.terra.api.util.generic.data.BiFunctor; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -17,15 +19,15 @@ import java.util.function.Predicate; -public record Pair(L left, R right) implements Bifunctor{ +public record Pair(L left, R right) implements BiFunctor> { private static final Pair NULL = new Pair<>(null, null); - public static Function, Pair> mapLeft(Function function) { - return pair -> of(function.apply(pair.left), pair.right); + public Pair mapLeft(Function function) { + return of(function.apply(left), right); } - public static Function, Pair> mapRight(Function function) { - return pair -> of(pair.left, function.apply(pair.right)); + public Pair mapRight(Function function) { + return of(left, function.apply(right)); } public static Predicate> testLeft(Predicate predicate) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java index aaeab8a2de..b7fba529a3 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java @@ -6,13 +6,11 @@ import com.github.benmanes.caffeine.cache.LoadingCache; import com.github.benmanes.caffeine.cache.Scheduler; -import java.util.Optional; - import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.util.cache.SeededVector2Key; import com.dfsek.terra.api.util.cache.SeededVector3Key; -import com.dfsek.terra.api.util.generic.pair.Pair; -import com.dfsek.terra.api.util.generic.pair.Pair.Mutable; +import com.dfsek.terra.api.util.generic.data.types.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair.Mutable; import com.dfsek.terra.api.world.biome.Biome; import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR; diff --git a/common/api/src/test/java/util/ColumnTest.java b/common/api/src/test/java/util/ColumnTest.java index a39d3d0866..9f1e8e7f9a 100644 --- a/common/api/src/test/java/util/ColumnTest.java +++ b/common/api/src/test/java/util/ColumnTest.java @@ -10,7 +10,7 @@ import java.util.stream.IntStream; import com.dfsek.terra.api.util.Column; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; import com.dfsek.terra.api.util.mutable.MutableInteger; import static org.junit.jupiter.api.Assertions.*; diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java index bfe507b3f1..9c56439ee7 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -64,7 +64,7 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.key.StringIdentifiable; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; import com.dfsek.terra.api.util.mutable.MutableBoolean; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.config.GenericLoaders; @@ -308,7 +308,7 @@ protected void dumpResources(List ignoredResources) { .walk(addonsPath) .map(path -> Pair.of(path, data.relativize(path).toString())) - .map(Pair.mapRight(s -> { + .map(p -> p.mapRight(s -> { if(s.contains("+")) { // remove commit hash return s.substring(0, s.lastIndexOf('+')); } @@ -316,17 +316,17 @@ protected void dumpResources(List ignoredResources) { })) .filter(Pair.testRight(s -> s.contains("."))) // remove patch version - .map(Pair.mapRight(s -> s.substring(0, s.lastIndexOf('.')))) + .map(p -> p.mapRight(s -> s.substring(0, s.lastIndexOf('.')))) .filter(Pair.testRight(s -> s.contains("."))) // remove minor version - .map(Pair.mapRight(s -> s.substring(0, s.lastIndexOf('.')))) + .map(p -> p.mapRight(s -> s.substring(0, s.lastIndexOf('.')))) .collect(Collectors.toSet()); Set pathsNoMajor = paths .stream() .filter(Pair.testRight(s -> s.contains("."))) - .map(Pair.mapRight(s -> s.substring(0, s.lastIndexOf('.')))) // remove major version + .map(p -> p.mapRight(s -> s.substring(0, s.lastIndexOf('.')))) // remove major version .map(Pair.unwrapRight()) .collect(Collectors.toSet()); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 3dbac74da0..f7bc364b42 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -71,7 +71,7 @@ import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.tectonic.ShortcutLoader; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java index 9fcb938c81..c5aa8903b5 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaListLikePreprocessor.java @@ -34,7 +34,7 @@ import java.util.Set; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; public class MetaListLikePreprocessor extends MetaPreprocessor { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java index d36d461131..32d96e5123 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaMapPreprocessor.java @@ -33,7 +33,7 @@ import java.util.Optional; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; import com.dfsek.terra.api.util.reflection.TypeKey; diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaPreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaPreprocessor.java index 2f4b0d231f..8a06f1ae2e 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaPreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaPreprocessor.java @@ -25,7 +25,7 @@ import java.lang.annotation.Annotation; import java.util.Map; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; public abstract class MetaPreprocessor implements ValuePreprocessor { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaValuePreprocessor.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaValuePreprocessor.java index 2f49049fe4..39319ba1f2 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaValuePreprocessor.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/preprocessor/MetaValuePreprocessor.java @@ -27,7 +27,7 @@ import java.util.Map; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; public class MetaValuePreprocessor extends MetaPreprocessor { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java index 7837250d4c..0a8c7f89be 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java @@ -44,7 +44,7 @@ import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; import com.dfsek.terra.api.registry.key.RegistryKey; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; import com.dfsek.terra.api.util.reflection.TypeKey; diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java index 5fdf266ad7..5d63ee7603 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java @@ -23,7 +23,7 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java index 6a8fe71e90..b41142a69c 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/GeneratedChunkCache.java @@ -8,7 +8,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java index 9a16c7231e..83394dfa76 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java @@ -27,7 +27,7 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.MetaPack; -import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.generic.data.types.Pair; import com.dfsek.terra.api.util.range.ConstantRange; import com.dfsek.terra.mod.ModPlatform; import com.dfsek.terra.mod.config.VanillaWorldProperties; From 9357b18964b7d238e9ab0d316eac95882484383e Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 1 Jan 2026 22:30:10 -0700 Subject: [PATCH 30/47] refactor some static methods to generic versions in BiFunctor --- .../noise/config/sampler/CacheSampler.java | 8 +++---- .../api/util/generic/data/BiFunctor.java | 17 ++++++++++++++ .../api/util/generic/data/types/Pair.java | 23 ++++++------------- .../generation/CachingBiomeProvider.java | 8 +++---- .../com/dfsek/terra/AbstractPlatform.java | 5 +++- 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/sampler/CacheSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/sampler/CacheSampler.java index 0e5c3cc7dd..378425a403 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/sampler/CacheSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/sampler/CacheSampler.java @@ -63,16 +63,16 @@ private Double sampleNoise(DoubleSeededVector3Key vec) { @Override public double getSample(long seed, double x, double y) { Mutable> cachePair = cache2D.get(); - DoubleSeededVector2Key mutableKey = cachePair.getLeft(); + DoubleSeededVector2Key mutableKey = cachePair.left(); mutableKey.set(x, y, seed); - return cachePair.getRight().get(mutableKey); + return cachePair.right().get(mutableKey); } @Override public double getSample(long seed, double x, double y, double z) { Mutable> cachePair = cache3D.get(); - DoubleSeededVector3Key mutableKey = cachePair.getLeft(); + DoubleSeededVector3Key mutableKey = cachePair.left(); mutableKey.set(x, y, z, seed); - return cachePair.getRight().get(mutableKey); + return cachePair.right().get(mutableKey); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java index 537b9aca2d..b869eecb91 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java @@ -1,9 +1,26 @@ package com.dfsek.terra.api.util.generic.data; +import com.dfsek.terra.api.util.generic.data.types.Pair; + +import java.util.function.Consumer; import java.util.function.Function; public interface BiFunctor> { + static > Consumer> consumeLeft(Consumer consumer) { + return pair -> pair.mapLeft(p -> { + consumer.accept(p); + return p; + }); + } + + static Consumer> consumeRight(Consumer consumer) { + return pair -> pair.mapRight(p -> { + consumer.accept(p); + return p; + }); + } + BiFunctor mapLeft(Function map); BiFunctor mapRight(Function map); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java index 9b450da74e..b8960e22a0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java @@ -14,7 +14,6 @@ import java.util.Objects; import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -30,7 +29,7 @@ public Pair mapRight(Function function) { return of(left, function.apply(right)); } - public static Predicate> testLeft(Predicate predicate) { + public static Predicate> testLeft(Predicate predicate) { return pair -> predicate.test(pair.left); } @@ -38,19 +37,11 @@ public static Predicate> testRight(Predicate predicate) { return pair -> predicate.test(pair.right); } - public static Consumer> consumeLeft(Consumer consumer) { - return pair -> consumer.accept(pair.left); - } - - public static Consumer> consumeRight(Consumer consumer) { - return pair -> consumer.accept(pair.right); - } - - public static Function, R> unwrapRight() { + public static Function, R> unwrapRight() { return pair -> pair.right; } - public static Function, L> unwrapLeft() { + public static Function, L> unwrapLeft() { return pair -> pair.left; } @@ -73,9 +64,9 @@ public Pair.Mutable mutable() { @Override public boolean equals(Object obj) { - if(!(obj instanceof Pair that)) return false; + if(!(obj instanceof Pair(Object left1, Object right1))) return false; - return Objects.equals(this.left, that.left) && Objects.equals(this.right, that.right); + return Objects.equals(this.left, left1) && Objects.equals(this.right, right1); } public Pair apply(BiConsumer consumer) { @@ -109,7 +100,7 @@ public Pair immutable() { return Pair.of(left, right); } - public L getLeft() { + public L left() { return left; } @@ -117,7 +108,7 @@ public void setLeft(L left) { this.left = left; } - public R getRight() { + public R right() { return right; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java index b7fba529a3..52bbcb5a2e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/CachingBiomeProvider.java @@ -74,17 +74,17 @@ public BiomeProvider getHandle() { @Override public Biome getBiome(int x, int y, int z, long seed) { Mutable> cachePair = cache.get(); - SeededVector3Key mutableKey = cachePair.getLeft(); + SeededVector3Key mutableKey = cachePair.left(); mutableKey.set(x, y, z, seed); - return cachePair.getRight().get(mutableKey); + return cachePair.right().get(mutableKey); } @Override public Maybe getBaseBiome(int x, int z, long seed) { Mutable>> cachePair = baseCache.get(); - SeededVector2Key mutableKey = cachePair.getLeft(); + SeededVector2Key mutableKey = cachePair.left(); mutableKey.set(x, z, seed); - return cachePair.getRight().get(mutableKey); + return cachePair.right().get(mutableKey); } @Override diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java index 9c56439ee7..b4e67e843e 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -18,6 +18,9 @@ package com.dfsek.terra; import com.dfsek.tectonic.api.TypeRegistry; + +import com.dfsek.terra.api.util.generic.data.BiFunctor; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.jetbrains.annotations.NotNull; @@ -352,7 +355,7 @@ protected void dumpResources(List ignoredResources) { paths .stream() .filter(Pair.testRight(resourcePath::startsWith)) - .forEach(Pair.consumeLeft(path -> { + .forEach(BiFunctor.consumeLeft(path -> { logger.info("Removing outdated resource {}, replacing with {}", path, resourcePath); try { Files.delete(path); From eae5a60cf9cd6a6e61aa47ed4c40f890b2371df3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 1 Jan 2026 22:31:44 -0700 Subject: [PATCH 31/47] remove useless methods from Pair --- .../com/dfsek/terra/api/util/generic/data/types/Pair.java | 8 -------- .../src/main/java/com/dfsek/terra/AbstractPlatform.java | 4 ++-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java index b8960e22a0..484897670f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java @@ -37,14 +37,6 @@ public static Predicate> testRight(Predicate predicate) { return pair -> predicate.test(pair.right); } - public static Function, R> unwrapRight() { - return pair -> pair.right; - } - - public static Function, L> unwrapLeft() { - return pair -> pair.left; - } - @Contract("_, _ -> new") public static Pair of(L1 left, R1 right) { return new Pair<>(left, right); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java index b4e67e843e..783a611479 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -330,7 +330,7 @@ protected void dumpResources(List ignoredResources) { .stream() .filter(Pair.testRight(s -> s.contains("."))) .map(p -> p.mapRight(s -> s.substring(0, s.lastIndexOf('.')))) // remove major version - .map(Pair.unwrapRight()) + .map(Pair::right) .collect(Collectors.toSet()); @@ -369,7 +369,7 @@ protected void dumpResources(List ignoredResources) { .anyMatch(resourcePath::startsWith) && // if any share name paths .stream() - .map(Pair.unwrapRight()) + .map(Pair::right) .noneMatch(resourcePath::startsWith)) { // but dont share major version logger.warn( "Addon {} has a new major version available. It will not be automatically updated; you will need to " + From 966bcab37009d5fd1f7c92fbfa211ab1c180d907 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 03:04:19 -0700 Subject: [PATCH 32/47] add more linkedlist methods --- .../terra/api/util/generic/data/LinkedList.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java index a14c925ce1..16b9f50c14 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java @@ -17,7 +17,7 @@ public sealed interface LinkedList extends Monad>, Monoid LinkedList pure(T1 t) { - return new Cons<>(t, empty()); + return of(t); } @Override @@ -32,12 +32,18 @@ default Maybe head() { return get(0); } + LinkedList tail(); + int length(); Maybe get(int index); LinkedList add(T value); + default LinkedList prepend(T value) { + return new Cons<>(value, this); + } + > C toCollection(C collection); default List toList() { @@ -115,6 +121,11 @@ public LinkedList map(Function map) { return (LinkedList) this; } + @Override + public LinkedList tail() { + return this; + } + @Override public int length() { return 0; From a5fe4d792822b373008f82e65c5d1974acc3320a Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 17:12:20 -0700 Subject: [PATCH 33/47] Add annotations --- .../commands/locate/LocateCommandAddon.java | 2 +- .../api/util/function/FunctionUtils.java | 39 +++++++++------ .../terra/api/util/generic/control/Monad.java | 20 +++++--- .../api/util/generic/data/BiFunctor.java | 22 +++++++-- .../terra/api/util/generic/data/Functor.java | 6 ++- .../api/util/generic/data/LinkedList.java | 48 ++++++++++++++----- .../terra/api/util/generic/data/Monoid.java | 11 +++-- .../api/util/generic/data/types/Either.java | 40 +++++++++++----- .../api/util/generic/data/types/Maybe.java | 16 ++++--- .../api/util/generic/data/types/Pair.java | 4 +- 10 files changed, 142 insertions(+), 66 deletions(-) diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java index b60caef03b..baec07c4ad 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/LocateCommandAddon.java @@ -27,7 +27,7 @@ import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.biome.Biome; -import static com.dfsek.terra.api.util.function.FunctionUtils.collapse; +import static com.dfsek.terra.api.util.generic.data.types.Either.collapse; public class LocateCommandAddon implements AddonInitializer { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 1961c754d6..8eefdd7301 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -2,40 +2,39 @@ import com.dfsek.terra.api.util.generic.data.types.Either; -import java.util.Optional; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; import java.util.function.Consumer; import java.util.function.Function; public final class FunctionUtils { - private FunctionUtils() {} + private FunctionUtils() { } - public static Function lift(Consumer c) { + @Contract("_ -> new") + public static @NotNull Function lift(@NotNull Consumer c) { + Objects.requireNonNull(c); return co -> { c.accept(co); return co; }; } - @SuppressWarnings("unchecked") - public static Either toEither(Optional o, L de) { - return (Either) o.map(Either::right).orElseGet(() -> Either.left(de)); - } - - public static T collapse(Either either) { - return either.collect(Function.identity(), Function.identity()); - } - - public static U throw_(T e) throws T { + @Contract("_ -> fail") + public static @NotNull U throw_(@NotNull T e) throws T { throw e; } @SuppressWarnings("unchecked") - public static U sneakyThrow(Throwable e) throws E { + @Contract("_ -> fail") + public static @NotNull U sneakyThrow(@NotNull Throwable e) throws E { throw (E) e; } - public static Function> liftTry(Function f) { + @Contract(pure = true, value = "_ -> new") + public static @NotNull Function> liftTry(@NotNull Function f) { return s -> { try { return Either.right(f.apply(s)); @@ -45,4 +44,14 @@ public static Function> liftTry(Function f) }; } + @Contract(pure = true, value = "_ -> new") + public static @NotNull Function> liftTryUnsafe(@NotNull Function f) { + return s -> { + try { + return Either.right(f.apply(s)); + } catch(Throwable e) { + return Either.left(e); + } + }; + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java index 29ae017c0a..bf3f73a7ab 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java @@ -3,6 +3,10 @@ import com.dfsek.terra.api.util.generic.data.Functor; import com.dfsek.terra.api.util.generic.kinds.K; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; import java.util.function.Function; @@ -10,17 +14,21 @@ * A monad is a monoid in the category of endofunctors. */ public interface Monad> extends Functor, K { - Monad bind(Function> map); + @Contract(pure = true, value = "_ -> new") + @NotNull Monad bind(@NotNull Function> map); - Monad pure(T1 t); + @Contract(pure = true, value = "_ -> new") + @NotNull Monad pure(@NotNull T1 t); @Override - default Monad map(Function map) { - return bind(map.andThen(this::pure)); + @Contract(pure = true, value = "_ -> new") + default @NotNull Monad map(@NotNull Function map) { + return bind(Objects.requireNonNull(map).andThen(this::pure)); } // almost all well-known applicative functors are also monads, so we can just put that here. - default Monad apply(Monad, M> amap) { - return amap.bind(this::map); + @Contract(pure = true, value = "_ -> new") + default @NotNull Monad apply(@NotNull Monad, M> amap) { + return Objects.requireNonNull(amap).bind(this::map); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java index b869eecb91..db93c4add8 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java @@ -2,29 +2,41 @@ import com.dfsek.terra.api.util.generic.data.types.Pair; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; import java.util.function.Consumer; import java.util.function.Function; public interface BiFunctor> { - static > Consumer> consumeLeft(Consumer consumer) { + @Contract("_ -> new") + static > @NotNull Consumer> consumeLeft(@NotNull Consumer consumer) { + Objects.requireNonNull(consumer); return pair -> pair.mapLeft(p -> { consumer.accept(p); return p; }); } - static Consumer> consumeRight(Consumer consumer) { + @Contract("_ -> new") + static > @NotNull Consumer> consumeRight(@NotNull Consumer consumer) { + Objects.requireNonNull(consumer); return pair -> pair.mapRight(p -> { consumer.accept(p); return p; }); } - BiFunctor mapLeft(Function map); - BiFunctor mapRight(Function map); + @Contract(pure = true, value = "_ -> new") + @NotNull BiFunctor mapLeft(@NotNull Function map); + + @Contract(pure = true, value = "_ -> new") + @NotNull BiFunctor mapRight(@NotNull Function map); - default BiFunctor bimap(Function left, Function right) { + @Contract(pure = true, value = "_, _-> new") + default @NotNull BiFunctor bimap(@NotNull Function left, @NotNull Function right) { return mapLeft(left).mapRight(right); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java index 452f1ea85b..69023acb0c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java @@ -2,9 +2,13 @@ import com.dfsek.terra.api.util.generic.kinds.K; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + import java.util.function.Function; public interface Functor> extends K { - Functor map(Function map); + @Contract(pure = true, value = "_ -> new") + @NotNull Functor map(@NotNull Function map); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java index 16b9f50c14..ba57ceadef 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java @@ -3,59 +3,81 @@ import com.dfsek.terra.api.util.generic.control.Monad; import com.dfsek.terra.api.util.generic.data.types.Maybe; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.dataflow.qual.Pure; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.Function; public sealed interface LinkedList extends Monad>, Monoid> { @Override - LinkedList bind(Function>> map); + @Contract(pure = true, value = "_ -> new") + @NotNull LinkedList bind(@NotNull Function>> map); @Override - default LinkedList pure(T1 t) { + @Contract(pure = true, value = "_ -> new") + default @NotNull LinkedList pure(@NotNull T1 t) { return of(t); } @Override - LinkedList map(Function map); + @Contract(pure = true, value = "_ -> new") + @NotNull LinkedList map(@NotNull Function map); @Override - default LinkedList identity() { + @Contract(pure = true, value = "-> new") + default @NotNull LinkedList identity() { return empty(); } + @Contract(pure = true, value = "-> new") default Maybe head() { return get(0); } LinkedList tail(); + @Contract(pure = true) int length(); + @Contract(pure = true) Maybe get(int index); + @Contract(pure = true, value = "_ -> new") LinkedList add(T value); - default LinkedList prepend(T value) { - return new Cons<>(value, this); + @NotNull + @Contract(pure = true, value = "_ -> new") + default LinkedList prepend(@NotNull T value) { + return new Cons<>(Objects.requireNonNull(value), this); } + @Contract(mutates = "param") > C toCollection(C collection); + @NotNull + @Contract(pure = true, value = "-> new") default List toList() { return toCollection(new ArrayList<>()); } + @NotNull + @Contract(pure = true, value = "-> new") default Set toSet() { return toCollection(new HashSet<>()); } @Override - LinkedList multiply(Monoid> t); + @NotNull + LinkedList multiply(@NotNull Monoid> t); static LinkedList of(T value) { return new Cons<>(value, empty()); @@ -68,12 +90,12 @@ static Nil empty() { record Cons(T value, LinkedList tail) implements LinkedList { @Override - public LinkedList bind(Function>> map) { + public @NotNull LinkedList bind(@NotNull Function>> map) { return ((LinkedList) map.apply(value)).multiply(tail.bind(map)); } @Override - public LinkedList map(Function map) { + public @NotNull LinkedList map(@NotNull Function map) { return new Cons<>(map.apply(value), tail.map(map)); } @@ -101,7 +123,7 @@ public > C toCollection(C collection) { } @Override - public LinkedList multiply(Monoid> t) { + public @NotNull LinkedList multiply(@NotNull Monoid> t) { return new Cons<>(value, tail.multiply(t)); } } @@ -111,13 +133,13 @@ record Nil() implements LinkedList { @Override @SuppressWarnings("unchecked") - public LinkedList bind(Function>> map) { + public @NotNull LinkedList bind(@NotNull Function>> map) { return (LinkedList) this; } @Override @SuppressWarnings("unchecked") - public LinkedList map(Function map) { + public @NotNull LinkedList map(@NotNull Function map) { return (LinkedList) this; } @@ -147,7 +169,7 @@ public > C toCollection(C collection) { } @Override - public LinkedList multiply(Monoid> t) { + public @NotNull LinkedList multiply(@NotNull Monoid> t) { return (LinkedList) t; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java index ed5fb23343..db13e80a97 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java @@ -2,9 +2,14 @@ import com.dfsek.terra.api.util.generic.kinds.K; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; -public interface Monoid> extends K{ - Monoid identity(); - Monoid multiply(Monoid t); +public interface Monoid> extends K { + @Contract(pure = true, value = "-> new") + @NotNull Monoid identity(); + + @Contract(pure = true, value = "_ -> new") + @NotNull Monoid multiply(@NotNull Monoid t); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 37d1e11cc5..7a60c17134 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -17,38 +17,52 @@ import org.jetbrains.annotations.NotNull; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; public sealed interface Either extends Monad>, BiFunctor> { - default Either ifLeft(Consumer action) { + static T collapse(Either either) { + return either.collect(Function.identity(), Function.identity()); + } + + @SuppressWarnings("unchecked") + static Either toEither(Optional o, L de) { + return (Either) o.map(Either::right).orElseGet(() -> left(de)); + } + + @NotNull + @Contract("_ -> this") + default Either ifLeft(@NotNull Consumer action) { return mapLeft(FunctionUtils.lift(action)); } - default Either ifRight(Consumer action) { + @NotNull + @Contract("_ -> this") + default Either ifRight(@NotNull Consumer action) { return mapRight(FunctionUtils.lift(action)); } // Either is a functor in its right parameter. @Override - default Either map(Function map) { + default @NotNull Either map(@NotNull Function map) { return mapRight(map); } @Override - default Either pure(T1 t) { + default @NotNull Either pure(@NotNull T1 t) { return right(t); } @Override - Either bind(Function>> map); + @NotNull Either bind(@NotNull Function>> map); @Override - Either mapLeft(Function f); + @NotNull Either mapLeft(@NotNull Function f); @Override - Either mapRight(Function f); + @NotNull Either mapRight(@NotNull Function f); Maybe getLeft(); @@ -93,18 +107,18 @@ record Left(L value) implements Either { @Override @SuppressWarnings("unchecked") - public Either bind(Function>> map) { + public @NotNull Either bind(@NotNull Function>> map) { return (Either) this; } @Override - public Either mapLeft(Function f) { + public @NotNull Either mapLeft(@NotNull Function f) { return new Left<>(f.apply(value)); } @SuppressWarnings({ "unchecked" }) @Override - public Either mapRight(Function f) { + public @NotNull Either mapRight(@NotNull Function f) { return (Either) this; } @@ -142,18 +156,18 @@ public U collect(Function left, Function right) { record Right(R value) implements Either { @Override - public Either bind(Function>> map) { + public @NotNull Either bind(@NotNull Function>> map) { return (Either) map.apply(value); } @SuppressWarnings({ "unchecked" }) @Override - public Either mapLeft(Function f) { + public @NotNull Either mapLeft(@NotNull Function f) { return (Either) this; } @Override - public Either mapRight(Function f) { + public @NotNull Either mapRight(@NotNull Function f) { return new Right<>(f.apply(value)); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java index 7aa1b683ee..9ee201c7c9 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -3,6 +3,8 @@ import com.dfsek.terra.api.util.generic.control.Monad; import com.dfsek.terra.api.util.generic.data.LinkedList; +import org.jetbrains.annotations.NotNull; + import java.util.NoSuchElementException; import java.util.Optional; import java.util.function.Consumer; @@ -14,12 +16,12 @@ public sealed interface Maybe extends Monad> { @Override - default Maybe pure(T1 t) { + default @NotNull Maybe pure(@NotNull T1 t) { return just(t); } @Override - Maybe bind(Function>> map); + @NotNull Maybe bind(@NotNull Function>> map); Optional toOptional(); @@ -30,7 +32,7 @@ default Maybe pure(T1 t) { boolean isJust(); @Override - Maybe map(Function map); + @NotNull Maybe map(@NotNull Function map); default T get(T def) { return get(() -> def); @@ -137,7 +139,7 @@ public boolean isJust() { } @Override - public Maybe map(Function map) { + public @NotNull Maybe map(@NotNull Function map) { return just(map.apply(value)); } @@ -147,7 +149,7 @@ public Maybe or(Supplier> or) { } @Override - public Maybe bind(Function>> map) { + public @NotNull Maybe bind(@NotNull Function>> map) { return (Maybe) map.apply(value); } } @@ -155,7 +157,7 @@ public Maybe bind(Function>> map) { record Nothing() implements Maybe { @Override - public Maybe bind(Function>> map) { + public @NotNull Maybe bind(@NotNull Function>> map) { return nothing(); } @@ -181,7 +183,7 @@ public boolean isJust() { @Override @SuppressWarnings("unchecked") - public Maybe map(Function map) { + public @NotNull Maybe map(@NotNull Function map) { return (Maybe) this; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java index 484897670f..06c3ae02de 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Pair.java @@ -21,11 +21,11 @@ public record Pair(L left, R right) implements BiFunctor> { private static final Pair NULL = new Pair<>(null, null); - public Pair mapLeft(Function function) { + public @NotNull Pair mapLeft(@NotNull Function function) { return of(function.apply(left), right); } - public Pair mapRight(Function function) { + public @NotNull Pair mapRight(@NotNull Function function) { return of(left, function.apply(right)); } From a66c2a07491257a226440cca51b53079c3d8f3f1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 17:12:30 -0700 Subject: [PATCH 34/47] Implement Monad Lazy --- .../dfsek/terra/api/util/generic/Lazy.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java index c9adddf1e2..01aa65a013 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java @@ -7,13 +7,21 @@ package com.dfsek.terra.api.util.generic; +import com.dfsek.terra.api.util.generic.control.Monad; +import com.dfsek.terra.api.util.generic.data.Functor; + +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; import java.util.function.Supplier; -public final class Lazy { +public final class Lazy implements Monad> { private final Supplier valueSupplier; - private T value; - private boolean got = false; + private volatile T value = null; + private final AtomicBoolean got = new AtomicBoolean(false); private Lazy(Supplier valueSupplier) { this.valueSupplier = valueSupplier; @@ -24,10 +32,24 @@ public static Lazy lazy(Supplier valueSupplier) { } public T value() { - if(!got && value == null) { - got = true; + if(!got.compareAndExchange(false, true)) { value = valueSupplier.get(); } return value; } + + @Override + public @NotNull Lazy bind(@NotNull Function>> map) { + return lazy(() -> ((Lazy) map.apply(value())).value()); + } + + @Override + public @NotNull Lazy map(@NotNull Function map) { + return (Lazy) Monad.super.map(map); + } + + @Override + public @NotNull Lazy pure(@NotNull T1 t) { + return new Lazy<>(() -> t); + } } From e706ef89fc0b93317f0019ca20a5677eb9aadb8f Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 17:23:03 -0700 Subject: [PATCH 35/47] implement faster map on Lazy --- .../src/main/java/com/dfsek/terra/api/util/generic/Lazy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java index 01aa65a013..81d539f1dc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java @@ -45,7 +45,7 @@ public T value() { @Override public @NotNull Lazy map(@NotNull Function map) { - return (Lazy) Monad.super.map(map); + return lazy(() -> map.apply(value())); } @Override From df46c617f288c49b383ec9f43f315b21ee00ba64 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 20:04:00 -0700 Subject: [PATCH 36/47] move Construct to FunctionUtils --- .../state/properties/base/IntProperty.java | 4 ++-- .../block/state/properties/enums/Direction.java | 4 ++-- .../terra/api/util/function/FunctionUtils.java | 5 +++++ .../dfsek/terra/api/util/generic/Construct.java | 17 ----------------- .../com/dfsek/terra/api/util/generic/Lazy.java | 6 ++++-- 5 files changed, 13 insertions(+), 23 deletions(-) delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java index 36652cb589..bc85ec07be 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java @@ -12,13 +12,13 @@ import java.util.List; import com.dfsek.terra.api.block.state.properties.Property; -import com.dfsek.terra.api.util.generic.Construct; +import com.dfsek.terra.api.util.function.FunctionUtils; public interface IntProperty extends Property { static IntProperty of(String name, int min, int max) { return new IntProperty() { - private final Collection collection = Construct.construct(() -> { + private final Collection collection = FunctionUtils.construct(() -> { List ints = new ArrayList<>(); for(int i = min; i <= max; i++) { ints.add(i); diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java index 258f462422..de8f82ddfa 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java @@ -9,7 +9,7 @@ import com.dfsek.seismic.type.Rotation; -import com.dfsek.terra.api.util.generic.Construct; +import com.dfsek.terra.api.util.function.FunctionUtils; public enum Direction { @@ -20,7 +20,7 @@ public enum Direction { UP(-1, 0, 1, 0), DOWN(-1, 0, -1, 0); - private static final Direction[] rotations = Construct.construct(() -> new Direction[]{ NORTH, SOUTH, EAST, WEST }); + private static final Direction[] rotations = FunctionUtils.construct(() -> new Direction[]{ NORTH, SOUTH, EAST, WEST }); private final int rotation; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 8eefdd7301..ad9fa94c98 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -8,6 +8,7 @@ import java.util.Objects; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Supplier; public final class FunctionUtils { @@ -54,4 +55,8 @@ private FunctionUtils() { } } }; } + + public static T construct(Supplier in) { + return in.get(); + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java deleted file mode 100644 index 6fb7bba01b..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2020-2025 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.util.generic; - -import java.util.function.Supplier; - - -public final class Construct { - public static T construct(Supplier in) { - return in.get(); - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java index 81d539f1dc..e239a1f47e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java @@ -8,12 +8,10 @@ package com.dfsek.terra.api.util.generic; import com.dfsek.terra.api.util.generic.control.Monad; -import com.dfsek.terra.api.util.generic.data.Functor; import org.jetbrains.annotations.NotNull; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.function.Supplier; @@ -31,6 +29,10 @@ public static Lazy lazy(Supplier valueSupplier) { return new Lazy<>(valueSupplier); } + public static Lazy of(T value) { + return new Lazy<>(() -> value); + } + public T value() { if(!got.compareAndExchange(false, true)) { value = valueSupplier.get(); From 53dafa4a2c3f64680d736123d97c8b37e826844c Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 20:04:26 -0700 Subject: [PATCH 37/47] rename IntToBooleanFunction to IntPredicate --- .../dfsek/terra/api/structure/feature/BinaryColumn.java | 8 ++++---- .../{IntToBooleanFunction.java => IntPredicate.java} | 2 +- .../terra/api/world/chunk/generation/util/Column.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) rename common/api/src/main/java/com/dfsek/terra/api/util/function/{IntToBooleanFunction.java => IntPredicate.java} (70%) diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java index 535dce508e..4bce25d7e0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java @@ -10,7 +10,7 @@ import java.util.function.BooleanSupplier; import java.util.function.IntConsumer; -import com.dfsek.terra.api.util.function.IntToBooleanFunction; +import com.dfsek.terra.api.util.function.IntPredicate; import com.dfsek.terra.api.util.generic.Lazy; import com.dfsek.terra.api.util.range.Range; @@ -20,7 +20,7 @@ */ public class BinaryColumn { private static final BinaryColumn NULL = new BinaryColumn(0, 1, y -> false); - private final IntToBooleanFunction data; + private final IntPredicate data; private final int minY; private final int maxY; private final Lazy results; @@ -31,7 +31,7 @@ public class BinaryColumn { * @param minY Minimum Y value * @param maxY Maximum Y value */ - public BinaryColumn(int minY, int maxY, IntToBooleanFunction data) { + public BinaryColumn(int minY, int maxY, IntPredicate data) { this.minY = minY; this.maxY = maxY; this.results = Lazy.lazy(() -> { @@ -53,7 +53,7 @@ public BinaryColumn(int minY, int maxY, boolean[] data) { this.data = y -> data[y - minY]; } - public BinaryColumn(Range y, IntToBooleanFunction data) { + public BinaryColumn(Range y, IntPredicate data) { this(y.getMin(), y.getMax(), data); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/IntToBooleanFunction.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/IntPredicate.java similarity index 70% rename from common/api/src/main/java/com/dfsek/terra/api/util/function/IntToBooleanFunction.java rename to common/api/src/main/java/com/dfsek/terra/api/util/function/IntPredicate.java index eb02bb73b9..8d4cb34e64 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/IntToBooleanFunction.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/IntPredicate.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.util.function; @FunctionalInterface -public interface IntToBooleanFunction { +public interface IntPredicate { boolean apply(int value); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java index 358fbb9bce..111edf53c7 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java @@ -11,7 +11,7 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.structure.feature.BinaryColumn; -import com.dfsek.terra.api.util.function.IntToBooleanFunction; +import com.dfsek.terra.api.util.function.IntPredicate; import com.dfsek.terra.api.world.WritableWorld; @@ -75,7 +75,7 @@ public Column clamp(int min, int max) { return new Column<>(x, z, world, min, max); } - public BinaryColumn newBinaryColumn(IntToBooleanFunction function) { + public BinaryColumn newBinaryColumn(IntPredicate function) { return new BinaryColumn(getMinY(), getMaxY(), function); } From e9d30b8794c867281dad09f33a24385f97890c74 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 21:13:24 -0700 Subject: [PATCH 38/47] rename Lazy to Memo --- .../addons/image/config/image/ImageCache.java | 4 ++-- .../state/properties/base/EnumProperty.java | 4 ++-- .../api/structure/feature/BinaryColumn.java | 8 +++---- .../api/util/generic/{Lazy.java => Memo.java} | 22 +++++++++---------- .../dfsek/terra/cli/block/CLIBlockType.java | 6 ++--- 5 files changed, 22 insertions(+), 22 deletions(-) rename common/api/src/main/java/com/dfsek/terra/api/util/generic/{Lazy.java => Memo.java} (61%) diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java index 7ad72a009b..26be6b5b28 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java @@ -17,7 +17,7 @@ import com.dfsek.terra.addons.image.image.SuppliedImage; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.properties.Properties; -import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.api.util.generic.Memo; import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR; @@ -41,7 +41,7 @@ public static Image load(String path, ConfigPack pack) throws IOException { return new SuppliedImage(() -> images.cache.get(path)); } else { // If images do not time out, image can be lazily loaded once instead of performing cache lookups for each image operation - Lazy lazyImage = Lazy.lazy(() -> images.cache.get(path)); + Memo lazyImage = Memo.lazy(() -> images.cache.get(path)); return new SuppliedImage(lazyImage::value); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java index 4053a90d1c..1f44549a23 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java @@ -11,13 +11,13 @@ import java.util.Collection; import com.dfsek.terra.api.block.state.properties.Property; -import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.api.util.generic.Memo; public interface EnumProperty> extends Property { static > EnumProperty of(String name, Class clazz) { return new EnumProperty<>() { - private final Lazy> constants = Lazy.lazy(() -> Arrays.asList(clazz.getEnumConstants())); + private final Memo> constants = Memo.lazy(() -> Arrays.asList(clazz.getEnumConstants())); @Override public Collection values() { diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java index 4bce25d7e0..ddbcdc659f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java @@ -11,7 +11,7 @@ import java.util.function.IntConsumer; import com.dfsek.terra.api.util.function.IntPredicate; -import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.api.util.generic.Memo; import com.dfsek.terra.api.util.range.Range; @@ -23,7 +23,7 @@ public class BinaryColumn { private final IntPredicate data; private final int minY; private final int maxY; - private final Lazy results; + private final Memo results; /** * Constructs a new {@link BinaryColumn} with all values initiated to {@code false} @@ -34,7 +34,7 @@ public class BinaryColumn { public BinaryColumn(int minY, int maxY, IntPredicate data) { this.minY = minY; this.maxY = maxY; - this.results = Lazy.lazy(() -> { + this.results = Memo.lazy(() -> { boolean[] res = new boolean[maxY - minY]; for(int y = minY; y < maxY; y++) { res[y - minY] = get(y); @@ -48,7 +48,7 @@ public BinaryColumn(int minY, int maxY, IntPredicate data) { public BinaryColumn(int minY, int maxY, boolean[] data) { this.minY = minY; this.maxY = maxY; - this.results = Lazy.lazy(() -> data); + this.results = Memo.lazy(() -> data); if(maxY <= minY) throw new IllegalArgumentException("Max y must be greater than min y"); this.data = y -> data[y - minY]; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Memo.java similarity index 61% rename from common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/Memo.java index e239a1f47e..214d5f0d8f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Memo.java @@ -16,21 +16,21 @@ import java.util.function.Supplier; -public final class Lazy implements Monad> { +public final class Memo implements Monad> { private final Supplier valueSupplier; private volatile T value = null; private final AtomicBoolean got = new AtomicBoolean(false); - private Lazy(Supplier valueSupplier) { + private Memo(Supplier valueSupplier) { this.valueSupplier = valueSupplier; } - public static Lazy lazy(Supplier valueSupplier) { - return new Lazy<>(valueSupplier); + public static Memo lazy(Supplier valueSupplier) { + return new Memo<>(valueSupplier); } - public static Lazy of(T value) { - return new Lazy<>(() -> value); + public static Memo of(T value) { + return new Memo<>(() -> value); } public T value() { @@ -41,17 +41,17 @@ public T value() { } @Override - public @NotNull Lazy bind(@NotNull Function>> map) { - return lazy(() -> ((Lazy) map.apply(value())).value()); + public @NotNull Memo bind(@NotNull Function>> map) { + return lazy(() -> ((Memo) map.apply(value())).value()); } @Override - public @NotNull Lazy map(@NotNull Function map) { + public @NotNull Memo map(@NotNull Function map) { return lazy(() -> map.apply(value())); } @Override - public @NotNull Lazy pure(@NotNull T1 t) { - return new Lazy<>(() -> t); + public @NotNull Memo pure(@NotNull T1 t) { + return new Memo<>(() -> t); } } diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java index 71772d0e5a..b7623af19c 100644 --- a/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java @@ -2,21 +2,21 @@ import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.api.util.generic.Memo; public class CLIBlockType implements BlockType { private final String value; private final boolean solid; private final boolean water; - private final Lazy defaultState; + private final Memo defaultState; public CLIBlockType(String value) { if(value.contains("[")) throw new IllegalArgumentException("Block Type must not contain properties"); this.value = value; this.solid = !value.equals("minecraft:air"); this.water = value.equals("minecraft:water"); - this.defaultState = Lazy.lazy(() -> new CLIBlockState(value)); + this.defaultState = Memo.lazy(() -> new CLIBlockState(value)); } @Override From b9af66848af0b3b2cf514d3e507031037413e2d8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 22:15:14 -0700 Subject: [PATCH 39/47] rename manifest-addon-loader to addon-loader-manifest --- .../{manifest-addon-loader => addon-loader-manifest}/LICENSE | 0 .../build.gradle.kts | 0 .../com/dfsek/terra/addons/manifest/api/AddonInitializer.java | 0 .../com/dfsek/terra/addons/manifest/impl/ManifestAddon.java | 0 .../terra/addons/manifest/impl/ManifestAddonClassLoader.java | 0 .../dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java | 0 .../dfsek/terra/addons/manifest/impl/config/AddonManifest.java | 0 .../dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java | 0 .../addons/manifest/impl/config/loaders/VersionLoader.java | 0 .../addons/manifest/impl/config/loaders/VersionRangeLoader.java | 0 .../terra/addons/manifest/impl/exception/AddonException.java | 0 .../terra/addons/manifest/impl/exception/ManifestException.java | 0 .../manifest/impl/exception/ManifestNotPresentException.java | 0 common/addons/biome-provider-extrusion/build.gradle.kts | 2 +- common/addons/biome-provider-image/build.gradle.kts | 2 +- common/addons/biome-provider-pipeline/build.gradle.kts | 2 +- common/addons/biome-provider-single/build.gradle.kts | 2 +- common/addons/biome-query-api/build.gradle.kts | 2 +- common/addons/chunk-generator-noise-3d/build.gradle.kts | 2 +- common/addons/command-addons/build.gradle.kts | 2 +- common/addons/command-locate/build.gradle.kts | 2 +- common/addons/command-packs/build.gradle.kts | 2 +- common/addons/command-profiler/build.gradle.kts | 2 +- common/addons/command-structures/build.gradle.kts | 2 +- common/addons/config-biome/build.gradle.kts | 2 +- common/addons/config-distributors/build.gradle.kts | 2 +- common/addons/config-feature/build.gradle.kts | 2 +- common/addons/config-flora/build.gradle.kts | 2 +- common/addons/config-locators/build.gradle.kts | 2 +- common/addons/config-noise-function/build.gradle.kts | 2 +- common/addons/config-number-predicate/build.gradle.kts | 2 +- common/addons/config-ore/build.gradle.kts | 2 +- common/addons/config-palette/build.gradle.kts | 2 +- common/addons/config-structure/build.gradle.kts | 2 +- common/addons/generation-stage-feature/build.gradle.kts | 2 +- common/addons/generation-stage-structure/build.gradle.kts | 2 +- common/addons/language-yaml/build.gradle.kts | 2 +- common/addons/library-image/build.gradle.kts | 2 +- common/addons/locator-slant-noise-3d/build.gradle.kts | 2 +- common/addons/palette-block-shortcut/build.gradle.kts | 2 +- common/addons/pipeline-image/build.gradle.kts | 2 +- common/addons/shortcut-blockstate-fallback/build.gradle.kts | 2 +- common/addons/structure-block-shortcut/build.gradle.kts | 2 +- common/addons/structure-mutator/build.gradle.kts | 2 +- common/addons/structure-sponge-loader/build.gradle.kts | 2 +- common/addons/structure-terrascript-loader/build.gradle.kts | 2 +- .../addons/terrascript-function-check-noise-3d/build.gradle.kts | 2 +- common/addons/terrascript-function-sampler/build.gradle.kts | 2 +- .../com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java | 2 +- 49 files changed, 36 insertions(+), 36 deletions(-) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/LICENSE (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/build.gradle.kts (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java (100%) rename common/addons/{manifest-addon-loader => addon-loader-manifest}/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java (100%) diff --git a/common/addons/manifest-addon-loader/LICENSE b/common/addons/addon-loader-manifest/LICENSE similarity index 100% rename from common/addons/manifest-addon-loader/LICENSE rename to common/addons/addon-loader-manifest/LICENSE diff --git a/common/addons/manifest-addon-loader/build.gradle.kts b/common/addons/addon-loader-manifest/build.gradle.kts similarity index 100% rename from common/addons/manifest-addon-loader/build.gradle.kts rename to common/addons/addon-loader-manifest/build.gradle.kts diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/api/AddonInitializer.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddon.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonClassLoader.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/ManifestAddonLoader.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/config/AddonManifest.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/config/WebsiteConfig.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionLoader.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/config/loaders/VersionRangeLoader.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/AddonException.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestException.java diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java b/common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java similarity index 100% rename from common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java rename to common/addons/addon-loader-manifest/src/main/java/com/dfsek/terra/addons/manifest/impl/exception/ManifestNotPresentException.java diff --git a/common/addons/biome-provider-extrusion/build.gradle.kts b/common/addons/biome-provider-extrusion/build.gradle.kts index 7615a16d02..f75f65358e 100644 --- a/common/addons/biome-provider-extrusion/build.gradle.kts +++ b/common/addons/biome-provider-extrusion/build.gradle.kts @@ -1,6 +1,6 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) compileOnlyApi(project(":common:addons:biome-query-api")) } diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image/build.gradle.kts index 55b7f98aa7..0473cb0bf5 100644 --- a/common/addons/biome-provider-image/build.gradle.kts +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -1,7 +1,7 @@ version = version("2.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) compileOnlyApi(project(":common:addons:library-image")) diff --git a/common/addons/biome-provider-pipeline/build.gradle.kts b/common/addons/biome-provider-pipeline/build.gradle.kts index 2bbce32db8..9989dd6b8e 100644 --- a/common/addons/biome-provider-pipeline/build.gradle.kts +++ b/common/addons/biome-provider-pipeline/build.gradle.kts @@ -1,5 +1,5 @@ version = version("2.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } \ No newline at end of file diff --git a/common/addons/biome-provider-single/build.gradle.kts b/common/addons/biome-provider-single/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/biome-provider-single/build.gradle.kts +++ b/common/addons/biome-provider-single/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/biome-query-api/build.gradle.kts b/common/addons/biome-query-api/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/biome-query-api/build.gradle.kts +++ b/common/addons/biome-query-api/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/chunk-generator-noise-3d/build.gradle.kts b/common/addons/chunk-generator-noise-3d/build.gradle.kts index 3640ad0547..764036ef65 100644 --- a/common/addons/chunk-generator-noise-3d/build.gradle.kts +++ b/common/addons/chunk-generator-noise-3d/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.2.1") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/command-addons/build.gradle.kts b/common/addons/command-addons/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/command-addons/build.gradle.kts +++ b/common/addons/command-addons/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/command-locate/build.gradle.kts b/common/addons/command-locate/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/command-locate/build.gradle.kts +++ b/common/addons/command-locate/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/command-packs/build.gradle.kts b/common/addons/command-packs/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/command-packs/build.gradle.kts +++ b/common/addons/command-packs/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/command-profiler/build.gradle.kts b/common/addons/command-profiler/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/command-profiler/build.gradle.kts +++ b/common/addons/command-profiler/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/command-structures/build.gradle.kts b/common/addons/command-structures/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/command-structures/build.gradle.kts +++ b/common/addons/command-structures/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/config-biome/build.gradle.kts b/common/addons/config-biome/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/config-biome/build.gradle.kts +++ b/common/addons/config-biome/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/config-distributors/build.gradle.kts b/common/addons/config-distributors/build.gradle.kts index 35e4d70760..144bc3c1a3 100644 --- a/common/addons/config-distributors/build.gradle.kts +++ b/common/addons/config-distributors/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.1") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/config-feature/build.gradle.kts b/common/addons/config-feature/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/config-feature/build.gradle.kts +++ b/common/addons/config-feature/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/config-flora/build.gradle.kts b/common/addons/config-flora/build.gradle.kts index 35e4d70760..144bc3c1a3 100644 --- a/common/addons/config-flora/build.gradle.kts +++ b/common/addons/config-flora/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.1") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/config-locators/build.gradle.kts b/common/addons/config-locators/build.gradle.kts index 9360372c25..33635a3c4e 100644 --- a/common/addons/config-locators/build.gradle.kts +++ b/common/addons/config-locators/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.1.1") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } \ No newline at end of file diff --git a/common/addons/config-noise-function/build.gradle.kts b/common/addons/config-noise-function/build.gradle.kts index 83d927a017..6ad135b2de 100644 --- a/common/addons/config-noise-function/build.gradle.kts +++ b/common/addons/config-noise-function/build.gradle.kts @@ -1,6 +1,6 @@ version = version("1.2.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) api("com.dfsek", "paralithic", Versions.Libraries.paralithic) } diff --git a/common/addons/config-number-predicate/build.gradle.kts b/common/addons/config-number-predicate/build.gradle.kts index 3f69abb4a7..bf42e0408b 100644 --- a/common/addons/config-number-predicate/build.gradle.kts +++ b/common/addons/config-number-predicate/build.gradle.kts @@ -1,6 +1,6 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) api("com.dfsek", "paralithic", Versions.Libraries.paralithic) } \ No newline at end of file diff --git a/common/addons/config-ore/build.gradle.kts b/common/addons/config-ore/build.gradle.kts index 06718492e4..6b58ef4373 100644 --- a/common/addons/config-ore/build.gradle.kts +++ b/common/addons/config-ore/build.gradle.kts @@ -1,6 +1,6 @@ version = version("1.1.1") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/config-palette/build.gradle.kts b/common/addons/config-palette/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/config-palette/build.gradle.kts +++ b/common/addons/config-palette/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/config-structure/build.gradle.kts b/common/addons/config-structure/build.gradle.kts index a40803d2b9..c0880e1dc3 100644 --- a/common/addons/config-structure/build.gradle.kts +++ b/common/addons/config-structure/build.gradle.kts @@ -2,5 +2,5 @@ version = version("1.0.1") dependencies { api("com.googlecode.json-simple:json-simple:1.1.1") - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/generation-stage-feature/build.gradle.kts b/common/addons/generation-stage-feature/build.gradle.kts index 84c179738c..df99929d59 100644 --- a/common/addons/generation-stage-feature/build.gradle.kts +++ b/common/addons/generation-stage-feature/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.1.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/generation-stage-structure/build.gradle.kts b/common/addons/generation-stage-structure/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/generation-stage-structure/build.gradle.kts +++ b/common/addons/generation-stage-structure/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/language-yaml/build.gradle.kts b/common/addons/language-yaml/build.gradle.kts index bb180dae9b..b59239dfb6 100644 --- a/common/addons/language-yaml/build.gradle.kts +++ b/common/addons/language-yaml/build.gradle.kts @@ -2,5 +2,5 @@ version = version("1.0.0") dependencies { implementation("com.dfsek.tectonic:yaml:${Versions.Libraries.tectonic}") - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/library-image/build.gradle.kts b/common/addons/library-image/build.gradle.kts index b8682c80ba..efcb3d2296 100644 --- a/common/addons/library-image/build.gradle.kts +++ b/common/addons/library-image/build.gradle.kts @@ -1,7 +1,7 @@ version = version("1.1.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/locator-slant-noise-3d/build.gradle.kts b/common/addons/locator-slant-noise-3d/build.gradle.kts index b4283bb750..1de35f1f16 100644 --- a/common/addons/locator-slant-noise-3d/build.gradle.kts +++ b/common/addons/locator-slant-noise-3d/build.gradle.kts @@ -1,6 +1,6 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) compileOnlyApi(project(":common:addons:chunk-generator-noise-3d")) } diff --git a/common/addons/palette-block-shortcut/build.gradle.kts b/common/addons/palette-block-shortcut/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/palette-block-shortcut/build.gradle.kts +++ b/common/addons/palette-block-shortcut/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/pipeline-image/build.gradle.kts b/common/addons/pipeline-image/build.gradle.kts index 81b010d74e..d1dd884326 100644 --- a/common/addons/pipeline-image/build.gradle.kts +++ b/common/addons/pipeline-image/build.gradle.kts @@ -1,7 +1,7 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) compileOnlyApi(project(":common:addons:biome-provider-pipeline")) compileOnlyApi(project(":common:addons:library-image")) } diff --git a/common/addons/shortcut-blockstate-fallback/build.gradle.kts b/common/addons/shortcut-blockstate-fallback/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/shortcut-blockstate-fallback/build.gradle.kts +++ b/common/addons/shortcut-blockstate-fallback/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/structure-block-shortcut/build.gradle.kts b/common/addons/structure-block-shortcut/build.gradle.kts index 9d0aac37fb..582ebe1095 100644 --- a/common/addons/structure-block-shortcut/build.gradle.kts +++ b/common/addons/structure-block-shortcut/build.gradle.kts @@ -1,5 +1,5 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/structure-mutator/build.gradle.kts b/common/addons/structure-mutator/build.gradle.kts index 0440540bb7..c557967b50 100644 --- a/common/addons/structure-mutator/build.gradle.kts +++ b/common/addons/structure-mutator/build.gradle.kts @@ -1,5 +1,5 @@ version = version("0.1.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } diff --git a/common/addons/structure-sponge-loader/build.gradle.kts b/common/addons/structure-sponge-loader/build.gradle.kts index 31e74764b3..39134f3c9d 100644 --- a/common/addons/structure-sponge-loader/build.gradle.kts +++ b/common/addons/structure-sponge-loader/build.gradle.kts @@ -3,5 +3,5 @@ version = version("1.0.0") dependencies { api("commons-io", "commons-io", Versions.Libraries.Internal.apacheIO) api("com.github.Querz", "NBT", Versions.Libraries.Internal.nbt) - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } \ No newline at end of file diff --git a/common/addons/structure-terrascript-loader/build.gradle.kts b/common/addons/structure-terrascript-loader/build.gradle.kts index 265114f64e..b8b4b50d89 100644 --- a/common/addons/structure-terrascript-loader/build.gradle.kts +++ b/common/addons/structure-terrascript-loader/build.gradle.kts @@ -2,5 +2,5 @@ version = version("1.2.0") dependencies { api("commons-io", "commons-io", Versions.Libraries.Internal.apacheIO) - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) } \ No newline at end of file diff --git a/common/addons/terrascript-function-check-noise-3d/build.gradle.kts b/common/addons/terrascript-function-check-noise-3d/build.gradle.kts index 75dbafba52..98b6cc5f4b 100644 --- a/common/addons/terrascript-function-check-noise-3d/build.gradle.kts +++ b/common/addons/terrascript-function-check-noise-3d/build.gradle.kts @@ -1,7 +1,7 @@ version = version("1.0.1") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) compileOnlyApi(project(":common:addons:chunk-generator-noise-3d")) compileOnlyApi(project(":common:addons:structure-terrascript-loader")) } \ No newline at end of file diff --git a/common/addons/terrascript-function-sampler/build.gradle.kts b/common/addons/terrascript-function-sampler/build.gradle.kts index dd32494447..6441004c38 100644 --- a/common/addons/terrascript-function-sampler/build.gradle.kts +++ b/common/addons/terrascript-function-sampler/build.gradle.kts @@ -1,7 +1,7 @@ version = version("1.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) compileOnlyApi(project(":common:addons:config-noise-function")) compileOnlyApi(project(":common:addons:structure-terrascript-loader")) } diff --git a/common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java b/common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java index 30a17b864a..9f7c20c44e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java +++ b/common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java @@ -19,7 +19,7 @@ * It is a minimal base for addon loaders to be implemented on top of. *

* Unless you are writing your own addon loader, you will want to depend on the - * {@code manifest-addon-loader} addon, and implement its AddonInitializer. + * {@code addon-loader-manifest} addon, and implement its AddonInitializer. * * @param Type of addon this bootstrap addon loads */ From 38a157194176077ba33687d3057cf7ad14afaf72 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 22:19:05 -0700 Subject: [PATCH 40/47] fix RegistryTest --- .../src/test/java/registry/RegistryTest.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/common/implementation/base/src/test/java/registry/RegistryTest.java b/common/implementation/base/src/test/java/registry/RegistryTest.java index 10ed433bfe..12ef4d880d 100644 --- a/common/implementation/base/src/test/java/registry/RegistryTest.java +++ b/common/implementation/base/src/test/java/registry/RegistryTest.java @@ -39,19 +39,19 @@ public class RegistryTest { public void openRegistry() { OpenRegistry test = new OpenRegistryImpl<>(TypeKey.of(String.class)); - test.register(RegistryKey.parse("test:test"), "bazinga"); + RegistryKey.parse("test:test").ifRight(r -> test.register(r, "bazinga")); - assertEquals(test.get(RegistryKey.parse("test:test")).orThrow(), "bazinga"); + assertEquals("bazinga", test.get(RegistryKey.parse("test:test").getRight().orThrow()).orThrow()); } @Test public void openRegistryChecked() { OpenRegistry test = new OpenRegistryImpl<>(TypeKey.of(String.class)); - test.registerChecked(RegistryKey.parse("test:test"), "bazinga"); + RegistryKey.parse("test:test").ifRight(r -> test.registerChecked(r, "bazinga")); try { - test.registerChecked(RegistryKey.parse("test:test"), "bazinga2"); + RegistryKey.parse("test:test").ifRight(r -> test.registerChecked(r, "bazinga2")); fail("Shouldn't be able to re-register with #registerChecked!"); } catch(DuplicateEntryException ignore) { @@ -62,12 +62,12 @@ public void openRegistryChecked() { public void checkedRegistry() { CheckedRegistry test = new CheckedRegistryImpl<>(new OpenRegistryImpl<>(TypeKey.of(String.class))); - test.register(RegistryKey.parse("test:test"), "bazinga"); + RegistryKey.parse("test:test").ifRight(r -> test.register(r, "bazinga")); - assertEquals(test.get(RegistryKey.parse("test:test")).orThrow(), "bazinga"); + assertEquals("bazinga", test.get(RegistryKey.parse("test:test").getRight().orThrow()).orThrow()); try { - test.register(RegistryKey.parse("test:test"), "bazinga2"); + RegistryKey.parse("test:test").ifRight(r -> test.register(r, "bazinga2")); fail("Shouldn't be able to re-register in CheckedRegistry!"); } catch(DuplicateEntryException ignore) { @@ -78,7 +78,7 @@ public void checkedRegistry() { public void getID() { OpenRegistry test = new OpenRegistryImpl<>(TypeKey.of(String.class)); - test.register(RegistryKey.parse("test:test"), "bazinga"); + RegistryKey.parse("test:test").ifRight(r -> test.register(r, "bazinga")); assertEquals(test.getByID("test").collectThrow(Invalid::toIllegal), "bazinga"); } @@ -87,10 +87,10 @@ public void getID() { public void getIDAmbiguous() { OpenRegistry test = new OpenRegistryImpl<>(TypeKey.of(String.class)); - test.registerChecked(RegistryKey.parse("test:test"), "bazinga"); - test.registerChecked(RegistryKey.parse("test2:test"), "bazinga"); + RegistryKey.parse("test:test").ifRight(r -> test.register(r, "bazinga")); + RegistryKey.parse("test3:test").ifRight(r -> test.register(r, "bazinga")); - Either result = test.getByID("test"); + Either result = test.getByID("test"); assertTrue(result.isLeft()); } From a9251fa2288c829a0e61cb0eb6d0e984c203b9a9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 22:20:44 -0700 Subject: [PATCH 41/47] rename api-addon-loader addon-loader-api --- common/addons/{api-addon-loader => addon-loader-api}/LICENSE | 0 common/addons/{api-addon-loader => addon-loader-api}/README.md | 0 .../{api-addon-loader => addon-loader-api}/build.gradle.kts | 0 .../src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java | 0 .../java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java | 0 .../main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename common/addons/{api-addon-loader => addon-loader-api}/LICENSE (100%) rename common/addons/{api-addon-loader => addon-loader-api}/README.md (100%) rename common/addons/{api-addon-loader => addon-loader-api}/build.gradle.kts (100%) rename common/addons/{api-addon-loader => addon-loader-api}/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java (100%) rename common/addons/{api-addon-loader => addon-loader-api}/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java (100%) rename common/addons/{api-addon-loader => addon-loader-api}/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java (100%) diff --git a/common/addons/api-addon-loader/LICENSE b/common/addons/addon-loader-api/LICENSE similarity index 100% rename from common/addons/api-addon-loader/LICENSE rename to common/addons/addon-loader-api/LICENSE diff --git a/common/addons/api-addon-loader/README.md b/common/addons/addon-loader-api/README.md similarity index 100% rename from common/addons/api-addon-loader/README.md rename to common/addons/addon-loader-api/README.md diff --git a/common/addons/api-addon-loader/build.gradle.kts b/common/addons/addon-loader-api/build.gradle.kts similarity index 100% rename from common/addons/api-addon-loader/build.gradle.kts rename to common/addons/addon-loader-api/build.gradle.kts diff --git a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java b/common/addons/addon-loader-api/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java similarity index 100% rename from common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java rename to common/addons/addon-loader-api/src/main/java/com/dfsek/terra/addon/loader/ApiAddon.java diff --git a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java b/common/addons/addon-loader-api/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java similarity index 100% rename from common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java rename to common/addons/addon-loader-api/src/main/java/com/dfsek/terra/addon/loader/ApiAddonClassLoader.java diff --git a/common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java b/common/addons/addon-loader-api/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java similarity index 100% rename from common/addons/api-addon-loader/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java rename to common/addons/addon-loader-api/src/main/java/com/dfsek/terra/addon/loader/ApiAddonLoader.java From b6d42fdcc1a1afb7b6e0c5cd6b71ddef400e82b9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 22:22:14 -0700 Subject: [PATCH 42/47] rename biome-query-api to api-biome-query --- common/addons/{biome-query-api => api-biome-query}/README.md | 0 .../{biome-query-api => api-biome-query}/build.gradle.kts | 0 .../com/dfsek/terra/addons/biome/query/BiomeQueryAPIAddon.java | 0 .../com/dfsek/terra/addons/biome/query/api/BiomeQueries.java | 0 .../dfsek/terra/addons/biome/query/impl/BiomeTagFlattener.java | 0 .../com/dfsek/terra/addons/biome/query/impl/BiomeTagHolder.java | 0 .../com/dfsek/terra/addons/biome/query/impl/SingleTagQuery.java | 0 .../src/main/resources/terra.addon.yml | 2 +- common/addons/biome-provider-extrusion/build.gradle.kts | 2 +- .../biome-provider-extrusion/src/main/resources/terra.addon.yml | 2 +- 10 files changed, 3 insertions(+), 3 deletions(-) rename common/addons/{biome-query-api => api-biome-query}/README.md (100%) rename common/addons/{biome-query-api => api-biome-query}/build.gradle.kts (100%) rename common/addons/{biome-query-api => api-biome-query}/src/main/java/com/dfsek/terra/addons/biome/query/BiomeQueryAPIAddon.java (100%) rename common/addons/{biome-query-api => api-biome-query}/src/main/java/com/dfsek/terra/addons/biome/query/api/BiomeQueries.java (100%) rename common/addons/{biome-query-api => api-biome-query}/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagFlattener.java (100%) rename common/addons/{biome-query-api => api-biome-query}/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagHolder.java (100%) rename common/addons/{biome-query-api => api-biome-query}/src/main/java/com/dfsek/terra/addons/biome/query/impl/SingleTagQuery.java (100%) rename common/addons/{biome-query-api => api-biome-query}/src/main/resources/terra.addon.yml (94%) diff --git a/common/addons/biome-query-api/README.md b/common/addons/api-biome-query/README.md similarity index 100% rename from common/addons/biome-query-api/README.md rename to common/addons/api-biome-query/README.md diff --git a/common/addons/biome-query-api/build.gradle.kts b/common/addons/api-biome-query/build.gradle.kts similarity index 100% rename from common/addons/biome-query-api/build.gradle.kts rename to common/addons/api-biome-query/build.gradle.kts diff --git a/common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/BiomeQueryAPIAddon.java b/common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/BiomeQueryAPIAddon.java similarity index 100% rename from common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/BiomeQueryAPIAddon.java rename to common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/BiomeQueryAPIAddon.java diff --git a/common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/api/BiomeQueries.java b/common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/api/BiomeQueries.java similarity index 100% rename from common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/api/BiomeQueries.java rename to common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/api/BiomeQueries.java diff --git a/common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagFlattener.java b/common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagFlattener.java similarity index 100% rename from common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagFlattener.java rename to common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagFlattener.java diff --git a/common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagHolder.java b/common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagHolder.java similarity index 100% rename from common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagHolder.java rename to common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/impl/BiomeTagHolder.java diff --git a/common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/impl/SingleTagQuery.java b/common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/impl/SingleTagQuery.java similarity index 100% rename from common/addons/biome-query-api/src/main/java/com/dfsek/terra/addons/biome/query/impl/SingleTagQuery.java rename to common/addons/api-biome-query/src/main/java/com/dfsek/terra/addons/biome/query/impl/SingleTagQuery.java diff --git a/common/addons/biome-query-api/src/main/resources/terra.addon.yml b/common/addons/api-biome-query/src/main/resources/terra.addon.yml similarity index 94% rename from common/addons/biome-query-api/src/main/resources/terra.addon.yml rename to common/addons/api-biome-query/src/main/resources/terra.addon.yml index 8a55ce2dc6..837a068312 100644 --- a/common/addons/biome-query-api/src/main/resources/terra.addon.yml +++ b/common/addons/api-biome-query/src/main/resources/terra.addon.yml @@ -1,7 +1,7 @@ schema-version: 1 contributors: - Terra contributors -id: biome-query-api +id: api-biome-query version: @VERSION@ entrypoints: - "com.dfsek.terra.addons.biome.query.BiomeQueryAPIAddon" diff --git a/common/addons/biome-provider-extrusion/build.gradle.kts b/common/addons/biome-provider-extrusion/build.gradle.kts index f75f65358e..39970f970a 100644 --- a/common/addons/biome-provider-extrusion/build.gradle.kts +++ b/common/addons/biome-provider-extrusion/build.gradle.kts @@ -2,5 +2,5 @@ version = version("1.0.0") dependencies { compileOnlyApi(project(":common:addons:addon-loader-manifest")) - compileOnlyApi(project(":common:addons:biome-query-api")) + compileOnlyApi(project(":common:addons:api-biome-query")) } diff --git a/common/addons/biome-provider-extrusion/src/main/resources/terra.addon.yml b/common/addons/biome-provider-extrusion/src/main/resources/terra.addon.yml index 21992a6d15..b6c9c9edcd 100644 --- a/common/addons/biome-provider-extrusion/src/main/resources/terra.addon.yml +++ b/common/addons/biome-provider-extrusion/src/main/resources/terra.addon.yml @@ -11,4 +11,4 @@ website: docs: https://terra.polydev.org license: MIT License depends: - biome-query-api: "1.+" \ No newline at end of file + api-biome-query: "1.+" \ No newline at end of file From ac1258d233fbeb82665d53dc54239329bdde2779 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 22:24:42 -0700 Subject: [PATCH 43/47] rename library-image to api-image --- common/addons/{library-image => api-image}/build.gradle.kts | 0 .../java/com/dfsek/terra/addons/image/ImageLibraryAddon.java | 0 .../com/dfsek/terra/addons/image/colorsampler/ColorSampler.java | 0 .../image/colorsampler/image/SingleImageColorSampler.java | 0 .../addons/image/colorsampler/image/TileImageColorSampler.java | 0 .../addons/image/colorsampler/image/transform/Alignment.java | 0 .../image/colorsampler/image/transform/ImageTransformation.java | 0 .../addons/image/colorsampler/mutate/RotateColorSampler.java | 0 .../addons/image/colorsampler/mutate/TranslateColorSampler.java | 0 .../java/com/dfsek/terra/addons/image/config/ColorLoader.java | 0 .../addons/image/config/ImageLibraryPackConfigTemplate.java | 0 .../image/config/colorsampler/ConstantColorSamplerTemplate.java | 0 .../config/colorsampler/image/ImageColorSamplerTemplate.java | 0 .../colorsampler/image/SingleImageColorSamplerTemplate.java | 0 .../colorsampler/image/TileImageColorSamplerTemplate.java | 0 .../config/colorsampler/mutate/MutateColorSamplerTemplate.java | 0 .../config/colorsampler/mutate/RotateColorSamplerTemplate.java | 0 .../colorsampler/mutate/TranslateColorSamplerTemplate.java | 0 .../image/config/converter/ClosestColorConverterTemplate.java | 0 .../addons/image/config/converter/ColorConverterTemplate.java | 0 .../image/config/converter/ExactColorConverterTemplate.java | 0 .../com/dfsek/terra/addons/image/config/image/ImageCache.java | 0 .../dfsek/terra/addons/image/config/image/ImageTemplate.java | 0 .../terra/addons/image/config/image/StitchedImageTemplate.java | 0 .../addons/image/config/sampler/ChannelSamplerTemplate.java | 0 .../image/config/sampler/DistanceTransformSamplerTemplate.java | 0 .../addons/image/converter/ClosestMatchColorConverter.java | 0 .../com/dfsek/terra/addons/image/converter/ColorConverter.java | 0 .../dfsek/terra/addons/image/converter/ExactColorConverter.java | 0 .../image/converter/mapping/BiomeDefinedColorMapping.java | 0 .../terra/addons/image/converter/mapping/ColorMapping.java | 0 .../dfsek/terra/addons/image/image/BufferedImageWrapper.java | 0 .../src/main/java/com/dfsek/terra/addons/image/image/Image.java | 0 .../java/com/dfsek/terra/addons/image/image/StitchedImage.java | 0 .../java/com/dfsek/terra/addons/image/image/SuppliedImage.java | 0 .../dfsek/terra/addons/image/operator/DistanceTransform.java | 0 .../com/dfsek/terra/addons/image/sampler/ChannelSampler.java | 0 .../main/java/com/dfsek/terra/addons/image/util/ColorUtil.java | 0 .../main/java/com/dfsek/terra/addons/image/util/MapUtil.java | 0 .../main/java/com/dfsek/terra/addons/image/util/MathUtil.java | 0 .../src/main/resources/terra.addon.yml | 2 +- common/addons/biome-provider-image/README.md | 2 +- common/addons/biome-provider-image/build.gradle.kts | 2 +- .../biome-provider-image/src/main/resources/terra.addon.yml | 2 +- common/addons/pipeline-image/build.gradle.kts | 2 +- common/addons/pipeline-image/src/main/resources/terra.addon.yml | 2 +- 46 files changed, 6 insertions(+), 6 deletions(-) rename common/addons/{library-image => api-image}/build.gradle.kts (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/Alignment.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/ImageTransformation.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/ImageLibraryPackConfigTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/ImageColorSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/SingleImageColorSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/MutateColorSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/TranslateColorSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/sampler/ChannelSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/config/sampler/DistanceTransformSamplerTemplate.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/image/Image.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/image/SuppliedImage.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/sampler/ChannelSampler.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java (100%) rename common/addons/{library-image => api-image}/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java (100%) rename common/addons/{library-image => api-image}/src/main/resources/terra.addon.yml (94%) diff --git a/common/addons/library-image/build.gradle.kts b/common/addons/api-image/build.gradle.kts similarity index 100% rename from common/addons/library-image/build.gradle.kts rename to common/addons/api-image/build.gradle.kts diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/ColorSampler.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/SingleImageColorSampler.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/TileImageColorSampler.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/Alignment.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/Alignment.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/Alignment.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/Alignment.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/ImageTransformation.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/ImageTransformation.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/ImageTransformation.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/image/transform/ImageTransformation.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/RotateColorSampler.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/colorsampler/mutate/TranslateColorSampler.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/ColorLoader.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLibraryPackConfigTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLibraryPackConfigTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLibraryPackConfigTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLibraryPackConfigTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/ConstantColorSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/ImageColorSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/ImageColorSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/ImageColorSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/ImageColorSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/SingleImageColorSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/SingleImageColorSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/SingleImageColorSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/SingleImageColorSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/image/TileImageColorSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/MutateColorSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/MutateColorSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/MutateColorSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/MutateColorSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/RotateColorSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/TranslateColorSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/TranslateColorSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/TranslateColorSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/colorsampler/mutate/TranslateColorSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ClosestColorConverterTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ColorConverterTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/converter/ExactColorConverterTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageCache.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/image/ImageTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/image/StitchedImageTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ChannelSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ChannelSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ChannelSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ChannelSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/DistanceTransformSamplerTemplate.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/DistanceTransformSamplerTemplate.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/DistanceTransformSamplerTemplate.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/DistanceTransformSamplerTemplate.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/ClosestMatchColorConverter.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/ColorConverter.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/ExactColorConverter.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/BiomeDefinedColorMapping.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/converter/mapping/ColorMapping.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/image/StitchedImage.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/SuppliedImage.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/image/SuppliedImage.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/SuppliedImage.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/image/SuppliedImage.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ChannelSampler.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/sampler/ChannelSampler.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/ChannelSampler.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/sampler/ChannelSampler.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/util/ColorUtil.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/util/MapUtil.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java b/common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java similarity index 100% rename from common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java rename to common/addons/api-image/src/main/java/com/dfsek/terra/addons/image/util/MathUtil.java diff --git a/common/addons/library-image/src/main/resources/terra.addon.yml b/common/addons/api-image/src/main/resources/terra.addon.yml similarity index 94% rename from common/addons/library-image/src/main/resources/terra.addon.yml rename to common/addons/api-image/src/main/resources/terra.addon.yml index c664c3df4b..4999706c2a 100644 --- a/common/addons/library-image/src/main/resources/terra.addon.yml +++ b/common/addons/api-image/src/main/resources/terra.addon.yml @@ -1,7 +1,7 @@ schema-version: 1 contributors: - Terra contributors -id: library-image +id: api-image version: @VERSION@ entrypoints: - "com.dfsek.terra.addons.image.ImageLibraryAddon" diff --git a/common/addons/biome-provider-image/README.md b/common/addons/biome-provider-image/README.md index 573eabee7f..fdc97f80b6 100644 --- a/common/addons/biome-provider-image/README.md +++ b/common/addons/biome-provider-image/README.md @@ -1,5 +1,5 @@ # biome-provider-image-v2 Implements and registers the `IMAGE` biome provider, which -utilizes various config types provided by the `library-image` addon to +utilizes various config types provided by the `api-image` addon to distribute biomes based on images. diff --git a/common/addons/biome-provider-image/build.gradle.kts b/common/addons/biome-provider-image/build.gradle.kts index 0473cb0bf5..5c0b6144af 100644 --- a/common/addons/biome-provider-image/build.gradle.kts +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -2,7 +2,7 @@ version = version("2.0.0") dependencies { compileOnlyApi(project(":common:addons:addon-loader-manifest")) - compileOnlyApi(project(":common:addons:library-image")) + compileOnlyApi(project(":common:addons:api-image")) } diff --git a/common/addons/biome-provider-image/src/main/resources/terra.addon.yml b/common/addons/biome-provider-image/src/main/resources/terra.addon.yml index f031ef1249..09d1a17f28 100644 --- a/common/addons/biome-provider-image/src/main/resources/terra.addon.yml +++ b/common/addons/biome-provider-image/src/main/resources/terra.addon.yml @@ -11,4 +11,4 @@ website: docs: https://terra.polydev.org license: MIT License depends: - library-image: "1.+" + api-image: "1.+" diff --git a/common/addons/pipeline-image/build.gradle.kts b/common/addons/pipeline-image/build.gradle.kts index d1dd884326..cd2ab10438 100644 --- a/common/addons/pipeline-image/build.gradle.kts +++ b/common/addons/pipeline-image/build.gradle.kts @@ -3,5 +3,5 @@ version = version("1.0.0") dependencies { compileOnlyApi(project(":common:addons:addon-loader-manifest")) compileOnlyApi(project(":common:addons:biome-provider-pipeline")) - compileOnlyApi(project(":common:addons:library-image")) + compileOnlyApi(project(":common:addons:api-image")) } diff --git a/common/addons/pipeline-image/src/main/resources/terra.addon.yml b/common/addons/pipeline-image/src/main/resources/terra.addon.yml index 750434fba2..506559d0c7 100644 --- a/common/addons/pipeline-image/src/main/resources/terra.addon.yml +++ b/common/addons/pipeline-image/src/main/resources/terra.addon.yml @@ -11,5 +11,5 @@ website: docs: https://terra.polydev.org license: MIT License depends: - library-image: "1.+" + api-image: "1.+" biome-provider-pipeline: "2.+" From 6a6a3928cdf31ca1a86b6faebe37fdfbb02be708 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 22:25:23 -0700 Subject: [PATCH 44/47] rename structure-block-shortcut to shortcut-block-structure --- .../LICENSE | 0 .../build.gradle.kts | 0 .../terra/addons/palette/shortcut/block/SingletonStructure.java | 0 .../palette/shortcut/block/StructureBlockShortcutAddon.java | 0 .../src/main/resources/terra.addon.yml | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename common/addons/{structure-block-shortcut => shortcut-block-structure}/LICENSE (100%) rename common/addons/{structure-block-shortcut => shortcut-block-structure}/build.gradle.kts (100%) rename common/addons/{structure-block-shortcut => shortcut-block-structure}/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java (100%) rename common/addons/{structure-block-shortcut => shortcut-block-structure}/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/StructureBlockShortcutAddon.java (100%) rename common/addons/{structure-block-shortcut => shortcut-block-structure}/src/main/resources/terra.addon.yml (100%) diff --git a/common/addons/structure-block-shortcut/LICENSE b/common/addons/shortcut-block-structure/LICENSE similarity index 100% rename from common/addons/structure-block-shortcut/LICENSE rename to common/addons/shortcut-block-structure/LICENSE diff --git a/common/addons/structure-block-shortcut/build.gradle.kts b/common/addons/shortcut-block-structure/build.gradle.kts similarity index 100% rename from common/addons/structure-block-shortcut/build.gradle.kts rename to common/addons/shortcut-block-structure/build.gradle.kts diff --git a/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java b/common/addons/shortcut-block-structure/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java similarity index 100% rename from common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java rename to common/addons/shortcut-block-structure/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java diff --git a/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/StructureBlockShortcutAddon.java b/common/addons/shortcut-block-structure/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/StructureBlockShortcutAddon.java similarity index 100% rename from common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/StructureBlockShortcutAddon.java rename to common/addons/shortcut-block-structure/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/StructureBlockShortcutAddon.java diff --git a/common/addons/structure-block-shortcut/src/main/resources/terra.addon.yml b/common/addons/shortcut-block-structure/src/main/resources/terra.addon.yml similarity index 100% rename from common/addons/structure-block-shortcut/src/main/resources/terra.addon.yml rename to common/addons/shortcut-block-structure/src/main/resources/terra.addon.yml From aa3fe18339ffcdfc0832500a159923604017b495 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 2 Jan 2026 22:26:33 -0700 Subject: [PATCH 45/47] rename palette-block-shortcut to shortcut-block-palette --- .../{palette-block-shortcut => shortcut-block-palette}/LICENSE | 0 .../build.gradle.kts | 0 .../addons/palette/shortcut/block/PaletteBlockShortcutAddon.java | 0 .../terra/addons/palette/shortcut/block/SingletonPalette.java | 0 .../src/main/resources/terra.addon.yml | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename common/addons/{palette-block-shortcut => shortcut-block-palette}/LICENSE (100%) rename common/addons/{palette-block-shortcut => shortcut-block-palette}/build.gradle.kts (100%) rename common/addons/{palette-block-shortcut => shortcut-block-palette}/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/PaletteBlockShortcutAddon.java (100%) rename common/addons/{palette-block-shortcut => shortcut-block-palette}/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonPalette.java (100%) rename common/addons/{palette-block-shortcut => shortcut-block-palette}/src/main/resources/terra.addon.yml (100%) diff --git a/common/addons/palette-block-shortcut/LICENSE b/common/addons/shortcut-block-palette/LICENSE similarity index 100% rename from common/addons/palette-block-shortcut/LICENSE rename to common/addons/shortcut-block-palette/LICENSE diff --git a/common/addons/palette-block-shortcut/build.gradle.kts b/common/addons/shortcut-block-palette/build.gradle.kts similarity index 100% rename from common/addons/palette-block-shortcut/build.gradle.kts rename to common/addons/shortcut-block-palette/build.gradle.kts diff --git a/common/addons/palette-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/PaletteBlockShortcutAddon.java b/common/addons/shortcut-block-palette/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/PaletteBlockShortcutAddon.java similarity index 100% rename from common/addons/palette-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/PaletteBlockShortcutAddon.java rename to common/addons/shortcut-block-palette/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/PaletteBlockShortcutAddon.java diff --git a/common/addons/palette-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonPalette.java b/common/addons/shortcut-block-palette/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonPalette.java similarity index 100% rename from common/addons/palette-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonPalette.java rename to common/addons/shortcut-block-palette/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonPalette.java diff --git a/common/addons/palette-block-shortcut/src/main/resources/terra.addon.yml b/common/addons/shortcut-block-palette/src/main/resources/terra.addon.yml similarity index 100% rename from common/addons/palette-block-shortcut/src/main/resources/terra.addon.yml rename to common/addons/shortcut-block-palette/src/main/resources/terra.addon.yml From 65eb66c3cac8b9171be9736b390422abf7f64e46 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 3 Jan 2026 04:13:21 -0700 Subject: [PATCH 46/47] add curry and uncurry functions --- .../api/util/function/FunctionUtils.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index ad9fa94c98..795f136d13 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -2,10 +2,13 @@ import com.dfsek.terra.api.util.generic.data.types.Either; +import com.dfsek.terra.api.util.generic.data.types.Pair; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.Objects; +import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -56,7 +59,28 @@ private FunctionUtils() { } }; } - public static T construct(Supplier in) { - return in.get(); + @Contract(pure = true, value = "_ -> new") + public static @NotNull Function, R> tuple(@NotNull BiFunction f) { + return p -> f.apply(p.left(), p.right()); + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull BiFunction untuple(@NotNull Function, R> f) { + return (a, b) -> f.apply(Pair.of(a, b)); + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull Function> curry(@NotNull BiFunction f) { + return a -> b -> f.apply(a, b); + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull BiFunction uncurry(@NotNull Function> f) { + return (a, b) -> f.apply(a).apply(b); + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull T construct(@NotNull Supplier in) { + return Objects.requireNonNull(Objects.requireNonNull(in).get()); } } From e6300df185ecb0367a768efb98e46acffec0e359 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 3 Jan 2026 15:53:13 -0700 Subject: [PATCH 47/47] implement a bunch of function utils --- .../addons/commands/locate/BiomeLocator.java | 13 +-- .../dfsek/terra/api/registry/Registry.java | 7 +- .../terra/api/registry/key/RegistryKey.java | 5 +- .../api/util/function/FunctionUtils.java | 37 +++++++++ .../api/util/generic/data/types/Either.java | 81 +++++++------------ 5 files changed, 78 insertions(+), 65 deletions(-) diff --git a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java index 3655d32665..fb6ba483c2 100644 --- a/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java +++ b/common/addons/command-locate/src/main/java/com/dfsek/terra/addons/commands/locate/BiomeLocator.java @@ -16,6 +16,7 @@ import java.util.function.Predicate; import java.util.stream.IntStream; import java.util.stream.Stream; +import static com.dfsek.terra.api.util.function.FunctionUtils.*; public class BiomeLocator { @@ -76,7 +77,7 @@ public static Maybe> search( .mapToObj(z -> new int[]{ minX, z }); // Fixed X (min), varying Z Optional> ringResult = Stream.of(northSide, eastSide, southSide, westSide) - .flatMap(Function.identity()) + .flatMap(identity()) .parallel() .map(coords -> check( provider, @@ -93,10 +94,10 @@ public static Maybe> search( .findFirst(); // findFirst() respects encounter order (North -> East -> South -> West) if(ringResult.isPresent()) { - return Maybe.fromOptional(ringResult); + return fromOptional(ringResult); } } - return Maybe.nothing(); + return nothing(); }); } @@ -120,16 +121,16 @@ private static Maybe> check( // Iterate from bottom to top of the world using the step for(int y = minHeight; y < maxHeight; y += step) { if(filter.test(provider.getBiome(x, y, z, seed))) { - return Maybe.just(Either.left(Vector3Int.of(x, y, z))); + return just(left(Vector3Int.of(x, y, z))); } } - return Maybe.nothing(); + return nothing(); } else { // 2D Mode: Check only the base biome // We use a flatMap approach here to be safe with Optionals inside the stream return provider.getBaseBiome(x, z, seed) .filter(filter) - .map(b -> Either.right(Vector2Int.of(x, z))); + .map(b -> right(Vector2Int.of(x, z))); } } } \ No newline at end of file diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index accdb945e2..61c357c318 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -29,6 +29,7 @@ import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.util.reflection.TypeKey; +import static com.dfsek.terra.api.util.function.FunctionUtils.*; public interface Registry extends TypeLoader { @@ -96,11 +97,11 @@ default Class getRawType() { default Either getByID(String id) { return getByID(id, map -> { - if(map.isEmpty()) return Either.left(new NoSuchElement("No such value \"" + id + "\"")); + if(map.isEmpty()) return left(new NoSuchElement("No such value \"" + id + "\"")); if(map.size() == 1) { - return Either.right(map.values().stream().findFirst().get()); // only one value. + return right(map.values().stream().findFirst().get()); // only one value. } - return Either.left(new AmbiguousKey("ID \"" + id + "\" is ambiguous; matches: " + map + return left(new AmbiguousKey("ID \"" + id + "\" is ambiguous; matches: " + map .keySet() .stream() .map(RegistryKey::toString) diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java b/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java index 65049fbd3e..c9af65910d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.error.InvalidKey; import com.dfsek.terra.api.util.generic.data.types.Either; import com.dfsek.terra.api.util.generic.data.types.Maybe; +import static com.dfsek.terra.api.util.function.FunctionUtils.*; import java.util.Objects; import java.util.regex.Pattern; @@ -33,12 +34,12 @@ private RegistryKey(String namespace, String id) { public static Either parse(String key) { if(key.chars().filter(c -> c == ':').count() != 1) { - return Either.left(new InvalidKey("Malformed RegistryKey: " + key)); + return left(new InvalidKey("Malformed RegistryKey: " + key)); } String namespace = key.substring(0, key.indexOf(":")); String id = key.substring(key.indexOf(":") + 1); - return Either.right(new RegistryKey(namespace, id)); + return right(new RegistryKey(namespace, id)); } public static RegistryKey of(String namespace, String id) { diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java index 795f136d13..cc04fa506e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -2,12 +2,14 @@ import com.dfsek.terra.api.util.generic.data.types.Either; +import com.dfsek.terra.api.util.generic.data.types.Maybe; import com.dfsek.terra.api.util.generic.data.types.Pair; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.Objects; +import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; @@ -17,6 +19,30 @@ public final class FunctionUtils { private FunctionUtils() { } + public static Function identity() { + return Function.identity(); + } + + public static Maybe just(T t) { + return Maybe.just(t); + } + + public static Maybe nothing() { + return Maybe.nothing(); + } + + public static Either left(L l) { + return Either.left(l); + } + + public static Either right(R r) { + return Either.right(r); + } + + public static Maybe fromOptional(Optional op) { + return Maybe.fromOptional(op); + } + @Contract("_ -> new") public static @NotNull Function lift(@NotNull Consumer c) { Objects.requireNonNull(c); @@ -26,6 +52,17 @@ private FunctionUtils() { } }; } + @Contract("_ -> new") + public static @NotNull Function lift(@NotNull Supplier c) { + Objects.requireNonNull(c); + return co -> c.get(); + } + + @Contract("_ -> new") + public static @NotNull Function lift(@NotNull R c) { + return lift(() -> c); + } + @Contract("_ -> fail") public static @NotNull U throw_(@NotNull T e) throws T { throw e; diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java index 7a60c17134..b95c29bc9c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -7,8 +7,6 @@ package com.dfsek.terra.api.util.generic.data.types; -import com.dfsek.terra.api.util.function.FunctionUtils; - import com.dfsek.terra.api.util.generic.control.Monad; import com.dfsek.terra.api.util.generic.data.BiFunctor; @@ -20,28 +18,29 @@ import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; +import static com.dfsek.terra.api.util.function.FunctionUtils.*; public sealed interface Either extends Monad>, BiFunctor> { static T collapse(Either either) { - return either.collect(Function.identity(), Function.identity()); + return either.collect(identity(), identity()); } @SuppressWarnings("unchecked") static Either toEither(Optional o, L de) { - return (Either) o.map(Either::right).orElseGet(() -> left(de)); + return (Either) o.map(Either::right).orElseGet(() -> Either.left(de)); } @NotNull @Contract("_ -> this") default Either ifLeft(@NotNull Consumer action) { - return mapLeft(FunctionUtils.lift(action)); + return mapLeft(lift(action)); } @NotNull @Contract("_ -> this") default Either ifRight(@NotNull Consumer action) { - return mapRight(FunctionUtils.lift(action)); + return mapRight(lift(action)); } // Either is a functor in its right parameter. @@ -52,7 +51,7 @@ default Either ifRight(@NotNull Consumer action) { @Override default @NotNull Either pure(@NotNull T1 t) { - return right(t); + return Either.right(t); } @Override @@ -64,13 +63,27 @@ default Either ifRight(@NotNull Consumer action) { @Override @NotNull Either mapRight(@NotNull Function f); - Maybe getLeft(); + @Override + @NotNull + default Either bimap(@NotNull Function left, @NotNull Function right) { + return (Either) BiFunctor.super.bimap(left, right); + } - Maybe getRight(); + default Maybe getLeft() { + return collapse(bimap(Maybe::just, lift(Maybe::nothing))); + } - boolean isLeft(); + default Maybe getRight() { + return collapse(bimap(lift(Maybe::nothing), Maybe::just)); + } + + default boolean isLeft() { + return collapse(bimap(lift(true), lift(false))); + } - boolean isRight(); + default boolean isRight() { + return collapse(bimap(lift(false), lift(true))); + } Either flip(); @@ -88,7 +101,7 @@ default Either consume(Consumer left, Consumer right) { @SuppressWarnings("Convert2MethodRef") default R collectThrow(Function left) throws T { - return mapLeft(left).collect(l -> FunctionUtils.sneakyThrow(l), Function.identity()); + return mapLeft(left).collect(l -> sneakyThrow(l), identity()); } @NotNull @@ -122,29 +135,9 @@ record Left(L value) implements Either { return (Either) this; } - @Override - public Maybe getLeft() { - return Maybe.just(value); - } - - @Override - public Maybe getRight() { - return Maybe.nothing(); - } - - @Override - public boolean isLeft() { - return true; - } - - @Override - public boolean isRight() { - return false; - } - @Override public Either flip() { - return right(value); + return Either.right(value); } @Override @@ -171,29 +164,9 @@ record Right(R value) implements Either { return new Right<>(f.apply(value)); } - @Override - public Maybe getLeft() { - return Maybe.nothing(); - } - - @Override - public Maybe getRight() { - return Maybe.just(value); - } - - @Override - public boolean isLeft() { - return false; - } - - @Override - public boolean isRight() { - return true; - } - @Override public Either flip() { - return left(value); + return Either.left(value); } @Override