diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java index f9c351b27..1d47dc030 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineProvider.java @@ -41,7 +41,7 @@ public class BiomePipelineProvider implements BiomeProvider { this.mutator = mutator; this.noiseAmp = noiseAmp; holderCache = CacheBuilder.newBuilder() - .maximumSize(128) + .maximumSize(1024) .build( new CacheLoader<>() { @Override @@ -101,31 +101,6 @@ public class BiomePipelineProvider implements BiomeProvider { return biomes; } - private static final class SeededVector { - private final int x; - private final int z; - private final long seed; - - private SeededVector(int x, int z, long seed) { - this.x = x; - this.z = z; - this.seed = seed; - } - - @Override - public int hashCode() { - int result = 0; - result = 31 * result + ((int) (seed ^ (seed >>> 32))); - result = 31 * result + x; - result = 31 * result + z; - return result; - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof SeededVector that)) return false; - - return this.seed == that.seed && this.x == that.x && this.z == that.z; - } + private record SeededVector(int x, int z, long seed) { } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/NoiseChunkGenerator3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/NoiseChunkGenerator3D.java index 3e7782728..fc8146dc4 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/NoiseChunkGenerator3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/NoiseChunkGenerator3D.java @@ -8,6 +8,8 @@ package com.dfsek.terra.addons.chunkgenerator.generation; +import com.dfsek.terra.api.world.info.WorldProperties; + import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; @@ -20,7 +22,6 @@ import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.profiler.ProfileFrame; -import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.WritableWorld; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -38,9 +39,11 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { private final int carverHorizontalResolution; private final int carverVerticalResolution; + private final ConfigPack configPack; public NoiseChunkGenerator3D(ConfigPack c, Platform platform, int elevationBlend, int carverHorizontalResolution, int carverVerticalResolution) { + this.configPack = c; this.platform = platform; this.air = platform.getWorldHandle().air(); this.carverHorizontalResolution = carverHorizontalResolution; @@ -107,8 +110,8 @@ public class NoiseChunkGenerator3D implements ChunkGenerator { } @Override - public BlockState getBlock(ServerWorld world, int x, int y, int z) { - BiomeProvider provider = world.getBiomeProvider(); + public BlockState getBlock(WorldProperties world, int x, int y, int z) { + BiomeProvider provider = configPack.getBiomeProvider(); Biome biome = provider.getBiome(x, z, world.getSeed()); Sampler3D sampler = samplerCache.get(x, z, world); diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java index b7173b314..49bdee236 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/PaletteUtil.java @@ -21,7 +21,7 @@ public final class PaletteUtil { public static Palette getPalette(int x, int y, int z, Sampler3D sampler, PaletteInfo paletteInfo) { SlantHolder slant = paletteInfo.slantHolder(); - if(slant != null) { + if(!slant.isEmpty()) { double slope = derivative(sampler, x, y, z); if(slope > slant.getMinSlope()) { return slant.getPalette(slope).getPalette(y); diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator.java index 68c71b830..cfe52e572 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; +import com.dfsek.terra.api.util.vector.Vector2Int; +import com.dfsek.terra.api.world.biome.Biome; + import net.jafama.FastMath; import java.util.HashMap; @@ -53,11 +56,14 @@ public class ChunkInterpolator { double[][][] noiseStorage = new double[5][5][size + 1]; + BiomeCache cache = new BiomeCache(provider); + for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { - BiomeNoiseProperties generationSettings = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getContext().get( - BiomeNoiseProperties.class); + BiomeNoiseProperties generationSettings = cache.get(xOrigin + (x << 2), zOrigin + (z << 2), seed) + .getContext() + .get(BiomeNoiseProperties.class); Map genMap = new HashMap<>(); int step = generationSettings.blendStep(); @@ -66,7 +72,7 @@ public class ChunkInterpolator { for(int xi = -blend; xi <= blend; xi++) { for(int zi = -blend; zi <= blend; zi++) { genMap.computeIfAbsent( - provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed) + cache.get(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed) .getContext() .get(BiomeNoiseProperties.class), g -> new MutableInteger(0)).increment(); // Increment by 1 @@ -96,6 +102,20 @@ public class ChunkInterpolator { } } + private static final class BiomeCache { + + private final BiomeProvider provider; + private final Map cache = new HashMap<>(); + + private BiomeCache(BiomeProvider provider) { + this.provider = provider; + } + + public Biome get(int x, int z, long seed) { + return cache.computeIfAbsent(Vector2Int.of(x, z), vec -> provider.getBiome(x, z, seed)); + } + } + private static int reRange(int value, int high) { return FastMath.max(FastMath.min(value, high), 0); } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/SamplerProvider.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/SamplerProvider.java index 710356a75..37aa253dd 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/SamplerProvider.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/SamplerProvider.java @@ -17,6 +17,8 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers; +import com.dfsek.terra.api.world.info.WorldProperties; + import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -45,13 +47,13 @@ public class SamplerProvider { }); } - public Sampler3D get(int x, int z, World world) { + public Sampler3D get(int x, int z, WorldProperties world) { int cx = FastMath.floorDiv(x, 16); int cz = FastMath.floorDiv(z, 16); return getChunk(cx, cz, world); } - public Sampler3D getChunk(int cx, int cz, World world) { + public Sampler3D getChunk(int cx, int cz, WorldProperties world) { return cache.getUnchecked(new WorldContext(cx, cz, world.getSeed(), world.getMinHeight(), world.getMaxHeight())); } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java index 592b3aa14..c70674103 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SlantHolder.java @@ -20,6 +20,10 @@ public class SlantHolder { this.minSlope = minSlope; } + public boolean isEmpty() { + return layers.isEmpty(); + } + public PaletteHolder getPalette(double slope) { return layers.floorEntry(slope).getValue(); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java index 5f21d69b2..88ac9f8f5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/ExpressionFunctionTemplate.java @@ -11,6 +11,7 @@ import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.functions.Function; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.exception.ValidationException; import java.util.HashMap; @@ -55,21 +56,10 @@ public class ExpressionFunctionTemplate extends SamplerTemplate noiseFunctionMap = generateFunctions(); return new ExpressionFunction(noiseFunctionMap, equation, vars); } catch(ParseException e) { - throw new IllegalStateException(e); + throw new LoadException("Failed to parse expression.", e); } } - @Override - public boolean validate() throws ValidationException { - try { - Map noiseFunctionMap = generateFunctions(); - new ExpressionFunction(noiseFunctionMap, equation, vars); - } catch(ParseException e) { - throw new ValidationException("Errors occurred while parsing noise equation: ", e); - } - return super.validate(); - } - private Map generateFunctions() throws ParseException { Map noiseFunctionMap = new HashMap<>(); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java index b0f3d1e13..1a0186c73 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java @@ -44,24 +44,27 @@ public class TerraScriptAddon implements AddonInitializer { .then(event -> { CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); - event.getPack().getLoader().open("", ".tesf").thenEntries(entries -> { - for(Map.Entry entry : entries) { - try { - String id = StringUtil.fileName(entry.getKey()); - StructureScript structureScript = new StructureScript(entry.getValue(), - id, - platform, - structureRegistry, - lootRegistry, - event - .getPack() - .getOrCreateRegistry(FunctionBuilder.class)); - structureRegistry.register(structureScript.getID(), structureScript); - } catch(ParseException e) { - throw new LoadException("Failed to load script \"" + entry.getKey() + "\"", e); - } - } - }).close(); + event.getPack().getLoader().open("", ".tesf").thenEntries( + entries -> + entries.stream() + .parallel() + .map(entry -> { + try { + String id = StringUtil.fileName(entry.getKey()); + return new StructureScript(entry.getValue(), + id, + platform, + structureRegistry, + lootRegistry, + event.getPack().getOrCreateRegistry(FunctionBuilder.class)); + } catch(ParseException e) { + throw new LoadException("Failed to load script \"" + entry.getKey() + "\"", e); + } + }) + .toList() + .forEach(structureScript -> structureRegistry.register(structureScript.getID(), + structureScript))) + .close(); }) .priority(2) .failThrough(); diff --git a/common/api/addons/build.gradle.kts b/common/api/addons/build.gradle.kts deleted file mode 100644 index 9ca59c852..000000000 --- a/common/api/addons/build.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -dependencies { - shadedApi(project(":common:api:util")) - shadedApi("ca.solo-studios", "strata", Versions.Libraries.strata) -} diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 0a86b0c7b..62ccbd373 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -1,10 +1,11 @@ -afterEvaluate { - subprojects.forEach { - if (it != project) { - println("Project: ${it.name}") - dependencies { - shadedApi(it) - } - } - } +dependencies { + shadedApi("ca.solo-studios", "strata", Versions.Libraries.strata) + shadedApi("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) + shadedApi("cloud.commandframework", "cloud-core", Versions.Libraries.cloud) + + shadedApi("com.dfsek", "paralithic", Versions.Libraries.paralithic) + shadedApi("com.dfsek.tectonic", "common", Versions.Libraries.tectonic) + + + shadedImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) } \ No newline at end of file diff --git a/common/api/core/build.gradle.kts b/common/api/core/build.gradle.kts deleted file mode 100644 index 6478aaddf..000000000 --- a/common/api/core/build.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -dependencies { - shadedApi(project(":common:api:util")) - shadedApi(project(":common:api:noise")) - shadedApi(project(":common:api:registry")) - shadedApi(project(":common:api:addons")) - - shadedApi("org.slf4j", "slf4j-api", Versions.Libraries.slf4j) - shadedApi("cloud.commandframework", "cloud-core", Versions.Libraries.cloud) - - - shadedImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) -} - diff --git a/common/api/inject/README.md b/common/api/inject/README.md deleted file mode 100644 index 1f8d4e927..000000000 --- a/common/api/inject/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Dependency Injection - -A simple annotation-based dependency injection framework \ No newline at end of file diff --git a/common/api/inject/build.gradle.kts b/common/api/inject/build.gradle.kts deleted file mode 100644 index db0506f53..000000000 --- a/common/api/inject/build.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -dependencies { - shadedApi(project(":common:api:util")) -} - diff --git a/common/api/noise/build.gradle.kts b/common/api/noise/build.gradle.kts deleted file mode 100644 index 69cc69cef..000000000 --- a/common/api/noise/build.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -dependencies { - shadedApi(project(":common:api:util")) - - shadedApi("com.dfsek", "paralithic", Versions.Libraries.paralithic) - - shadedImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) -} - diff --git a/common/api/registry/build.gradle.kts b/common/api/registry/build.gradle.kts deleted file mode 100644 index db0506f53..000000000 --- a/common/api/registry/build.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -dependencies { - shadedApi(project(":common:api:util")) -} - diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/Handle.java b/common/api/src/main/java/com/dfsek/terra/api/Handle.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/Handle.java rename to common/api/src/main/java/com/dfsek/terra/api/Handle.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/Platform.java b/common/api/src/main/java/com/dfsek/terra/api/Platform.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/Platform.java rename to common/api/src/main/java/com/dfsek/terra/api/Platform.java diff --git a/common/api/addons/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java b/common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java similarity index 100% rename from common/api/addons/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java rename to common/api/src/main/java/com/dfsek/terra/api/addon/BaseAddon.java diff --git a/common/api/addons/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 similarity index 100% rename from common/api/addons/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java rename to common/api/src/main/java/com/dfsek/terra/api/addon/bootstrap/BootstrapBaseAddon.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/BlockType.java b/common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/BlockType.java rename to common/api/src/main/java/com/dfsek/terra/api/block/BlockType.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java rename to common/api/src/main/java/com/dfsek/terra/api/block/entity/BlockEntity.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/entity/Container.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/entity/Container.java rename to common/api/src/main/java/com/dfsek/terra/api/block/entity/Container.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java rename to common/api/src/main/java/com/dfsek/terra/api/block/entity/MobSpawner.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java rename to common/api/src/main/java/com/dfsek/terra/api/block/entity/SerialState.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/entity/Sign.java b/common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/entity/Sign.java rename to common/api/src/main/java/com/dfsek/terra/api/block/entity/Sign.java diff --git a/common/api/core/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 similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/BlockState.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/BlockState.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/Property.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/BooleanProperty.java diff --git a/common/api/core/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 similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/EnumProperty.java diff --git a/common/api/core/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 similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/IntProperty.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/base/Properties.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/Properties.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/base/Properties.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/base/Properties.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Axis.java diff --git a/common/api/core/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 similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Direction.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/Half.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RailShape.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RailShape.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RailShape.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RailShape.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/RedstoneConnection.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java b/common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java rename to common/api/src/main/java/com/dfsek/terra/api/block/state/properties/enums/WallHeight.java diff --git a/common/api/core/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 similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java rename to common/api/src/main/java/com/dfsek/terra/api/command/arguments/RegistryArgument.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java b/common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java rename to common/api/src/main/java/com/dfsek/terra/api/config/AbstractableTemplate.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java rename to common/api/src/main/java/com/dfsek/terra/api/config/ConfigFactory.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/config/ConfigPack.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/config/ConfigPack.java rename to common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/config/ConfigType.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/config/ConfigType.java rename to common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/config/Loader.java b/common/api/src/main/java/com/dfsek/terra/api/config/Loader.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/config/Loader.java rename to common/api/src/main/java/com/dfsek/terra/api/config/Loader.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/config/PluginConfig.java b/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/config/PluginConfig.java rename to common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/config/meta/Meta.java b/common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/config/meta/Meta.java rename to common/api/src/main/java/com/dfsek/terra/api/config/meta/Meta.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/entity/CommandSender.java b/common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/entity/CommandSender.java rename to common/api/src/main/java/com/dfsek/terra/api/entity/CommandSender.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/entity/Entity.java b/common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/entity/Entity.java rename to common/api/src/main/java/com/dfsek/terra/api/entity/Entity.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/entity/EntityType.java b/common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/entity/EntityType.java rename to common/api/src/main/java/com/dfsek/terra/api/entity/EntityType.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/entity/Player.java b/common/api/src/main/java/com/dfsek/terra/api/entity/Player.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/entity/Player.java rename to common/api/src/main/java/com/dfsek/terra/api/entity/Player.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/EventHandler.java b/common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/EventHandler.java rename to common/api/src/main/java/com/dfsek/terra/api/event/EventHandler.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/EventManager.java b/common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/EventManager.java rename to common/api/src/main/java/com/dfsek/terra/api/event/EventManager.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/AbstractCancellable.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/Cancellable.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/Event.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/Event.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/Event.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/Event.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/FailThroughEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/PackEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationDiscoveryEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/config/ConfigurationLoadEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackLoadEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPostLoadEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/config/pack/ConfigPackPreLoadEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/platform/CommandRegistrationEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/platform/PlatformInitializationEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/EntitySpawnEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java rename to common/api/src/main/java/com/dfsek/terra/api/event/events/world/generation/LootPopulateEvent.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java b/common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java rename to common/api/src/main/java/com/dfsek/terra/api/event/functional/EventContext.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java b/common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java rename to common/api/src/main/java/com/dfsek/terra/api/event/functional/FunctionalEventHandler.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java b/common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java rename to common/api/src/main/java/com/dfsek/terra/api/handle/ItemHandle.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java b/common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java rename to common/api/src/main/java/com/dfsek/terra/api/handle/WorldHandle.java diff --git a/common/api/inject/src/main/java/com/dfsek/terra/api/inject/Injector.java b/common/api/src/main/java/com/dfsek/terra/api/inject/Injector.java similarity index 100% rename from common/api/inject/src/main/java/com/dfsek/terra/api/inject/Injector.java rename to common/api/src/main/java/com/dfsek/terra/api/inject/Injector.java diff --git a/common/api/inject/src/main/java/com/dfsek/terra/api/inject/annotations/Inject.java b/common/api/src/main/java/com/dfsek/terra/api/inject/annotations/Inject.java similarity index 100% rename from common/api/inject/src/main/java/com/dfsek/terra/api/inject/annotations/Inject.java rename to common/api/src/main/java/com/dfsek/terra/api/inject/annotations/Inject.java diff --git a/common/api/inject/src/main/java/com/dfsek/terra/api/inject/exception/InjectionException.java b/common/api/src/main/java/com/dfsek/terra/api/inject/exception/InjectionException.java similarity index 100% rename from common/api/inject/src/main/java/com/dfsek/terra/api/inject/exception/InjectionException.java rename to common/api/src/main/java/com/dfsek/terra/api/inject/exception/InjectionException.java diff --git a/common/api/inject/src/main/java/com/dfsek/terra/api/inject/impl/InjectorImpl.java b/common/api/src/main/java/com/dfsek/terra/api/inject/impl/InjectorImpl.java similarity index 100% rename from common/api/inject/src/main/java/com/dfsek/terra/api/inject/impl/InjectorImpl.java rename to common/api/src/main/java/com/dfsek/terra/api/inject/impl/InjectorImpl.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/inventory/BlockInventoryHolder.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/BlockInventoryHolder.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/inventory/BlockInventoryHolder.java rename to common/api/src/main/java/com/dfsek/terra/api/inventory/BlockInventoryHolder.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/inventory/Inventory.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/Inventory.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/inventory/Inventory.java rename to common/api/src/main/java/com/dfsek/terra/api/inventory/Inventory.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/inventory/InventoryHolder.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/InventoryHolder.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/inventory/InventoryHolder.java rename to common/api/src/main/java/com/dfsek/terra/api/inventory/InventoryHolder.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/inventory/Item.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/Item.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/inventory/Item.java rename to common/api/src/main/java/com/dfsek/terra/api/inventory/Item.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/inventory/ItemStack.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/ItemStack.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/inventory/ItemStack.java rename to common/api/src/main/java/com/dfsek/terra/api/inventory/ItemStack.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/inventory/item/Damageable.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Damageable.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/inventory/item/Damageable.java rename to common/api/src/main/java/com/dfsek/terra/api/inventory/item/Damageable.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/inventory/item/Enchantment.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/Enchantment.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/inventory/item/Enchantment.java rename to common/api/src/main/java/com/dfsek/terra/api/inventory/item/Enchantment.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/inventory/item/ItemMeta.java b/common/api/src/main/java/com/dfsek/terra/api/inventory/item/ItemMeta.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/inventory/item/ItemMeta.java rename to common/api/src/main/java/com/dfsek/terra/api/inventory/item/ItemMeta.java diff --git a/common/api/noise/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java b/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java similarity index 100% rename from common/api/noise/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java rename to common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/profiler/ProfileFrame.java b/common/api/src/main/java/com/dfsek/terra/api/profiler/ProfileFrame.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/profiler/ProfileFrame.java rename to common/api/src/main/java/com/dfsek/terra/api/profiler/ProfileFrame.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/profiler/Profiler.java b/common/api/src/main/java/com/dfsek/terra/api/profiler/Profiler.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/profiler/Profiler.java rename to common/api/src/main/java/com/dfsek/terra/api/profiler/Profiler.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/profiler/Timings.java b/common/api/src/main/java/com/dfsek/terra/api/profiler/Timings.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/profiler/Timings.java rename to common/api/src/main/java/com/dfsek/terra/api/profiler/Timings.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/properties/Context.java b/common/api/src/main/java/com/dfsek/terra/api/properties/Context.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/properties/Context.java rename to common/api/src/main/java/com/dfsek/terra/api/properties/Context.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/properties/Properties.java b/common/api/src/main/java/com/dfsek/terra/api/properties/Properties.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/properties/Properties.java rename to common/api/src/main/java/com/dfsek/terra/api/properties/Properties.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/properties/PropertyHolder.java b/common/api/src/main/java/com/dfsek/terra/api/properties/PropertyHolder.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/properties/PropertyHolder.java rename to common/api/src/main/java/com/dfsek/terra/api/properties/PropertyHolder.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/properties/annotations/Linked.java b/common/api/src/main/java/com/dfsek/terra/api/properties/annotations/Linked.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/properties/annotations/Linked.java rename to common/api/src/main/java/com/dfsek/terra/api/properties/annotations/Linked.java diff --git a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java similarity index 100% rename from common/api/registry/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java rename to common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java diff --git a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java similarity index 100% rename from common/api/registry/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java rename to common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java diff --git a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java similarity index 100% rename from common/api/registry/src/main/java/com/dfsek/terra/api/registry/Registry.java rename to common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java diff --git a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/exception/DuplicateEntryException.java b/common/api/src/main/java/com/dfsek/terra/api/registry/exception/DuplicateEntryException.java similarity index 100% rename from common/api/registry/src/main/java/com/dfsek/terra/api/registry/exception/DuplicateEntryException.java rename to common/api/src/main/java/com/dfsek/terra/api/registry/exception/DuplicateEntryException.java diff --git a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/exception/NoSuchEntryException.java b/common/api/src/main/java/com/dfsek/terra/api/registry/exception/NoSuchEntryException.java similarity index 100% rename from common/api/registry/src/main/java/com/dfsek/terra/api/registry/exception/NoSuchEntryException.java rename to common/api/src/main/java/com/dfsek/terra/api/registry/exception/NoSuchEntryException.java diff --git a/common/api/registry/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java b/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java similarity index 100% rename from common/api/registry/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java rename to common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryHolder.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/structure/LootTable.java b/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/structure/LootTable.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/structure/Structure.java b/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/structure/Structure.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/structure/StructureSpawn.java b/common/api/src/main/java/com/dfsek/terra/api/structure/StructureSpawn.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/structure/StructureSpawn.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/StructureSpawn.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java b/common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/configured/ConfiguredStructure.java diff --git a/common/api/core/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 similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/feature/BinaryColumn.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java rename to common/api/src/main/java/com/dfsek/terra/api/structure/feature/Locator.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/tectonic/ConfigLoadingDelegate.java b/common/api/src/main/java/com/dfsek/terra/api/tectonic/ConfigLoadingDelegate.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/tectonic/ConfigLoadingDelegate.java rename to common/api/src/main/java/com/dfsek/terra/api/tectonic/ConfigLoadingDelegate.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/tectonic/LoaderRegistrar.java b/common/api/src/main/java/com/dfsek/terra/api/tectonic/LoaderRegistrar.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/tectonic/LoaderRegistrar.java rename to common/api/src/main/java/com/dfsek/terra/api/tectonic/LoaderRegistrar.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/tectonic/ShortcutLoader.java b/common/api/src/main/java/com/dfsek/terra/api/tectonic/ShortcutLoader.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/tectonic/ShortcutLoader.java rename to common/api/src/main/java/com/dfsek/terra/api/tectonic/ShortcutLoader.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/transform/Transform.java b/common/api/src/main/java/com/dfsek/terra/api/transform/Transform.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/transform/Transform.java rename to common/api/src/main/java/com/dfsek/terra/api/transform/Transform.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/transform/Transformer.java b/common/api/src/main/java/com/dfsek/terra/api/transform/Transformer.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/transform/Transformer.java rename to common/api/src/main/java/com/dfsek/terra/api/transform/Transformer.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/transform/Validator.java b/common/api/src/main/java/com/dfsek/terra/api/transform/Validator.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/transform/Validator.java rename to common/api/src/main/java/com/dfsek/terra/api/transform/Validator.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/transform/exception/AttemptsFailedException.java b/common/api/src/main/java/com/dfsek/terra/api/transform/exception/AttemptsFailedException.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/transform/exception/AttemptsFailedException.java rename to common/api/src/main/java/com/dfsek/terra/api/transform/exception/AttemptsFailedException.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/transform/exception/TransformException.java b/common/api/src/main/java/com/dfsek/terra/api/transform/exception/TransformException.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/transform/exception/TransformException.java rename to common/api/src/main/java/com/dfsek/terra/api/transform/exception/TransformException.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/util/ConstantRange.java b/common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/util/ConstantRange.java rename to common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/MathUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/MathUtil.java rename to common/api/src/main/java/com/dfsek/terra/api/util/MathUtil.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java rename to common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/util/Range.java b/common/api/src/main/java/com/dfsek/terra/api/util/Range.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/util/Range.java rename to common/api/src/main/java/com/dfsek/terra/api/util/Range.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/Rotation.java b/common/api/src/main/java/com/dfsek/terra/api/util/Rotation.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/Rotation.java rename to common/api/src/main/java/com/dfsek/terra/api/util/Rotation.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/util/RotationUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/RotationUtil.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/util/RotationUtil.java rename to common/api/src/main/java/com/dfsek/terra/api/util/RotationUtil.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/StringIdentifiable.java b/common/api/src/main/java/com/dfsek/terra/api/util/StringIdentifiable.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/StringIdentifiable.java rename to common/api/src/main/java/com/dfsek/terra/api/util/StringIdentifiable.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/StringUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/StringUtil.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/StringUtil.java rename to common/api/src/main/java/com/dfsek/terra/api/util/StringUtil.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java rename to common/api/src/main/java/com/dfsek/terra/api/util/collection/MaterialSet.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java rename to common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java diff --git a/common/api/util/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 similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/generic/Construct.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java diff --git a/common/api/util/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 similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java diff --git a/common/api/util/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 similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java rename to common/api/src/main/java/com/dfsek/terra/api/util/generic/either/Either.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/pair/Pair.java similarity index 100% rename from common/api/util/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/pair/Pair.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutableBoolean.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableBoolean.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutableBoolean.java rename to common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableBoolean.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutableDouble.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableDouble.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutableDouble.java rename to common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableDouble.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutableInteger.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableInteger.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutableInteger.java rename to common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableInteger.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutableNumber.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableNumber.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutableNumber.java rename to common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutableNumber.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutablePrimitive.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutablePrimitive.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/MutablePrimitive.java rename to common/api/src/main/java/com/dfsek/terra/api/util/mutable/MutablePrimitive.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/package-info.java b/common/api/src/main/java/com/dfsek/terra/api/util/mutable/package-info.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/mutable/package-info.java rename to common/api/src/main/java/com/dfsek/terra/api/util/mutable/package-info.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java rename to common/api/src/main/java/com/dfsek/terra/api/util/reflection/ReflectionUtil.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java b/common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java rename to common/api/src/main/java/com/dfsek/terra/api/util/reflection/TypeKey.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java rename to common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java similarity index 84% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java rename to common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java index 74de1a7fa..735f80cb7 100644 --- a/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector2Int.java @@ -2,6 +2,8 @@ package com.dfsek.terra.api.util.vector; import com.dfsek.terra.api.util.Rotation; +import java.util.Objects; + /** * oh yeah @@ -82,4 +84,17 @@ public class Vector2Int { return new Vector2Int(x, z); } } + + @Override + public int hashCode() { + return (31 * x) + z; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof Vector2Int that) { + return this.x == that.x && this.z == that.z; + } + return false; + } } diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector3.java b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector3.java rename to common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3.java diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector3Int.java b/common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3Int.java similarity index 100% rename from common/api/util/src/main/java/com/dfsek/terra/api/util/vector/Vector3Int.java rename to common/api/src/main/java/com/dfsek/terra/api/util/vector/Vector3Int.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/BufferedWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/BufferedWorld.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/BufferedWorld.java rename to common/api/src/main/java/com/dfsek/terra/api/world/BufferedWorld.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/ReadableWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/ReadableWorld.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/ReadableWorld.java rename to common/api/src/main/java/com/dfsek/terra/api/world/ReadableWorld.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/ServerWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/ServerWorld.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/ServerWorld.java rename to common/api/src/main/java/com/dfsek/terra/api/world/ServerWorld.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/World.java b/common/api/src/main/java/com/dfsek/terra/api/world/World.java similarity index 67% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/World.java rename to common/api/src/main/java/com/dfsek/terra/api/world/World.java index 37e596d30..9c12a3724 100644 --- a/common/api/core/src/main/java/com/dfsek/terra/api/world/World.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/World.java @@ -1,18 +1,12 @@ package com.dfsek.terra.api.world; -import com.dfsek.terra.api.Handle; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; +import com.dfsek.terra.api.world.info.WorldProperties; -public interface World extends Handle { - long getSeed(); - - int getMaxHeight(); - - int getMinHeight(); - +public interface World extends WorldProperties { ChunkGenerator getGenerator(); BiomeProvider getBiomeProvider(); diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/WritableWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/WritableWorld.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/WritableWorld.java rename to common/api/src/main/java/com/dfsek/terra/api/world/WritableWorld.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/biome/Biome.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/Biome.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/biome/Biome.java rename to common/api/src/main/java/com/dfsek/terra/api/world/biome/Biome.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/biome/PaletteSettings.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/PaletteSettings.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/biome/PaletteSettings.java rename to common/api/src/main/java/com/dfsek/terra/api/world/biome/PaletteSettings.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/biome/PlatformBiome.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/PlatformBiome.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/biome/PlatformBiome.java rename to common/api/src/main/java/com/dfsek/terra/api/world/biome/PlatformBiome.java diff --git a/common/api/core/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 similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java rename to common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/Chunk.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/Chunk.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/Chunk.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/Chunk.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/ChunkAccess.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/ChunkAccess.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/ChunkAccess.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/ChunkAccess.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java similarity index 76% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java index 618bb3f44..e9f9218bd 100644 --- a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ChunkGenerator.java @@ -7,12 +7,13 @@ package com.dfsek.terra.api.world.chunk.generation; +import com.dfsek.terra.api.world.info.WorldProperties; + import org.jetbrains.annotations.NotNull; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3Int; -import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.WritableWorld; @@ -20,13 +21,13 @@ public interface ChunkGenerator { void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WritableWorld world, int chunkX, int chunkZ); - BlockState getBlock(ServerWorld world, int x, int y, int z); + BlockState getBlock(WorldProperties world, int x, int y, int z); - default BlockState getBlock(ServerWorld world, Vector3 vector3) { + default BlockState getBlock(WorldProperties world, Vector3 vector3) { return getBlock(world, vector3.getBlockX(), vector3.getBlockY(), vector3.getBlockZ()); } - default BlockState getBlock(ServerWorld world, Vector3Int vector3) { + default BlockState getBlock(WorldProperties world, Vector3Int vector3) { return getBlock(world, vector3.getX(), vector3.getY(), vector3.getZ()); } } diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoChunk.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoChunk.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoChunk.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoChunk.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoWorld.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoWorld.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoWorld.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/ProtoWorld.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/Chunkified.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/Chunkified.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/Chunkified.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/Chunkified.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/GenerationStage.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/GenerationStage.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/GenerationStage.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/stage/GenerationStage.java diff --git a/common/api/core/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 similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Column.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/GeneratorWrapper.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/GeneratorWrapper.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/GeneratorWrapper.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/GeneratorWrapper.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Palette.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Palette.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Palette.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/Palette.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/ChunkGeneratorProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/ChunkGeneratorProvider.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/ChunkGeneratorProvider.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/ChunkGeneratorProvider.java diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/GenerationStageProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/GenerationStageProvider.java similarity index 100% rename from common/api/core/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/GenerationStageProvider.java rename to common/api/src/main/java/com/dfsek/terra/api/world/chunk/generation/util/provider/GenerationStageProvider.java diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/info/WorldProperties.java b/common/api/src/main/java/com/dfsek/terra/api/world/info/WorldProperties.java new file mode 100644 index 000000000..d9db43ef6 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/world/info/WorldProperties.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.world.info; + +import com.dfsek.terra.api.Handle; + + +public interface WorldProperties extends Handle { + long getSeed(); + + int getMaxHeight(); + + int getMinHeight(); +} diff --git a/common/api/util/build.gradle.kts b/common/api/util/build.gradle.kts deleted file mode 100644 index 65ed8775a..000000000 --- a/common/api/util/build.gradle.kts +++ /dev/null @@ -1,6 +0,0 @@ -dependencies { - shadedApi("com.dfsek.tectonic", "common", Versions.Libraries.tectonic) - - shadedImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) -} - diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java index 920127bbf..ee40850d6 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java @@ -61,7 +61,7 @@ public class PluginConfigImpl implements ConfigTemplate, PluginConfig { @Value("cache.sampler") @Default - private int samplerCache = 64; + private int samplerCache = 1024; @Value("cache.biome-provider") @Default 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 fa55ca006..d9b36c3ff 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 @@ -62,6 +62,9 @@ import com.dfsek.terra.registry.CheckedRegistryImpl; import com.dfsek.terra.registry.OpenRegistryImpl; import com.dfsek.terra.registry.ShortcutHolder; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -74,7 +77,11 @@ import java.io.IOException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; +import java.util.Map.Entry; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -83,7 +90,8 @@ import java.util.zip.ZipFile; * Represents a Terra configuration pack. */ public class ConfigPackImpl implements ConfigPack { - public static final TypeKey> CONFIG_TYPE_TYPE_KEY = new TypeKey<>() {}; + public static final TypeKey> CONFIG_TYPE_TYPE_KEY = new TypeKey<>() { + }; private static final Logger logger = LoggerFactory.getLogger(ConfigPackImpl.class); private final ConfigPackTemplate template = new ConfigPackTemplate(); @@ -162,33 +170,36 @@ public class ConfigPackImpl implements ConfigPack { configTypes.values().forEach(list -> list.forEach(pair -> configTypeRegistry.register(pair.getLeft(), pair.getRight()))); - Map, List> configs = new HashMap<>(); + ListMultimap, Configuration> multimap = configurations.values().parallelStream().collect( + () -> Multimaps.newListMultimap(new ConcurrentHashMap<>(), ArrayList::new), (configs, configuration) -> { + if(configuration.contains("type")) { // Only sort configs with type key + ProtoConfig config = new ProtoConfig(); + selfLoader.load(config, configuration); + configs.put(config.getType(), configuration); + } + }, ListMultimap::putAll); - for(Configuration configuration : configurations.values()) { // Sort the configs - if(configuration.contains("type")) { // Only sort configs with type key - ProtoConfig config = new ProtoConfig(); - selfLoader.load(config, configuration); - configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration); - } - } - - for(ConfigType configType : configTypeRegistry.entries()) { // Load the configs + configTypeRegistry.forEach(configType -> { CheckedRegistry registry = getCheckedRegistry(configType.getTypeKey()); - platform.getEventManager().callEvent(new ConfigTypePreLoadEvent(configType, registry, this)); - for(AbstractConfiguration config : abstractConfigLoader.loadConfigs( - configs.getOrDefault(configType, Collections.emptyList()))) { - try { - Object loaded = ((ConfigFactory) configType.getFactory()).build( - selfLoader.load(configType.getTemplate(this, platform), config), platform); - registry.register(config.getID(), loaded); - platform.getEventManager().callEvent( - new ConfigurationLoadEvent(this, config, template -> selfLoader.load(template, config), configType, loaded)); - } catch(DuplicateEntryException e) { - throw new LoadException("Duplicate registry entry: ", e); - } - } + abstractConfigLoader + .loadConfigs(multimap.get(configType)) + .stream() + .parallel() + .map(configuration -> { + logger.debug("Loading abstract config {}", configuration.getID()); + Object loaded = ((ConfigFactory) configType.getFactory()).build( + selfLoader.load(configType.getTemplate(this, platform), configuration), platform); + platform.getEventManager().callEvent(new ConfigurationLoadEvent(this, + configuration, + template -> selfLoader.load(template, configuration), + configType, + loaded)); + return Pair.of(configuration.getID(), loaded); + }) + .toList() + .forEach(pair -> registry.register(pair.getLeft(), pair.getRight())); platform.getEventManager().callEvent(new ConfigTypePostLoadEvent(configType, registry, this)); - } + }); platform.getEventManager().callEvent(new ConfigPackPostLoadEvent(this, template -> selfLoader.load(template, packManifest))); logger.info("Loaded config pack \"{}\" v{} by {} in {}ms.", diff --git a/platforms/cli/build.gradle.kts b/platforms/cli/build.gradle.kts new file mode 100644 index 000000000..0b28ac619 --- /dev/null +++ b/platforms/cli/build.gradle.kts @@ -0,0 +1,24 @@ +repositories { + maven { url = uri("https://jitpack.io/") } +} + +dependencies { + shadedApi("commons-io:commons-io:2.6") + shadedApi("com.github.Querz:NBT:6.1") + shadedApi(project(":common:implementation:base")) + + shadedImplementation("com.google.guava:guava:31.0.1-jre") + + shadedImplementation("ch.qos.logback:logback-classic:1.2.7") + + shadedImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) +} + +tasks.withType() { + entryCompression = ZipEntryCompression.STORED + manifest { + attributes( + "Main-Class" to "com.dfsek.terra.cli.TerraCLI", + ) + } +} \ No newline at end of file diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/CLIPlatform.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/CLIPlatform.java new file mode 100644 index 000000000..36df2da41 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/CLIPlatform.java @@ -0,0 +1,65 @@ +package com.dfsek.terra.cli; + +import com.dfsek.tectonic.api.TypeRegistry; + +import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import com.dfsek.tectonic.api.loader.type.TypeLoader; + +import com.dfsek.terra.AbstractPlatform; +import com.dfsek.terra.api.handle.ItemHandle; +import com.dfsek.terra.api.handle.WorldHandle; + +import com.dfsek.terra.api.world.biome.PlatformBiome; +import com.dfsek.terra.cli.handle.CLIItemHandle; +import com.dfsek.terra.cli.handle.CLIWorldHandle; + +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.lang.reflect.AnnotatedType; + + +public class CLIPlatform extends AbstractPlatform { + private static final Logger LOGGER = LoggerFactory.getLogger(CLIPlatform.class); + + private final CLIWorldHandle worldHandle = new CLIWorldHandle(); + private final CLIItemHandle itemHandle = new CLIItemHandle(); + public CLIPlatform() { + LOGGER.info("Root directory: {}", getDataFolder().getAbsoluteFile()); + load(); + LOGGER.info("Initialized Terra platform."); + } + @Override + public boolean reload() { + return false; + } + + @Override + public @NotNull String platformName() { + return "CLI"; + } + + @Override + public @NotNull WorldHandle getWorldHandle() { + return worldHandle; + } + + @Override + public @NotNull File getDataFolder() { + return new File("./"); + } + + @Override + public @NotNull ItemHandle getItemHandle() { + return itemHandle; + } + + @Override + public void register(TypeRegistry registry) { + super.register(registry); + registry.registerLoader(PlatformBiome.class, (TypeLoader) (annotatedType, o, configLoader) -> () -> o); + } +} diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/NBTSerializable.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/NBTSerializable.java new file mode 100644 index 000000000..0c05a1652 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/NBTSerializable.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.cli; + +public interface NBTSerializable { + T serialize(); +} 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 new file mode 100644 index 000000000..f74e54045 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/TerraCLI.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.cli; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; + +import com.dfsek.terra.api.util.vector.Vector2Int; +import com.dfsek.terra.cli.world.CLIWorld; + +import net.querz.mca.MCAUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + + +public final class TerraCLI { + private static final Logger LOGGER = LoggerFactory.getLogger(TerraCLI.class); + + public static void main(String... args) { + LOGGER.info("Starting Terra CLI..."); + + CLIPlatform platform = new CLIPlatform(); + platform.getEventManager().callEvent(new PlatformInitializationEvent()); + + ConfigPack generate = platform.getConfigRegistry().get("OVERWORLD").orElseThrow(); // TODO: make this a cli argument + + CLIWorld world = new CLIWorld(2, 2, 384, -64, generate); + + world.generate(); + + world.serialize().parallel().forEach(mcaFile -> { + Vector2Int pos = mcaFile.getLeft(); + String name = MCAUtil.createNameFromRegionLocation(pos.getX(), pos.getZ()); + LOGGER.info("Writing region ({}, {}) to {}", pos.getX(), pos.getZ(), name); + + try { + MCAUtil.write(mcaFile.getRight(), name); + } catch(IOException e) { + e.printStackTrace(); + } + LOGGER.info("Wrote region to file."); + }); + LOGGER.info("Done."); + System.exit(0); + } +} 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 new file mode 100644 index 000000000..f22d08c29 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockState.java @@ -0,0 +1,84 @@ +package com.dfsek.terra.cli.block; + +import com.dfsek.terra.api.block.BlockType; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.block.state.properties.Property; + +import net.querz.nbt.tag.CompoundTag; + + +public class CLIBlockState implements BlockState { + private final String value; + private final CLIBlockType type; + private final boolean isAir; + private final CompoundTag nbt; + + public CLIBlockState(String value) { + this.value = value; + if(value.contains("[")) { + + } else { + + } + this.isAir = value.startsWith("minecraft:air"); + this.nbt = new CompoundTag(); + if(value.contains("[")) { + this.type = new CLIBlockType(value.substring(0, value.indexOf("["))); + String properties = value.substring(value.indexOf('[') + 1, value.indexOf(']')); + String[] props = properties.split(","); + CompoundTag pTag = new CompoundTag(); + for(String property : props) { + String name = property.substring(0, property.indexOf('=')); + String val = property.substring(property.indexOf('=') + 1); + + pTag.putString(name, val); + } + this.nbt.put("Properties", pTag); + } else this.type = new CLIBlockType(value); + this.nbt.putString("Name", type.getHandle()); + } + + @Override + public Object getHandle() { + return value; + } + + @Override + public boolean matches(BlockState other) { + return false; + } + + @Override + public > boolean has(Property property) { + return false; + } + + @Override + public > T get(Property property) { + return null; + } + + @Override + public > BlockState set(Property property, T value) { + return null; + } + + @Override + public BlockType getBlockType() { + return type; + } + + @Override + public String getAsString(boolean properties) { + return value; + } + + @Override + public boolean isAir() { + return isAir; + } + + public CompoundTag getNbt() { + return nbt; + } +} 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 new file mode 100644 index 000000000..bc5754048 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/block/CLIBlockType.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.cli.block; + +import com.dfsek.terra.api.block.BlockType; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.util.generic.Lazy; + + +public class CLIBlockType implements BlockType { + private final String value; + private final boolean solid; + private final boolean water; + private final Lazy 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)); + } + + @Override + public String getHandle() { + return value; + } + + @Override + public BlockState getDefaultState() { + return defaultState.value(); + } + + @Override + public boolean isSolid() { + return solid; + } + + @Override + public boolean isWater() { + return water; + } +} diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/generator/CLIChunkGenerator.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/generator/CLIChunkGenerator.java new file mode 100644 index 000000000..0b58929b3 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/generator/CLIChunkGenerator.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.cli.generator; + +import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; +import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; + + +public class CLIChunkGenerator implements GeneratorWrapper { + @Override + public ChunkGenerator getHandle() { + return null; + } +} diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/handle/CLIItemHandle.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/handle/CLIItemHandle.java new file mode 100644 index 000000000..3a183d006 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/handle/CLIItemHandle.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.cli.handle; + +import com.dfsek.terra.api.handle.ItemHandle; +import com.dfsek.terra.api.inventory.Item; +import com.dfsek.terra.api.inventory.item.Enchantment; + +import java.util.Set; + + +public class CLIItemHandle implements ItemHandle { + @Override + public Item createItem(String data) { + return null; + } + + @Override + public Enchantment getEnchantment(String id) { + return null; + } + + @Override + public Set getEnchantments() { + return null; + } +} 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 new file mode 100644 index 000000000..4ec2dc619 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/handle/CLIWorldHandle.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.cli.handle; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.entity.EntityType; +import com.dfsek.terra.api.handle.WorldHandle; + +import com.dfsek.terra.cli.block.CLIBlockState; + +import org.jetbrains.annotations.NotNull; + + +public class CLIWorldHandle implements WorldHandle { + private static final CLIBlockState AIR = new CLIBlockState("minecraft:air"); + @Override + public @NotNull BlockState createBlockState(@NotNull String data) { + return new CLIBlockState(data); + } + + @Override + public @NotNull BlockState air() { + return AIR; + } + + @Override + public @NotNull EntityType getEntity(@NotNull String id) { + return null; + } + + public static CLIBlockState getAIR() { + return AIR; + } +} 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 new file mode 100644 index 000000000..efd5c3e98 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/CLIWorld.java @@ -0,0 +1,308 @@ +package com.dfsek.terra.cli.world; + +import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.api.util.vector.Vector2Int; +import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; +import com.dfsek.terra.cli.NBTSerializable; + +import com.dfsek.terra.cli.world.chunk.CLIChunk; + +import com.google.common.collect.Streams; +import net.jafama.FastMath; + +import com.dfsek.terra.api.block.entity.BlockEntity; +import com.dfsek.terra.api.block.state.BlockState; +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.vector.Vector3; +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; + +import net.querz.mca.MCAFile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Stream; + + +public class CLIWorld implements ServerWorld, NBTSerializable>> { + private static final Logger LOGGER = LoggerFactory.getLogger(CLIWorld.class); + private final Region[] regions; + private final Region[] negativeRegions; + private final int size; + private final long seed; + private final int maxHeight; + private final int minHeight; + private final ChunkGenerator chunkGenerator; + private final BiomeProvider biomeProvider; + private final ConfigPack pack; + private final AtomicInteger amount = new AtomicInteger(0); + + private final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() - 1); + + public CLIWorld(int size, + long seed, + int maxHeight, + int minHeight, + ConfigPack pack) { + this.size = size; + this.maxHeight = maxHeight; + this.minHeight = minHeight; + this.seed = seed; + this.chunkGenerator = pack.getGeneratorProvider().newInstance(pack); + this.biomeProvider = pack.getBiomeProvider(); + this.pack = pack; + + + size+=1; + this.regions = new Region[size * size]; + this.negativeRegions = new Region[size * size]; + for(int x = 0; x < size; x++) { + for(int z = 0; z < size; z++) { + regions[x + z * size] = new Region(this, x, z); + negativeRegions[x + z * size] = new Region(this, x, z); + } + } + } + + public void generate() { + int sizeChunks = size * 32; + List> futures = new ArrayList<>(); + final AtomicLong start = new AtomicLong(System.nanoTime()); + for(int x = 0; x < sizeChunks; x++) { + for(int z = 0; z < sizeChunks; z++) { + int finalX = x; + int finalZ = z; + futures.add(executor.submit(() -> { + try { + int num = amount.getAndIncrement(); + CLIChunk chunk = getChunkAt(finalX, finalZ); + chunkGenerator.generateChunkData(chunk, this, finalX, finalZ); + CLIProtoWorld protoWorld = new CLIProtoWorld(this, finalX, finalZ); + pack.getStages().forEach(stage -> stage.populate(protoWorld)); + if(num % 240 == 239) { + long time = System.nanoTime(); + double cps = num / ((double) (time - start.get()) / 1000000000); + LOGGER.info("Generating chunk at ({}, {}), generated {} chunks at {}cps", finalX, finalZ, num, cps); + amount.set(0); + start.set(System.nanoTime()); + } + } catch(Exception e) { + e.printStackTrace(); + } + })); + } + } + + for(Future future : futures) { + try { + future.get(); + } catch(InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + } + + @Override + public Object getHandle() { + return this; + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + return getChunkAt(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)) + .getBlock(FastMath.floorMod(x, 16), y, FastMath.floorMod(z, 16)); + } + + @Override + public BlockEntity getBlockEntity(int x, int y, int z) { + return new BlockEntity() { + @Override + public boolean update(boolean applyPhysics) { + return false; + } + + @Override + public Vector3 getPosition() { + return Vector3.of(x, y, z); + } + + @Override + public int getX() { + return x; + } + + @Override + public int getY() { + return y; + } + + @Override + public int getZ() { + return z; + } + + @Override + public BlockState getBlockState() { + return CLIWorld.this.getBlockState(x, y, z); + } + + @Override + public Object getHandle() { + return this; + } + }; + } + + @Override + public CLIChunk getChunkAt(int x, int z) { + return getRegion(FastMath.floorDiv(x, 32), FastMath.floorDiv(z, 32)) + .get(FastMath.floorMod(x, 32), FastMath.floorMod(z, 32)); + } + + public Region getRegion(int x, int z) { + int key = x + z * size; + if(key >= 0) return regions[key]; + else return negativeRegions[-key]; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return maxHeight; + } + + @Override + public int getMinHeight() { + return minHeight; + } + + @Override + public ChunkGenerator getGenerator() { + return chunkGenerator; + } + + @Override + public BiomeProvider getBiomeProvider() { + return biomeProvider; + } + + @Override + public ConfigPack getPack() { + return pack; + } + + @Override + public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { + getChunkAt(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)) + .setBlock(FastMath.floorMod(x, 16), y, FastMath.floorMod(z, 16), data, physics); + } + + @Override + public Entity spawnEntity(double x, double y, double z, EntityType entityType) { + return null; + } + + @Override + public Stream> serialize() { + return Streams + .concat(Arrays.stream(regions), Arrays.stream(negativeRegions)) + .map(region -> Pair.of(Vector2Int.of(region.getX(), region.getZ()), region.serialize())); + } + + private static final class CLIProtoWorld implements ProtoWorld { + private final CLIWorld delegate; + private final int x, z; + + private CLIProtoWorld(CLIWorld delegate, int x, int z) { + this.delegate = delegate; + this.x = x; + this.z = z; + } + + @Override + public Object getHandle() { + return this; + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + return delegate.getBlockState(x, y, z); + } + + @Override + public BlockEntity getBlockEntity(int x, int y, int z) { + return delegate.getBlockEntity(x, y, z); + } + + @Override + public long getSeed() { + return delegate.seed; + } + + @Override + public int getMaxHeight() { + return delegate.maxHeight; + } + + @Override + public int getMinHeight() { + return delegate.minHeight; + } + + @Override + public ChunkGenerator getGenerator() { + return delegate.chunkGenerator; + } + + @Override + public BiomeProvider getBiomeProvider() { + return delegate.biomeProvider; + } + + @Override + public ConfigPack getPack() { + return delegate.pack; + } + + @Override + public void setBlockState(int x, int y, int z, BlockState data, boolean physics) { + delegate.setBlockState(x, y, z, data, physics); + } + + @Override + public Entity spawnEntity(double x, double y, double z, EntityType entityType) { + return delegate.spawnEntity(x, y, z, entityType); + } + + @Override + public int centerChunkX() { + return x; + } + + @Override + public int centerChunkZ() { + return z; + } + + @Override + public ServerWorld getWorld() { + return delegate; + } + } +} diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/world/Region.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/Region.java new file mode 100644 index 000000000..1e188b026 --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/Region.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.cli.world; + +import net.querz.mca.MCAFile; + +import com.dfsek.terra.cli.NBTSerializable; +import com.dfsek.terra.cli.world.chunk.CLIChunk; + + +public class Region implements NBTSerializable { + private final CLIChunk[] chunks; + private final int x, z; + private final CLIWorld world; + + public Region(CLIWorld world, int x, int z) { + this.x = x; + this.z = z; + this.world = world; + this.chunks = new CLIChunk[32 * 32];; + } + + public CLIChunk get(int x, int z) { + int key = x + z*32; + CLIChunk chunk = chunks[key]; + if(chunk == null) { + chunk = new CLIChunk(x, z, world); + chunks[key] = chunk; + } + return chunk; + } + + @Override + public MCAFile serialize() { + MCAFile mcaFile = new MCAFile(x, z); + int count = 0; + for(int cx = 0; cx < 32; cx++) { + for(int cz = 0; cz < 32; cz++) { + CLIChunk chunk = chunks[cx + cz * 32]; + if(chunk != null) { + count++; + mcaFile.setChunk(cx + cz * 32, chunk.serialize()); + } + } + } + if(count > 0) { + mcaFile.cleanupPalettesAndBlockStates(); + } + return mcaFile; + } + + public int getX() { + return x; + } + + public int getZ() { + return z; + } +} diff --git a/platforms/cli/src/main/java/com/dfsek/terra/cli/world/chunk/CLIChunk.java b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/chunk/CLIChunk.java new file mode 100644 index 000000000..79fa0832b --- /dev/null +++ b/platforms/cli/src/main/java/com/dfsek/terra/cli/world/chunk/CLIChunk.java @@ -0,0 +1,88 @@ +package com.dfsek.terra.cli.world.chunk; + +import org.jetbrains.annotations.NotNull; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.world.ServerWorld; +import com.dfsek.terra.api.world.chunk.Chunk; +import com.dfsek.terra.api.world.chunk.generation.ProtoChunk; +import com.dfsek.terra.cli.NBTSerializable; +import com.dfsek.terra.cli.block.CLIBlockState; +import com.dfsek.terra.cli.world.CLIWorld; + +import static com.dfsek.terra.cli.handle.CLIWorldHandle.getAIR; + + +public class CLIChunk implements Chunk, ProtoChunk, NBTSerializable { + private final int x; + private final int z; + private final CLIBlockState[][][] blocks; + private final int minHeight; + private final int maxHeight; + private final CLIWorld world; + + public CLIChunk(int x, int z, CLIWorld world) { + this.x = x; + this.z = z; + this.minHeight = world.getMinHeight(); + this.maxHeight = world.getMaxHeight(); + this.world = world; + this.blocks= new CLIBlockState[16][16][maxHeight - minHeight]; + } + + @Override + public Object getHandle() { + return null; + } + + @Override + public void setBlock(int x, int y, int z, BlockState data, boolean physics) { + blocks[x][z][y - minHeight] = (CLIBlockState) data; + } + + @Override + public @NotNull CLIBlockState getBlock(int x, int y, int z) { + CLIBlockState blockState = blocks[x][z][y - minHeight]; + if(blockState == null) return getAIR(); + return blockState; + } + + @Override + public int getX() { + return x; + } + + @Override + public int getZ() { + return z; + } + + @Override + public ServerWorld getWorld() { + return world; + } + + @Override + public net.querz.mca.Chunk serialize() { + net.querz.mca.Chunk chunk = net.querz.mca.Chunk.newChunk(2230); + for(int x = 0; x < blocks.length; x++) { + for(int z = 0; z < blocks[x].length; z++) { + for(int y = 0; y < blocks[z][z].length; y++) { + int yi = y + minHeight; + if(yi < 0 || yi >= 256) continue; + CLIBlockState blockState = blocks[x][z][y]; + if(blockState != null) { + chunk.setBlockStateAt(x, yi, z, blockState.getNbt(), false); + } + } + } + } + chunk.setStatus("features"); + return chunk; + } + + @Override + public int getMaxHeight() { + return maxHeight; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java index 8abe49a0d..81342b550 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/PlatformImpl.java @@ -24,6 +24,7 @@ import com.dfsek.tectonic.api.TypeRegistry; import com.dfsek.tectonic.api.exception.LoadException; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.MinecraftVersion; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; @@ -70,7 +71,7 @@ public class PlatformImpl extends AbstractPlatform { public boolean reload() { getTerraConfig().load(this); boolean succeed = getRawConfigRegistry().loadAll(this); - + worlds.forEach(world -> { FabricChunkGeneratorWrapper chunkGeneratorWrapper = ((FabricChunkGeneratorWrapper) world.getChunkManager().getChunkGenerator()); chunkGeneratorWrapper.setPack(getConfigRegistry().get(chunkGeneratorWrapper.getPack().getID()).orElseThrow()); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index 3c4e8eead..900362e9d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -27,6 +27,8 @@ import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; import com.dfsek.terra.fabric.FabricEntryPoint; import com.dfsek.terra.fabric.mixin.access.StructureAccessorAccessor; +import com.dfsek.terra.fabric.util.FabricAdapter; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; @@ -43,6 +45,7 @@ import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.Blender; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.StructuresConfig; import net.minecraft.world.gen.chunk.VerticalBlockSample; import net.minecraft.world.gen.feature.*; @@ -54,6 +57,7 @@ import org.slf4j.LoggerFactory; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import java.util.function.Supplier; public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.ChunkGenerator implements GeneratorWrapper { @@ -76,7 +80,9 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C Codec.LONG.fieldOf("seed").stable() .forGetter(generator -> generator.seed), PACK_CODEC.fieldOf("pack").stable() - .forGetter(generator -> generator.pack) + .forGetter(generator -> generator.pack), + ChunkGeneratorSettings.REGISTRY_CODEC.fieldOf("settings") + .forGetter(generator -> generator.settingsSupplier) ).apply(instance, instance.stable(FabricChunkGeneratorWrapper::new)) ); @@ -84,11 +90,13 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C private final TerraBiomeSource biomeSource; private ChunkGenerator delegate; private ConfigPack pack; - private net.minecraft.server.world.ServerWorld world; + private final Supplier settingsSupplier; - public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { + public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack, + Supplier settingsSupplier) { super(biomeSource, new StructuresConfig(true)); this.pack = configPack; + this.settingsSupplier = settingsSupplier; this.delegate = pack.getGeneratorProvider().newInstance(pack); logger.info("Loading world with config pack {}", pack.getID()); @@ -104,7 +112,7 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C @Override public net.minecraft.world.gen.chunk.ChunkGenerator withSeed(long seed) { - return new FabricChunkGeneratorWrapper((TerraBiomeSource) this.biomeSource.withSeed(seed), seed, pack); + return new FabricChunkGeneratorWrapper((TerraBiomeSource) this.biomeSource.withSeed(seed), seed, pack, settingsSupplier); } @Override @@ -129,7 +137,7 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C @Override public int getWorldHeight() { - return world.getTopY(); + return settingsSupplier.get().getGenerationShapeConfig().height(); } public Pool getEntitySpawnList(Biome biome, StructureAccessor accessor, SpawnGroup group, BlockPos pos) { @@ -194,31 +202,31 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C @Override public int getSeaLevel() { - return world.getSeaLevel(); + return settingsSupplier.get().getSeaLevel(); } @Override public int getMinimumY() { - return world.getBottomY(); + return settingsSupplier.get().getGenerationShapeConfig().minimumY(); } @Override - public int getHeight(int x, int z, Heightmap.Type heightmap, HeightLimitView heightmapType) { - int height = ((ServerWorld) world).getMaxHeight(); - while(height >= ((ServerWorld) world).getMinHeight() && !heightmap.getBlockPredicate().test( - (BlockState) ((ServerWorld) world).getGenerator().getBlock((ServerWorld) world, x, height - 1, z))) { - height--; + public int getHeight(int x, int z, Heightmap.Type heightmap, HeightLimitView height) { + int y = height.getTopY(); + while(y >= getMinimumY() && !heightmap.getBlockPredicate().test( + (BlockState) delegate.getBlock(FabricAdapter.adapt(height, seed), x, y - 1, z))) { + y--; } - return height; + return y; } @Override - public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView view) { - BlockState[] array = new BlockState[view.getHeight()]; - for(int y = view.getTopY() - 1; y >= view.getBottomY(); y--) { - array[y - view.getBottomY()] = (BlockState) ((ServerWorld) world).getGenerator().getBlock((ServerWorld) world, x, y, z); + public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView height) { + BlockState[] array = new BlockState[height.getHeight()]; + for(int y = height.getTopY() - 1; y >= height.getBottomY(); y--) { + array[y - height.getBottomY()] = (BlockState) delegate.getBlock(FabricAdapter.adapt(height, seed), x, y, z); } - return new VerticalBlockSample(view.getBottomY(), array); + return new VerticalBlockSample(height.getBottomY(), array); } public ConfigPack getPack() { @@ -239,10 +247,6 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C } - public void setWorld(net.minecraft.server.world.ServerWorld world) { - this.world = world; - } - @Override public ChunkGenerator getHandle() { return delegate; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java index 9ee749260..3a7395357 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java @@ -29,6 +29,10 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.fabric.FabricEntryPoint; import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; + +import java.util.function.Supplier; + @Environment(EnvType.CLIENT) public class TerraGeneratorType extends GeneratorType { @@ -41,6 +45,8 @@ public class TerraGeneratorType extends GeneratorType { @Override protected ChunkGenerator getChunkGenerator(DynamicRegistryManager manager, long seed) { - return new FabricChunkGeneratorWrapper(new TerraBiomeSource(manager.get(Registry.BIOME_KEY), seed, pack), seed, pack); + Registry chunkGeneratorSettingsRegistry = manager.get(Registry.CHUNK_GENERATOR_SETTINGS_KEY); + Supplier settingsSupplier = () -> chunkGeneratorSettingsRegistry.getOrThrow(ChunkGeneratorSettings.OVERWORLD); + return new FabricChunkGeneratorWrapper(new TerraBiomeSource(manager.get(Registry.BIOME_KEY), seed, pack), seed, pack, settingsSupplier); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java index efcc46ba7..98a81b125 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ServerWorldMixin.java @@ -43,7 +43,7 @@ import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; @Mixin(ServerWorld.class) public abstract class ServerWorldMixin { - private static final Logger logger = LoggerFactory.getLogger(ServerWorldMixin.class); + private static final Logger logger = LoggerFactory.getLogger(ServerWorld.class); @Inject(method = "", at = @At("RETURN")) public void injectConstructor(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, @@ -51,7 +51,6 @@ public abstract class ServerWorldMixin { WorldGenerationProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo ci) { if(chunkGenerator instanceof FabricChunkGeneratorWrapper) { - ((FabricChunkGeneratorWrapper) chunkGenerator).setWorld((ServerWorld) (Object) this); FabricEntryPoint.getPlatform().addWorld((ServerWorld) (Object) this); logger.info("Registered world {}", this); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java index 8a3452301..57fe9e3b8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java @@ -25,6 +25,7 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.dimension.DimensionOptions; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.GeneratorOptions; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -32,6 +33,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Properties; import java.util.Random; +import java.util.function.Supplier; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.fabric.FabricEntryPoint; @@ -57,16 +59,16 @@ public abstract class GeneratorOptionsMixin { String prop = properties.get("level-type").toString().trim(); if(prop.startsWith("Terra")) { - String seed = (String) MoreObjects.firstNonNull(properties.get("level-seed"), ""); - long l = new Random().nextLong(); - if(!seed.isEmpty()) { + String seedProperty = (String) properties.get("level-seed"); + long seed = new Random().nextLong(); + if(seedProperty != null) { try { - long m = Long.parseLong(seed); + long m = Long.parseLong(seedProperty); if(m != 0L) { - l = m; + seed = m; } } catch(NumberFormatException exception) { - l = seed.hashCode(); + seed = seedProperty.hashCode(); } } @@ -74,23 +76,30 @@ public abstract class GeneratorOptionsMixin { boolean generateStructures = generate_structures == null || Boolean.parseBoolean(generate_structures); Registry dimensionTypes = registryManager.get(Registry.DIMENSION_TYPE_KEY); Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); - SimpleRegistry dimensionOptions = DimensionType.createDefaultDimensionOptions(registryManager, - l, false); + SimpleRegistry dimensionOptions = DimensionType.createDefaultDimensionOptions(registryManager, seed, false); + + Registry chunkGeneratorSettingsRegistry = registryManager.get(Registry.CHUNK_GENERATOR_SETTINGS_KEY); + Supplier + settingsSupplier = () -> chunkGeneratorSettingsRegistry.getOrThrow(ChunkGeneratorSettings.OVERWORLD); prop = prop.substring(prop.indexOf(":") + 1); - + String finalProp = prop; ConfigPack config = main.getConfigRegistry().get(prop).orElseThrow(() -> new IllegalArgumentException( "No such pack " + finalProp)); - cir.setReturnValue(new GeneratorOptions(l, generateStructures, false, - GeneratorOptions.getRegistryWithReplacedOverworldGenerator(dimensionTypes, - dimensionOptions, - new FabricChunkGeneratorWrapper( - new TerraBiomeSource( - biomeRegistry, - l, config), - l, config)))); + cir.setReturnValue( + new GeneratorOptions(seed, + generateStructures, + false, + GeneratorOptions + .getRegistryWithReplacedOverworldGenerator( + dimensionTypes, + dimensionOptions, + new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, config), + seed, + config, + settingsSupplier)))); } } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java index 6f732ff16..51b9e95c7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java @@ -17,6 +17,8 @@ package com.dfsek.terra.fabric.util; +import com.dfsek.terra.api.world.info.WorldProperties; + import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.WallShape; import net.minecraft.block.enums.WireConnection; @@ -30,6 +32,8 @@ import com.dfsek.terra.api.block.state.properties.enums.RedstoneConnection; import com.dfsek.terra.api.block.state.properties.enums.WallHeight; import com.dfsek.terra.api.util.vector.Vector3; +import net.minecraft.world.HeightLimitView; + public final class FabricAdapter { public static BlockPos adapt(Vector3 v) { @@ -51,6 +55,30 @@ public final class FabricAdapter { }; } + public static WorldProperties adapt(HeightLimitView height, long seed) { + return new WorldProperties() { + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return height.getTopY(); + } + + @Override + public int getMinHeight() { + return height.getBottomY(); + } + + @Override + public Object getHandle() { + return height; + } + }; + } + public static com.dfsek.terra.api.block.state.properties.enums.Direction adapt(Direction direction) { return switch(direction) { case SOUTH -> com.dfsek.terra.api.block.state.properties.enums.Direction.SOUTH; diff --git a/platforms/region/build.gradle.kts.old b/platforms/region/build.gradle.kts.old deleted file mode 100644 index 7dfe20204..000000000 --- a/platforms/region/build.gradle.kts.old +++ /dev/null @@ -1,21 +0,0 @@ -import com.dfsek.terra.configureCommon -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - -configureCommon() - - -repositories { - mavenCentral() - maven { url = uri("https://jitpack.io/") } -} - -dependencies { - "shadedApi"(project(":common:implementation")) - "shadedImplementation"("com.github.Querz:NBT:5.2") // Standalone NBT API - "shadedImplementation"("org.yaml:snakeyaml:1.27") - "shadedImplementation"("com.googlecode.json-simple:json-simple:1.1.1") -} - -tasks.named("shadowJar") { - relocate("net.querz", "com.dfsek.terra.libs.nbt") -} \ No newline at end of file diff --git a/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java b/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java deleted file mode 100644 index ae5103cb6..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.dfsek.terra; - -import com.dfsek.terra.api.util.MathUtil; - -import net.querz.mca.MCAUtil; - - -public final class DirectUtils { - - /** - * Compute long region ID from chunk coords - * - * @param x X - * @param z Z - * - * @return Region IS - */ - public static long regionID(int x, int z) { - return MathUtil.squash(MCAUtil.chunkToRegion(x), MCAUtil.chunkToRegion(z)); - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java b/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java deleted file mode 100644 index 47aa3ffa7..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dfsek.terra; - -import com.dfsek.terra.region.Generator; - -import java.io.IOException; -import java.util.concurrent.ThreadLocalRandom; - - -public class RegionGenerator { - public static void main(String[] args) throws IOException { - long seed; - if(args.length == 1) seed = Long.parseLong(args[0]); - else seed = ThreadLocalRandom.current().nextLong(); - - StandalonePlugin plugin = new StandalonePlugin(); - Generator generator = new Generator(seed, plugin); - - generator.generate(); - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java deleted file mode 100644 index 55908641a..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.dfsek.terra; - -import com.dfsek.tectonic.api.TypeRegistry; - -import com.dfsek.terra.api.TerraPlugin; -import com.dfsek.terra.api.addon.TerraAddon; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.config.PluginConfig; -import com.dfsek.terra.api.event.EventManager; -import com.dfsek.terra.api.handle.ItemHandle; -import com.dfsek.terra.api.handle.WorldHandle; -import com.dfsek.terra.api.lang.Language; -import com.dfsek.terra.api.profiler.Profiler; -import com.dfsek.terra.api.registry.registry.CheckedRegistry; -import com.dfsek.terra.api.registry.registry.Registry; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.config.GenericLoaders; -import com.dfsek.terra.config.PluginConfigImpl; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.config.lang.LanguageImpl; -import com.dfsek.terra.event.EventManagerImpl; -import com.dfsek.terra.platform.RawBiome; -import com.dfsek.terra.platform.RawWorldHandle; -import com.dfsek.terra.profiler.ProfilerImpl; -import com.dfsek.terra.registry.CheckedRegistryImpl; -import com.dfsek.terra.registry.LockedRegistryImpl; -import com.dfsek.terra.registry.master.AddonRegistry; -import com.dfsek.terra.registry.master.ConfigRegistry; -import com.dfsek.terra.util.logging.DebugLogger; -import com.dfsek.terra.util.logging.JavaLogger; - -import java.io.File; -import java.io.IOException; -import java.util.logging.Logger; - - -public class StandalonePlugin implements TerraPlugin { - private final ConfigRegistry registry = new ConfigRegistry(); - private final AddonRegistry addonRegistry = new AddonRegistry(this); - - private final Registry addonLockedRegistry = new LockedRegistryImpl<>(addonRegistry); - - private final PluginConfig config = new PluginConfigImpl(); - private final RawWorldHandle worldHandle = new RawWorldHandle(); - private final EventManager eventManager = new EventManagerImpl(this); - - private final Profiler profiler = new ProfilerImpl(); - - @Override - public WorldHandle getWorldHandle() { - return worldHandle; - } - - @Override - public com.dfsek.terra.api.Logger logger() { - return new JavaLogger(Logger.getLogger("Terra")); - } - - @Override - public PluginConfig getTerraConfig() { - return config; - } - - @Override - public File getDataFolder() { - return new File("."); - } - - @Override - public Language getLanguage() { - try { - return new LanguageImpl(new File(getDataFolder(), "lang/en_us.yml")); - } catch(IOException e) { - throw new IllegalArgumentException(); - } - } - - @Override - public CheckedRegistry getConfigRegistry() { - return new CheckedRegistryImpl<>(registry); - } - - @Override - public Registry getAddons() { - return addonLockedRegistry; - } - - @Override - public boolean reload() { - throw new UnsupportedOperationException(); - } - - @Override - public ItemHandle getItemHandle() { - return null; - } - - @Override - public void saveDefaultConfig() { - - } - - @Override - public String platformName() { - return "Standalone"; - } - - @Override - public DebugLogger getDebugLogger() { - Logger logger = Logger.getLogger("Terra"); - return new DebugLogger(new com.dfsek.terra.api.Logger() { - @Override - public void info(String message) { - logger.info(message); - } - - @Override - public void warning(String message) { - logger.warning(message); - } - - @Override - public void severe(String message) { - logger.severe(message); - } - }); - } - - @Override - public void register(TypeRegistry registry) { - registry - .registerLoader(BlockState.class, (t, o, l) -> worldHandle.createBlockData((String) o)) - .registerLoader(Biome.class, (t, o, l) -> new RawBiome(o.toString())); - new GenericLoaders(this).register(registry); - } - - public void load() { - LangUtil.load("en_us", this); - registry.loadAll(this); - config.load(this); - } - - @Override - public EventManager getEventManager() { - return eventManager; - } - - @Override - public Profiler getProfiler() { - return profiler; - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlockEntity.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlockEntity.java deleted file mode 100644 index 215e5c0b6..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlockEntity.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dfsek.terra.platform; - -import com.dfsek.terra.api.block.entity.BlockEntity; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.vector.Vector3; - - -public class DirectBlockEntity implements BlockEntity { - @Override - public Vector3 getPosition() { - return null; - } - - @Override - public int getX() { - return 0; - } - - @Override - public int getY() { - return 0; - } - - @Override - public int getZ() { - return 0; - } - - @Override - public BlockState getBlockData() { - return null; - } - - @Override - public boolean update(boolean applyPhysics) { - return false; - } - - @Override - public Object getHandle() { - return null; - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java deleted file mode 100644 index b5734d5df..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.dfsek.terra.platform; - -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.world.World; -import com.dfsek.terra.api.world.generator.ChunkData; - -import net.querz.mca.Chunk; -import net.querz.nbt.tag.CompoundTag; -import org.jetbrains.annotations.NotNull; - - -public class DirectChunkData implements ChunkData, com.dfsek.terra.api.world.Chunk { - private final Chunk delegate; - private final DirectWorld world; - private final int x; - private final int z; - - public DirectChunkData(Chunk delegate, DirectWorld world, int x, int z) { - this.delegate = delegate; - this.world = world; - this.x = x; - this.z = z; - } - - @Override - public Object getHandle() { - return delegate; - } - - @Override - public int getMaxHeight() { - return 255; - } - - @Override - public void setBlock(int x, int y, int z, @NotNull BlockState blockState) { - delegate.setBlockStateAt(x, y, z, ((State) blockState).getHandle(), false); - } - - @Override - public @NotNull - BlockState getBlock(int x, int y, int z) { - CompoundTag tag = delegate.getBlockStateAt(x, y, z); - if(tag == null) return new State("minecraft:air"); - return new State(tag.getString("Name")); - } - - @Override - public void setBlock(int x, int y, int z, BlockState data, boolean physics) { - setBlock(x, y, z, data); - } - - @Override - public int getX() { - return x; - } - - @Override - public int getZ() { - return z; - } - - @Override - public World getWorld() { - return world; - } - -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java deleted file mode 100644 index 932874e02..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.dfsek.terra.platform; - -import com.dfsek.terra.DirectUtils; -import com.dfsek.terra.api.block.entity.BlockEntity; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.entity.Entity; -import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.vector.Vector3; -import com.dfsek.terra.api.world.Chunk; -import com.dfsek.terra.api.world.World; - -import net.jafama.FastMath; -import net.querz.mca.MCAFile; -import net.querz.mca.MCAUtil; -import net.querz.nbt.tag.CompoundTag; - -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - - -public class DirectWorld implements World { - private final long seed; - private final GenWrapper generator; - private final Map files = Collections.synchronizedMap(new HashMap<>()); - - public DirectWorld(long seed) { - this.seed = seed; - this.generator = generator; - } - - @Override - public long getSeed() { - return seed; - } - - @Override - public int getMaxHeight() { - return 255; - } - - @Override - public Chunk getChunkAt(int x, int z) { - MCAFile file = compute(x, z); - net.querz.mca.Chunk chunk = file.getChunk(x, z); - if(chunk == null) { - chunk = net.querz.mca.Chunk.newChunk(); - file.setChunk(x, z, chunk); - } - return new DirectChunkData(chunk, this, x, z); - } - - @Override - public BlockState getBlockData(int x, int y, int z) { - return null; - } - - @Override - public void setBlockData(int x, int y, int z, BlockState data, boolean physics) { - - } - - @Override - public BlockEntity getBlockState(int x, int y, int z) { - return null; - } - - @Override - public Entity spawnEntity(Vector3 location, EntityType entityType) { - return null; - } - - @Override - public int getMinHeight() { - return 0; - } - - @Override - public Object getHandle() { - return generator; - } - - public MCAFile compute(int x, int z) { - synchronized(files) { - return files.computeIfAbsent(DirectUtils.regionID(x, z), k -> { - File test = new File("region", MCAUtil.createNameFromChunkLocation(x, z)); - if(test.exists()) { - try { - System.out.println("Re-loading " + MCAUtil.createNameFromChunkLocation(x, z)); - return MCAUtil.read(test); - } catch(IOException e) { - e.printStackTrace(); - } - } - return new MCAFile(MCAUtil.chunkToRegion(x), MCAUtil.chunkToRegion(z)); - }); - } - } - - public CompoundTag getData(int x, int y, int z) { - return compute(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)).getBlockStateAt(x, y, z); - } - - public Map getFiles() { - return files; - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/RawBiome.java b/platforms/region/src/main/java/com/dfsek/terra/platform/RawBiome.java deleted file mode 100644 index 2a370ba55..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/RawBiome.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.platform; - -import com.dfsek.terra.api.world.biome.Biome; - - -public class RawBiome implements Biome { - private final String id; - - public RawBiome(String id) { - this.id = id; - } - - @Override - public Object getHandle() { - return id; - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java b/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java deleted file mode 100644 index 66d15d5d2..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.dfsek.terra.platform; - -import com.dfsek.terra.api.util.collection.MaterialSet; -import com.dfsek.terra.api.vector.Vector3; -import com.dfsek.terra.api.world.Tree; -import com.dfsek.terra.api.world.World; - -import java.util.Random; - - -public class RawTree implements Tree { // TODO: implement - @Override - public boolean plant(Vector3 l, World world, Random r) { - return false; - } - - @Override - public MaterialSet getSpawnable() { - return MaterialSet.empty(); - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/RawWorldHandle.java b/platforms/region/src/main/java/com/dfsek/terra/platform/RawWorldHandle.java deleted file mode 100644 index 5df5225c3..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/RawWorldHandle.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dfsek.terra.platform; - -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.entity.EntityType; -import com.dfsek.terra.api.handle.WorldHandle; - - -public class RawWorldHandle implements WorldHandle { - - @Override - public BlockState createBlockData(String data) { - return new State(data); - } - - @Override - public BlockState air() { - return null; - } - - @Override - public EntityType getEntity(String id) { - return null; - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/State.java b/platforms/region/src/main/java/com/dfsek/terra/platform/State.java deleted file mode 100644 index 45dfce0b9..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/State.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.dfsek.terra.platform; - -import com.dfsek.terra.api.block.BlockType; -import com.dfsek.terra.api.block.state.BlockState; -import com.dfsek.terra.api.block.state.properties.Property; - -import net.querz.nbt.tag.CompoundTag; - - -public class State implements BlockState, BlockType { - private final CompoundTag data; - private final String noProp; - - public State(String data) { - this.data = new CompoundTag(); - if(data.contains("[")) { - noProp = data.substring(0, data.indexOf('[')); // Strip properties - String properties = data.substring(data.indexOf('[') + 1, data.indexOf(']')); - String[] props = properties.split(","); - CompoundTag pTag = new CompoundTag(); - for(String property : props) { - String name = property.substring(0, property.indexOf('=')); - String val = property.substring(property.indexOf('=') + 1); - - pTag.putString(name, val); - } - this.data.put("Properties", pTag); - } else noProp = data; - this.data.putString("Name", noProp); - } - - public State(CompoundTag tag) { - if(tag == null) { - this.data = new CompoundTag(); - data.putString("Name", "minecraft:air"); - } else { - this.data = tag; - } - noProp = data.getString("Name"); - } - - - @Override - public BlockType getBlockType() { - return this; - } - - @Override - public boolean matches(BlockState other) { - return ((State) other).noProp.equals(noProp); - } - - @Override - public boolean isAir() { - return noProp.equals("minecraft:air"); - } - - @Override - public boolean isStructureVoid() { - return false; - } - - @Override - public boolean has(Property property) { - return false; - } - - @Override - public T get(Property property) { - return null; - } - - @Override - public BlockState set(Property property, T value) { - return null; - } - - - @Override - public BlockState clone() { - try { - return (BlockState) super.clone(); - } catch(CloneNotSupportedException e) { - throw new Error(e); - } - } - - @Override - public String getAsString() { - return noProp; - } - - @Override - public CompoundTag getHandle() { - return data; - } - - @Override - public int hashCode() { - return noProp.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof State)) return false; - return ((State) obj).noProp.equals(noProp); - } - - @Override - public BlockState getDefaultData() { - return this; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - public boolean isWater() { - return false; - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java deleted file mode 100644 index c871f0d1e..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.dfsek.terra.region; - -import com.dfsek.terra.StandalonePlugin; -import com.dfsek.terra.api.world.generator.TerraChunkGenerator; -import com.dfsek.terra.platform.DirectChunkData; -import com.dfsek.terra.platform.DirectWorld; - -import net.querz.mca.MCAFile; -import net.querz.mca.MCAUtil; - -import java.io.File; -import java.io.IOException; -import java.util.Map; - - -public class Generator { - private final long seed; - TerraChunkGenerator generator; - - public Generator(long seed, StandalonePlugin plugin) { - plugin.load(); - //generator = new DefaultChunkGenerator3D(plugin.getConfigRegistry().get("DEFAULT"), plugin); - this.seed = seed; - } - - public void generate() throws IOException { - - int rad = 64; - System.out.println("Total mem: " + Runtime.getRuntime().maxMemory() / 1024 / 1024 / 1024 + "GB"); - - - DirectWorld world = new DirectWorld(seed, null); - - long l = System.nanoTime(); - int count = 0; - - for(int cx = -rad; cx <= rad; cx++) { - for(int cz = -rad; cz <= rad; cz++) { - DirectChunkData chunkData = (DirectChunkData) world.getChunkAt(cx, cz); - generator.generateChunkData(world, null, cx, cz, chunkData); - - count++; - - if(count % 200 == 0) { - long n = System.nanoTime(); - - System.out.println("Generated " + count + " chunks. " + 200 / ((double) (n - l) / 1000000) * 1000 + "cps."); - - l = System.nanoTime(); - - } - } - } - - - System.out.println("Saving..."); - - for(Map.Entry entry : world.getFiles().entrySet()) { - if(entry.getValue() == null) continue; - entry.getValue().cleanupPalettesAndBlockStates(); - int x = (int) (entry.getKey() >> 32); - int z = (int) (long) entry.getKey(); - File file = new File("region", MCAUtil.createNameFromRegionLocation(x, z)); - file.getParentFile().mkdirs(); - MCAUtil.write(entry.getValue(), file); - } - - System.out.println("Done in " + (System.nanoTime() - l) / 1000000000 + "s"); - } -}