From 563c6d0403d9a88e9d25bb28918e6da2c83da110 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 26 Oct 2023 20:22:34 +0200 Subject: [PATCH] make object collision configurable --- .../volmit/iris/engine/object/IrisObject.java | 20 +++++++++++++++++++ .../engine/object/IrisObjectPlacement.java | 8 ++++++++ 2 files changed, 28 insertions(+) diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java index 700d1d75f..566ea9bb4 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -22,6 +22,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.loader.IrisRegistrant; import com.volmit.iris.engine.data.cache.AtomicCache; +import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.placer.HeightmapObjectPlacer; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; @@ -688,6 +689,25 @@ public class IrisObject extends IrisRegistrant { return -1; } + if (!config.getAllowedCollisions().isEmpty() || !config.getForbiddenCollisions().isEmpty()) { + Engine engine = rdata.getEngine(); + String key; + BlockVector offset = new BlockVector(config.getTranslate().getX(), config.getTranslate().getY(), config.getTranslate().getZ()); + for (int i = x - Math.floorDiv(w, 2) + (int) offset.getX(); i <= x + Math.floorDiv(w, 2) - (w % 2 == 0 ? 1 : 0) + (int) offset.getX(); i++) { + for (int j = y - Math.floorDiv(h, 2) + (int) offset.getY(); j <= y + Math.floorDiv(h, 2) - (h % 2 == 0 ? 1 : 0) + (int) offset.getY(); j++) { + for (int k = z - Math.floorDiv(d, 2) + (int) offset.getZ(); k <= z + Math.floorDiv(d, 2) - (d % 2 == 0 ? 1 : 0) + (int) offset.getX(); k++) { + key = engine.getObjectPlacementKey(i, j, k); + if (key != null) { + if (config.getForbiddenCollisions().contains(key) && !config.getAllowedCollisions().contains(key)) { + Iris.warn("%s collides with %s (%s / %s / %s)", getLoadKey(), key, i, j, k); + return -1; + } + } + } + } + } + } + if (config.isBore()) { BlockVector offset = new BlockVector(config.getTranslate().getX(), config.getTranslate().getY(), config.getTranslate().getZ()); for (int i = x - Math.floorDiv(w, 2) + (int) offset.getX(); i <= x + Math.floorDiv(w, 2) - (w % 2 == 0 ? 1 : 0) + (int) offset.getX(); i++) { diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java index 9ae7be341..813ef8c4a 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java @@ -128,6 +128,14 @@ public class IrisObjectPlacement { @Desc("This object / these objects override the following trees when they grow...") @ArrayType(min = 1, type = IrisTree.class) private KList trees = new KList<>(); + @RegistryListResource(IrisObject.class) + @ArrayType(type = String.class) + @Desc("List of objects to this object is allowed to collied with") + private KList allowedCollisions = new KList<>(); + @RegistryListResource(IrisObject.class) + @ArrayType(type = String.class) + @Desc("List of objects to this object is forbidden to collied with") + private KList forbiddenCollisions = new KList<>(); private transient AtomicCache cache = new AtomicCache<>(); public IrisObjectPlacement toPlacement(String... place) {