diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java index b87d873df..5a7efd66e 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java +++ b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java @@ -32,7 +32,10 @@ public class Transformer { } } StringBuilder exBuilder = new StringBuilder("Could not transform input; all attempts failed: ").append(from.toString()).append("\n"); - for(Exception exception : exceptions) exBuilder.append(exception.getMessage()).append("\n"); + for(Exception exception : exceptions) { + exBuilder.append(exception.getMessage()).append("\n"); + exception.printStackTrace(); + } throw new AttemptsFailedException(exBuilder.toString()); } 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 b116b2cc7..3e95b66a9 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,6 +10,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.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.fabric.inventory.FabricItemHandle; @@ -29,6 +31,10 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; 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.Feature; +import net.minecraft.world.gen.feature.HugeMushroomFeature; +import net.minecraft.world.gen.feature.TreeFeature; import org.apache.commons.io.FileUtils; import java.io.File; @@ -150,6 +156,27 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void onInitialize() { instance = this; + + Map> treeFeatureMap = new HashMap<>(); + BuiltinRegistries.CONFIGURED_FEATURE.stream().filter(feature -> + feature.feature instanceof TreeFeature + || feature.feature instanceof HugeMushroomFeature).forEach(tree -> System.out.println(BuiltinRegistries.CONFIGURED_FEATURE.getId(tree))); + + Transformer> treeTransformer = new Transformer.Builder>() + .addTransform(id -> BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse(id))) + .addTransform(new MapTransform>() + .add("BROWN_MUSHROOM", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_brown_mushroom"))) + .add("RED_MUSHROOM", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_red_mushroom"))) + .add("JUNGLE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:mega_jungle_tree"))) + .add("JUNGLE_COCOA", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree_no_vine"))) + .add("LARGE_OAK", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:fancy_oak"))) + .add("LARGE_SPRUCE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:pine"))) + .add("SMALL_JUNGLE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree"))) + .add("SWAMP_OAK", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:oak"))) + .add("TALL_BIRCH", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:birch")))) + .addTransform(id -> BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:" + id.toLowerCase()))).build(); + ((FabricWorldHandle) worldHandle).setTreeTransformer(treeTransformer); + config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); saveDefaultConfig(); plugin.load(this); @@ -157,6 +184,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { logger.info("Initializing Terra..."); registry.loadAll(this); + /* registry.forEach(config -> { String pack = config.getTemplate().getID().toLowerCase(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java new file mode 100644 index 000000000..ff870c3c3 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import com.dfsek.terra.util.MaterialSet; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.ConfiguredFeature; + +import java.util.Random; +import java.util.Set; + +public class FabricTree implements Tree { + private final ConfiguredFeature delegate; + + public FabricTree(ConfiguredFeature delegate) { + this.delegate = delegate; + } + + @Override + public boolean plant(Location l, Random r) { + FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld()); + ChunkGenerator generatorWrapper = ((FabricChunkGenerator) fabricWorldAccess.getGenerator()).getHandle(); + return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); + } + + @Override + public Set getSpawnable() { + return MaterialSet.get(TerraFabricPlugin.getInstance().getWorldHandle().createMaterialData("minecraft:grass_block"), + TerraFabricPlugin.getInstance().getWorldHandle().createMaterialData("minecraft:podzol")); + } + + @Override + public ConfiguredFeature getHandle() { + return delegate; + } +} 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 fd36927df..781210139 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,6 +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.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; @@ -16,10 +17,17 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.BlockState; import net.minecraft.command.argument.BlockArgumentParser; import net.minecraft.state.property.Properties; +import net.minecraft.world.gen.feature.ConfiguredFeature; import java.util.Arrays; public class FabricWorldHandle implements WorldHandle { + private Transformer> treeTransformer; + + public void setTreeTransformer(Transformer> treeTransformer) { + this.treeTransformer = treeTransformer; + } + @Override public void setBlockData(Block block, BlockData data, boolean physics) { block.setBlockData(data, physics); @@ -59,6 +67,6 @@ public class FabricWorldHandle implements WorldHandle { @Override public Tree getTree(String id) { - return null; + return new FabricTree(treeTransformer.translate(id)); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 536dfc3ad..c68831890 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -13,6 +13,7 @@ import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.OrePopulator; +import com.dfsek.terra.population.TreePopulator; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; @@ -50,6 +51,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance()); private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance()); private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance()); + private final TreePopulator treePopulator = new TreePopulator(TerraFabricPlugin.getInstance()); public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { super(biomeSource, new StructuresConfig(false));