Astruct lets you generate massive jigsaw-based structures without freezing the server. It plans structures off-thread, queues placements, and only builds blocks once the required chunks are loaded.
In practice, very large structures may “stream in” over a few seconds—especially after teleporting—since planning can take time. In survival, this is usually unnoticeable when
plan_horizon_chunksis set high enough.
spacing). Each cell gets a deterministic, seed-based center per structure ID.Place JSON files at:
data/<namespace>/worldgen/async_structure/<id>.json
{
"id": "example:castle",
"dimension": "minecraft:the_nether",
"start_pool": "castle:start",
"fallback_pool": "castle:caps",
"soft_radius_chunks": 16,
"plan_horizon_chunks": 160,
"budgets": {
"max_steps": 30,
"max_open_connectors": 128
},
"gen_y": { "mode": "surface", "value": 0 },
"spacing": 2048
}
id
Unique structure ID (should match the file path key).
dimension
Target dimension key (e.g. minecraft:the_nether).
start_pool
Template pool to start expansion from.
fallback_pool
Pool used to cap dead-ends (end pieces).
soft_radius_chunks
Max distance budget (in chunks) from the center during expansion.
plan_horizon_chunks
How far ahead (in chunks) the planner prepares around players.
budgets.max_steps
Upper bound on jigsaw pieces per plan.
budgets.max_open_connectors
Safety limit for outstanding connectors.
gen_y
Controls how the final Y coordinate is chosen.
Y is resolved late, at the final structure position.
Supported modes:
"fixed"
Always use value as the Y level.
"min_plus"
min_build_height + value.
"world_y"
World sea level.
"surface"
Terrain surface at the structure’s X/Z position
(plus optional offset via value).
Example:
"gen_y": { "mode": "surface", "value": 0 }
spacingid – Unique structure ID (should match the file path key).dimension – Target dimension key (e.g. minecraft:the_nether).start_pool – Template pool to start expansion from.fallback_pool – Pool used to cap dead-ends (end pieces).soft_radius_chunks – Max distance budget (in chunks) from the center during expansion.plan_horizon_chunks – How far ahead (in chunks) the planner prepares around players.budgets.max_steps – Upper bound on jigsaw pieces per plan.budgets.max_open_connectors – Safety limit for outstanding connectors.gen_y.mode – "fixed" | "world_y" | "min_plus".gen_y.value – Y or offset (depending on mode).spacing – Cell size in blocks (effective density control).piece_rules.deny_overlap_tile_entities – Optional safety flag to skip pieces that would overlap TEs.Astruct plugs into the vanilla /locate root:
/locate astruct – Nearest center for any Astruct structure in this dimension./locate astruct <id> – Nearest center for a specific structure ID.astruct-common.toml:
debug_logs (bool, default false) – Verbose diagnostics.max_placements_per_tick (int, default 10) – Upper bound on pieces placed each tick.
Tune for your hardware/pack.max_steps and pool complexity. Thousands of pieces may take seconds off-thread—that’s expected. Players won’t lag; placement is paced.id inside JSON matches the file’s namespaced key.debug_logs to see planning times. Very high max_steps or complex pools can take long. Reduce max_steps, increase plan_horizon_chunks, or increase spacing.debug_logs = false (default)./locate structure.