diff --git a/src/main/java/com/volmit/iris/engine/IrisEngineParallax.java b/src/main/java/com/volmit/iris/engine/IrisEngineParallax.java index 491ca1592..186efd811 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngineParallax.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngineParallax.java @@ -19,12 +19,15 @@ package com.volmit.iris.engine; import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; +import com.volmit.iris.engine.cache.Cache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineParallaxManager; import com.volmit.iris.engine.object.IrisFeaturePositional; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.scheduling.IrisLock; import lombok.Getter; +import org.bukkit.util.Consumer; public class IrisEngineParallax implements EngineParallaxManager { @Getter @@ -33,10 +36,6 @@ public class IrisEngineParallax implements EngineParallaxManager { @Getter private final int parallaxSize; - @Getter - private final IrisLock featureLock = new IrisLock("Feature"); - - @Getter private final ConcurrentLinkedHashMap> featureCache = new ConcurrentLinkedHashMap.Builder>() .initialCapacity(1024) .maximumWeightedCapacity(1024) @@ -47,4 +46,39 @@ public class IrisEngineParallax implements EngineParallaxManager { this.engine = engine; parallaxSize = computeParallaxSize(); } + + @Override + @BlockCoordinates + public void forEachFeature(double x, double z, Consumer f) { + if (!getEngine().getDimension().hasFeatures(getEngine())) { + return; + } + + for (IrisFeaturePositional ipf : forEachFeature(x, z)) { + f.accept(ipf); + } + } + + @Override + @BlockCoordinates + public KList forEachFeature(double x, double z) { + int cx = ((int)x) >> 4; + int cz = ((int)x) >> 4; + long key = Cache.key(cx, cz); + + return featureCache.compute(key, (k, v) -> { + if(v != null) + { + return v; + } + + KList pos = new KList<>(); + pos.addAll(EngineParallaxManager.super.forEachFeature(cx << 4, cz << 4)); + pos.addAll(EngineParallaxManager.super.forEachFeature((cx << 4) + 15, cz << 4)); + pos.addAll(EngineParallaxManager.super.forEachFeature(cx << 4, (cz << 4) + 15)); + pos.addAll(EngineParallaxManager.super.forEachFeature((cx << 4) + 15, (cz << 4) + 15)); + pos.removeDuplicates(); + return pos; + }); + } } diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java index 0289baa09..9ebfe4567 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java @@ -200,10 +200,6 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { } } - ConcurrentLinkedHashMap> getFeatureCache(); - - IrisLock getFeatureLock(); - @BlockCoordinates default void forEachFeature(double x, double z, Consumer f) { if (!getEngine().getDimension().hasFeatures(getEngine())) {