diff --git a/core/src/main/java/com/volmit/iris/core/loader/IrisData.java b/core/src/main/java/com/volmit/iris/core/loader/IrisData.java index 404958e79..87a45076b 100644 --- a/core/src/main/java/com/volmit/iris/core/loader/IrisData.java +++ b/core/src/main/java/com/volmit/iris/core/loader/IrisData.java @@ -250,9 +250,19 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { } } - if (engine != null && t.getPreprocessors().isNotEmpty()) { + if (engine == null) return; + var global = engine.getDimension().getPreProcessors(t.getFolderName()); + var local = t.getPreprocessors(); + if ((global != null && global.isNotEmpty()) || local.isNotEmpty()) { synchronized (this) { - for (String i : t.getPreprocessors()) { + if (global != null) { + for (String i : global) { + engine.getExecution().preprocessObject(i, t); + Iris.debug("Loader<" + C.GREEN + t.getTypeName() + C.LIGHT_PURPLE + "> iprocess " + C.YELLOW + t.getLoadKey() + C.LIGHT_PURPLE + " in " + i); + } + } + + for (String i : local) { engine.getExecution().preprocessObject(i, t); Iris.debug("Loader<" + C.GREEN + t.getTypeName() + C.LIGHT_PURPLE + "> iprocess " + C.YELLOW + t.getLoadKey() + C.LIGHT_PURPLE + " in " + i); } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java index f2c5b724c..a765e167a 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java @@ -28,6 +28,7 @@ import com.volmit.iris.core.nms.datapack.IDataFixer; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.*; 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.data.DataProvider; import com.volmit.iris.util.io.IO; @@ -66,6 +67,7 @@ public class IrisDimension extends IrisRegistrant { private final transient AtomicCache rad = new AtomicCache<>(); private final transient AtomicCache featuresUsed = new AtomicCache<>(); private final transient AtomicCache> strongholdsCache = new AtomicCache<>(); + private final transient AtomicCache>> cachedPreProcessors = new AtomicCache<>(); @MinNumber(2) @Required @Desc("The human readable name of this dimension") @@ -244,6 +246,10 @@ public class IrisDimension extends IrisRegistrant { @MaxNumber(318) @Desc("The Subterrain Fluid Layer Height") private int caveLavaHeight = 8; + @MinNumber(1) + @Desc("A list of globally applied pre-processors") + @ArrayType(type = IrisPreProcessors.class) + private KList globalPreProcessors = new KList<>(); public int getMaxHeight() { return (int) getDimensionHeight().getMax(); @@ -362,6 +368,17 @@ public class IrisDimension extends IrisRegistrant { return r; } + public KList getPreProcessors(String type) { + return cachedPreProcessors.aquire(() -> { + KMap> preProcessors = new KMap<>(); + for (var entry : globalPreProcessors) { + preProcessors.computeIfAbsent(entry.getType(), k -> new KList<>()) + .addAll(entry.getScripts()); + } + return preProcessors; + }).get(type); + } + public IrisGeneratorStyle getBiomeStyle(InferredType type) { switch (type) { case CAVE: diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisPreProcessors.java b/core/src/main/java/com/volmit/iris/engine/object/IrisPreProcessors.java new file mode 100644 index 000000000..fb62a9d78 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisPreProcessors.java @@ -0,0 +1,25 @@ +package com.volmit.iris.engine.object; + +import com.volmit.iris.engine.object.annotations.*; +import com.volmit.iris.engine.object.annotations.functions.ResourceLoadersFunction; +import com.volmit.iris.util.collection.KList; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Desc("Represents global preprocessors") +public class IrisPreProcessors { + @Required + @Desc("The preprocessor type") + @RegistryListFunction(ResourceLoadersFunction.class) + private String type = "dimension"; + + @Required + @Desc("The preprocessor scripts") + @RegistryListResource(IrisScript.class) + @ArrayType(type = String.class, min = 1) + private KList scripts = new KList<>(); +} diff --git a/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ResourceLoadersFunction.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ResourceLoadersFunction.java new file mode 100644 index 000000000..943a96113 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ResourceLoadersFunction.java @@ -0,0 +1,28 @@ +package com.volmit.iris.engine.object.annotations.functions; + +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.loader.ResourceLoader; +import com.volmit.iris.engine.framework.ListFunction; +import com.volmit.iris.util.collection.KList; + +public class ResourceLoadersFunction implements ListFunction> { + @Override + public String key() { + return "resource-loader"; + } + + @Override + public String fancyName() { + return "Resource Loader"; + } + + @Override + public KList apply(IrisData data) { + return data.getLoaders() + .values() + .stream() + .filter(rl -> ResourceLoader.class.equals(rl.getClass())) + .map(ResourceLoader::getFolderName) + .collect(KList.collector()); + } +}