From 0b1d59e39824560a6ec719a0845a03301b5cf262 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Mon, 13 Sep 2021 16:33:24 -0400 Subject: [PATCH] Marker destruction --- .../com/volmit/iris/engine/IrisWorldManager.java | 3 +++ .../com/volmit/iris/engine/jigsaw/PlannedPiece.java | 5 +++++ .../volmit/iris/engine/object/IrisEntitySpawn.java | 8 ++++++++ .../com/volmit/iris/engine/object/IrisMarker.java | 9 +++++++++ .../com/volmit/iris/engine/object/IrisObject.java | 13 ++++++++++++- .../com/volmit/iris/engine/object/IrisSpawner.java | 3 +++ 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java index a60729eba..a0a6dd8e4 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -398,6 +398,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager { private Stream stream(IrisSpawner s, boolean initial) { for (IrisEntitySpawn i : initial ? s.getInitialSpawns() : s.getSpawns()) { i.setReferenceSpawner(s); + i.setReferenceMarker(s.getReferenceMarker()); } return (initial ? s.getInitialSpawns() : s.getSpawns()).stream(); @@ -471,6 +472,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager { IrisEntitySpawn ss = spawnRandomly(s).getRandom(); ss.setReferenceSpawner(spawner); + ss.setReferenceMarker(spawner.getReferenceMarker()); spawn(block, ss); } @@ -496,6 +498,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager { IrisPosition pos = new IrisPosition((c.getX() << 4) + x, y, (c.getZ() << 4) + z); for (String i : mark.getSpawners()) { IrisSpawner m = getData().getSpawnerLoader().load(i); + m.setReferenceMarker(mark); if (m != null) { p.computeIfAbsent(pos, (k) -> new KSet<>()).add(m); diff --git a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java b/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java index 5ed796b2c..da80cce9f 100644 --- a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java +++ b/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java @@ -243,6 +243,11 @@ public class PlannedPiece { @Override public Engine getEngine() { + if(IrisToolbelt.isIrisWorld(world)) + { + return IrisToolbelt.access(world).getEngine(); + } + return IrisContext.get().getEngine(); } }, piece.getPlacementOptions(), rng, getData()); diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java b/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java index 9ffef5653..96c7f9643 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java @@ -28,6 +28,7 @@ import com.volmit.iris.engine.object.annotations.Required; import com.volmit.iris.engine.object.annotations.Snippet; import com.volmit.iris.util.format.C; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.matter.MatterMarker; import com.volmit.iris.util.matter.slices.MarkerMatter; import lombok.AllArgsConstructor; import lombok.Data; @@ -63,6 +64,7 @@ public class IrisEntitySpawn implements IRare { @Desc("The max of this entity to spawn") private int maxSpawns = 1; private transient IrisSpawner referenceSpawner; + private transient IrisMarker referenceMarker; public int spawn(Engine gen, Chunk c, RNG rng) { int spawns = minSpawns == maxSpawns ? minSpawns : rng.i(Math.min(minSpawns, maxSpawns), Math.max(minSpawns, maxSpawns)); @@ -110,6 +112,12 @@ public class IrisEntitySpawn implements IRare { World world = gen.getWorld().realWorld(); if (spawns > 0) { + + if(referenceMarker != null) + { + gen.getMantle().getMantle().remove(c.getX(), c.getY(), c.getZ(), MatterMarker.class); + } + for (int id = 0; id < spawns; id++) { Location l = c.toLocation(world).add(0, 1, 0); diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMarker.java b/src/main/java/com/volmit/iris/engine/object/IrisMarker.java index 39663b2c2..625e92049 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisMarker.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisMarker.java @@ -24,6 +24,7 @@ import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.RegistryListResource; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.plugin.VolmitSender; import lombok.AllArgsConstructor; import lombok.Data; @@ -46,6 +47,14 @@ public class IrisMarker extends IrisRegistrant { @Desc("Remove this marker when the block it's assigned to is changed.") private boolean removeOnChange = true; + @Desc("If this marker is used, what is the chance it removes itself. For example 25% (0.25) would mean that on average 4 uses will remove a specific marker. Set this below 0 (-1) to never exhaust & set this to 1 or higher to always exhaust on first use.") + private double exhaustionChance = 0.33; + + public boolean shouldExhaust() + { + return RNG.r.chance(exhaustionChance); + } + @Override public String getFolderName() { return "markers"; diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/src/main/java/com/volmit/iris/engine/object/IrisObject.java index 618590262..714447417 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -504,7 +504,7 @@ public class IrisObject extends IrisRegistrant { } public int place(int x, int yv, int z, IObjectPlacer oplacer, IrisObjectPlacement config, RNG rng, Consumer listener, CarveResult c, IrisData rdata) { - IObjectPlacer placer = (config.getHeightmap() != null) ? new HeightmapObjectPlacer(IrisContext.get().getEngine(), rng, x, yv, z, config, oplacer) : oplacer; + IObjectPlacer placer = (config.getHeightmap() != null) ? new HeightmapObjectPlacer(oplacer.getEngine() == null ? IrisContext.get().getEngine() : oplacer.getEngine(), rng, x, yv, z, config, oplacer) : oplacer; if (config.isSmartBore()) { ensureSmartBored(placer.isDebugSmartBore()); @@ -667,9 +667,19 @@ public class IrisObject extends IrisRegistrant { for(BlockVector i : getBlocks().k().shuffle()) { + if(max <= 0) + { + break; + } + BlockData data = getBlocks().get(i); for (BlockData k : j.getMark(rdata)) { + if(max <= 0) + { + break; + } + if (j.isExact() ? k.matches(data) : k.getMaterial().equals(data.getMaterial())) { boolean a = !blocks.containsKey(new BlockVector(i.clone().add(new BlockVector(0, 1, 0)))); boolean fff = !blocks.containsKey(new BlockVector(i.clone().add(new BlockVector(0, 2, 0)))); @@ -677,6 +687,7 @@ public class IrisObject extends IrisRegistrant { if((j.isEmptyAbove() && a && fff) || !j.isEmptyAbove()) { markers.put(i, j.getMarker()); + max--; } } } diff --git a/src/main/java/com/volmit/iris/engine/object/IrisSpawner.java b/src/main/java/com/volmit/iris/engine/object/IrisSpawner.java index b5ae5191f..04ec09c1f 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisSpawner.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisSpawner.java @@ -38,6 +38,9 @@ import org.bukkit.World; @Desc("Represents an entity spawn during initial chunk generation") @Data public class IrisSpawner extends IrisRegistrant { + + private transient IrisMarker referenceMarker; + @ArrayType(min = 1, type = IrisEntitySpawn.class) @Desc("The entity spawns to add") private KList spawns = new KList<>();