From 6348442962af4cd8ab9b991df8b6271aa9540982 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 16 May 2024 13:17:17 +0200 Subject: [PATCH] add y lock to fix offset when placing objects --- .../iris/engine/jigsaw/PlannedPiece.java | 52 +++++++++++++++++-- .../iris/engine/jigsaw/PlannedStructure.java | 15 +++++- .../object/IrisJigsawPieceConnector.java | 3 ++ 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java index 882f29f02..5a966e752 100644 --- a/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java +++ b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java @@ -22,15 +22,17 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.object.*; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.math.AxisAlignedBB; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Setter; import org.bukkit.util.BlockVector; import java.util.ArrayList; import java.util.List; -@SuppressWarnings("ALL") @Data public class PlannedPiece { private IrisPosition position; @@ -45,6 +47,12 @@ public class PlannedPiece { private AxisAlignedBB box; @EqualsAndHashCode.Exclude private PlannedStructure structure; + @EqualsAndHashCode.Exclude + @Setter(AccessLevel.NONE) + private ParentConnection parent = null; + @EqualsAndHashCode.Exclude + @Setter(AccessLevel.NONE) + private KMap realPositions; public PlannedPiece(PlannedStructure structure, IrisPosition position, IrisJigsawPiece piece) { this(structure, position, piece, 0, 0, 0); @@ -66,6 +74,7 @@ public class PlannedPiece { this.object.setLoadKey(piece.getObject()); this.ogObject.setLoadKey(piece.getObject()); this.connected = new KList<>(); + this.realPositions = new KMap<>(); } @@ -124,11 +133,21 @@ public class PlannedPiece { return c; } - public boolean connect(IrisJigsawPieceConnector c) { - if (piece.getConnectors().contains(c)) { - return connected.addIfMissing(c); - } + public KList getChildConnectors() { + ParentConnection pc = getParent(); + KList c = getConnected().copy(); + if (pc != null) c.removeIf(i -> i.equals(pc.connector)); + return c; + } + public boolean connect(IrisJigsawPieceConnector c, PlannedPiece p, IrisJigsawPieceConnector pc) { + if (piece.getConnectors().contains(c) && p.getPiece().getConnectors().contains(pc)) { + if (connected.contains(c) || p.connected.contains(pc)) return false; + connected.add(c); + p.connected.add(pc); + p.parent = new ParentConnection(this, c, p, pc); + return true; + } return false; } @@ -162,4 +181,27 @@ public class PlannedPiece { public boolean isFull() { return connected.size() >= piece.getConnectors().size(); } + + public void setRealPositions(int x, int y, int z, IObjectPlacer placer) { + boolean isUnderwater = piece.getPlacementOptions().isUnderwater(); + for (IrisJigsawPieceConnector c : piece.getConnectors()) { + var pos = c.getPosition().add(new IrisPosition(x, 0, z)); + if (y < 0) { + pos.setY(pos.getY() + placer.getHighest(pos.getX(), pos.getZ(), getData(), isUnderwater) + (object.getH() / 2)); + } else { + pos.setY(pos.getY() + y); + } + realPositions.put(c, pos); + } + } + + public record ParentConnection(PlannedPiece parent, IrisJigsawPieceConnector parentConnector, PlannedPiece self, IrisJigsawPieceConnector connector) { + public IrisPosition getTargetPosition() { + var pos = parent.realPositions.get(parentConnector); + if (pos == null) return null; + return pos.add(new IrisPosition(parentConnector.getDirection().toVector())) + .sub(connector.getPosition()) + .sub(new IrisPosition(self.object.getCenter())); + } + } } diff --git a/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java index 05b199a3a..77d4157f7 100644 --- a/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java +++ b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java @@ -126,6 +126,17 @@ public class PlannedStructure { height = i.getStructure().getStructure().getLockY(); } + PlannedPiece.ParentConnection connection = i.getParent(); + if (connection != null && connection.connector().isLockY()) { + var pos = connection.getTargetPosition(); + if (pos != null) { + height = pos.getY(); + offset = 0; + } else { + Iris.warn("Failed to get target position for " + v.getLoadKey()); + } + } + height += offset + (v.getH() / 2); if (options.getMode().equals(ObjectPlaceMode.PAINT)) { @@ -134,6 +145,7 @@ public class PlannedStructure { int id = rng.i(0, Integer.MAX_VALUE); JigsawPieceContainer container = JigsawPieceContainer.toContainer(i.getPiece()); + i.setRealPositions(xx, height, zz, placer); return v.place(xx, height, zz, placer, options, rng, (b, data) -> { e.set(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id); e.set(b.getX(), b.getY(), b.getZ(), container); @@ -248,8 +260,7 @@ public class PlannedStructure { return false; } - piece.connect(pieceConnector); - test.connect(testConnector); + piece.connect(pieceConnector, test, testConnector); pieces.add(test); return true; diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPieceConnector.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPieceConnector.java index bc5fce61b..f3afe074a 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPieceConnector.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPieceConnector.java @@ -79,6 +79,9 @@ public class IrisJigsawPieceConnector { @Required private IrisDirection direction = IrisDirection.UP_POSITIVE_Y; + @Desc("Lock the Y position of this connector") + private boolean lockY = false; + public String toString() { return direction.getFace().name() + "@(" + position.getX() + "," + position.getY() + "," + position.getZ() + ")"; }