From 67f456cf531d97bd6bc1b46204df6aa8b1a47dfe Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Thu, 31 Jul 2025 00:16:23 +0200 Subject: [PATCH] cleanup script engine --- core/src/main/java/com/volmit/iris/Iris.java | 2 - .../com/volmit/iris/core/loader/IrisData.java | 6 +- .../volmit/iris/core/project/IrisProject.java | 4 +- .../core/scripting/ExecutionEnvironment.java | 73 ------------------- .../environment/EngineEnvironment.java | 25 +++++++ .../environment/PackEnvironment.java | 19 +++++ .../environment/SimpleEnvironment.java | 30 ++++++++ .../com/volmit/iris/engine/IrisEngine.java | 6 +- .../volmit/iris/engine/framework/Engine.java | 4 +- .../scripting/kotlin/base/SimpleScript.kt | 4 +- .../environment/IrisExecutionEnvironment.kt | 6 +- .../IrisPackExecutionEnvironment.kt | 6 +- .../IrisSimpleExecutionEnvironment.kt | 12 +-- .../kotlin/runner/FileDependenciesResolver.kt | 65 +++++++++++++++++ .../scripting/kotlin/runner/ScriptRunner.kt | 25 +++++-- .../core/scripting/kotlin/runner/Utils.kt | 26 ++----- 16 files changed, 191 insertions(+), 122 deletions(-) delete mode 100644 core/src/main/java/com/volmit/iris/core/scripting/ExecutionEnvironment.java create mode 100644 core/src/main/java/com/volmit/iris/core/scripting/environment/EngineEnvironment.java create mode 100644 core/src/main/java/com/volmit/iris/core/scripting/environment/PackEnvironment.java create mode 100644 core/src/main/java/com/volmit/iris/core/scripting/environment/SimpleEnvironment.java create mode 100644 core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/runner/FileDependenciesResolver.kt diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index c137a7f63..178c2e35f 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -30,7 +30,6 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; import com.volmit.iris.core.pregenerator.LazyPregenerator; -import com.volmit.iris.core.scripting.ExecutionEnvironment; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.EnginePanic; @@ -447,7 +446,6 @@ public class Iris extends VolmitPlugin implements Listener { IO.delete(new File("iris")); compat = IrisCompat.configured(getDataFile("compat.json")); ServerConfigurator.configure(); - ExecutionEnvironment.createSimple(); IrisSafeguard.IrisSafeguardSystem(); getSender().setTag(getTag()); IrisSafeguard.splash(true); 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 bd17e6ceb..e06fa1f16 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 @@ -24,7 +24,7 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import com.volmit.iris.Iris; -import com.volmit.iris.core.scripting.ExecutionEnvironment; +import com.volmit.iris.core.scripting.environment.PackEnvironment; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.*; @@ -57,7 +57,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { private static final KMap dataLoaders = new KMap<>(); private final File dataFolder; private final int id; - private final ExecutionEnvironment.Pack environment; + private final PackEnvironment environment; private boolean closed = false; private ResourceLoader biomeLoader; private ResourceLoader lootLoader; @@ -91,7 +91,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { this.engine = null; this.dataFolder = dataFolder; this.id = RNG.r.imax(); - this.environment = ExecutionEnvironment.createPack(this); + this.environment = PackEnvironment.create(this); hotloaded(); } diff --git a/core/src/main/java/com/volmit/iris/core/project/IrisProject.java b/core/src/main/java/com/volmit/iris/core/project/IrisProject.java index e708e07ed..b5009d840 100644 --- a/core/src/main/java/com/volmit/iris/core/project/IrisProject.java +++ b/core/src/main/java/com/volmit/iris/core/project/IrisProject.java @@ -24,7 +24,7 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.loader.IrisRegistrant; import com.volmit.iris.core.loader.ResourceLoader; -import com.volmit.iris.core.scripting.ExecutionEnvironment; +import com.volmit.iris.core.scripting.environment.SimpleEnvironment; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.object.*; import com.volmit.iris.engine.object.annotations.Snippet; @@ -355,7 +355,7 @@ public class IrisProject { settings.put("json.schemas", schemas); ws.put("settings", settings); - ExecutionEnvironment.createSimple().configureProject(path); + SimpleEnvironment.create().configureProject(path); File schemasFile = new File(path, ".idea" + File.separator + "jsonSchemas.xml"); Document doc = IO.read(schemasFile); Element mappings = (Element) doc.selectSingleNode("//component[@name='JsonSchemaMappingsProjectConfiguration']"); diff --git a/core/src/main/java/com/volmit/iris/core/scripting/ExecutionEnvironment.java b/core/src/main/java/com/volmit/iris/core/scripting/ExecutionEnvironment.java deleted file mode 100644 index 67939a2e6..000000000 --- a/core/src/main/java/com/volmit/iris/core/scripting/ExecutionEnvironment.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.volmit.iris.core.scripting; - -import com.volmit.iris.core.loader.IrisData; -import com.volmit.iris.core.loader.IrisRegistrant; -import com.volmit.iris.core.scripting.kotlin.environment.IrisExecutionEnvironment; -import com.volmit.iris.core.scripting.kotlin.environment.IrisPackExecutionEnvironment; -import com.volmit.iris.core.scripting.kotlin.environment.IrisSimpleExecutionEnvironment; -import com.volmit.iris.util.math.RNG; -import lombok.NonNull; -import lombok.experimental.UtilityClass; -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.util.*; - -@UtilityClass -public class ExecutionEnvironment { - - @NonNull - public static Engine createEngine(@NonNull com.volmit.iris.engine.framework.Engine engine) { - return new IrisExecutionEnvironment(engine); - } - - @NonNull - public static Pack createPack(@NonNull IrisData data) { - return new IrisPackExecutionEnvironment(data); - } - - @NonNull - public static Simple createSimple() { - return new IrisSimpleExecutionEnvironment(); - } - - public interface Simple { - void configureProject(@NonNull File projectDir); - - void execute(@NonNull String script); - - void execute(@NonNull String script, @NonNull Class type, @Nullable Map<@NonNull String, Object> vars); - - @Nullable - Object evaluate(@NonNull String script); - - @Nullable - Object evaluate(@NonNull String script, @NonNull Class type, @Nullable Map<@NonNull String, Object> vars); - - default void close() { - - } - } - - public interface Pack extends Simple { - @NonNull - IrisData getData(); - - @Nullable - Object createNoise(@NonNull String script, @NonNull RNG rng); - } - - public interface Engine extends Pack { - @NonNull - com.volmit.iris.engine.framework.Engine getEngine(); - - @Nullable - Object spawnMob(@NonNull String script, @NonNull Location location); - - void postSpawnMob(@NonNull String script, @NonNull Location location, @NonNull Entity mob); - - void preprocessObject(@NonNull String script, @NonNull IrisRegistrant object); - } -} diff --git a/core/src/main/java/com/volmit/iris/core/scripting/environment/EngineEnvironment.java b/core/src/main/java/com/volmit/iris/core/scripting/environment/EngineEnvironment.java new file mode 100644 index 000000000..64507eeb8 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/scripting/environment/EngineEnvironment.java @@ -0,0 +1,25 @@ +package com.volmit.iris.core.scripting.environment; + +import com.volmit.iris.core.loader.IrisRegistrant; +import com.volmit.iris.core.scripting.kotlin.environment.IrisExecutionEnvironment; +import com.volmit.iris.engine.framework.Engine; +import lombok.NonNull; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.jetbrains.annotations.Nullable; + +public interface EngineEnvironment extends PackEnvironment { + static EngineEnvironment create(@NonNull Engine engine) { + return new IrisExecutionEnvironment(engine); + } + + @NonNull + Engine getEngine(); + + @Nullable + Object spawnMob(@NonNull String script, @NonNull Location location); + + void postSpawnMob(@NonNull String script, @NonNull Location location, @NonNull Entity mob); + + void preprocessObject(@NonNull String script, @NonNull IrisRegistrant object); +} \ No newline at end of file diff --git a/core/src/main/java/com/volmit/iris/core/scripting/environment/PackEnvironment.java b/core/src/main/java/com/volmit/iris/core/scripting/environment/PackEnvironment.java new file mode 100644 index 000000000..c5dbccf22 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/scripting/environment/PackEnvironment.java @@ -0,0 +1,19 @@ +package com.volmit.iris.core.scripting.environment; + +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.scripting.kotlin.environment.IrisPackExecutionEnvironment; +import com.volmit.iris.util.math.RNG; +import lombok.NonNull; +import org.jetbrains.annotations.Nullable; + +public interface PackEnvironment extends SimpleEnvironment { + static PackEnvironment create(@NonNull IrisData data) { + return new IrisPackExecutionEnvironment(data); + } + + @NonNull + IrisData getData(); + + @Nullable + Object createNoise(@NonNull String script, @NonNull RNG rng); +} \ No newline at end of file diff --git a/core/src/main/java/com/volmit/iris/core/scripting/environment/SimpleEnvironment.java b/core/src/main/java/com/volmit/iris/core/scripting/environment/SimpleEnvironment.java new file mode 100644 index 000000000..2c07c0d81 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/scripting/environment/SimpleEnvironment.java @@ -0,0 +1,30 @@ +package com.volmit.iris.core.scripting.environment; + +import com.volmit.iris.core.scripting.kotlin.environment.IrisSimpleExecutionEnvironment; +import lombok.NonNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.Map; + +public interface SimpleEnvironment { + static SimpleEnvironment create() { + return new IrisSimpleExecutionEnvironment(); + } + + void configureProject(@NonNull File projectDir); + + void execute(@NonNull String script); + + void execute(@NonNull String script, @NonNull Class type, @Nullable Map<@NonNull String, Object> vars); + + @Nullable + Object evaluate(@NonNull String script); + + @Nullable + Object evaluate(@NonNull String script, @NonNull Class type, @Nullable Map<@NonNull String, Object> vars); + + default void close() { + + } +} \ No newline at end of file diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java index 08e5e1fd4..1b9cec579 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -28,7 +28,7 @@ import com.volmit.iris.core.loader.ResourceLoader; import com.volmit.iris.core.nms.container.BlockPos; import com.volmit.iris.core.nms.container.Pair; import com.volmit.iris.core.project.IrisProject; -import com.volmit.iris.core.scripting.ExecutionEnvironment; +import com.volmit.iris.core.scripting.environment.EngineEnvironment; import com.volmit.iris.core.service.PreservationSVC; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.*; @@ -94,7 +94,7 @@ public class IrisEngine implements Engine { private CompletableFuture hash32; private EngineMode mode; private EngineEffects effects; - private ExecutionEnvironment.Engine execution; + private EngineEnvironment execution; private EngineWorldManager worldManager; private volatile int parallelism; private boolean failing; @@ -170,7 +170,7 @@ public class IrisEngine implements Engine { cacheId = RNG.r.nextInt(); worldManager = new IrisWorldManager(this); complex = new IrisComplex(this); - execution = ExecutionEnvironment.createEngine(this); + execution = EngineEnvironment.create(this); effects = new IrisEngineEffects(this); hash32 = new CompletableFuture<>(); setupMode(); diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index 43aff4987..1df252cfa 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -29,7 +29,7 @@ import com.volmit.iris.core.loader.IrisRegistrant; import com.volmit.iris.core.nms.container.BlockPos; import com.volmit.iris.core.nms.container.Pair; import com.volmit.iris.core.pregenerator.ChunkUpdater; -import com.volmit.iris.core.scripting.ExecutionEnvironment; +import com.volmit.iris.core.scripting.environment.EngineEnvironment; import com.volmit.iris.core.service.ExternalDataSVC; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.data.cache.Cache; @@ -110,7 +110,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat IrisContext getContext(); - ExecutionEnvironment.Engine getExecution(); + EngineEnvironment getExecution(); double getMaxBiomeObjectDensity(); diff --git a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/base/SimpleScript.kt b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/base/SimpleScript.kt index 4e5203763..a2ddcb728 100644 --- a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/base/SimpleScript.kt +++ b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/base/SimpleScript.kt @@ -17,8 +17,8 @@ abstract class SimpleScript object SimpleScriptDefinition : ScriptCompilationConfiguration({ isStandalone(false) defaultImports( - "kotlin.script.experimental.dependencies.DependsOn", - "kotlin.script.experimental.dependencies.Repository", + DependsOn::class.qualifiedName!!, + Repository::class.qualifiedName!!, "com.volmit.iris.Iris.info", "com.volmit.iris.Iris.debug", "com.volmit.iris.Iris.warn", diff --git a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisExecutionEnvironment.kt b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisExecutionEnvironment.kt index df13c7ad4..edaba44e5 100644 --- a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisExecutionEnvironment.kt +++ b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisExecutionEnvironment.kt @@ -1,7 +1,7 @@ package com.volmit.iris.core.scripting.kotlin.environment import com.volmit.iris.core.loader.IrisRegistrant -import com.volmit.iris.core.scripting.ExecutionEnvironment +import com.volmit.iris.core.scripting.environment.EngineEnvironment import com.volmit.iris.core.scripting.func.BiomeLookup import com.volmit.iris.core.scripting.kotlin.base.EngineScript import com.volmit.iris.core.scripting.kotlin.base.MobSpawningScript @@ -13,7 +13,7 @@ import org.bukkit.entity.Entity data class IrisExecutionEnvironment( private val engine: Engine -) : IrisPackExecutionEnvironment(engine.data), ExecutionEnvironment.Engine { +) : IrisPackExecutionEnvironment(engine.data), EngineEnvironment { override fun getEngine() = engine override fun execute(script: String) = @@ -26,7 +26,7 @@ data class IrisExecutionEnvironment( evaluate(script, MobSpawningScript::class.java, engine.parameters("location" to location)) override fun postSpawnMob(script: String, location: Location, mob: Entity) = - execute(script, PostMobSpawningScript::class.java, engine.parameters("location" to location, "entity" to mob,)) + execute(script, PostMobSpawningScript::class.java, engine.parameters("location" to location, "entity" to mob)) override fun preprocessObject(script: String, `object`: IrisRegistrant) = execute(script, PreprocessorScript::class.java, engine.parameters("object" to `object`)) diff --git a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisPackExecutionEnvironment.kt b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisPackExecutionEnvironment.kt index 7eeb7ed23..86832c963 100644 --- a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisPackExecutionEnvironment.kt +++ b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisPackExecutionEnvironment.kt @@ -1,7 +1,7 @@ package com.volmit.iris.core.scripting.kotlin.environment import com.volmit.iris.core.loader.IrisData -import com.volmit.iris.core.scripting.ExecutionEnvironment +import com.volmit.iris.core.scripting.environment.PackEnvironment import com.volmit.iris.core.scripting.kotlin.base.DataScript import com.volmit.iris.core.scripting.kotlin.base.NoiseScript import com.volmit.iris.core.scripting.kotlin.runner.Script @@ -11,14 +11,14 @@ import kotlin.reflect.KClass open class IrisPackExecutionEnvironment( private val data: IrisData -) : IrisSimpleExecutionEnvironment(), ExecutionEnvironment.Pack { +) : IrisSimpleExecutionEnvironment(data.dataFolder), PackEnvironment { override fun getData() = data override fun compile(script: String, type: KClass<*>): Script { val loaded = data.scriptLoader.load(script) return compileCache.get(script) - .computeIfAbsent(type) { _ -> runner.compileText(type, loaded.source, script) } + .computeIfAbsent(type) { _ -> runner.compile(type, loaded.loadFile, loaded.source) } .valueOrThrow("Failed to compile script $script") } diff --git a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisSimpleExecutionEnvironment.kt b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisSimpleExecutionEnvironment.kt index 1641bdbe6..2bb96e768 100644 --- a/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisSimpleExecutionEnvironment.kt +++ b/core/src/main/kotlin/com/volmit/iris/core/scripting/kotlin/environment/IrisSimpleExecutionEnvironment.kt @@ -2,7 +2,7 @@ package com.volmit.iris.core.scripting.kotlin.environment import com.volmit.iris.Iris import com.volmit.iris.core.IrisSettings -import com.volmit.iris.core.scripting.ExecutionEnvironment +import com.volmit.iris.core.scripting.environment.SimpleEnvironment import com.volmit.iris.core.scripting.kotlin.base.* import com.volmit.iris.core.scripting.kotlin.runner.Script import com.volmit.iris.core.scripting.kotlin.runner.ScriptRunner @@ -18,9 +18,11 @@ import kotlin.script.experimental.annotations.KotlinScript import kotlin.script.experimental.api.ResultWithDiagnostics import kotlin.text.split -open class IrisSimpleExecutionEnvironment : ExecutionEnvironment.Simple { +open class IrisSimpleExecutionEnvironment( + baseDir: File = File(".").absoluteFile +) : SimpleEnvironment { protected val compileCache = KCache, ResultWithDiagnostics