diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureDefinition.java b/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureDefinition.java index be1933e0..6c69fa52 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureDefinition.java +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureDefinition.java @@ -324,6 +324,22 @@ public interface IStructureDefinition { return walker.getBuilt(); } + default void iterate(String piece, World world, ExtendedFacing extendedFacing, int basePositionX, int basePositionY, + int basePositionZ, int basePositionA, int basePositionB, int basePositionC, IStructureWalker predicate) { + StructureUtility.iterateV2( + getStructureFor(piece), + world, + extendedFacing, + basePositionX, + basePositionY, + basePositionZ, + basePositionA, + basePositionB, + basePositionC, + predicate, + "customIterate"); + } + /** * Gets the controller position for a piece. Controller positions are denoted by a tilde. * diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureWalker.java b/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureWalker.java index 2f3111df..d0856684 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureWalker.java +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureWalker.java @@ -2,8 +2,25 @@ package com.gtnewhorizon.structurelib.structure; import net.minecraft.world.World; -interface IStructureWalker { +/** + * A functional interface that is used to iterate over an arbitrary structure. + */ +@FunctionalInterface +public interface IStructureWalker { + /** + * Called once per structure element. + * + * @param element The current element + * @param world The current world + * @param x The absolute X position of the element in world coordinates + * @param y The absolute Y position of the element in world coordinates + * @param z The absolute Z position of the element in world coordinates + * @param a The relative A position of the element in structure-local coordinates (pre transform) + * @param b The relative B position of the element in structure-local coordinates (pre transform) + * @param c The relative C position of the element in structure-local coordinates (pre transform) + * @return False to stop iterating, true to continue. + */ boolean visit(IStructureElement element, World world, int x, int y, int z, int a, int b, int c); default boolean blockNotLoaded(IStructureElement element, World world, int x, int y, int z, int a, int b,