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 93% 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 index 6fb9658501..16d7db8443 100644 --- 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 @@ -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/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 96% 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 index 4d16b43c91..3677df900b 100644 --- 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 @@ -33,7 +33,7 @@ public String getID() { } @Override - public Version getVersion() { + public Version version() { return VERSION; } } 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 96% 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 index c267dc9188..60754c44f6 100644 --- 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 @@ -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/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 99% 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 index 92671ac481..eacd7b4700 100644 --- 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 @@ -132,7 +132,7 @@ public String getID() { } @Override - public Version getVersion() { + public Version version() { return VERSION; } } 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-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/api-biome-query/build.gradle.kts b/common/addons/api-biome-query/build.gradle.kts new file mode 100644 index 0000000000..582ebe1095 --- /dev/null +++ b/common/addons/api-biome-query/build.gradle.kts @@ -0,0 +1,5 @@ +version = version("1.0.0") + +dependencies { + compileOnlyApi(project(":common:addons:addon-loader-manifest")) +} 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/api-image/build.gradle.kts b/common/addons/api-image/build.gradle.kts new file mode 100644 index 0000000000..efcb3d2296 --- /dev/null +++ b/common/addons/api-image/build.gradle.kts @@ -0,0 +1,7 @@ +version = version("1.1.0") + +dependencies { + compileOnlyApi(project(":common:addons:addon-loader-manifest")) + + +} 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 95% 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 index 7ad72a009b..26be6b5b28 100644 --- 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 @@ -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/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-extrusion/build.gradle.kts b/common/addons/biome-provider-extrusion/build.gradle.kts index 7615a16d02..39970f970a 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:biome-query-api")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) + compileOnlyApi(project(":common:addons:api-biome-query")) } 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-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-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 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 55b7f98aa7..5c0b6144af 100644 --- a/common/addons/biome-provider-image/build.gradle.kts +++ b/common/addons/biome-provider-image/build.gradle.kts @@ -1,8 +1,8 @@ version = version("2.0.0") dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) - compileOnlyApi(project(":common:addons:library-image")) + compileOnlyApi(project(":common:addons:addon-loader-manifest")) + compileOnlyApi(project(":common:addons:api-image")) } 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-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/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-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-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/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-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/biome-query-api/build.gradle.kts b/common/addons/biome-query-api/build.gradle.kts deleted file mode 100644 index 9d0aac37fb..0000000000 --- a/common/addons/biome-query-api/build.gradle.kts +++ /dev/null @@ -1,5 +0,0 @@ -version = version("1.0.0") - -dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) -} 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/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-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-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/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-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..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 @@ -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.either.Either; + +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; @@ -13,6 +16,8 @@ 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 { @@ -27,9 +32,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 +50,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(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 fromOptional(ringResult); + } + } + return 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,20 +117,20 @@ 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 just(left(Vector3Int.of(x, y, z))); } } - return Optional.empty(); + 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/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..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 @@ -3,14 +3,15 @@ import com.dfsek.seismic.type.vector.Vector2Int; import com.dfsek.seismic.type.vector.Vector3Int; + +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; 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; @@ -21,11 +22,13 @@ 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; +import static com.dfsek.terra.api.util.generic.data.types.Either.collapse; + public class LocateCommandAddon implements AddonInitializer { @Inject @@ -35,7 +38,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().entity().orThrow().world().getPack().getRegistry(Biome.class); } @Override @@ -63,7 +66,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().entity().orThrow( () -> new Error("Only entities can run this command.")); World world = sender.world(); @@ -83,7 +86,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 +103,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 +121,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/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/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..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().orElseThrow().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().orElseThrow(); + Entity sender = context.sender().entity().orThrow(); structure.generate( sender.position().toInt(), sender.world(), 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-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..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 @@ -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; @@ -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/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-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 08116ae0c3..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 @@ -13,19 +13,19 @@ 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; @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-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-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..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 @@ -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; @@ -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/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-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..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 @@ -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; @@ -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; @@ -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..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 @@ -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); @@ -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 4f892db376..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 @@ -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,19 +14,19 @@ 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) { 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/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 deleted file mode 100644 index b8682c80ba..0000000000 --- a/common/addons/library-image/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -version = version("1.1.0") - -dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) - - -} 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 deleted file mode 100644 index 9d0aac37fb..0000000000 --- a/common/addons/palette-block-shortcut/build.gradle.kts +++ /dev/null @@ -1,5 +0,0 @@ -version = version("1.0.0") - -dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) -} diff --git a/common/addons/pipeline-image/build.gradle.kts b/common/addons/pipeline-image/build.gradle.kts index 81b010d74e..cd2ab10438 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")) + 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.+" 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/shortcut-block-palette/build.gradle.kts b/common/addons/shortcut-block-palette/build.gradle.kts new file mode 100644 index 0000000000..582ebe1095 --- /dev/null +++ b/common/addons/shortcut-block-palette/build.gradle.kts @@ -0,0 +1,5 @@ +version = version("1.0.0") + +dependencies { + compileOnlyApi(project(":common:addons:addon-loader-manifest")) +} 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 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/shortcut-block-structure/build.gradle.kts b/common/addons/shortcut-block-structure/build.gradle.kts new file mode 100644 index 0000000000..582ebe1095 --- /dev/null +++ b/common/addons/shortcut-block-structure/build.gradle.kts @@ -0,0 +1,5 @@ +version = version("1.0.0") + +dependencies { + compileOnlyApi(project(":common:addons:addon-loader-manifest")) +} 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 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..582ebe1095 --- /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:addon-loader-manifest")) +} 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..25d176b059 --- /dev/null +++ b/common/addons/shortcut-blockstate-fallback/src/main/java/com/dfsek/terra/addons/shortcut/blockstate/ShortcutBlockStateFallbackAddon.java @@ -0,0 +1,28 @@ +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) + + .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..f0722c16b2 --- /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 diff --git a/common/addons/structure-block-shortcut/build.gradle.kts b/common/addons/structure-block-shortcut/build.gradle.kts deleted file mode 100644 index 9d0aac37fb..0000000000 --- a/common/addons/structure-block-shortcut/build.gradle.kts +++ /dev/null @@ -1,5 +0,0 @@ -version = version("1.0.0") - -dependencies { - compileOnlyApi(project(":common:addons:manifest-addon-loader")) -} 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-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/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/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 0c1fd8b2e0..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 { @@ -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..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> { @@ -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/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..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; @@ -76,7 +80,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) { @@ -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/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/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index 5176116f81..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)) - .ifPresentOrElse(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(), @@ -91,8 +92,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)); + } + ); return null; } 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..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; @@ -48,7 +50,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/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/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/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/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 */ 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/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/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/command/CommandSender.java b/common/api/src/main/java/com/dfsek/terra/api/command/CommandSender.java index 9755c2005f..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 @@ -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 entity(); - Optional 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 8e15c18ceb..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,7 +12,7 @@ import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; -import java.util.Optional; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; @@ -22,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,20 +104,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 RegistryKey.parse(finalInput) + .bind(registry::getEither) .map(ArgumentParseResult::success) - .orElse(ArgumentParseResult.failure(new NoSuchEntryException("No such entry: " + input))); + .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/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..c5b01540d6 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/error/Invalid.java @@ -0,0 +1,16 @@ +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); + } + + default IllegalArgumentException toIllegal() { + return new IllegalArgumentException(message()); + } +} 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/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/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/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/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index a034214fbd..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 @@ -8,6 +8,14 @@ package com.dfsek.terra.api.registry; 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; +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; @@ -21,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 { @@ -32,7 +41,11 @@ 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); + + default Either getEither(@NotNull RegistryKey key) { + return get(key).toEither(new NoSuchElement("No such element " + key)); + } /** * Check if the registry contains a value. @@ -82,17 +95,17 @@ 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 left(new NoSuchElement("No such value \"" + id + "\"")); if(map.size() == 1) { - return map.values().stream().findFirst(); // only one value. + return right(map.values().stream().findFirst().get()); // only one value. } - throw new IllegalArgumentException("ID \"" + id + "\" is ambiguous; matches: " + map + return 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))); }); } @@ -102,9 +115,10 @@ 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 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/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..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 @@ -1,5 +1,11 @@ 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 static com.dfsek.terra.api.util.function.FunctionUtils.*; + import java.util.Objects; import java.util.regex.Pattern; @@ -26,14 +32,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 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 right(new RegistryKey(namespace, id)); } public static RegistryKey of(String namespace, String id) { @@ -41,7 +47,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/structure/feature/BinaryColumn.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java index 535dce508e..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 @@ -10,8 +10,8 @@ import java.util.function.BooleanSupplier; import java.util.function.IntConsumer; -import com.dfsek.terra.api.util.function.IntToBooleanFunction; -import com.dfsek.terra.api.util.generic.Lazy; +import com.dfsek.terra.api.util.function.IntPredicate; +import com.dfsek.terra.api.util.generic.Memo; import com.dfsek.terra.api.util.range.Range; @@ -20,10 +20,10 @@ */ 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; + private final Memo results; /** * Constructs a new {@link BinaryColumn} with all values initiated to {@code false} @@ -31,10 +31,10 @@ 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(() -> { + this.results = Memo.lazy(() -> { boolean[] res = new boolean[maxY - minY]; for(int y = minY; y < maxY; y++) { res[y - minY] = get(y); @@ -48,12 +48,12 @@ public BinaryColumn(int minY, int maxY, IntToBooleanFunction 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]; } - 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/collection/MaterialSet.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/BlockStateSet.java similarity index 88% 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..5b4a4056a2 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()); + add(data.blockType()); } - 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/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..cc04fa506e --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/function/FunctionUtils.java @@ -0,0 +1,123 @@ +package com.dfsek.terra.api.util.function; + +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; +import java.util.function.Supplier; + + +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); + return co -> { + c.accept(co); + return co; + }; + } + + @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; + } + + @SuppressWarnings("unchecked") + @Contract("_ -> fail") + public static @NotNull U sneakyThrow(@NotNull Throwable e) throws E { + throw (E) e; + } + + @Contract(pure = true, value = "_ -> new") + public static @NotNull Function> liftTry(@NotNull Function f) { + return s -> { + try { + return Either.right(f.apply(s)); + } catch(Exception e) { + return Either.left(e); + } + }; + } + + @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); + } + }; + } + + @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()); + } +} 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/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 deleted file mode 100644 index c9adddf1e2..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java +++ /dev/null @@ -1,33 +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 Lazy { - private final Supplier valueSupplier; - private T value; - private boolean got = false; - - private Lazy(Supplier valueSupplier) { - this.valueSupplier = valueSupplier; - } - - public static Lazy lazy(Supplier valueSupplier) { - return new Lazy<>(valueSupplier); - } - - public T value() { - if(!got && value == null) { - got = true; - value = valueSupplier.get(); - } - return value; - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Memo.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Memo.java new file mode 100644 index 0000000000..214d5f0d8f --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Memo.java @@ -0,0 +1,57 @@ +/* + * 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 com.dfsek.terra.api.util.generic.control.Monad; + +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Function; +import java.util.function.Supplier; + + +public final class Memo implements Monad> { + private final Supplier valueSupplier; + private volatile T value = null; + private final AtomicBoolean got = new AtomicBoolean(false); + + private Memo(Supplier valueSupplier) { + this.valueSupplier = valueSupplier; + } + + public static Memo lazy(Supplier valueSupplier) { + return new Memo<>(valueSupplier); + } + + public static Memo of(T value) { + return new Memo<>(() -> value); + } + + public T value() { + if(!got.compareAndExchange(false, true)) { + value = valueSupplier.get(); + } + return value; + } + + @Override + public @NotNull Memo bind(@NotNull Function>> map) { + return lazy(() -> ((Memo) map.apply(value())).value()); + } + + @Override + public @NotNull Memo map(@NotNull Function map) { + return lazy(() -> map.apply(value())); + } + + @Override + public @NotNull Memo pure(@NotNull T1 t) { + return new Memo<>(() -> 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..bf3f73a7ab --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/control/Monad.java @@ -0,0 +1,34 @@ +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 org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; +import java.util.function.Function; + + +/** + * A monad is a monoid in the category of endofunctors. + */ +public interface Monad> extends Functor, K { + @Contract(pure = true, value = "_ -> new") + @NotNull Monad bind(@NotNull Function> map); + + @Contract(pure = true, value = "_ -> new") + @NotNull Monad pure(@NotNull T1 t); + + @Override + @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. + @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 new file mode 100644 index 0000000000..db93c4add8 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/BiFunctor.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.api.util.generic.data; + +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> { + @Contract("_ -> new") + static > @NotNull Consumer> consumeLeft(@NotNull Consumer consumer) { + Objects.requireNonNull(consumer); + return pair -> pair.mapLeft(p -> { + consumer.accept(p); + return p; + }); + } + + @Contract("_ -> new") + static > @NotNull Consumer> consumeRight(@NotNull Consumer consumer) { + Objects.requireNonNull(consumer); + return pair -> pair.mapRight(p -> { + consumer.accept(p); + return p; + }); + } + + @Contract(pure = true, value = "_ -> new") + @NotNull BiFunctor mapLeft(@NotNull Function map); + + @Contract(pure = true, value = "_ -> new") + @NotNull BiFunctor mapRight(@NotNull Function map); + + @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 new file mode 100644 index 0000000000..69023acb0c --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Functor.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.util.generic.data; + +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 { + @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 new file mode 100644 index 0000000000..ba57ceadef --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/LinkedList.java @@ -0,0 +1,176 @@ +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 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 + @Contract(pure = true, value = "_ -> new") + @NotNull LinkedList bind(@NotNull Function>> map); + + @Override + @Contract(pure = true, value = "_ -> new") + default @NotNull LinkedList pure(@NotNull T1 t) { + return of(t); + } + + @Override + @Contract(pure = true, value = "_ -> new") + @NotNull LinkedList map(@NotNull Function map); + + @Override + @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); + + @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 + @NotNull + LinkedList multiply(@NotNull 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 @NotNull LinkedList bind(@NotNull Function>> map) { + return ((LinkedList) map.apply(value)).multiply(tail.bind(map)); + } + + @Override + public @NotNull LinkedList map(@NotNull 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 @NotNull LinkedList multiply(@NotNull Monoid> t) { + return new Cons<>(value, tail.multiply(t)); + } + } + + record Nil() implements LinkedList { + private static final Nil INSTANCE = new Nil<>(); + + @Override + @SuppressWarnings("unchecked") + public @NotNull LinkedList bind(@NotNull Function>> map) { + return (LinkedList) this; + } + + @Override + @SuppressWarnings("unchecked") + public @NotNull LinkedList map(@NotNull Function map) { + return (LinkedList) this; + } + + @Override + public LinkedList tail() { + return 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 @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 new file mode 100644 index 0000000000..db13e80a97 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/Monoid.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.api.util.generic.data; + +import com.dfsek.terra.api.util.generic.kinds.K; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + + +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 new file mode 100644 index 0000000000..b95c29bc9c --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Either.java @@ -0,0 +1,177 @@ +/* + * 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.data.types; + +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; + +import java.util.Objects; +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(identity(), identity()); + } + + @SuppressWarnings("unchecked") + static Either toEither(Optional o, L de) { + return (Either) o.map(Either::right).orElseGet(() -> Either.left(de)); + } + + @NotNull + @Contract("_ -> this") + default Either ifLeft(@NotNull Consumer action) { + return mapLeft(lift(action)); + } + + @NotNull + @Contract("_ -> this") + default Either ifRight(@NotNull Consumer action) { + return mapRight(lift(action)); + } + + // Either is a functor in its right parameter. + @Override + default @NotNull Either map(@NotNull Function map) { + return mapRight(map); + } + + @Override + default @NotNull Either pure(@NotNull T1 t) { + return Either.right(t); + } + + @Override + @NotNull Either bind(@NotNull Function>> map); + + @Override + @NotNull Either mapLeft(@NotNull Function f); + + @Override + @NotNull Either mapRight(@NotNull Function f); + + @Override + @NotNull + default Either bimap(@NotNull Function left, @NotNull Function right) { + return (Either) BiFunctor.super.bimap(left, right); + } + + default Maybe getLeft() { + return collapse(bimap(Maybe::just, lift(Maybe::nothing))); + } + + default Maybe getRight() { + return collapse(bimap(lift(Maybe::nothing), Maybe::just)); + } + + default boolean isLeft() { + return collapse(bimap(lift(true), lift(false))); + } + + default boolean isRight() { + return collapse(bimap(lift(false), lift(true))); + } + + Either flip(); + + 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 { + return mapLeft(left).collect(l -> sneakyThrow(l), identity()); + } + + @NotNull + @Contract("_ -> new") + static Either left(L1 left) { + return new Left<>(Objects.requireNonNull(left)); + } + + @NotNull + @Contract("_ -> new") + static Either right(R1 right) { + return new Right<>(Objects.requireNonNull(right)); + } + + record Left(L value) implements Either { + + @Override + @SuppressWarnings("unchecked") + public @NotNull Either bind(@NotNull Function>> map) { + return (Either) this; + } + + @Override + public @NotNull Either mapLeft(@NotNull Function f) { + return new Left<>(f.apply(value)); + } + + @SuppressWarnings({ "unchecked" }) + @Override + public @NotNull Either mapRight(@NotNull Function f) { + return (Either) this; + } + + @Override + public Either flip() { + return Either.right(value); + } + + @Override + public U collect(Function left, Function right) { + return left.apply(value); + } + } + + + record Right(R value) implements Either { + @Override + public @NotNull Either bind(@NotNull Function>> map) { + return (Either) map.apply(value); + } + + @SuppressWarnings({ "unchecked" }) + @Override + public @NotNull Either mapLeft(@NotNull Function f) { + return (Either) this; + } + + @Override + public @NotNull Either mapRight(@NotNull Function f) { + return new Right<>(f.apply(value)); + } + + @Override + public Either flip() { + return Either.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 new file mode 100644 index 0000000000..9ee201c7c9 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/data/types/Maybe.java @@ -0,0 +1,195 @@ +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 org.jetbrains.annotations.NotNull; + +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; +import java.util.stream.Stream; + + +public sealed interface Maybe extends Monad> { + @Override + default @NotNull Maybe pure(@NotNull T1 t) { + return just(t); + } + + @Override + @NotNull Maybe bind(@NotNull Function>> map); + + Optional toOptional(); + + Either toEither(L l); + + T get(Supplier def); + + boolean isJust(); + + @Override + @NotNull Maybe map(@NotNull Function map); + + 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 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); + + 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); + } + + 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 ofNullable(T t) { + if(t == null) return nothing(); + return just(t); + } + + 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 Either toEither(L l) { + return Either.right(value); + } + + @Override + public T get(Supplier def) { + return value; + } + + @Override + public boolean isJust() { + return true; + } + + @Override + public @NotNull Maybe map(@NotNull Function map) { + return just(map.apply(value)); + } + + @Override + public Maybe or(Supplier> or) { + return this; + } + + @Override + public @NotNull Maybe bind(@NotNull Function>> map) { + return (Maybe) map.apply(value); + } + } + + + record Nothing() implements Maybe { + @Override + public @NotNull Maybe bind(@NotNull 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 @NotNull Maybe map(@NotNull Function map) { + return (Maybe) this; + } + + @Override + public Maybe or(Supplier> or) { + return or.get(); + } + } +} 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 61% 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 9c08d6bf65..06c3ae02de 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,37 +5,31 @@ * 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; import java.util.Objects; import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Function; 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); + public @NotNull Pair mapLeft(@NotNull 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 @NotNull Pair mapRight(@NotNull 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); } @@ -43,22 +37,6 @@ 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() { - 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); @@ -76,24 +54,11 @@ 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; + 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) { @@ -127,7 +92,7 @@ public Pair immutable() { return Pair.of(left, right); } - public L getLeft() { + public L left() { return left; } @@ -135,7 +100,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/util/generic/either/Either.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java deleted file mode 100644 index 7b05d1afbb..0000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java +++ /dev/null @@ -1,87 +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.either; - -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; -import java.util.Optional; -import java.util.function.Consumer; - - -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; - } - - @NotNull - @Contract("_ -> new") - public static Either left(L1 left) { - return new Either<>(Objects.requireNonNull(left), null, true); - } - - @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; - } - - @NotNull - @Contract("_ -> this") - public Either ifRight(Consumer action) { - if(!leftPresent) action.accept(right); - return this; - } - - @NotNull - public Optional getLeft() { - if(leftPresent) return Optional.of(left); - return Optional.empty(); - } - - @NotNull - public Optional getRight() { - if(!leftPresent) return Optional.of(right); - return Optional.empty(); - } - - public boolean hasLeft() { - return leftPresent; - } - - public boolean hasRight() { - return !leftPresent; - } - - @Override - public int hashCode() { - return Objects.hash(left, right); - } - - @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)); - } -} 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 new file mode 100644 index 0000000000..7b89b0e1f9 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/kinds/K.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.util.generic.kinds; + +/** + * Kind of the type T + */ +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/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 { +} 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..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 @@ -1,16 +1,16 @@ 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; -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; @@ -25,14 +25,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 +56,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); } @@ -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 Optional getBaseBiome(int x, int z, long seed) { - Mutable>> cachePair = baseCache.get(); - SeededVector2Key mutableKey = cachePair.getLeft(); + public Maybe getBaseBiome(int x, int z, long seed) { + Mutable>> cachePair = baseCache.get(); + SeededVector2Key mutableKey = cachePair.left(); mutableKey.set(x, z, seed); - return cachePair.getRight().get(mutableKey); + return cachePair.right().get(mutableKey); } @Override 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); } 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 aae1bc3ad5..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 @@ -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; @@ -64,7 +67,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; @@ -274,7 +277,7 @@ protected InternalAddon loadAddons() { .append("- ") .append(addon.getID()) .append("@") - .append(addon.getVersion().getFormatted()); + .append(addon.version().getFormatted()); } logger.info(builder.toString()); @@ -308,7 +311,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,18 +319,18 @@ 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(Pair.unwrapRight()) + .map(p -> p.mapRight(s -> s.substring(0, s.lastIndexOf('.')))) // remove major version + .map(Pair::right) .collect(Collectors.toSet()); @@ -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); @@ -366,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 " + 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 bdb243e71d..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,17 +24,19 @@ 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; 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; 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 +55,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 BlockStateSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()) .registerLoader(ParseOptions.class, ExpressionParserOptionsTemplate::new); @@ -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).getBlockType()) + .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/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 78% 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 8d2f0fb5f6..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 @@ -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 BlockStateSetLoader 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 { 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/ConfigPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 42530b81f5..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 @@ -26,7 +26,9 @@ 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.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import org.jetbrains.annotations.NotNull; @@ -69,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; @@ -99,6 +101,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 +110,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 +145,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 +163,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; @@ -179,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) -> { @@ -209,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)); }); @@ -259,6 +262,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 +270,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,14 +278,14 @@ 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 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)); @@ -357,11 +362,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; } 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..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,13 +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); - 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); - } + 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<>(); 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..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 { @@ -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..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; @@ -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/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/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..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 { @@ -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/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/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..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 @@ -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; @@ -29,18 +33,18 @@ 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; 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; 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; @@ -68,9 +72,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 +118,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 @@ -151,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/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..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 @@ -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; } @@ -36,14 +35,12 @@ 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), depthTracker.intrinsic("Using shortcut \"" + shortcut + "\"")); } - throw new LoadException("Shortcut \"" + shortcut + "\" is not defined.", depthTracker); } return back.load(annotatedType, o, configLoader, depthTracker); } diff --git a/common/implementation/base/src/test/java/registry/RegistryTest.java b/common/implementation/base/src/test/java/registry/RegistryTest.java index 4ea1326feb..12ef4d880d 100644 --- a/common/implementation/base/src/test/java/registry/RegistryTest.java +++ b/common/implementation/base/src/test/java/registry/RegistryTest.java @@ -17,6 +17,10 @@ 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; import com.dfsek.terra.api.registry.CheckedRegistry; @@ -35,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")).orElseThrow(), "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) { @@ -58,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")).orElseThrow(), "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) { @@ -74,23 +78,20 @@ 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").orElseThrow(), "bazinga"); + assertEquals(test.getByID("test").collectThrow(Invalid::toIllegal), "bazinga"); } @Test 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")); - 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/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/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/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/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/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 0160180a9a..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 @@ -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 entity() { 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 player() { 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..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; @@ -182,10 +184,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(Invalid::toIllegal), platform.getWorldHandle().air()); } public AsyncScheduler getAsyncScheduler() { 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/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/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/TerraCLI.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java index c271f98cf0..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 @@ -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).orElseThrow(); + ConfigPack generate = platform.getConfigRegistry().getByID(pack).collectThrow(Invalid::toIllegal); CLIWorld world = new CLIWorld(size, seed, maxHeight, minHeight, generate, noSave); @@ -59,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/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..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 @@ -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/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/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java index 810426f830..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) @@ -95,7 +96,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/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/api/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index 337276839c..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,14 +41,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(Invalid::toIllegal); 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/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/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/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 8cdc42c6bf..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)) @@ -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-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..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,18 +56,18 @@ 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..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; @@ -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)); 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(); 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); });