From ee6e9b059a66c23cf329743194a675a091be2de5 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 10 Jan 2021 09:12:20 -0500 Subject: [PATCH] Jigsaw structures max dimension allowed --- .../volmit/iris/object/IrisJigsawPiece.java | 33 +++++++++++++ .../iris/object/IrisJigsawStructure.java | 49 +++++++++++++++++++ .../volmit/iris/object/IrisPosition2D.java | 24 +++++++++ 3 files changed, 106 insertions(+) create mode 100644 src/main/java/com/volmit/iris/object/IrisPosition2D.java diff --git a/src/main/java/com/volmit/iris/object/IrisJigsawPiece.java b/src/main/java/com/volmit/iris/object/IrisJigsawPiece.java index cf8d94406..6356c1016 100644 --- a/src/main/java/com/volmit/iris/object/IrisJigsawPiece.java +++ b/src/main/java/com/volmit/iris/object/IrisJigsawPiece.java @@ -1,11 +1,15 @@ package com.volmit.iris.object; +import com.volmit.iris.scaffold.cache.AtomicCache; import com.volmit.iris.util.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import org.bukkit.util.BlockVector; + +import java.io.IOException; @Accessors(chain = true) @NoArgsConstructor @@ -32,6 +36,35 @@ public class IrisJigsawPiece extends IrisRegistrant @DontObfuscate private ObjectPlaceMode placeMode; + AtomicCache max2dDim = new AtomicCache<>(); + AtomicCache max3dDim = new AtomicCache<>(); + + public int getMax2dDimension() { + return max2dDim.aquire(() -> { + try { + BlockVector v = IrisObject.sampleSize(getLoader().getObjectLoader().findFile(getObject())); + return Math.max(v.getBlockX(), v.getBlockZ()); + } catch (IOException e) { + e.printStackTrace(); + } + + return 0; + }); + } + + public int getMax3dDimension() { + return max2dDim.aquire(() -> { + try { + BlockVector v = IrisObject.sampleSize(getLoader().getObjectLoader().findFile(getObject())); + return Math.max(Math.max(v.getBlockX(), v.getBlockZ()), v.getBlockY()); + } catch (IOException e) { + e.printStackTrace(); + } + + return 0; + }); + } + public IrisJigsawPieceConnector getConnector(IrisPosition relativePosition) { for(IrisJigsawPieceConnector i : connectors) { diff --git a/src/main/java/com/volmit/iris/object/IrisJigsawStructure.java b/src/main/java/com/volmit/iris/object/IrisJigsawStructure.java index d17e30e84..6d6998c78 100644 --- a/src/main/java/com/volmit/iris/object/IrisJigsawStructure.java +++ b/src/main/java/com/volmit/iris/object/IrisJigsawStructure.java @@ -35,4 +35,53 @@ public class IrisJigsawStructure extends IrisRegistrant private boolean terminate = true; private AtomicCache maxDimension = new AtomicCache<>(); + + private void loadPool(String p, KList pools, KList pieces) + { + IrisJigsawPool pool = getLoader().getJigsawPoolLoader().load(p); + + for(String i : pool.getPieces()) + { + if(pieces.addIfMissing(i)) + { + loadPiece(i, pools, pieces); + } + } + } + + private void loadPiece(String p, KList pools, KList pieces) + { + IrisJigsawPiece piece = getLoader().getJigsawPieceLoader().load(p); + for(IrisJigsawPieceConnector i : piece.getConnectors()) + { + for(String j : i.getPools()) + { + if(pools.addIfMissing(j)) + { + loadPool(p, pools, pieces); + } + } + } + } + + public int getMaxDimension() + { + return maxDimension.aquire(() -> { + int max = 0; + KList pools = new KList<>(); + KList pieces = new KList<>(); + + for(String i : getPieces()) + { + loadPiece(i, pools, pieces); + } + + for(String i : pieces) + { + max = Math.max(max, getLoader().getJigsawPieceLoader().load(i).getMax3dDimension()); + } + + return max; + }); + } } diff --git a/src/main/java/com/volmit/iris/object/IrisPosition2D.java b/src/main/java/com/volmit/iris/object/IrisPosition2D.java new file mode 100644 index 000000000..5011fada3 --- /dev/null +++ b/src/main/java/com/volmit/iris/object/IrisPosition2D.java @@ -0,0 +1,24 @@ +package com.volmit.iris.object; + +import com.volmit.iris.util.Desc; +import com.volmit.iris.util.DontObfuscate; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Desc("Represents a position") +@Data +public class IrisPosition2D +{ + @DontObfuscate + @Desc("The x position") + private int x = 0; + + @DontObfuscate + @Desc("The z position") + private int z = 0; +}