Skip to content

Jigsaw Structures

A JigsawStructure is assembled from pieces. It places a first piece from its start pool, then attaches a new piece at every jigsaw block in the placed pieces, until it is size steps from the start.

ExamplePlugin.java Java
import dev.wyck.keys.ResourceKey;
import dev.wyck.worldgen.structure.templatesystem.StructureTemplate;

@Override
public void onLoad() {
  // From the plugin's data folder
  StructureTemplate tower = StructureTemplate.of(ResourceKey.of("wyck", "tower"), getDataPath().resolve("tower.nbt"))
      .register();

  // From inside the plugin jar
  StructureTemplate ruin = StructureTemplate.of(ResourceKey.of("wyck", "ruin"), getClass().getResource("/ruin.nbt"))
      .register();
}

A TemplatePool is a weighted list of pool elements with a fallback pool, used when a piece from this pool does not fit. The fallback defaults to TemplatePool.EMPTY.

ExamplePlugin.java Java
import dev.wyck.keys.ResourceKey;
import dev.wyck.worldgen.structure.pools.PoolElement;
import dev.wyck.worldgen.structure.pools.TemplatePool;
import dev.wyck.worldgen.structure.pools.types.ComposedTemplatePool;

ComposedTemplatePool start = TemplatePool.builder()
  .resourceKey(ResourceKey.of("wyck", "tower/start"))
  .element(PoolElement.single(tower), 3) // weight from 1 to 150
  .element(PoolElement.single(ruin), 1)
  .build()
  .register();
ExamplePlugin.java Java
import dev.wyck.keys.ResourceKey;
import dev.wyck.worldgen.HeightmapType;
import dev.wyck.worldgen.structure.Structure;
import dev.wyck.worldgen.structure.types.JigsawStructure;

JigsawStructure structure = Structure.jigsaw(settings, start)
  .resourceKey(ResourceKey.of("wyck", "tower"))
  .size(6)
  .projectStartToHeightmap(HeightmapType.WORLD_SURFACE_WG)
  .maxDistanceFromCenter(JigsawStructure.MaxDistance.of(80))
  .build()
  .register();

Add the structure to a structure set so it generates.

A PoolAliasBinding replaces a pool for one structure.

ExamplePlugin.java Java
import dev.wyck.keys.ResourceKey;
import dev.wyck.worldgen.structure.Structures;
import dev.wyck.worldgen.structure.pools.PoolElement;
import dev.wyck.worldgen.structure.pools.TemplatePool;
import dev.wyck.worldgen.structure.pools.alias.PoolAliasBinding;
import dev.wyck.worldgen.structure.pools.types.ComposedTemplatePool;
import dev.wyck.worldgen.structure.types.JigsawStructure;

TemplatePool vanillaHouses = TemplatePool.reference(ResourceKey.minecraft("village/plains/houses"));

// Vanilla's houses plus your own, under a new key
ComposedTemplatePool houses = ((ComposedTemplatePool) vanillaHouses.wrap()).toBuilder()
  .resourceKey(ResourceKey.of("wyck", "village/plains/houses"))
  .element(PoolElement.single(myHouse), 4)
  .build()
  .register();

JigsawStructure village = (JigsawStructure) Structures.VILLAGE_PLAINS.wrap();
village.toBuilder()
  .resourceKey(ResourceKey.of("wyck", "village_plains"))
  .poolAlias(PoolAliasBinding.direct(vanillaHouses, houses))
  .build()
  .register();