From cf2e7df2986aaaa1ee6d8de10b6d2f4d306a1417 Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Mon, 8 Jun 2026 00:20:23 -0400 Subject: [PATCH] c --- .../arcane/iris/engine/object/IrisObject.java | 12 +++++++++--- .../iris/engine/object/IrisObjectVacuum.java | 8 ++++++++ .../engine/object/IrisObjectVacuumTest.java | 17 +++++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/art/arcane/iris/engine/object/IrisObject.java b/core/src/main/java/art/arcane/iris/engine/object/IrisObject.java index c8895e8b3..62d974390 100644 --- a/core/src/main/java/art/arcane/iris/engine/object/IrisObject.java +++ b/core/src/main/java/art/arcane/iris/engine/object/IrisObject.java @@ -963,6 +963,7 @@ public class IrisObject extends IrisRegistrant { int lowest = Integer.MAX_VALUE; int topLayer = Integer.MIN_VALUE; int vacuumLowest = Integer.MAX_VALUE; + int vacuumHighest = Integer.MIN_VALUE; y += yrand; readLock.lock(); @@ -1132,6 +1133,9 @@ public class IrisObject extends IrisRegistrant { if (vacuuming && yy < vacuumLowest) { vacuumLowest = yy; } + if (vacuuming && yy > vacuumHighest) { + vacuumHighest = yy; + } } } } catch (Throwable e) { @@ -1370,7 +1374,7 @@ public class IrisObject extends IrisRegistrant { int highZ = IrisObjectVacuum.footprintHigh(rotDim.getBlockZ()); int centerX = x + config.getTranslate().getX(); int centerZ = z + config.getTranslate().getZ(); - vacuumTerrain(placer, config, centerX, centerZ, lowX, highX, lowZ, highZ, vacuumLowest); + vacuumTerrain(placer, config, centerX, centerZ, lowX, highX, lowZ, highZ, vacuumLowest, vacuumHighest); } if (heightmap != null) { @@ -1409,7 +1413,7 @@ public class IrisObject extends IrisRegistrant { + "(forcePlace=false, fromBottom=false, mode!=FLOATING). Skipping to protect bedrock."); } - private void vacuumTerrain(IObjectPlacer placer, IrisObjectPlacement config, int centerX, int centerZ, int lowX, int highX, int lowZ, int highZ, int baseY) { + private void vacuumTerrain(IObjectPlacer placer, IrisObjectPlacement config, int centerX, int centerZ, int lowX, int highX, int lowZ, int highZ, int baseY, int topY) { ObjectPlaceMode mode = config.getMode(); IrisVacuumSettings settings = config.getVacuumSettings(); int radius = IrisObjectVacuum.resolveRadius(mode, settings); @@ -1448,7 +1452,9 @@ public class IrisObject extends IrisRegistrant { placer.set(cx, yy, cz, fill); } } else if (targetY < origY) { - for (int yy = origY; yy > targetY; yy--) { + boolean inside = IrisObjectVacuum.outset(dx, lowX, highX) == 0 && IrisObjectVacuum.outset(dz, lowZ, highZ) == 0; + int carveFloor = IrisObjectVacuum.carveFloorY(targetY, topY, inside); + for (int yy = origY; yy >= carveFloor; yy--) { placer.set(cx, yy, cz, AIR); } } diff --git a/core/src/main/java/art/arcane/iris/engine/object/IrisObjectVacuum.java b/core/src/main/java/art/arcane/iris/engine/object/IrisObjectVacuum.java index b249c0113..55f70e148 100644 --- a/core/src/main/java/art/arcane/iris/engine/object/IrisObjectVacuum.java +++ b/core/src/main/java/art/arcane/iris/engine/object/IrisObjectVacuum.java @@ -90,4 +90,12 @@ public final class IrisObjectVacuum { double factor = Math.pow(t, Math.max(0.25, falloff)); return (int) Math.round(originalY + ((meetY - originalY) * factor)); } + + public static int carveFloorY(int targetY, int objectTopY, boolean insideFootprint) { + int floor = targetY + 1; + if (insideFootprint) { + floor = Math.max(floor, objectTopY + 1); + } + return floor; + } } diff --git a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectVacuumTest.java b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectVacuumTest.java index 52c057465..964fea72d 100644 --- a/core/src/test/java/art/arcane/iris/engine/object/IrisObjectVacuumTest.java +++ b/core/src/test/java/art/arcane/iris/engine/object/IrisObjectVacuumTest.java @@ -126,4 +126,21 @@ public class IrisObjectVacuumTest { assertFalse(IrisObjectVacuum.isVacuumMode(ObjectPlaceMode.PAINT)); assertFalse(IrisObjectVacuum.isVacuumMode(ObjectPlaceMode.FLOATING)); } + + @Test + public void carveFloorPreservesBuriedObjectInsideFootprint() { + int surfaceY = 122; + int baseY = 110; + int topY = 119; + int meetY = baseY - 1; + + int insideFloor = IrisObjectVacuum.carveFloorY(meetY, topY, true); + assertEquals("inside the footprint the carve must stop one above the object top", topY + 1, insideFloor); + assertTrue("inside carve must not reach the object's blocks", insideFloor > topY); + assertTrue("inside carve still removes the terrain burying the object", insideFloor <= surfaceY + 1); + + int ringFloor = IrisObjectVacuum.carveFloorY(meetY, topY, false); + assertEquals("the ring carves down to the deformation target (the crater floor)", meetY + 1, ringFloor); + assertTrue("ring crater is deeper than the object-protected inside floor", ringFloor < insideFloor); + } }