From c4fe14bd4519ed475fcfa61de01b5d9eda8be695 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sun, 12 Sep 2021 10:42:36 -0400 Subject: [PATCH] Reduced updates --- .../iris/core/commands/CommandObject.java | 6 +++ .../com/volmit/iris/core/service/TreeSVC.java | 6 +++ .../volmit/iris/engine/IrisWorldManager.java | 12 +++--- .../placer/HeightmapObjectPlacer.java | 10 ++++- .../iris/engine/jigsaw/PlannedPiece.java | 6 +++ .../iris/engine/mantle/EngineMantle.java | 2 + .../iris/engine/mantle/MantleWriter.java | 6 +++ .../iris/engine/object/IObjectPlacer.java | 3 ++ .../volmit/iris/engine/object/IrisObject.java | 39 ++++++++++++++++++- .../iris/engine/object/IrisObjectMarker.java | 36 ++++++++++++++--- .../engine/object/IrisObjectPlacement.java | 3 ++ 11 files changed, 117 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/commands/CommandObject.java b/src/main/java/com/volmit/iris/core/commands/CommandObject.java index 3aa306a2e..130e9ea2d 100644 --- a/src/main/java/com/volmit/iris/core/commands/CommandObject.java +++ b/src/main/java/com/volmit/iris/core/commands/CommandObject.java @@ -23,6 +23,7 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.service.ObjectSVC; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.service.WandSVC; +import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IObjectPlacer; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisObject; @@ -138,6 +139,11 @@ public class CommandObject implements DecreeExecutor { tile.toBukkitTry(state); state.update(); } + + @Override + public Engine getEngine() { + return null; + } }; } diff --git a/src/main/java/com/volmit/iris/core/service/TreeSVC.java b/src/main/java/com/volmit/iris/core/service/TreeSVC.java index 4f508534e..eac9e8117 100644 --- a/src/main/java/com/volmit/iris/core/service/TreeSVC.java +++ b/src/main/java/com/volmit/iris/core/service/TreeSVC.java @@ -138,6 +138,7 @@ public class TreeSVC implements IrisService { List blockStateList = new KList<>(); KMap dataCache = new KMap<>(); // TODO: REAL CLASSES!!!! + IObjectPlacer placer = new IObjectPlacer() { @Override @@ -198,6 +199,11 @@ public class TreeSVC implements IrisService { public void setTile(int xx, int yy, int zz, TileData tile) { } + + @Override + public Engine getEngine() { + return engine; + } }; object.place( diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java index 67d938f22..7adf5e07f 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -95,7 +95,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager { public IrisWorldManager(Engine engine) { super(engine); - chunkUpdater = new ChronoLatch(1000); + chunkUpdater = new ChronoLatch(3000); cln = new ChronoLatch(60000); cl = new ChronoLatch(3000); ecl = new ChronoLatch(250); @@ -115,6 +115,11 @@ public class IrisWorldManager extends EngineAssignedWorldManager { } if (getEngine().getWorld().hasRealWorld()) { + if(getEngine().getWorld().getPlayers().isEmpty()) + { + return 5000; + } + if (chunkUpdater.flip()) { updateChunks(); } @@ -156,7 +161,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager { onAsyncTick(); } - return 250; + return 700; } }; looper.setPriority(Thread.MIN_PRIORITY); @@ -447,9 +452,6 @@ public class IrisWorldManager extends EngineAssignedWorldManager { })); energy += 0.3; fixEnergy(); - if (!getMantle().hasFlag(e.getX(), e.getZ(), MantleFlag.UPDATE)) { - J.a(() -> getEngine().updateChunk(e), 20); - } } private void spawn(IrisPosition block, IrisSpawner spawner, boolean initial) { diff --git a/src/main/java/com/volmit/iris/engine/framework/placer/HeightmapObjectPlacer.java b/src/main/java/com/volmit/iris/engine/framework/placer/HeightmapObjectPlacer.java index 26b3185f4..953ac7b3d 100644 --- a/src/main/java/com/volmit/iris/engine/framework/placer/HeightmapObjectPlacer.java +++ b/src/main/java/com/volmit/iris/engine/framework/placer/HeightmapObjectPlacer.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.framework.placer; import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IObjectPlacer; import com.volmit.iris.engine.object.IrisObjectPlacement; import com.volmit.iris.engine.object.TileData; @@ -30,11 +31,13 @@ public class HeightmapObjectPlacer implements IObjectPlacer { private final long s; private final IrisObjectPlacement config; private final IObjectPlacer oplacer; + private final Engine engine; - public HeightmapObjectPlacer(RNG rng, int x, int yv, int z, IrisObjectPlacement config, IObjectPlacer oplacer) { + public HeightmapObjectPlacer(Engine engine, RNG rng, int x, int yv, int z, IrisObjectPlacement config, IObjectPlacer oplacer) { s = rng.nextLong() + yv + z - x; this.config = config; this.oplacer = oplacer; + this.engine = engine; } public int getHighest(int param1Int1, int param1Int2, IrisData data) { @@ -81,4 +84,9 @@ public class HeightmapObjectPlacer implements IObjectPlacer { public void setTile(int param1Int1, int param1Int2, int param1Int3, TileData param1TileData) { oplacer.setTile(param1Int1, param1Int2, param1Int3, param1TileData); } + + @Override + public Engine getEngine() { + return null; + } } 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 70c08985d..5ed796b2c 100644 --- a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java +++ b/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java @@ -33,6 +33,7 @@ import com.volmit.iris.engine.object.IrisPosition; import com.volmit.iris.engine.object.TileData; import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.math.AxisAlignedBB; import com.volmit.iris.util.math.BlockPosition; import com.volmit.iris.util.math.RNG; @@ -239,6 +240,11 @@ public class PlannedPiece { tile.toBukkitTry(state); state.update(); } + + @Override + public Engine getEngine() { + return IrisContext.get().getEngine(); + } }, piece.getPlacementOptions(), rng, getData()); } } diff --git a/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index d6d476a26..b940073c7 100644 --- a/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -28,6 +28,7 @@ import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisPosition; import com.volmit.iris.engine.object.TileData; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.data.B; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; @@ -203,6 +204,7 @@ public interface EngineMantle extends IObjectPlacer { int xx = i + x; int zz = j + z; burst.queue(() -> { + IrisContext.touch(getEngine().getContext()); MantleChunk mc = getMantle().getChunk(xx, zz); for (MantleComponent k : getComponents()) { diff --git a/src/main/java/com/volmit/iris/engine/mantle/MantleWriter.java b/src/main/java/com/volmit/iris/engine/mantle/MantleWriter.java index 7ee2035ac..cfda683b8 100644 --- a/src/main/java/com/volmit/iris/engine/mantle/MantleWriter.java +++ b/src/main/java/com/volmit/iris/engine/mantle/MantleWriter.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList; 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.object.IObjectPlacer; import com.volmit.iris.engine.object.IrisPosition; import com.volmit.iris.engine.object.TileData; @@ -201,6 +202,11 @@ public class MantleWriter implements IObjectPlacer { getEngineMantle().setTile(xx, yy, zz, tile); } + @Override + public Engine getEngine() { + return getEngineMantle().getEngine(); + } + /** * Set a sphere into the mantle * diff --git a/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java b/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java index 8a8fcf3a6..614eb1658 100644 --- a/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java +++ b/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.object; import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.engine.framework.Engine; import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; @@ -44,4 +45,6 @@ public interface IObjectPlacer { boolean isDebugSmartBore(); void setTile(int xx, int yy, int zz, TileData tile); + + Engine getEngine(); } 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 b236d7f77..229faadc2 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -22,9 +22,11 @@ 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; +import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.data.B; import com.volmit.iris.util.interpolation.IrisInterpolation; import com.volmit.iris.util.json.JSONObject; @@ -32,6 +34,7 @@ import com.volmit.iris.util.math.AxisAlignedBB; import com.volmit.iris.util.math.BlockPosition; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.matter.MatterMarker; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.IrisLock; import lombok.EqualsAndHashCode; @@ -484,7 +487,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(rng, x, yv, z, config, oplacer) : oplacer; + IObjectPlacer placer = (config.getHeightmap() != null) ? new HeightmapObjectPlacer(IrisContext.get().getEngine(), rng, x, yv, z, config, oplacer) : oplacer; if (config.isSmartBore()) { ensureSmartBored(placer.isDebugSmartBore()); @@ -634,7 +637,36 @@ public class IrisObject extends IrisRegistrant { int lowest = Integer.MAX_VALUE; y += yrand; readLock.lock(); + + KMap markers = null; + try { + if(config.getMarkers().isNotEmpty() && placer.getEngine() != null) + { + markers = new KMap<>(); + for(IrisObjectMarker j : config.getMarkers()) + { + int max = j.getMaximumMarkers(); + + for(BlockVector i : getBlocks().k().shuffle()) + { + BlockData data = getBlocks().get(i); + + for (BlockData k : j.getMark(rdata)) { + 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)))); + + if((j.isEmptyAbove() && a && fff) || !j.isEmptyAbove()) + { + markers.put(i, j.getMarker()); + } + } + } + } + } + } + for (BlockVector g : getBlocks().keySet()) { BlockData d; TileData tile = null; @@ -720,6 +752,11 @@ public class IrisObject extends IrisRegistrant { listener.accept(new BlockPosition(xx, yy, zz)); } + if(markers != null && markers.containsKey(g)) + { + placer.getEngine().getMantle().getMantle().set(xx,yy,zz,new MatterMarker(markers.get(g))); + } + if (!data.getMaterial().equals(Material.AIR) && !data.getMaterial().equals(Material.CAVE_AIR)) { placer.set(xx, yy, zz, data); diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectMarker.java b/src/main/java/com/volmit/iris/engine/object/IrisObjectMarker.java index c8f421684..d9be1924c 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObjectMarker.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObjectMarker.java @@ -18,10 +18,13 @@ package com.volmit.iris.engine.object; +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.ArrayType; 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 com.volmit.iris.util.collection.KList; @@ -29,6 +32,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import org.bukkit.block.data.BlockData; @Snippet("object-marker") @Accessors(chain = true) @@ -47,11 +51,33 @@ public class IrisObjectMarker { @Desc("The maximum amount of markers to place. Use these sparingly!") private int maximumMarkers = 8; - @MinNumber(0.01) - @MaxNumber(1) - @Desc("The percentage of blocks in this object to check.") - private double checkRatio = 0.33; - @Desc("If true, markers will only be placed here if there is 2 air blocks above it.") private boolean emptyAbove = true; + + @Desc("If true, markers will only be placed if the block matches the mark list perfectly.") + private boolean exact = false; + + @Required + @RegistryListResource(IrisMarker.class) + @Desc("The marker to add") + private String marker; + + private final transient AtomicCache> findData = new AtomicCache<>(); + + public KList getMark(IrisData rdata) { + return findData.aquire(() -> + { + KList b = new KList<>(); + + for (IrisBlockData i : mark) { + BlockData bx = i.getBlockData(rdata); + + if (bx != null) { + b.add(bx); + } + } + + return b; + }); + } } diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java b/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java index 63bd897f4..b3db6b459 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObjectPlacement.java @@ -82,6 +82,9 @@ public class IrisObjectPlacement { @MinNumber(0) @Desc("When bore is enabled, expand max-y of the cuboid it removes") private int boreExtendMaxY = 0; + @ArrayType(min = 1,type = IrisObjectMarker.class) + @Desc("Add markers to blocks in this object") + private KList markers = new KList<>(); @MaxNumber(64) @MinNumber(-1) @Desc("When bore is enabled, lower min-y of the cuboid it removes")