From afdb4fbfa20b889b1b23e398aa6c58a330f4a5f7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Jun 2021 01:37:28 -0700 Subject: [PATCH 01/11] late init biomes --- .../java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 8 ++++---- .../dfsek/terra/fabric/generation/TerraGeneratorType.java | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) 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 d93e8a169..0bfe69dbc 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 @@ -43,7 +43,6 @@ import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; -import com.dfsek.terra.fabric.util.FabricUtil; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -176,6 +175,10 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return LangUtil.getLanguage(); } + public FabricAddon getFabricAddon() { + return fabricAddon; + } + @Override public CheckedRegistry getConfigRegistry() { return checkedRegistry; @@ -240,9 +243,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public void packInit() { logger.info("Loading config packs..."); registry.loadAll(this); - - registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(fabricAddon, biome, pack)))); // Register all Terra biomes. - logger.info("Loaded packs."); } 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 6ae8dac89..ec89f02c3 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 @@ -1,7 +1,10 @@ package com.dfsek.terra.fabric.generation; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.util.FabricUtil; import net.minecraft.client.world.GeneratorType; +import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -17,6 +20,7 @@ public class TerraGeneratorType extends GeneratorType { @Override protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { + TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(TerraFabricPlugin.getInstance().getFabricAddon(), biome, pack)))); // Register all Terra biomes. return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); } } From c7cbf1163150b30966c2c17012c5d5c96ac11550 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Jun 2021 01:42:53 -0700 Subject: [PATCH 02/11] override ChunkGenerator#getEntitySpawnList --- .../FabricChunkGeneratorWrapper.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) 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 be602374f..72f0723cc 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 @@ -21,8 +21,10 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.jafama.FastMath; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.entity.SpawnGroup; import net.minecraft.server.world.ServerWorld; import net.minecraft.structure.StructureManager; +import net.minecraft.util.collection.Pool; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.registry.DynamicRegistryManager; @@ -32,6 +34,7 @@ import net.minecraft.world.HeightLimitView; import net.minecraft.world.Heightmap; import net.minecraft.world.SpawnHelper; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; @@ -204,6 +207,34 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener } } + public Pool getEntitySpawnList(Biome biome, StructureAccessor accessor, SpawnGroup group, BlockPos pos) { + if(accessor.getStructureAt(pos, true, StructureFeature.SWAMP_HUT).hasChildren()) { + if(group == SpawnGroup.MONSTER) { + return StructureFeature.SWAMP_HUT.getMonsterSpawns(); + } + + if(group == SpawnGroup.CREATURE) { + return StructureFeature.SWAMP_HUT.getCreatureSpawns(); + } + } + + if(group == SpawnGroup.MONSTER) { + if(accessor.getStructureAt(pos, false, StructureFeature.PILLAGER_OUTPOST).hasChildren()) { + return StructureFeature.PILLAGER_OUTPOST.getMonsterSpawns(); + } + + if(accessor.getStructureAt(pos, false, StructureFeature.MONUMENT).hasChildren()) { + return StructureFeature.MONUMENT.getMonsterSpawns(); + } + + if(accessor.getStructureAt(pos, true, StructureFeature.FORTRESS).hasChildren()) { + return StructureFeature.FORTRESS.getMonsterSpawns(); + } + } + + return group == SpawnGroup.UNDERGROUND_WATER_CREATURE && accessor.getStructureAt(pos, false, StructureFeature.MONUMENT).hasChildren() ? StructureFeature.MONUMENT.getUndergroundWaterCreatureSpawns() : super.getEntitySpawnList(biome, accessor, group, pos); + } + @Override public TerraChunkGenerator getHandle() { return delegate; From 01e47b0bab8e3dd1dc0ad3aedbbdb6becc29962f Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 27 May 2021 19:46:05 -0700 Subject: [PATCH 03/11] fix getHeight crash --- .../java/com/dfsek/terra/world/TerraWorld.java | 4 +--- .../generation/FabricChunkGeneratorWrapper.java | 17 ++++++----------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java index cc37116a2..a92f35b8c 100644 --- a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java @@ -6,10 +6,8 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; -import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.WorldConfig; @@ -70,7 +68,7 @@ public class TerraWorld { double noise = sampler.sample(fdX, y, fdZ); if(noise > 0) { int level = 0; - for(int yi = world.getMaxHeight(); yi > y; yi--) { + for(int yi = world.getMaxHeight() - 1; yi > y; yi--) { if(sampler.sample(fdX, yi, fdZ) > 0) level++; else level = 0; } 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 72f0723cc..2820adb72 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 @@ -10,15 +10,14 @@ import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.block.FabricBlockData; import com.dfsek.terra.fabric.mixin.StructureAccessorAccessor; import com.dfsek.terra.fabric.util.FabricAdapter; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; -import com.dfsek.terra.world.generation.math.samplers.Sampler; import com.dfsek.terra.world.population.items.TerraStructure; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.jafama.FastMath; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.SpawnGroup; @@ -164,14 +163,10 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public int getHeight(int x, int z, Heightmap.Type heightmap, HeightLimitView heightmapType) { TerraWorld world = TerraFabricPlugin.getInstance().getWorld(dimensionType); - Sampler sampler = world.getConfig().getSamplerCache().getChunk(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)); - int cx = FastMath.floorMod(x, 16); - int cz = FastMath.floorMod(z, 16); - int height = world.getWorld().getMaxHeight(); - - while(height >= 0 && sampler.sample(cx, height-1, cz) < 0) height--; - + while(height >= world.getWorld().getMinHeight() && !heightmap.getBlockPredicate().test(((FabricBlockData) world.getUngeneratedBlock(x, height - 1, z)).getHandle())) { + height--; + } return height; } @@ -179,8 +174,8 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView view) { TerraWorld world = TerraFabricPlugin.getInstance().getWorld(dimensionType); int height = getHeight(x, z, Heightmap.Type.WORLD_SURFACE, view); - BlockState[] array = new BlockState[256]; - for(int y = view.getBottomY()+view.getHeight(); y >= view.getBottomY(); y--) { + BlockState[] array = new BlockState[view.getHeight()]; + for(int y = view.getBottomY() + view.getHeight() - 1; y >= view.getBottomY(); y--) { if(y > height) { if(y > ((UserDefinedBiome) world.getBiomeProvider().getBiome(x, z)).getConfig().getSeaLevel()) { array[y] = Blocks.AIR.getDefaultState(); From 392ad207d97142da274018a3c2bdad5594021997 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Jun 2021 01:58:46 -0700 Subject: [PATCH 04/11] use getUngeneratedBlock in getColumnSample --- .../generation/FabricChunkGeneratorWrapper.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) 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 2820adb72..044c2c5c1 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 @@ -4,7 +4,6 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkData; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.util.FastRandom; -import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.generation.Chunkified; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.locate.AsyncStructureFinder; @@ -19,7 +18,6 @@ import com.dfsek.terra.world.population.items.TerraStructure; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.entity.SpawnGroup; import net.minecraft.server.world.ServerWorld; import net.minecraft.structure.StructureManager; @@ -173,20 +171,10 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public VerticalBlockSample getColumnSample(int x, int z, HeightLimitView view) { TerraWorld world = TerraFabricPlugin.getInstance().getWorld(dimensionType); - int height = getHeight(x, z, Heightmap.Type.WORLD_SURFACE, view); BlockState[] array = new BlockState[view.getHeight()]; for(int y = view.getBottomY() + view.getHeight() - 1; y >= view.getBottomY(); y--) { - if(y > height) { - if(y > ((UserDefinedBiome) world.getBiomeProvider().getBiome(x, z)).getConfig().getSeaLevel()) { - array[y] = Blocks.AIR.getDefaultState(); - } else { - array[y] = Blocks.WATER.getDefaultState(); - } - } else { - array[y] = Blocks.STONE.getDefaultState(); - } + array[y] = ((FabricBlockData) world.getUngeneratedBlock(x, y, z)).getHandle(); } - return new VerticalBlockSample(view.getBottomY(), array); } From 82dfe652e098993c51019369f03a087d33552c24 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Jun 2021 02:03:42 -0700 Subject: [PATCH 05/11] bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index c800414ff..7cce0b721 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "4", "0", true) +val versionObj = Version("5", "4", "1", true) allprojects { version = versionObj From 9ba544bf71de0831d0c5e3bd0517616a2d71f955 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 17 Jun 2021 00:07:06 -0700 Subject: [PATCH 06/11] dont hold static biomes --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 14 +++++++++--- .../fabric/generation/TerraGeneratorType.java | 11 +++++++++- .../dfsek/terra/fabric/util/FabricUtil.java | 14 +++++++----- .../dfsek/terra/fabric/util/ProtoBiome.java | 22 +++++++++++++++++++ 4 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoBiome.java 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 0bfe69dbc..9cfb726eb 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 @@ -43,6 +43,7 @@ import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; +import com.dfsek.terra.fabric.util.ProtoBiome; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -120,9 +121,16 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final PluginConfig config = new PluginConfig(); - private final Transformer biomeFixer = new Transformer.Builder() - .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), Validator.notNull()) - .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), Validator.notNull()).build(); + private final Transformer biomeFixer = new Transformer.Builder() + .addTransform(this::parseBiome, Validator.notNull()) + .addTransform(id -> parseBiome("minecraft:" + id.toLowerCase()), Validator.notNull()).build(); + + private ProtoBiome parseBiome(String id) { + Identifier identifier = Identifier.tryParse(id); + if(BuiltinRegistries.BIOME.get(identifier) == null) return null; // failure. + return new ProtoBiome(identifier); + } + private File dataFolder; private final CommandManager manager = new TerraCommandManager(this); 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 ec89f02c3..cfecda8a2 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 @@ -5,8 +5,10 @@ import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.util.FabricUtil; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.GeneratorOptions; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -18,9 +20,16 @@ public class TerraGeneratorType extends GeneratorType { this.pack = pack; } + @Override + public GeneratorOptions createDefaultOptions(DynamicRegistryManager.Impl registryManager, long seed, boolean generateStructures, boolean bonusChest) { + GeneratorOptions options = super.createDefaultOptions(registryManager, seed, generateStructures, bonusChest); + Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); + TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(TerraFabricPlugin.getInstance().getFabricAddon(), biome, pack, registryManager)))); // Register all Terra biomes. + return options; + } + @Override protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { - TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(TerraFabricPlugin.getInstance().getFabricAddon(), biome, pack)))); // Register all Terra biomes. return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index c761cade4..0f5edafcd 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -9,7 +9,8 @@ import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; @@ -37,11 +38,12 @@ public final class FabricUtil { * @param pack The ConfigPack this biome belongs to. * @return The Minecraft delegate biome. */ - public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack) { + public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager.Impl registryManager) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); - Biome vanilla = (Biome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); + Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); + Biome vanilla = ((ProtoBiome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0))).get(biomeRegistry); GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); @@ -63,8 +65,9 @@ public final class FabricUtil { TerraFabricPlugin.getInstance().getDebugLogger().info("Injecting Vanilla structures and features into Terra biome " + biome.getTemplate().getID()); + Registry> configuredStructureFeatureRegistry = registryManager.get(Registry.CONFIGURED_STRUCTURE_FEATURE_KEY); for(Supplier> structureFeature : vanilla.getGenerationSettings().getStructureFeatures()) { - Identifier key = BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getId(structureFeature.get()); + Identifier key = configuredStructureFeatureRegistry.getId(structureFeature.get()); if(!compatibilityOptions.getExcludedBiomeStructures().contains(key) && !postLoadCompatibilityOptions.getExcludedPerBiomeStructures().getOrDefault(biome, Collections.emptySet()).contains(key)) { generationSettings.structureFeature(structureFeature.get()); TerraFabricPlugin.getInstance().getDebugLogger().info("Injected structure " + key); @@ -72,9 +75,10 @@ public final class FabricUtil { } if(compatibilityOptions.doBiomeInjection()) { + Registry> configuredFeatureRegistry = registryManager.get(Registry.CONFIGURED_FEATURE_KEY); for(int step = 0; step < vanilla.getGenerationSettings().getFeatures().size(); step++) { for(Supplier> featureSupplier : vanilla.getGenerationSettings().getFeatures().get(step)) { - Identifier key = BuiltinRegistries.CONFIGURED_FEATURE.getId(featureSupplier.get()); + Identifier key = configuredFeatureRegistry.getId(featureSupplier.get()); if(!compatibilityOptions.getExcludedBiomeFeatures().contains(key) && !postLoadCompatibilityOptions.getExcludedPerBiomeFeatures().getOrDefault(biome, Collections.emptySet()).contains(key)) { generationSettings.feature(step, featureSupplier); TerraFabricPlugin.getInstance().getDebugLogger().info("Injected feature " + key + " at stage " + step); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoBiome.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoBiome.java new file mode 100644 index 000000000..a7ff41ecd --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoBiome.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.fabric.util; + +import com.dfsek.terra.api.platform.world.Biome; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +public class ProtoBiome implements Biome { + private final Identifier identifier; + + public ProtoBiome(Identifier identifier) { + this.identifier = identifier; + } + + public net.minecraft.world.biome.Biome get(Registry registry) { + return registry.get(identifier); + } + + @Override + public Object getHandle() { + return identifier; + } +} From b948202ef281eec4dbd59b37e4c3a6821f49722a Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Jun 2021 09:07:56 -0700 Subject: [PATCH 07/11] cleanup FabricChunkGeneratorWrapper --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 1 - .../FabricChunkGeneratorWrapper.java | 47 ++++++++++++------- 2 files changed, 31 insertions(+), 17 deletions(-) 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 9cfb726eb..5e553a4a7 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 @@ -58,7 +58,6 @@ import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.WorldAccess; -import net.minecraft.world.biome.Biome; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.decorator.NopeDecoratorConfig; 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 044c2c5c1..cae1e2f90 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 @@ -50,24 +50,30 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; public class FabricChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper { + public static final Codec PACK_CODEC = RecordCodecBuilder.create( + config -> config.group( + Codec.STRING.fieldOf("pack") + .forGetter(pack -> pack.getTemplate().getID()) + ).apply(config, config.stable(TerraFabricPlugin.getInstance().getConfigRegistry()::get))); + + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + TerraBiomeSource.CODEC.fieldOf("biome_source") + .forGetter(generator -> generator.biomeSource), + Codec.LONG.fieldOf("seed").stable() + .forGetter(generator -> generator.seed), + PACK_CODEC.fieldOf("pack").stable() + .forGetter(generator -> generator.pack) + ).apply(instance, instance.stable(FabricChunkGeneratorWrapper::new)) + ); + private final long seed; private final DefaultChunkGenerator3D delegate; private final TerraBiomeSource biomeSource; - public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( - Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) - ).apply(config, config.stable(TerraFabricPlugin.getInstance().getConfigRegistry()::get)))); - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), - Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed), - PACK_CODEC.fieldOf("pack").stable().forGetter(generator -> generator.pack)) - .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); + private final ConfigPack pack; private DimensionType dimensionType; - public ConfigPack getPack() { - return pack; - } - public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { super(biomeSource, new StructuresConfig(false)); this.pack = configPack; @@ -90,9 +96,13 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener return new FabricChunkGeneratorWrapper((TerraBiomeSource) this.biomeSource.withSeed(seed), seed, pack); } + public ConfigPack getPack() { + return pack; + } + @Override public void buildSurface(ChunkRegion region, Chunk chunk) { - + // No-op } public void setDimensionType(DimensionType dimensionType) { @@ -124,13 +134,16 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public void carve(long seed, BiomeAccess access, Chunk chunk, GenerationStep.Carver carver) { - if(pack.getTemplate().vanillaCaves()) super.carve(seed, access, chunk, carver); + if(pack.getTemplate().vanillaCaves()) { + super.carve(seed, access, chunk, carver); + } } @Override public void setStructureStarts(DynamicRegistryManager dynamicRegistryManager, StructureAccessor structureAccessor, Chunk chunk, StructureManager structureManager, long worldSeed) { - if(pack.getTemplate().vanillaStructures()) + if(pack.getTemplate().vanillaStructures()) { super.setStructureStarts(dynamicRegistryManager, structureAccessor, chunk, structureManager, worldSeed); + } } @Override @@ -149,7 +162,9 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public boolean isStrongholdStartingChunk(ChunkPos chunkPos) { - if(pack.getTemplate().vanillaStructures()) return super.isStrongholdStartingChunk(chunkPos); + if(pack.getTemplate().vanillaStructures()) { + return super.isStrongholdStartingChunk(chunkPos); + } return false; } From b3e2685564819db55f1012d4059ac32fd0f23728 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Jun 2021 12:18:08 -0700 Subject: [PATCH 08/11] init biomes on server --- .../fabric/generation/TerraGeneratorType.java | 3 +++ .../fabric/mixin/GeneratorOptionsMixin.java | 26 +++++++++++++------ .../dfsek/terra/fabric/util/FabricUtil.java | 2 +- 3 files changed, 22 insertions(+), 9 deletions(-) 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 cfecda8a2..065d8e7c0 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 @@ -3,6 +3,8 @@ package com.dfsek.terra.fabric.generation; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.util.FabricUtil; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.Identifier; import net.minecraft.util.registry.DynamicRegistryManager; @@ -12,6 +14,7 @@ import net.minecraft.world.gen.GeneratorOptions; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +@Environment(EnvType.CLIENT) public class TerraGeneratorType extends GeneratorType { private final ConfigPack pack; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java index 1738ebe11..6b012002c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java @@ -4,7 +4,9 @@ import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.util.FabricUtil; import com.google.common.base.MoreObjects; +import net.minecraft.util.Identifier; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.SimpleRegistry; @@ -24,11 +26,13 @@ import java.util.Random; @Mixin(GeneratorOptions.class) public abstract class GeneratorOptionsMixin { @Inject(method = "fromProperties(Lnet/minecraft/util/registry/DynamicRegistryManager;Ljava/util/Properties;)Lnet/minecraft/world/gen/GeneratorOptions;", at = @At("HEAD"), cancellable = true) - private static void fromProperties(DynamicRegistryManager dynamicRegistryManager, Properties properties, CallbackInfoReturnable cir) { + private static void fromProperties(DynamicRegistryManager registryManager, Properties properties, CallbackInfoReturnable cir) { if(properties.get("level-type") == null) { return; } + TerraFabricPlugin main = TerraFabricPlugin.getInstance(); + String prop = properties.get("level-type").toString().trim(); if(prop.startsWith("Terra")) { String seed = (String) MoreObjects.firstNonNull(properties.get("level-seed"), ""); @@ -46,18 +50,24 @@ public abstract class GeneratorOptionsMixin { String generate_structures = (String) properties.get("generate-structures"); boolean generateStructures = generate_structures == null || Boolean.parseBoolean(generate_structures); - Registry dimensionTypes = dynamicRegistryManager.get(Registry.DIMENSION_TYPE_KEY); - Registry biomes = dynamicRegistryManager.get(Registry.BIOME_KEY); - Registry chunkGeneratorSettings = dynamicRegistryManager.get(Registry.CHUNK_GENERATOR_SETTINGS_KEY); - SimpleRegistry dimensionOptions = DimensionType.createDefaultDimensionOptions(dimensionTypes, biomes, chunkGeneratorSettings, l); + Registry dimensionTypes = registryManager.get(Registry.DIMENSION_TYPE_KEY); + Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); + Registry chunkGeneratorSettings = registryManager.get(Registry.CHUNK_GENERATOR_SETTINGS_KEY); + SimpleRegistry dimensionOptions = DimensionType.createDefaultDimensionOptions(dimensionTypes, biomeRegistry, chunkGeneratorSettings, l); prop = prop.substring(prop.indexOf(":") + 1); - ConfigPack pack = TerraFabricPlugin.getInstance().getConfigRegistry().get(prop); + ConfigPack config = main.getConfigRegistry().get(prop); - if(pack == null) throw new IllegalArgumentException("No such pack " + prop); + if(config == null) throw new IllegalArgumentException("No such pack " + prop); - cir.setReturnValue(new GeneratorOptions(l, generateStructures, false, GeneratorOptions.getRegistryWithReplacedOverworldGenerator(dimensionTypes, dimensionOptions, new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomes, l, pack), l, pack)))); + + main.logger().info("Registering biomes..."); + main.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(main.getFabricAddon(), biome, pack, registryManager)))); // Register all Terra biomes. + main.logger().info("Biomes registered."); + + + cir.setReturnValue(new GeneratorOptions(l, generateStructures, false, GeneratorOptions.getRegistryWithReplacedOverworldGenerator(dimensionTypes, dimensionOptions, new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, l, config), l, config)))); } } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index 0f5edafcd..97d0cd74a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -38,7 +38,7 @@ public final class FabricUtil { * @param pack The ConfigPack this biome belongs to. * @return The Minecraft delegate biome. */ - public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager.Impl registryManager) { + public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager registryManager) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); From d5dc37629e6fb05d27ddac30a1aedf0557783627 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Jun 2021 14:08:27 -0700 Subject: [PATCH 09/11] fabric lifecycle api --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 48 +++++++++++-------- .../fabric/event/BiomeRegistrationEvent.java | 19 ++++++++ .../fabric/event/GameInitializationEvent.java | 9 ++++ .../fabric/generation/TerraGeneratorType.java | 4 +- .../client}/MinecraftClientMixin.java | 5 +- .../fabric/mixin/lifecycle/package-info.java | 4 ++ .../server}/GeneratorOptionsMixin.java | 9 ++-- .../server}/ServerMainMixin.java | 5 +- .../dfsek/terra/fabric/util/FabricUtil.java | 5 +- .../src/main/resources/terra.mixins.json | 6 +-- 10 files changed, 76 insertions(+), 38 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/BiomeRegistrationEvent.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/GameInitializationEvent.java rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{init => lifecycle/client}/MinecraftClientMixin.java (87%) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{ => lifecycle/server}/GeneratorOptionsMixin.java (88%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{init => lifecycle/server}/ServerMainMixin.java (67%) 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 5e553a4a7..87235d6b2 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 @@ -38,11 +38,14 @@ import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; +import com.dfsek.terra.fabric.event.GameInitializationEvent; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; +import com.dfsek.terra.fabric.util.FabricUtil; import com.dfsek.terra.fabric.util.ProtoBiome; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; @@ -58,6 +61,7 @@ import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.WorldAccess; +import net.minecraft.world.biome.Biome; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.decorator.NopeDecoratorConfig; @@ -111,10 +115,10 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final DebugLogger debugLogger = new DebugLogger(logger); private final ItemHandle itemHandle = new FabricItemHandle(); private final WorldHandle worldHandle = new FabricWorldHandle(); - private final ConfigRegistry registry = new ConfigRegistry(); - private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); + private final ConfigRegistry configRegistry = new ConfigRegistry(); + private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(configRegistry); - private final FabricAddon fabricAddon = new FabricAddon(this); + private final FabricAddon fabricAddon = new FabricAddon(); private final AddonRegistry addonRegistry = new AddonRegistry(fabricAddon, this); private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); @@ -200,11 +204,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public boolean reload() { config.load(this); LangUtil.load(config.getLanguage(), this); // Load language. - boolean succeed = registry.loadAll(this); + boolean succeed = configRegistry.loadAll(this); worldMap.forEach((seed, pair) -> { pair.getRight().getConfig().getSamplerCache().clear(); String packID = pair.getRight().getConfig().getTemplate().getID(); - pair.setRight(new TerraWorld(pair.getRight().getWorld(), registry.get(packID), this)); + pair.setRight(new TerraWorld(pair.getRight().getWorld(), configRegistry.get(packID), this)); }); return succeed; } @@ -247,12 +251,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }); } - public void packInit() { - logger.info("Loading config packs..."); - registry.loadAll(this); - logger.info("Loaded packs."); - } - @Override public void onInitialize() { instance = this; @@ -300,19 +298,12 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Addon("Terra-Fabric") @Author("Terra") @Version("1.0.0") - public static final class FabricAddon extends TerraAddon implements EventListener { - - private final TerraPlugin main; - + public final class FabricAddon extends TerraAddon implements EventListener { private final Map> templates = new HashMap<>(); - private FabricAddon(TerraPlugin main) { - this.main = main; - } - @Override public void initialize() { - main.getEventManager().registerListener(this, this); + eventManager.registerListener(this, this); } @Priority(Priority.LOWEST) @@ -351,7 +342,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { if(!template.getExcludedRegistryFeatures().contains(entry.getKey().getValue())) { try { event.getPack().getTreeRegistry().add(entry.getKey().getValue().toString(), (Tree) entry.getValue()); - main.getDebugLogger().info("Injected ConfiguredFeature " + entry.getKey().getValue() + " as Tree."); + debugLogger.info("Injected ConfiguredFeature " + entry.getKey().getValue() + " as Tree."); } catch(DuplicateEntryException ignored) { } } @@ -374,6 +365,21 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { templates.get(event.getPack()).setRight(template); } + @Global + public void injectBiomes(BiomeRegistrationEvent event) { + logger.info("Registering biomes..."); + Registry biomeRegistry = event.getRegistryManager().get(Registry.BIOME_KEY); + configRegistry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(biome, pack, event.getRegistryManager())))); // Register all Terra biomes. + logger.info("Biomes registered."); + } + + @Global + public void initializePacks(GameInitializationEvent event) { + TerraFabricPlugin main = TerraFabricPlugin.getInstance(); + main.logger().info("Loading config packs..."); + configRegistry.loadAll(TerraFabricPlugin.this); + logger.info("Loaded packs."); + } private void injectTree(CheckedRegistry registry, String id, ConfiguredFeature tree) { try { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/BiomeRegistrationEvent.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/BiomeRegistrationEvent.java new file mode 100644 index 000000000..747645e67 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/BiomeRegistrationEvent.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.fabric.event; + +import com.dfsek.terra.api.event.events.Event; +import net.minecraft.util.registry.DynamicRegistryManager; + +/** + * Fired when biomes should be registered. + */ +public class BiomeRegistrationEvent implements Event { + private final DynamicRegistryManager registryManager; + + public BiomeRegistrationEvent(DynamicRegistryManager registryManager) { + this.registryManager = registryManager; + } + + public DynamicRegistryManager getRegistryManager() { + return registryManager; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/GameInitializationEvent.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/GameInitializationEvent.java new file mode 100644 index 000000000..1a2ca827f --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/GameInitializationEvent.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.fabric.event; + +import com.dfsek.terra.api.event.events.Event; + +/** + * Called when the game is initialized and packs should be registered. + */ +public class GameInitializationEvent implements Event { +} 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 065d8e7c0..fb842a330 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 @@ -2,6 +2,7 @@ package com.dfsek.terra.fabric.generation; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; import com.dfsek.terra.fabric.util.FabricUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -26,8 +27,7 @@ public class TerraGeneratorType extends GeneratorType { @Override public GeneratorOptions createDefaultOptions(DynamicRegistryManager.Impl registryManager, long seed, boolean generateStructures, boolean bonusChest) { GeneratorOptions options = super.createDefaultOptions(registryManager, seed, generateStructures, bonusChest); - Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); - TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(TerraFabricPlugin.getInstance().getFabricAddon(), biome, pack, registryManager)))); // Register all Terra biomes. + TerraFabricPlugin.getInstance().getEventManager().callEvent(new BiomeRegistrationEvent(registryManager)); // register biomes return options; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java similarity index 87% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java index 59dba3484..aa2a4aee1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java @@ -1,6 +1,7 @@ -package com.dfsek.terra.fabric.mixin.init; +package com.dfsek.terra.fabric.mixin.lifecycle.client; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.event.GameInitializationEvent; import com.dfsek.terra.fabric.generation.TerraGeneratorType; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; import net.minecraft.client.MinecraftClient; @@ -18,7 +19,7 @@ public class MinecraftClientMixin { target = "Lnet/minecraft/client/util/WindowProvider;createWindow(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)Lnet/minecraft/client/util/Window;", // sorta arbitrary position, after mod init, before window opens shift = At.Shift.BEFORE)) public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { - TerraFabricPlugin.getInstance().packInit(); // Load during MinecraftClient construction, after other mods have registered blocks and stuff + TerraFabricPlugin.getInstance().getEventManager().callEvent(new GameInitializationEvent()); TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> { final GeneratorType generatorType = new TerraGeneratorType(pack); //noinspection ConstantConditions diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java new file mode 100644 index 000000000..428f9772c --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java @@ -0,0 +1,4 @@ +/** + * Mixins that inject behavior into the client/server lifecycle. + */ +package com.dfsek.terra.fabric.mixin.lifecycle; \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java similarity index 88% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java index 6b012002c..c665bb3c4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.fabric.mixin; +package com.dfsek.terra.fabric.mixin.lifecycle.server; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.util.FabricUtil; @@ -61,11 +62,7 @@ public abstract class GeneratorOptionsMixin { if(config == null) throw new IllegalArgumentException("No such pack " + prop); - - main.logger().info("Registering biomes..."); - main.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(main.getFabricAddon(), biome, pack, registryManager)))); // Register all Terra biomes. - main.logger().info("Biomes registered."); - + main.getEventManager().callEvent(new BiomeRegistrationEvent(registryManager)); // register biomes cir.setReturnValue(new GeneratorOptions(l, generateStructures, false, GeneratorOptions.getRegistryWithReplacedOverworldGenerator(dimensionTypes, dimensionOptions, new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, l, config), l, config)))); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java similarity index 67% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java index 99cc5cfcb..b32f2e591 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java @@ -1,6 +1,7 @@ -package com.dfsek.terra.fabric.mixin.init; +package com.dfsek.terra.fabric.mixin.lifecycle.server; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.event.GameInitializationEvent; import net.minecraft.server.Main; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -11,6 +12,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class ServerMainMixin { @Inject(method = "main([Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DynamicRegistryManager;create()Lnet/minecraft/util/registry/DynamicRegistryManager$Impl;")) private static void injectConstructor(String[] args, CallbackInfo ci) { - TerraFabricPlugin.getInstance().packInit(); // Load during MinecraftServer construction, after other mods have registered blocks and stuff + TerraFabricPlugin.getInstance().getEventManager().callEvent(new GameInitializationEvent()); // Load during MinecraftServer construction, after other mods have registered blocks and stuff } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index 97d0cd74a..7b5a3dedf 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -33,15 +33,16 @@ public final class FabricUtil { /** * Clones a Vanilla biome and injects Terra data to create a Terra-vanilla biome delegate. * - * @param fabricAddon The Fabric addon instance. * @param biome The Terra BiomeBuilder. * @param pack The ConfigPack this biome belongs to. * @return The Minecraft delegate biome. */ - public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager registryManager) { + public static Biome createBiome(BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager registryManager) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); + TerraFabricPlugin.FabricAddon fabricAddon = TerraFabricPlugin.getInstance().getFabricAddon(); + Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); Biome vanilla = ((ProtoBiome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0))).get(biomeRegistry); diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index b97212194..4e1dc8491 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -6,7 +6,7 @@ "mixins": [ "StructureAccessorAccessor", "CommandManagerMixin", - "GeneratorOptionsMixin", + "lifecycle.server.GeneratorOptionsMixin", "ServerWorldMixin", "access.BiomeEffectsAccessor", "access.MobSpawnerLogicAccessor", @@ -37,10 +37,10 @@ ], "client": [ "access.GeneratorTypeAccessor", - "init.MinecraftClientMixin" + "lifecycle.client.MinecraftClientMixin" ], "server": [ - "init.ServerMainMixin" + "lifecycle.server.ServerMainMixin" ], "injectors": { "defaultRequire": 1 From b85880fc9210e9fe48df8889e1a6e23eac952329 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Jun 2021 14:11:25 -0700 Subject: [PATCH 10/11] server only mixins --- platforms/fabric/src/main/resources/terra.mixins.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 4e1dc8491..f2f42900c 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -6,7 +6,6 @@ "mixins": [ "StructureAccessorAccessor", "CommandManagerMixin", - "lifecycle.server.GeneratorOptionsMixin", "ServerWorldMixin", "access.BiomeEffectsAccessor", "access.MobSpawnerLogicAccessor", @@ -40,6 +39,7 @@ "lifecycle.client.MinecraftClientMixin" ], "server": [ + "lifecycle.server.GeneratorOptionsMixin", "lifecycle.server.ServerMainMixin" ], "injectors": { From fa01c47f43c1bed69e02fdd45bc8bdf1b892d482 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 19 Jun 2021 13:25:20 -0700 Subject: [PATCH 11/11] fix re-registering issue --- .../com/dfsek/terra/fabric/TerraFabricPlugin.java | 2 +- .../java/com/dfsek/terra/fabric/util/FabricUtil.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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 87235d6b2..4a3c4bf18 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 @@ -369,7 +369,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public void injectBiomes(BiomeRegistrationEvent event) { logger.info("Registering biomes..."); Registry biomeRegistry = event.getRegistryManager().get(Registry.BIOME_KEY); - configRegistry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(biome, pack, event.getRegistryManager())))); // Register all Terra biomes. + configRegistry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> FabricUtil.registerOrOverwrite(biomeRegistry, Registry.BIOME_KEY, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(biome, pack, event.getRegistryManager())))); // Register all Terra biomes. logger.info("Biomes registered."); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index 7b5a3dedf..eb6bdee7d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -8,9 +8,12 @@ import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; +import com.mojang.serialization.Lifecycle; import net.minecraft.util.Identifier; import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.MutableRegistry; import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; @@ -119,4 +122,12 @@ public final class FabricUtil { .generationSettings(generationSettings.build()) .build(); } + + public static void registerOrOverwrite(Registry registry, RegistryKey> key, Identifier identifier, T item) { + if(registry.containsId(identifier)) { + ((MutableRegistry) registry).set(registry.getRawId(registry.get(identifier)), RegistryKey.of(key, identifier), item, Lifecycle.stable()); + } else { + Registry.register(registry, identifier, item); + } + } }