diff --git a/common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java b/common/src/main/java/com/dfsek/terra/api/transform/AttemptsFailedException.java similarity index 90% rename from common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java rename to common/src/main/java/com/dfsek/terra/api/transform/AttemptsFailedException.java index b5f23a6f2..256ad5e57 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/AttemptsFailedException.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; public class AttemptsFailedException extends RuntimeException { public AttemptsFailedException() { diff --git a/common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java b/common/src/main/java/com/dfsek/terra/api/transform/MapTransform.java similarity index 94% rename from common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java rename to common/src/main/java/com/dfsek/terra/api/transform/MapTransform.java index 03edbbabb..efd409194 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/MapTransform.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java b/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java new file mode 100644 index 000000000..b94b7be39 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.transform; + +public class NotNullValidator implements Validator { + @Override + public boolean validate(T value) { + return !(value == null); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transform.java b/common/src/main/java/com/dfsek/terra/api/transform/Transform.java similarity index 81% rename from common/src/main/java/com/dfsek/terra/api/translator/Transform.java rename to common/src/main/java/com/dfsek/terra/api/transform/Transform.java index c186c1e8e..2732b1da7 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/Transform.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/Transform.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; /** * Interface to transform data from one type to another. diff --git a/common/src/main/java/com/dfsek/terra/api/translator/TransformException.java b/common/src/main/java/com/dfsek/terra/api/transform/TransformException.java similarity index 90% rename from common/src/main/java/com/dfsek/terra/api/translator/TransformException.java rename to common/src/main/java/com/dfsek/terra/api/transform/TransformException.java index 419dc4c23..9643d9673 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/TransformException.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/TransformException.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; public class TransformException extends Exception { public TransformException() { diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java b/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java similarity index 50% rename from common/src/main/java/com/dfsek/terra/api/translator/Transformer.java rename to common/src/main/java/com/dfsek/terra/api/transform/Transformer.java index 5a7efd66e..ed66fda10 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java @@ -1,7 +1,10 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * Class to translate types from one style/platform to another. @@ -10,10 +13,10 @@ import java.util.List; * @param Data type to transform to. */ public class Transformer { - private final List> transformer; + private final LinkedHashMap, List>> transformers; - private Transformer(List> transformer) { - this.transformer = transformer; + private Transformer(LinkedHashMap, List>> transformer) { + this.transformers = transformer; } /** @@ -24,9 +27,15 @@ public class Transformer { */ public T translate(F from) { List exceptions = new ArrayList<>(); - for(Transform transform : transformer) { + for(Map.Entry, List>> transform : transformers.entrySet()) { try { - return transform.transform(from); + T result = transform.getKey().transform(from); + for(Validator validator : transform.getValue()) { + if(!validator.validate(result)) { + throw new TransformException("Failed to validate result: " + result.toString()); + } + } + return result; } catch(Exception exception) { exceptions.add(exception); } @@ -45,15 +54,16 @@ public class Transformer { * @param * @param */ - public static class Builder { - private final List> transforms = new ArrayList<>(); + public static final class Builder { + private final LinkedHashMap, List>> transforms = new LinkedHashMap<>(); - public Builder addTransform(Transform transform) { - transforms.add(transform); + @SafeVarargs + public final Builder addTransform(Transform transform, Validator... validators) { + transforms.put(transform, Arrays.asList(validators)); return this; } - public Transformer build() { + public final Transformer build() { return new Transformer<>(transforms); } } diff --git a/common/src/main/java/com/dfsek/terra/api/transform/Validator.java b/common/src/main/java/com/dfsek/terra/api/transform/Validator.java new file mode 100644 index 000000000..c9ba5db9e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/transform/Validator.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.transform; + + +public interface Validator { + boolean validate(T value) throws TransformException; +} diff --git a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java index c2d9f9e26..19ba94497 100644 --- a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -35,7 +35,7 @@ public class OrePopulator implements TerraBlockPopulator { Random random = new FastRandom(MathUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed())); int originX = ((chunk.getX() + cx) << 4); int originZ = ((chunk.getZ() + cz) << 4); - Biome b = main.getWorld(world).getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE); + Biome b = tw.getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE); BiomeTemplate config = ((UserDefinedBiome) b).getConfig(); int finalCx = cx; int finalCz = cz; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 02f4fe45f..64d9943d9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -6,7 +6,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.translator.Transformer; +import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 09105d372..85c8fea12 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -12,8 +12,8 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.translator.MapTransform; -import com.dfsek.terra.api.translator.Transformer; +import com.dfsek.terra.api.transform.MapTransform; +import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.command.command.TerraCommand; import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 0613ffd43..f22fd85eb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -10,8 +10,10 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.translator.MapTransform; -import com.dfsek.terra.api.translator.Transformer; +import com.dfsek.terra.api.transform.MapTransform; +import com.dfsek.terra.api.transform.NotNullValidator; +import com.dfsek.terra.api.transform.Transformer; +import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.fabric.inventory.FabricItemHandle; @@ -29,9 +31,13 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.DefaultBiomeFeatures; import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.HugeMushroomFeature; import net.minecraft.world.gen.feature.TreeFeature; @@ -139,19 +145,42 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } } + Transformer biomeFixer = new Transformer.Builder() + .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), new NotNullValidator<>()) + .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); + @Override public void register(TypeRegistry registry) { genericLoaders.register(registry); registry .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) .registerLoader(MaterialData.class, (t, o, l) -> worldHandle.createMaterialData((String) o)) - .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> { - String id = (String) o; - if(!id.contains(":")) id = "minecraft:" + id.toLowerCase(); - Identifier identifier = new Identifier(id); - Biome biome = BuiltinRegistries.BIOME.get(identifier); - return new FabricBiome(biome); - }); + .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> new FabricBiome(biomeFixer.translate((String) o))); + } + + private Biome createBiome(UserDefinedBiome biome) { + SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); + DefaultBiomeFeatures.addFarmAnimals(spawnSettings); + DefaultBiomeFeatures.addMonsters(spawnSettings, 95, 5, 100); + + GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); + + return (new Biome.Builder()) + .precipitation(Biome.Precipitation.RAIN) + .category(Biome.Category.NONE) + .depth(0.125F) + .scale(0.05F) + .temperature(0.8F) + .downfall(0.4F) + .effects((new BiomeEffects.Builder()) + .waterColor(0x3f76e4) + .waterFogColor(0x050533) + .fogColor(0xc0d8ff) + .skyColor(0x77adff) + .build()) + .spawnSettings(spawnSettings.build()) + .generationSettings(generationSettings.build()) + .build(); } @SuppressWarnings("unchecked") diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java deleted file mode 100644 index 9f3cc5cf8..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.fabric.mixin; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.world.CreateWorldScreen; -import net.minecraft.client.gui.screen.world.MoreOptionsDialog; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(MoreOptionsDialog.class) -public class MoreOptionsDialogMixin { - - @Inject(at = @At("HEAD"), method = "method_28092(Lnet/minecraft/client/gui/screen/world/CreateWorldScreen;Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/font/TextRenderer;)V") - private void draw(final CreateWorldScreen parent, MinecraftClient client, TextRenderer textRenderer, CallbackInfo info) { - System.out.println("More options opened"); - } - - /*@Inject(at = @At("RETURN"), method = "setVisible(B)V") - private void setVisible(boolean visible, CallbackInfo info) { - System.out.println("redraw"); - } - */ -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 17af069fe..9a8873ffd 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.translator.Transformer; +import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java new file mode 100644 index 000000000..a28b4cf54 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.fabric.world.features; + +import com.mojang.serialization.Codec; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.Feature; + +import java.util.Random; + +public class FloraFeature extends Feature { + public FloraFeature(Codec codec) { + super(codec); + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + return false; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index 4e77be7aa..c5816ca25 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -8,7 +8,9 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.fabric.world.block.FabricBlock; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.WorldAccess; @@ -35,12 +37,12 @@ public class FabricWorldAccess implements World { @Override public ChunkGenerator getGenerator() { - return null; + return new FabricChunkGenerator(((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator()); } @Override public String getName() { - return delegate.toString(); + return ((ServerWorldAccess) delegate).toServerWorld().worldProperties.getLevelName(); } @Override diff --git a/platforms/fabric/src/main/resources/terra.accesswidener b/platforms/fabric/src/main/resources/terra.accesswidener index 0b39996bb..56b2a20c4 100644 --- a/platforms/fabric/src/main/resources/terra.accesswidener +++ b/platforms/fabric/src/main/resources/terra.accesswidener @@ -1,4 +1,5 @@ accessWidener v1 named extendable method net/minecraft/client/world/GeneratorType (Ljava/lang/String;)V -accessible field net/minecraft/server/world/ServerWorld Lnet/minecraft/world/level/ServerWorldProperties worldProperties \ No newline at end of file +accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; +mutable field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; \ No newline at end of file diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index be4d44a45..a6b050657 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,8 +5,7 @@ "compatibilityLevel": "JAVA_8", "mixins": [], "client": [ - "GeneratorTypeAccessor", - "MoreOptionsDialogMixin" + "GeneratorTypeAccessor" ], "server": [], "injectors": {