From 61c0ddb15bb90e597a2a18e2bb66f51b73a0e088 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Tue, 16 Apr 2024 13:29:06 +0200 Subject: [PATCH 1/8] fix random jigsaw rotation and offset --- .../iris/engine/jigsaw/PlannedStructure.java | 15 +++++---------- .../iris/engine/object/IrisJigsawPiece.java | 15 ++------------- .../com/volmit/iris/engine/object/IrisObject.java | 12 +++++++++--- 3 files changed, 16 insertions(+), 26 deletions(-) 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 dd7eade40..4510af468 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 @@ -23,7 +23,6 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.mantle.MantleWriter; import com.volmit.iris.engine.object.*; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.mantle.Mantle; @@ -32,8 +31,6 @@ import com.volmit.iris.util.matter.slices.container.JigsawPieceContainer; import lombok.Data; import org.bukkit.Axis; import org.bukkit.World; -import org.bukkit.block.TileState; -import org.bukkit.block.data.BlockData; @Data public class PlannedStructure { @@ -76,7 +73,7 @@ public class PlannedStructure { public void place(IObjectPlacer placer, Mantle e, Engine eng) { IrisObjectPlacement options = new IrisObjectPlacement(); - options.getRotation().setEnabled(false); + options.setRotation(IrisObjectRotation.of(0,0,0)); int startHeight = pieces.get(0).getPosition().getY(); for (PlannedPiece i : pieces) { @@ -90,11 +87,11 @@ public class PlannedStructure { if (i.getPiece().getPlacementOptions() != null) { options = i.getPiece().getPlacementOptions(); options.getRotation().setEnabled(false); + options.setRotateTowardsSlope(false); } else { options.setMode(i.getPiece().getPlaceMode()); } - IrisObject vo = i.getOgObject(); IrisObject v = i.getObject(); int sx = (v.getW() / 2); int sz = (v.getD() / 2); @@ -122,7 +119,7 @@ public class PlannedStructure { int id = rng.i(0, Integer.MAX_VALUE); JigsawPieceContainer container = JigsawPieceContainer.toContainer(i.getPiece()); - vo.place(xx, height, zz, placer, options, rng, (b, data) -> { + 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); }, null, getData()); @@ -167,9 +164,7 @@ public class PlannedStructure { private boolean generateRotatedPiece(PlannedPiece piece, IrisJigsawPieceConnector pieceConnector, IrisJigsawPiece idea) { if (!piece.getPiece().getPlacementOptions().getRotation().isEnabled()) { - if (generateRotatedPiece(piece, pieceConnector, idea, 0, 0, 0)) { - return true; - } + return generateRotatedPiece(piece, pieceConnector, idea, 0, 0, 0); } KList forder1 = new KList().qadd(0).qadd(1).qadd(2).qadd(3).shuffle(rng); @@ -216,7 +211,7 @@ public class PlannedStructure { } private boolean generateRotatedPiece(PlannedPiece piece, IrisJigsawPieceConnector pieceConnector, IrisJigsawPiece idea, int x, int y, int z) { - return generateRotatedPiece(piece, pieceConnector, idea, IrisObjectRotation.of(x, y, z)); + return generateRotatedPiece(piece, pieceConnector, idea, IrisObjectRotation.of(x * 90D, y * 90D, z * 90D)); } private boolean generatePositionedPiece(PlannedPiece piece, IrisJigsawPieceConnector pieceConnector, PlannedPiece test, IrisJigsawPieceConnector testConnector) { diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java index 72feb927c..93c9f07bc 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java @@ -101,19 +101,8 @@ public class IrisJigsawPiece extends IrisRegistrant { } public IrisJigsawPiece copy() { - IrisJigsawPiece p = new IrisJigsawPiece(); - p.setObject(getObject()); - p.setLoader(getLoader()); - p.setLoadKey(getLoadKey()); - p.setLoadFile(getLoadFile()); - p.setConnectors(new KList<>()); - p.setPlacementOptions(getPlacementOptions()); - - for (IrisJigsawPieceConnector i : getConnectors()) { - p.getConnectors().add(i.copy()); - } - - return p; + var gson = getLoader().getGson(); + return gson.fromJson(gson.toJson(this), IrisJigsawPiece.class); } public boolean isTerminal() { 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 5225c4b23..c4306c115 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 @@ -533,10 +533,16 @@ public class IrisObject extends IrisRegistrant { } else if (min == hWest) { slopeRotationY = 270; } + + double newRotation = config.getRotation().getYAxis().getMin() + slopeRotationY; + if (newRotation == 0) { + config.getRotation().setYAxis(new IrisAxisRotationClamp(false, false, 0, 0, 90)); + config.getRotation().setEnabled(config.getRotation().canRotateX() || config.getRotation().canRotateZ()); + } else { + config.getRotation().setYAxis(new IrisAxisRotationClamp(true, false, newRotation, newRotation, 90)); + config.getRotation().setEnabled(true); + } } - double newRotation = config.getRotation().getYAxis().getMin() + slopeRotationY; - config.getRotation().setYAxis(new IrisAxisRotationClamp(true, false, newRotation, newRotation, 90)); - config.getRotation().setEnabled(true); } if (config.isSmartBore()) { From 856c926cde27cbe04a11a2722b0f0a57565610fe Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Wed, 17 Apr 2024 21:15:15 +0200 Subject: [PATCH 2/8] add min distance to jigsaw structures --- .../iris/engine/jigsaw/PlannedStructure.java | 23 +++++-- .../components/MantleJigsawComponent.java | 58 ++++++++++++++--- .../engine/object/IrisJigsawDistance.java | 31 ++++++++++ .../object/IrisJigsawStructurePlacement.java | 19 ++++++ .../matter/slices/JigsawStructuresMatter.java | 35 +++++++++++ .../container/JigsawStructuresContainer.java | 62 +++++++++++++++++++ 6 files changed, 214 insertions(+), 14 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/engine/object/IrisJigsawDistance.java create mode 100644 core/src/main/java/com/volmit/iris/util/matter/slices/JigsawStructuresMatter.java create mode 100644 core/src/main/java/com/volmit/iris/util/matter/slices/container/JigsawStructuresContainer.java 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 4510af468..ab402cf4c 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 @@ -26,8 +26,10 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.*; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.matter.slices.container.JigsawPieceContainer; +import com.volmit.iris.util.matter.slices.container.JigsawStructuresContainer; import lombok.Data; import org.bukkit.Axis; import org.bukkit.World; @@ -71,17 +73,28 @@ public class PlannedStructure { } } - public void place(IObjectPlacer placer, Mantle e, Engine eng) { + public boolean place(IObjectPlacer placer, Mantle e, Engine eng) { IrisObjectPlacement options = new IrisObjectPlacement(); options.setRotation(IrisObjectRotation.of(0,0,0)); int startHeight = pieces.get(0).getPosition().getY(); + boolean placed = false; for (PlannedPiece i : pieces) { - place(i, startHeight, options, placer, e, eng); + if (place(i, startHeight, options, placer, e, eng)) + placed = true; } + if (placed) { + Position2 chunkPos = new Position2(position.getX() >> 4, position.getZ() >> 4); + Position2 regionPos = new Position2(chunkPos.getX() >> 5, chunkPos.getZ() >> 5); + JigsawStructuresContainer slice = e.get(regionPos.getX(), 0, regionPos.getZ(), JigsawStructuresContainer.class); + if (slice == null) slice = new JigsawStructuresContainer(); + slice.add(structure, chunkPos); + e.set(regionPos.getX(), 0, regionPos.getZ(), slice); + } + return placed; } - public void place(PlannedPiece i, int startHeight, IrisObjectPlacement o, IObjectPlacer placer, Mantle e, Engine eng) { + public boolean place(PlannedPiece i, int startHeight, IrisObjectPlacement o, IObjectPlacer placer, Mantle e, Engine eng) { IrisObjectPlacement options = o; if (i.getPiece().getPlacementOptions() != null) { @@ -119,10 +132,10 @@ public class PlannedStructure { int id = rng.i(0, Integer.MAX_VALUE); JigsawPieceContainer container = JigsawPieceContainer.toContainer(i.getPiece()); - v.place(xx, height, zz, placer, options, rng, (b, data) -> { + 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); - }, null, getData()); + }, null, getData()) != -1; } public void place(World world) { diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java index d9255ef12..14ebeb45d 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java @@ -24,12 +24,15 @@ import com.volmit.iris.engine.mantle.IrisMantleComponent; import com.volmit.iris.engine.mantle.MantleWriter; 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.collection.KSet; import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.matter.slices.container.JigsawStructuresContainer; import com.volmit.iris.util.noise.CNG; import java.util.List; @@ -68,21 +71,58 @@ public class MantleJigsawComponent extends IrisMantleComponent { } } - boolean placed = placeStructures(writer, rng, x, z, biome.getJigsawStructures()); + KSet cachedRegions = new KSet<>(); + KMap> cache = new KMap<>(); + KMap distanceCache = new KMap<>(); + boolean placed = placeStructures(writer, rng, x, z, biome.getJigsawStructures(), cachedRegions, cache, distanceCache); if (!placed) - placed = placeStructures(writer, rng, x, z, region.getJigsawStructures()); + placed = placeStructures(writer, rng, x, z, region.getJigsawStructures(), cachedRegions, cache, distanceCache); if (!placed) - placeStructures(writer, rng, x, z, getDimension().getJigsawStructures()); + placeStructures(writer, rng, x, z, getDimension().getJigsawStructures(), cachedRegions, cache, distanceCache); } @ChunkCoordinates - private boolean placeStructures(MantleWriter writer, RNG rng, int x, int z, KList structures) { + private boolean placeStructures(MantleWriter writer, RNG rng, int x, int z, KList structures, + KSet cachedRegions, KMap> cache, KMap distanceCache) { for (IrisJigsawStructurePlacement i : structures) { if (rng.nextInt(i.getRarity()) == 0) { + if (checkDistances(i.collectDistances(), x, z, cachedRegions, cache, distanceCache)) + continue; IrisPosition position = new IrisPosition((x << 4) + rng.nextInt(15), 0, (z << 4) + rng.nextInt(15)); IrisJigsawStructure structure = getData().getJigsawStructureLoader().load(i.getStructure()); - place(writer, position, structure, rng); - return true; + if (place(writer, position, structure, rng)) + return true; + } + } + return false; + } + + @ChunkCoordinates + private boolean checkDistances(KMap distances, int x, int z, KSet cachedRegions, KMap> cache, KMap distanceCache) { + int range = 0; + for (int d : distances.values()) + range = Math.max(range, d); + + for (int xx = -range; xx <= range; xx++) { + for (int zz = -range; zz <= range; zz++) { + Position2 pos = new Position2((xx + x) >> 5, (zz + z) >> 5); + if (cachedRegions.contains(pos)) continue; + cachedRegions.add(pos); + JigsawStructuresContainer container = getMantle().get(pos.getX(), 0, pos.getZ(), JigsawStructuresContainer.class); + if (container == null) continue; + for (String key : container.getStructures()) { + cache.computeIfAbsent(key, k -> new KSet<>()).addAll(container.getPositions(key)); + } + } + } + Position2 pos = new Position2(x, z); + for (String structure : distances.keySet()) { + if (!cache.containsKey(structure)) continue; + double maxDist = distances.get(structure); + maxDist = maxDist * maxDist; + for (Position2 sPos : cache.get(structure)) { + double dist = distanceCache.computeIfAbsent(sPos, position2 -> position2.distance(pos)); + if (dist > maxDist) return true; } } return false; @@ -91,7 +131,7 @@ public class MantleJigsawComponent extends IrisMantleComponent { @ChunkCoordinates public IrisJigsawStructure guess(int x, int z) { // todo The guess doesnt bring into account that the placer may return -1 - boolean t = false; + // todo doesnt bring skipped placements into account RNG rng = new RNG(cng.fit(-Integer.MAX_VALUE, Integer.MAX_VALUE, x, z)); IrisBiome biome = getEngineMantle().getEngine().getSurfaceBiome((x << 4) + 8, (z << 4) + 8); IrisRegion region = getEngineMantle().getEngine().getRegion((x << 4) + 8, (z << 4) + 8); @@ -130,7 +170,7 @@ public class MantleJigsawComponent extends IrisMantleComponent { } @BlockCoordinates - private void place(MantleWriter writer, IrisPosition position, IrisJigsawStructure structure, RNG rng) { - new PlannedStructure(structure, position, rng).place(writer, getMantle(), writer.getEngine()); + private boolean place(MantleWriter writer, IrisPosition position, IrisJigsawStructure structure, RNG rng) { + return new PlannedStructure(structure, position, rng).place(writer, getMantle(), writer.getEngine()); } } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawDistance.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawDistance.java new file mode 100644 index 000000000..17cbda4c2 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawDistance.java @@ -0,0 +1,31 @@ +package com.volmit.iris.engine.object; + +import com.volmit.iris.engine.object.annotations.Desc; +import com.volmit.iris.engine.object.annotations.MaxNumber; +import com.volmit.iris.engine.object.annotations.MinNumber; +import com.volmit.iris.engine.object.annotations.RegistryListResource; +import com.volmit.iris.engine.object.annotations.Required; +import com.volmit.iris.engine.object.annotations.Snippet; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Snippet("jigsaw-structure-distance") +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Desc("Represents the min distance between jigsaw structure placements") +@Data +public class IrisJigsawDistance { + @Required + @RegistryListResource(IrisJigsawStructure.class) + @Desc("The structure to check against") + private String structure; + + @Required + @MinNumber(0) + @MaxNumber(5000) + @Desc("The min distance in blocks to a placed structure\nWARNING: The performance impact scales exponentially!") + private int distance; +} diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java index 609658e2d..2bb6faa70 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java @@ -18,10 +18,13 @@ package com.volmit.iris.engine.object; +import com.volmit.iris.engine.object.annotations.ArrayType; import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.RegistryListResource; import com.volmit.iris.engine.object.annotations.Required; import com.volmit.iris.engine.object.annotations.Snippet; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -45,4 +48,20 @@ public class IrisJigsawStructurePlacement { @Required @Desc("The 1 in X chance rarity") private int rarity = 100; + + @ArrayType(type = IrisJigsawDistance.class) + @Desc("List of distances to check for") + private KList distances = new KList<>(); + + public KMap collectDistances() { + KMap map = new KMap<>(); + for (IrisJigsawDistance d : distances) { + map.compute(d.getStructure(), (k, v) -> v != null ? Math.min(toChunks(d.getDistance()), v) : toChunks(d.getDistance())); + } + return map; + } + + private int toChunks(int blocks) { + return (int) Math.ceil(blocks / 16d); + } } diff --git a/core/src/main/java/com/volmit/iris/util/matter/slices/JigsawStructuresMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/JigsawStructuresMatter.java new file mode 100644 index 000000000..55803b946 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/matter/slices/JigsawStructuresMatter.java @@ -0,0 +1,35 @@ +package com.volmit.iris.util.matter.slices; + +import com.volmit.iris.util.data.palette.Palette; +import com.volmit.iris.util.matter.Sliced; +import com.volmit.iris.util.matter.slices.container.JigsawStructuresContainer; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +@Sliced +public class JigsawStructuresMatter extends RawMatter { + public JigsawStructuresMatter() { + this(1, 1, 1); + } + + public JigsawStructuresMatter(int width, int height, int depth) { + super(width, height, depth, JigsawStructuresContainer.class); + } + + @Override + public Palette getGlobalPalette() { + return null; + } + + @Override + public void writeNode(JigsawStructuresContainer b, DataOutputStream dos) throws IOException { + b.write(dos); + } + + @Override + public JigsawStructuresContainer readNode(DataInputStream din) throws IOException { + return new JigsawStructuresContainer(din); + } +} diff --git a/core/src/main/java/com/volmit/iris/util/matter/slices/container/JigsawStructuresContainer.java b/core/src/main/java/com/volmit/iris/util/matter/slices/container/JigsawStructuresContainer.java new file mode 100644 index 000000000..68d0f388f --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/matter/slices/container/JigsawStructuresContainer.java @@ -0,0 +1,62 @@ +package com.volmit.iris.util.matter.slices.container; + +import com.volmit.iris.engine.object.IrisJigsawStructure; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.documentation.ChunkCoordinates; +import com.volmit.iris.util.math.Position2; +import org.jetbrains.annotations.Unmodifiable; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class JigsawStructuresContainer { + private final Map> map = new KMap<>(); + + public JigsawStructuresContainer() {} + + public JigsawStructuresContainer(DataInputStream din) throws IOException { + int s0 = din.readInt(); + for (int i = 0; i < s0; i++) { + int s1 = din.readInt(); + KList list = new KList<>(s1); + for (int j = 0; j < s1; j++) { + list.add(new Position2(din.readInt(), din.readInt())); + } + map.put(din.readUTF(), list); + } + } + + public void write(DataOutputStream dos) throws IOException { + dos.writeInt(map.size()); + for (String key : map.keySet()) { + List list = map.get(key); + dos.writeInt(list.size()); + for (Position2 pos : list) { + dos.writeInt(pos.getX()); + dos.writeInt(pos.getZ()); + } + dos.writeUTF(key); + } + } + + @Unmodifiable + public Set getStructures() { + return Collections.unmodifiableSet(map.keySet()); + } + + @Unmodifiable + public List getPositions(String structure) { + return Collections.unmodifiableList(map.get(structure)); + } + + @ChunkCoordinates + public void add(IrisJigsawStructure structure, Position2 pos) { + map.computeIfAbsent(structure.getLoadKey(), k -> new KList<>()).add(pos); + } +} From c1d9cc62cbea71055aae43e54d3eb03fa5a84f2b Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Wed, 17 Apr 2024 21:21:18 +0200 Subject: [PATCH 3/8] woops --- .../java/com/volmit/iris/engine/object/IrisJigsawPiece.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java index 93c9f07bc..c69aca0e4 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawPiece.java @@ -102,7 +102,11 @@ public class IrisJigsawPiece extends IrisRegistrant { public IrisJigsawPiece copy() { var gson = getLoader().getGson(); - return gson.fromJson(gson.toJson(this), IrisJigsawPiece.class); + IrisJigsawPiece copy = gson.fromJson(gson.toJson(this), IrisJigsawPiece.class); + copy.setLoader(getLoader()); + copy.setLoadKey(getLoadKey()); + copy.setLoadFile(getLoadFile()); + return copy; } public boolean isTerminal() { From d7a283c99f5e17d59f7c24edd9b886d53505214d Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 18 Apr 2024 16:00:47 +0200 Subject: [PATCH 4/8] fix underwater jigsaw placement --- .../java/com/volmit/iris/engine/jigsaw/PlannedStructure.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ab402cf4c..fe727eebb 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 @@ -118,7 +118,7 @@ public class PlannedStructure { if (i.getStructure().getStructure().getOverrideYRange() != null) { height = (int) i.getStructure().getStructure().getOverrideYRange().get(rng, xx, zz, getData()); } else { - height = placer.getHighest(xx, zz, getData()); + height = placer.getHighest(xx, zz, getData(), options.isUnderwater()); } } else { height = i.getStructure().getStructure().getLockY(); From a7118aa785b3c1cf84eab13016ccfecfe59fa1b3 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 19 Apr 2024 15:18:11 +0200 Subject: [PATCH 5/8] fix jigsaw place command --- .../iris/core/commands/CommandJigsaw.java | 2 +- .../volmit/iris/engine/jigsaw/PlannedPiece.java | 17 +++++++---------- .../iris/engine/jigsaw/PlannedStructure.java | 14 ++++++++++++-- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java b/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java index 922041241..a59aa2a69 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandJigsaw.java @@ -57,7 +57,7 @@ public class CommandJigsaw implements DecreeExecutor { PrecisionStopwatch p = PrecisionStopwatch.start(); PlannedStructure ps = new PlannedStructure(structure, new IrisPosition(player().getLocation()), new RNG()); sender().sendMessage(C.GREEN + "Generated " + ps.getPieces().size() + " pieces in " + Form.duration(p.getMilliseconds(), 2)); - ps.place(world()); + ps.place(world(), failed -> sender().sendMessage(failed == 0 ? C.GREEN + "Placed the structure!" : C.RED + "Failed to place " + failed + " pieces!")); } @Decree(description = "Create a jigsaw piece") 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 e93fe5c7d..d2b0d43ea 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 @@ -165,7 +165,7 @@ public class PlannedPiece { return connected.size() >= piece.getConnectors().size() || isDead(); } - public void place(World world) { + public boolean place(World world) { PlatformChunkGenerator a = IrisToolbelt.access(world); int minY = 0; @@ -175,14 +175,16 @@ public class PlannedPiece { if (!a.getEngine().getDimension().isBedrock()) minY--; //If the dimension has no bedrock, allow it to go a block lower } + Engine engine = a != null ? a.getEngine() : IrisContext.get().getEngine(); getPiece().getPlacementOptions().setTranslate(new IrisObjectTranslate()); - getPiece().getPlacementOptions().setRotation(rotation); + getPiece().getPlacementOptions().getRotation().setEnabled(false); + getPiece().getPlacementOptions().setRotateTowardsSlope(false); int finalMinY = minY; RNG rng = getStructure().getRng().nextParallelRNG(37555); // TODO: REAL CLASSES!!!!!!! - getOgObject().place(position.getX() + getObject().getCenter().getBlockX(), position.getY() + getObject().getCenter().getBlockY(), position.getZ() + getObject().getCenter().getBlockZ(), new IObjectPlacer() { + return getObject().place(position.getX() + getObject().getCenter().getBlockX(), position.getY() + getObject().getCenter().getBlockY(), position.getZ() + getObject().getCenter().getBlockZ(), new IObjectPlacer() { @Override public int getHighest(int x, int z, IrisData data) { return position.getY(); @@ -207,7 +209,6 @@ public class PlannedPiece { IrisLootTable table = getPiece().getPlacementOptions().getTable(block.getBlockData(), getData()); if (table == null) return; - Engine engine = a.getEngine(); engine.addItems(false, ((InventoryHolder) block.getState()).getInventory(), rng.nextParallelRNG(BlockPosition.toLong(x, y, z)), new KList<>(table), InventorySlotType.STORAGE, x, y, z, 15); @@ -258,12 +259,8 @@ public class PlannedPiece { @Override public Engine getEngine() { - if (IrisToolbelt.isIrisWorld(world)) { - return IrisToolbelt.access(world).getEngine(); - } - - return IrisContext.get().getEngine(); + return engine; } - }, piece.getPlacementOptions(), rng, getData()); + }, piece.getPlacementOptions(), rng, getData().getEngine() == null ? engine.getData() : getData()) != -1; } } 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 fe727eebb..36cdcaa00 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 @@ -34,6 +34,9 @@ import lombok.Data; import org.bukkit.Axis; import org.bukkit.World; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.IntConsumer; + @Data public class PlannedStructure { private static ConcurrentLinkedHashMap objectRotationCache @@ -138,9 +141,16 @@ public class PlannedStructure { }, null, getData()) != -1; } - public void place(World world) { + public void place(World world, IntConsumer consumer) { + AtomicInteger processed = new AtomicInteger(); + AtomicInteger failures = new AtomicInteger(); for (PlannedPiece i : pieces) { - Iris.sq(() -> i.place(world)); + Iris.sq(() -> { + if (!i.place(world)) failures.incrementAndGet(); + if (processed.incrementAndGet() == pieces.size()) { + consumer.accept(failures.get()); + } + }); } } From 79a4ebcf65c08d65fd05c1ccd84f4b3340fec85d Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 19 Apr 2024 15:29:28 +0200 Subject: [PATCH 6/8] woops --- .../engine/mantle/components/MantleJigsawComponent.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java index 14ebeb45d..2236723fc 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java @@ -118,11 +118,11 @@ public class MantleJigsawComponent extends IrisMantleComponent { Position2 pos = new Position2(x, z); for (String structure : distances.keySet()) { if (!cache.containsKey(structure)) continue; - double maxDist = distances.get(structure); - maxDist = maxDist * maxDist; + double minDist = distances.get(structure); + minDist = minDist * minDist; for (Position2 sPos : cache.get(structure)) { double dist = distanceCache.computeIfAbsent(sPos, position2 -> position2.distance(pos)); - if (dist > maxDist) return true; + if (minDist > dist) return true; } } return false; From 0e666a4c35786ca7c87f28e746c4a0a895d06f4d Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Mon, 22 Apr 2024 14:23:45 +0200 Subject: [PATCH 7/8] change rng noise for jigsaw component --- .../mantle/components/MantleJigsawComponent.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java index 2236723fc..69f815fb1 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java @@ -18,6 +18,7 @@ package com.volmit.iris.engine.mantle.components; +import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.jigsaw.PlannedStructure; import com.volmit.iris.engine.mantle.EngineMantle; import com.volmit.iris.engine.mantle.IrisMantleComponent; @@ -34,20 +35,25 @@ import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.matter.slices.container.JigsawStructuresContainer; import com.volmit.iris.util.noise.CNG; +import com.volmit.iris.util.noise.NoiseType; import java.util.List; public class MantleJigsawComponent extends IrisMantleComponent { - private final CNG cng; public MantleJigsawComponent(EngineMantle engineMantle) { super(engineMantle, MantleFlag.JIGSAW); - cng = NoiseStyle.STATIC.create(new RNG(engineMantle.getEngine().getSeedManager().getJigsaw())); + } + + private RNG applyNoise(int x, int z) { + long seed = Cache.key(x, z) + getEngineMantle().getEngine().getSeedManager().getJigsaw(); + CNG cng = CNG.signatureFast(new RNG(seed), NoiseType.WHITE, NoiseType.GLOB); + return new RNG((long) (seed * cng.noise(x, z))); } @Override public void generateLayer(MantleWriter writer, int x, int z, ChunkContext context) { - RNG rng = new RNG(cng.fit(-Integer.MAX_VALUE, Integer.MAX_VALUE, x, z)); + RNG rng = applyNoise(x, z); int xxx = 8 + (x << 4); int zzz = 8 + (z << 4); IrisRegion region = getComplex().getRegionStream().get(xxx, zzz); @@ -132,7 +138,7 @@ public class MantleJigsawComponent extends IrisMantleComponent { public IrisJigsawStructure guess(int x, int z) { // todo The guess doesnt bring into account that the placer may return -1 // todo doesnt bring skipped placements into account - RNG rng = new RNG(cng.fit(-Integer.MAX_VALUE, Integer.MAX_VALUE, x, z)); + RNG rng = applyNoise(x, z); IrisBiome biome = getEngineMantle().getEngine().getSurfaceBiome((x << 4) + 8, (z << 4) + 8); IrisRegion region = getEngineMantle().getEngine().getRegion((x << 4) + 8, (z << 4) + 8); From cb9a73c60ed397c1414f4444f146f1683d113c2f Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Tue, 23 Apr 2024 10:28:04 +0200 Subject: [PATCH 8/8] rename IrisJigsawDistance to IrisJigsawMinDistance to avoid confusion --- .../mantle/components/MantleJigsawComponent.java | 10 +++++----- ...sJigsawDistance.java => IrisJigsawMinDistance.java} | 6 ++---- .../engine/object/IrisJigsawStructurePlacement.java | 10 +++++----- 3 files changed, 12 insertions(+), 14 deletions(-) rename core/src/main/java/com/volmit/iris/engine/object/{IrisJigsawDistance.java => IrisJigsawMinDistance.java} (85%) diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java index 69f815fb1..f10ff67c7 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java @@ -92,7 +92,7 @@ public class MantleJigsawComponent extends IrisMantleComponent { KSet cachedRegions, KMap> cache, KMap distanceCache) { for (IrisJigsawStructurePlacement i : structures) { if (rng.nextInt(i.getRarity()) == 0) { - if (checkDistances(i.collectDistances(), x, z, cachedRegions, cache, distanceCache)) + if (checkMinDistances(i.collectMinDistances(), x, z, cachedRegions, cache, distanceCache)) continue; IrisPosition position = new IrisPosition((x << 4) + rng.nextInt(15), 0, (z << 4) + rng.nextInt(15)); IrisJigsawStructure structure = getData().getJigsawStructureLoader().load(i.getStructure()); @@ -104,9 +104,9 @@ public class MantleJigsawComponent extends IrisMantleComponent { } @ChunkCoordinates - private boolean checkDistances(KMap distances, int x, int z, KSet cachedRegions, KMap> cache, KMap distanceCache) { + private boolean checkMinDistances(KMap minDistances, int x, int z, KSet cachedRegions, KMap> cache, KMap distanceCache) { int range = 0; - for (int d : distances.values()) + for (int d : minDistances.values()) range = Math.max(range, d); for (int xx = -range; xx <= range; xx++) { @@ -122,9 +122,9 @@ public class MantleJigsawComponent extends IrisMantleComponent { } } Position2 pos = new Position2(x, z); - for (String structure : distances.keySet()) { + for (String structure : minDistances.keySet()) { if (!cache.containsKey(structure)) continue; - double minDist = distances.get(structure); + double minDist = minDistances.get(structure); minDist = minDist * minDist; for (Position2 sPos : cache.get(structure)) { double dist = distanceCache.computeIfAbsent(sPos, position2 -> position2.distance(pos)); diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawDistance.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawMinDistance.java similarity index 85% rename from core/src/main/java/com/volmit/iris/engine/object/IrisJigsawDistance.java rename to core/src/main/java/com/volmit/iris/engine/object/IrisJigsawMinDistance.java index 17cbda4c2..818f4b3dd 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawDistance.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawMinDistance.java @@ -1,7 +1,6 @@ package com.volmit.iris.engine.object; import com.volmit.iris.engine.object.annotations.Desc; -import com.volmit.iris.engine.object.annotations.MaxNumber; import com.volmit.iris.engine.object.annotations.MinNumber; import com.volmit.iris.engine.object.annotations.RegistryListResource; import com.volmit.iris.engine.object.annotations.Required; @@ -11,13 +10,13 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -@Snippet("jigsaw-structure-distance") +@Snippet("jigsaw-structure-min-distance") @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor @Desc("Represents the min distance between jigsaw structure placements") @Data -public class IrisJigsawDistance { +public class IrisJigsawMinDistance { @Required @RegistryListResource(IrisJigsawStructure.class) @Desc("The structure to check against") @@ -25,7 +24,6 @@ public class IrisJigsawDistance { @Required @MinNumber(0) - @MaxNumber(5000) @Desc("The min distance in blocks to a placed structure\nWARNING: The performance impact scales exponentially!") private int distance; } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java index 2bb6faa70..16eea76e8 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisJigsawStructurePlacement.java @@ -49,13 +49,13 @@ public class IrisJigsawStructurePlacement { @Desc("The 1 in X chance rarity") private int rarity = 100; - @ArrayType(type = IrisJigsawDistance.class) - @Desc("List of distances to check for") - private KList distances = new KList<>(); + @ArrayType(type = IrisJigsawMinDistance.class) + @Desc("List of minimum distances to check for") + private KList minDistances = new KList<>(); - public KMap collectDistances() { + public KMap collectMinDistances() { KMap map = new KMap<>(); - for (IrisJigsawDistance d : distances) { + for (IrisJigsawMinDistance d : minDistances) { map.compute(d.getStructure(), (k, v) -> v != null ? Math.min(toChunks(d.getDistance()), v) : toChunks(d.getDistance())); } return map;