From ed24f1503351993a5126601bd3bb26b3f1cc8818 Mon Sep 17 00:00:00 2001 From: Glease <4586901+Glease@users.noreply.github.com> Date: Fri, 12 Aug 2022 12:25:03 +0800 Subject: [PATCH] migrate iterate to iterateV2 --- .../structure/IStructureDefinition.java | 174 ++++++------------ .../structure/IStructureWalker.java | 32 ++++ .../structure/StructureUtility.java | 2 +- 3 files changed, 86 insertions(+), 122 deletions(-) diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureDefinition.java b/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureDefinition.java index 3e30bd58..83876b7c 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureDefinition.java +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureDefinition.java @@ -1,10 +1,11 @@ package com.gtnewhorizon.structurelib.structure; import static com.gtnewhorizon.structurelib.StructureLib.DEBUG_MODE; +import static com.gtnewhorizon.structurelib.structure.IStructureWalker.ignoreBlockUnloaded; +import static com.gtnewhorizon.structurelib.structure.IStructureWalker.skipBlockUnloaded; import com.gtnewhorizon.structurelib.StructureLib; import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing; -import java.util.Arrays; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -196,136 +197,67 @@ public interface IStructureDefinition { return false; } - // change base position to base offset - basePositionA = -basePositionA; - basePositionB = -basePositionB; - basePositionC = -basePositionC; - - int[] abc = new int[] {basePositionA, basePositionB, basePositionC}; - int[] xyz = new int[3]; - if (checkBlocksIfNotNullForceCheckAllIfTrue != null) { + boolean success; if (checkBlocksIfNotNullForceCheckAllIfTrue) { - for (IStructureElement element : elements) { - if (element.isNavigating()) { - abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA(); - abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB(); - abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC(); - } else { - extendedFacing.getWorldOffset(abc, xyz); - xyz[0] += basePositionX; - xyz[1] += basePositionY; - xyz[2] += basePositionZ; - - if (DEBUG_MODE) - StructureLib.LOGGER.info( - "Multi [{}, {}, {}] step @ {} {}", - basePositionX, - basePositionY, - basePositionZ, - Arrays.toString(xyz), - Arrays.toString(abc)); - - if (world.blockExists(xyz[0], xyz[1], xyz[2])) { - if (!element.check(object, world, xyz[0], xyz[1], xyz[2])) { - if (DEBUG_MODE) { - StructureLib.LOGGER.info("Multi [" + basePositionX + ", " + basePositionY + ", " - + basePositionZ + "] failed @ " + Arrays.toString(xyz) + " " - + Arrays.toString(abc)); - } - return false; - } - } else { - if (DEBUG_MODE) { - StructureLib.LOGGER.info("Multi [" + basePositionX + ", " + basePositionY + ", " - + basePositionZ + "] !blockExists @ " + Arrays.toString(xyz) + " " - + Arrays.toString(abc)); - } - return false; - } - abc[0] += 1; - } - } + success = StructureUtility.iterateV2( + elements, + world, + extendedFacing, + basePositionX, + basePositionY, + basePositionZ, + basePositionA, + basePositionB, + basePositionC, + (e, w, x, y, z) -> e.check(object, w, x, y, z), + "check"); } else { - for (IStructureElement element : elements) { - if (element.isNavigating()) { - abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA(); - abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB(); - abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC(); - } else { - extendedFacing.getWorldOffset(abc, xyz); - xyz[0] += basePositionX; - xyz[1] += basePositionY; - xyz[2] += basePositionZ; - - StructureLib.LOGGER.info( - "Multi [{}, {}, {}] step @ {} {}", - basePositionX, - basePositionY, - basePositionZ, - Arrays.toString(xyz), - Arrays.toString(abc)); - - if (world.blockExists(xyz[0], xyz[1], xyz[2])) { - if (!element.check(object, world, xyz[0], xyz[1], xyz[2])) { - if (DEBUG_MODE) { - StructureLib.LOGGER.info("Multi [" + basePositionX + ", " + basePositionY + ", " - + basePositionZ + "] failed @ " + Arrays.toString(xyz) + " " - + Arrays.toString(abc)); - } - return false; - } - } else { - if (DEBUG_MODE) { - StructureLib.LOGGER.info("Multi [" + basePositionX + ", " + basePositionY + ", " - + basePositionZ + "] !blockExists @ " + Arrays.toString(xyz) + " " - + Arrays.toString(abc)); - } - } - abc[0] += 1; - } - } + success = StructureUtility.iterateV2( + elements, + world, + extendedFacing, + basePositionX, + basePositionY, + basePositionZ, + basePositionA, + basePositionB, + basePositionC, + skipBlockUnloaded((e,w, x, y, z) -> e.check(object,w, x,y, z)), + "check force"); } - if (DEBUG_MODE) { + if (DEBUG_MODE && success) { StructureLib.LOGGER.info( "Multi [" + basePositionX + ", " + basePositionY + ", " + basePositionZ + "] pass"); } + return success; } else { if (hintsOnly) { - for (IStructureElement element : elements) { - if (element.isNavigating()) { - abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA(); - abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB(); - abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC(); - } else { - extendedFacing.getWorldOffset(abc, xyz); - xyz[0] += basePositionX; - xyz[1] += basePositionY; - xyz[2] += basePositionZ; - - element.spawnHint(object, world, xyz[0], xyz[1], xyz[2], trigger); - - abc[0] += 1; - } - } + StructureUtility.iterateV2( + elements, + world, + extendedFacing, + basePositionX, + basePositionY, + basePositionZ, + basePositionA, + basePositionB, + basePositionC, + ignoreBlockUnloaded((e, w, x, y, z) -> e.spawnHint(object, world, x, y, z, trigger)), + "spawnHint"); } else { - for (IStructureElement element : elements) { - if (element.isNavigating()) { - abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA(); - abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB(); - abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC(); - } else { - extendedFacing.getWorldOffset(abc, xyz); - xyz[0] += basePositionX; - xyz[1] += basePositionY; - xyz[2] += basePositionZ; - - if (world.blockExists(xyz[0], xyz[1], xyz[2])) { - element.placeBlock(object, world, xyz[0], xyz[1], xyz[2], trigger); - } - abc[0] += 1; - } - } + StructureUtility.iterateV2( + elements, + world, + extendedFacing, + basePositionX, + basePositionY, + basePositionZ, + basePositionA, + basePositionB, + basePositionC, + ignoreBlockUnloaded((e, w, x, y, z) -> e.placeBlock(object, world, x, y, z, trigger)), + "placeBlock"); } } return true; diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureWalker.java b/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureWalker.java index a6710169..2e3ec862 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureWalker.java +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureWalker.java @@ -4,4 +4,36 @@ import net.minecraft.world.World; public interface IStructureWalker { boolean visit(IStructureElement element, World world, int x, int y, int z); + + default boolean blockNotLoaded(IStructureElement element, World world, int x, int y, int z) { + return false; + } + + static IStructureWalker ignoreBlockUnloaded(IStructureWalker walker) { + return new IStructureWalker() { + @Override + public boolean visit(IStructureElement element, World world, int x, int y, int z) { + return walker.visit(element, world, x, y, z); + } + + @Override + public boolean blockNotLoaded(IStructureElement element, World world, int x, int y, int z) { + return walker.visit(element, world, x, y, z); + } + }; + } + + static IStructureWalker skipBlockUnloaded(IStructureWalker walker) { + return new IStructureWalker() { + @Override + public boolean visit(IStructureElement element, World world, int x, int y, int z) { + return walker.visit(element, world, x, y, z); + } + + @Override + public boolean blockNotLoaded(IStructureElement element, World world, int x, int y, int z) { + return true; + } + }; + } } diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java b/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java index 2602b76f..1c99531d 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/StructureUtility.java @@ -2244,7 +2244,7 @@ public class StructureUtility { Arrays.toString(xyz), Arrays.toString(abc)); } - return false; + if (!predicate.blockNotLoaded(element, world, xyz[0], xyz[1], xyz[2])) return false; } abc[0] += 1; }