diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/structures/BCLStructure.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/structures/BCLStructure.java index deb03584..09cef8a5 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/structures/BCLStructure.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/structures/BCLStructure.java @@ -28,6 +28,8 @@ public abstract class BCLStructure { private final Function structureBuilder; private final TerrainAdjustment terrainAdjustment; + private Bound registered; + protected Unbound( @NotNull ResourceLocation id, @NotNull GenerationStep.Decoration step, @@ -48,12 +50,14 @@ public abstract class BCLStructure { BCLStructure.registerStructureType(id, codec) ); + registered = null; this.structureBuilder = structureBuilder; this.terrainAdjustment = terrainAdjustment; } public Bound register(BootstapContext bootstrapContext) { + if (registered != null) return registered; S baseStructure = structureBuilder.apply(structure( bootstrapContext, this.biomeTag, @@ -61,7 +65,8 @@ public abstract class BCLStructure { terrainAdjustment )); Holder.Reference structure = bootstrapContext.register(structureKey, baseStructure); - return new Bound<>( + BCLStructureBuilder.UNBOUND_STRUCTURES.remove(this); + registered = new Bound<>( this.id, this.structureKey, this.structureSetKey, @@ -73,6 +78,7 @@ public abstract class BCLStructure { baseStructure, structure ); + return registered; } } @@ -243,11 +249,16 @@ public abstract class BCLStructure { return biomes; } + private boolean registeredSet = false; + public void registerSet(BootstapContext bootstrapContext) { + if (registeredSet) return; + registeredSet = true; bootstrapContext.register(structureSetKey, new StructureSet( bootstrapContext.lookup(Registries.STRUCTURE).getOrThrow(structureKey), spreadConfig )); + BCLStructureBuilder.UNBOUND_STRUCTURE_SETS.remove(this); } public abstract Bound register(BootstapContext bootstrapContext); diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/structures/BCLStructureBuilder.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/structures/BCLStructureBuilder.java index dabe662b..cd930060 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/structures/BCLStructureBuilder.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/structures/BCLStructureBuilder.java @@ -3,19 +3,24 @@ package org.betterx.bclib.api.v2.levelgen.structures; import org.betterx.worlds.together.tag.v3.TagManager; import com.mojang.serialization.Codec; +import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement; import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType; import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.Function; public class BCLStructureBuilder { + static final ConcurrentLinkedQueue> UNBOUND_STRUCTURES = new ConcurrentLinkedQueue<>(); + static final ConcurrentLinkedQueue> UNBOUND_STRUCTURE_SETS = new ConcurrentLinkedQueue<>(); private final ResourceLocation structureID; private final Function structureBuilder; @@ -98,7 +103,7 @@ public class BCLStructureBuilder { if (codec == null) codec(Structure.simpleCodec(structureBuilder)); if (biomeTag == null) biomeTag(structureID.getNamespace(), structureID.getPath()); - return new BCLStructure.Unbound<>( + var res = new BCLStructure.Unbound<>( structureID, step, placement, @@ -107,5 +112,18 @@ public class BCLStructureBuilder { structureBuilder, terrainAdjustment ); + UNBOUND_STRUCTURES.add(res); + UNBOUND_STRUCTURE_SETS.add(res); + return res; + } + + public static void registerUnbound(BootstapContext context) { + UNBOUND_STRUCTURES.forEach(s -> s.register(context)); + UNBOUND_STRUCTURES.clear(); + } + + public static void registerUnboundSets(BootstapContext context) { + UNBOUND_STRUCTURE_SETS.forEach(s -> s.registerSet(context)); + UNBOUND_STRUCTURE_SETS.clear(); } }