From b54850cc05836bb6fa84a1f73846e1054fc501b5 Mon Sep 17 00:00:00 2001 From: Matthew Rowland Date: Sat, 31 May 2025 17:30:48 -0700 Subject: [PATCH 1/3] Init --- .../com/mathhulk/spectra/ScriptsCommand.java | 35 +- .../java/com/mathhulk/spectra/Spectra.java | 110 +- .../{plugin => plugins}/ScriptPlugin.java | 50 +- .../ScriptPluginLoader.java | 4 +- .../spectra/plugins/ScriptPluginManager.java | 76 + .../spectra/{ => scripts}/CommandManager.java | 2 +- .../{ => scripts}/EventListenerManager.java | 2 +- .../spectra/{ => scripts}/Script.java | 42 +- .../spectra/{ => scripts}/ScriptManager.java | 60 +- .../spectra/{ => scripts}/TaskManager.java | 22 +- .../scripts/polyfill/ESMFileSystem.java | 69 + .../scripts/polyfill/NodeOSPolyfill.java | 128 + .../scripts/polyfill/NodePathPolyfill.java | 32 + .../wrappers/BiomeProviderWrapper.java | 85 + .../wrappers/ChunkGeneratorWrapper.java | 207 + .../mathhulk/spectra/ui/ScreenManager.java | 241 + .../spectra/ui/VerifiedPlayerManager.java | 82 + apps/fabric/.gitattributes | 9 + apps/fabric/.github/workflows/build.yml | 30 + apps/fabric/.gitignore | 40 + apps/fabric/LICENSE | 121 + apps/fabric/build.gradle | 95 + apps/fabric/gradle.properties | 18 + apps/fabric/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + apps/fabric/gradlew | 251 + apps/fabric/gradlew.bat | 94 + apps/fabric/settings.gradle | 10 + .../com/mathhulk/spectra/SpectraClient.java | 57 + .../browser/BrowserMessageRouterHandler.java | 30 + .../spectra/browser/BrowserScreen.java | 177 + .../spectra/browser/ExternalLinkHandler.java | 61 + .../browser/MySchemeHandlerFactory.java | 21 + .../spectra/browser/ScaledBrowser.java | 38 + .../browser/ScreenResourceHandler.java | 184 + .../mixin/client/ExampleClientMixin.java | 15 + .../spectra/ui/HandshakeC2SPayload.java | 18 + .../spectra/ui/OpenBrowserS2CPayload.java | 18 + .../mathhulk/spectra/ui/ResourceManager.java | 250 + .../spectra/ui/ResourceS2CPayload.java | 23 + .../spectra/ui/ResourcesC2SPayload.java | 22 + .../spectra/ui/ResourcesS2CPayload.java | 23 + .../resources/spectra.client.mixins.json | 11 + .../java/com/mathhulk/spectra/Spectra.java | 24 + .../mathhulk/spectra/mixin/ExampleMixin.java | 15 + .../main/resources/assets/spectra/icon.png | Bin 0 -> 3735 bytes .../fabric/src/main/resources/fabric.mod.json | 41 + .../src/main/resources/spectra.mixins.json | 11 + package-lock.json | 9558 ++++++++++++++--- 49 files changed, 11003 insertions(+), 1516 deletions(-) rename apps/bukkit/src/main/java/com/mathhulk/spectra/{plugin => plugins}/ScriptPlugin.java (72%) rename apps/bukkit/src/main/java/com/mathhulk/spectra/{plugin => plugins}/ScriptPluginLoader.java (96%) create mode 100644 apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPluginManager.java rename apps/bukkit/src/main/java/com/mathhulk/spectra/{ => scripts}/CommandManager.java (99%) rename apps/bukkit/src/main/java/com/mathhulk/spectra/{ => scripts}/EventListenerManager.java (98%) rename apps/bukkit/src/main/java/com/mathhulk/spectra/{ => scripts}/Script.java (82%) rename apps/bukkit/src/main/java/com/mathhulk/spectra/{ => scripts}/ScriptManager.java (77%) rename apps/bukkit/src/main/java/com/mathhulk/spectra/{ => scripts}/TaskManager.java (82%) create mode 100644 apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/polyfill/ESMFileSystem.java create mode 100644 apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/polyfill/NodeOSPolyfill.java create mode 100644 apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/polyfill/NodePathPolyfill.java create mode 100644 apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/wrappers/BiomeProviderWrapper.java create mode 100644 apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/wrappers/ChunkGeneratorWrapper.java create mode 100644 apps/bukkit/src/main/java/com/mathhulk/spectra/ui/ScreenManager.java create mode 100644 apps/bukkit/src/main/java/com/mathhulk/spectra/ui/VerifiedPlayerManager.java create mode 100644 apps/fabric/.gitattributes create mode 100644 apps/fabric/.github/workflows/build.yml create mode 100644 apps/fabric/.gitignore create mode 100644 apps/fabric/LICENSE create mode 100644 apps/fabric/build.gradle create mode 100644 apps/fabric/gradle.properties create mode 100644 apps/fabric/gradle/wrapper/gradle-wrapper.jar create mode 100644 apps/fabric/gradle/wrapper/gradle-wrapper.properties create mode 100755 apps/fabric/gradlew create mode 100644 apps/fabric/gradlew.bat create mode 100644 apps/fabric/settings.gradle create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/SpectraClient.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/browser/BrowserMessageRouterHandler.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/browser/BrowserScreen.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/browser/ExternalLinkHandler.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/browser/MySchemeHandlerFactory.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/browser/ScaledBrowser.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/browser/ScreenResourceHandler.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/mixin/client/ExampleClientMixin.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/ui/HandshakeC2SPayload.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/ui/OpenBrowserS2CPayload.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/ui/ResourceManager.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/ui/ResourceS2CPayload.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/ui/ResourcesC2SPayload.java create mode 100644 apps/fabric/src/client/java/com/mathhulk/spectra/ui/ResourcesS2CPayload.java create mode 100644 apps/fabric/src/client/resources/spectra.client.mixins.json create mode 100644 apps/fabric/src/main/java/com/mathhulk/spectra/Spectra.java create mode 100644 apps/fabric/src/main/java/com/mathhulk/spectra/mixin/ExampleMixin.java create mode 100644 apps/fabric/src/main/resources/assets/spectra/icon.png create mode 100644 apps/fabric/src/main/resources/fabric.mod.json create mode 100644 apps/fabric/src/main/resources/spectra.mixins.json diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/ScriptsCommand.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/ScriptsCommand.java index 5b7b1e2..6c085d7 100644 --- a/apps/bukkit/src/main/java/com/mathhulk/spectra/ScriptsCommand.java +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/ScriptsCommand.java @@ -4,15 +4,26 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import com.mathhulk.spectra.scripts.Script; +import com.mathhulk.spectra.scripts.ScriptManager; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.List; public class ScriptsCommand implements CommandExecutor, TabCompleter { private final Spectra plugin; + private final String OPEN_BROWSER_CHANNEL = "spectra:open-browser"; + public ScriptsCommand(Spectra plugin) { this.plugin = plugin; + + plugin.getServer().getMessenger().registerOutgoingPluginChannel(plugin, OPEN_BROWSER_CHANNEL); } @Override @@ -148,13 +159,35 @@ public boolean onCommand(CommandSender sender, Command command, String label, St scriptManager.enable(); } + if (firstArgument.equals("open")) { + if (!(sender instanceof Player)) { + sender.sendMessage("This command can only be used by players."); + + return true; + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + + try { + dos.writeInt(0); + dos.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + + byte[] message = baos.toByteArray(); + + ((Player) sender).sendPluginMessage(plugin, OPEN_BROWSER_CHANNEL, message); + } + return true; } @Override public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { if (args.length == 1) { - return List.of("start-watching", "stop-watching", "list", "enable", "disable", "remove", "add"); + return List.of("start-watching", "stop-watching", "list", "enable", "disable", "remove", "add", "open"); } if (args.length == 2 && List.of("enable", "disable", "remove", "add").contains(args[0])) { diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/Spectra.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/Spectra.java index 002ee8d..c3f7d25 100644 --- a/apps/bukkit/src/main/java/com/mathhulk/spectra/Spectra.java +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/Spectra.java @@ -1,18 +1,18 @@ package com.mathhulk.spectra; -import java.io.File; - import org.bukkit.command.PluginCommand; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginManager; +import org.bukkit.generator.BiomeProvider; +import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.java.JavaPlugin; -import com.mathhulk.spectra.plugin.ScriptPlugin; -import com.mathhulk.spectra.plugin.ScriptPluginLoader; +import com.mathhulk.spectra.plugins.ScriptPluginManager; +import com.mathhulk.spectra.scripts.ScriptManager; +import com.mathhulk.spectra.ui.VerifiedPlayerManager; public class Spectra extends JavaPlugin { private ScriptManager scriptManager; - private ScriptPluginLoader pluginLoader; + private ScriptPluginManager scriptPluginManager; + private VerifiedPlayerManager verifiedPlayerManager; public static Spectra instance; @@ -21,56 +21,20 @@ public void onLoad() { // Register ScriptPluginLoader instance = this; - PluginManager pluginManager = getServer().getPluginManager(); - pluginManager.registerInterface(ScriptPluginLoader.class); - - // Load Spectra plugins - getLogger().info("Loading Spectra plugins..."); - - File[] plugins = getDataFolder().getParentFile().listFiles(); - - if (plugins == null) - return; - - for (File file : plugins) { - if (!ScriptPluginLoader.isSpectraPluginFile(file.getName())) - continue; - - try { - Plugin loadedPlugin = pluginManager.loadPlugin(file); - - if (loadedPlugin == null) { - getLogger().severe("Failed to load " + file.getName()); - - continue; - } - } catch (Exception e) { - e.printStackTrace(); - } - } + verifiedPlayerManager = new VerifiedPlayerManager(this); - // Store the ScriptPluginLoader instance - for (Plugin plugin : pluginManager.getPlugins()) { - getLogger().info("Checking " + plugin.getName()); - - if (!(plugin instanceof ScriptPlugin)) - continue; - - pluginLoader = (ScriptPluginLoader) plugin.getPluginLoader(); - - break; - } + // TODO: Add a flag to disable script plugins + scriptPluginManager = new ScriptPluginManager(this); + scriptPluginManager.load(); // TODO: Add a flag to disable the script manager scriptManager = new ScriptManager(this); - // TODO: Add a flag to disable watching by default scriptManager.load(true); } @Override public void onEnable() { - // Register the command PluginCommand command = getCommand("scripts"); if (command == null) { @@ -83,28 +47,56 @@ public void onEnable() { command.setExecutor(scriptsCommand); command.setTabCompleter(scriptsCommand); - // Log the number of Spectra plugins loaded - int totalPlugins = pluginLoader == null ? 0 : pluginLoader.getPlugins().size(); - - getLogger().info(totalPlugins == 0 ? "No Spectra plugins loaded" - : totalPlugins == 1 ? "Loaded 1 Spectra plugin" : "Loaded " + totalPlugins + " Spectra plugins"); - // Enable scripts - if (scriptManager == null) - return; + if (scriptManager != null) { + scriptManager.enable(); + } - scriptManager.enable(); + if (verifiedPlayerManager != null) { + verifiedPlayerManager.enable(); + } } @Override public void onDisable() { - if (scriptManager == null) - return; + // Disable scripts + if (scriptManager != null) { + scriptManager.disable(); + } - scriptManager.disable(); + if (verifiedPlayerManager != null) { + verifiedPlayerManager.disable(); + } } public ScriptManager getScriptManager() { return scriptManager; } + + public ScriptPluginManager getScriptPluginManager() { + return scriptPluginManager; + } + + @Override + public BiomeProvider getDefaultBiomeProvider(String worldName, String id) { + BiomeProvider biomeProvider = scriptManager.getDefaultBiomeProvider(worldName, + id); + + if (biomeProvider != null) { + return biomeProvider; + } + + return super.getDefaultBiomeProvider(worldName, id); + } + + @Override + public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { + ChunkGenerator chunkGenerator = scriptManager.getDefaultWorldGenerator(worldName, id); + + if (chunkGenerator != null) { + return chunkGenerator; + } + + return super.getDefaultWorldGenerator(worldName, id); + } } \ No newline at end of file diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/plugin/ScriptPlugin.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPlugin.java similarity index 72% rename from apps/bukkit/src/main/java/com/mathhulk/spectra/plugin/ScriptPlugin.java rename to apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPlugin.java index a95849c..a5c1a39 100644 --- a/apps/bukkit/src/main/java/com/mathhulk/spectra/plugin/ScriptPlugin.java +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPlugin.java @@ -1,4 +1,4 @@ -package com.mathhulk.spectra.plugin; +package com.mathhulk.spectra.plugins; import java.io.File; import java.io.InputStream; @@ -13,9 +13,12 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginLogger; +import org.graalvm.polyglot.Value; -import com.mathhulk.spectra.Script; import com.mathhulk.spectra.Spectra; +import com.mathhulk.spectra.scripts.Script; +import com.mathhulk.spectra.scripts.wrappers.BiomeProviderWrapper; +import com.mathhulk.spectra.scripts.wrappers.ChunkGeneratorWrapper; public class ScriptPlugin implements Plugin { private Script script; @@ -59,8 +62,7 @@ public String getName() { @Override public void onLoad() { - // TODO: Implement - script.enable(); + script.load(); } @Override @@ -122,12 +124,48 @@ public void saveConfig() { @Override public BiomeProvider getDefaultBiomeProvider(String worldName, String id) { - return Spectra.instance.getDefaultBiomeProvider(worldName, id); + synchronized (script.getContext()) { + Value member = script.getMember("getDefaultBiomeProvider"); + + if (!member.canExecute()) { + return null; + } + + try { + Value value = member.execute(worldName, id); + + if (!value.hasMembers()) { + return null; + } + + return new BiomeProviderWrapper(script.getContext(), value); + } catch (Exception e) { + return null; + } + } } @Override public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { - return Spectra.instance.getDefaultWorldGenerator(worldName, id); + synchronized (script.getContext()) { + Value member = script.getMember("getDefaultWorldGenerator"); + + if (!member.canExecute()) { + return null; + } + + try { + Value value = member.execute(worldName, id); + + if (!value.hasMembers()) { + return null; + } + + return new ChunkGeneratorWrapper(script.getContext(), value); + } catch (Exception e) { + return null; + } + } } @Override diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/plugin/ScriptPluginLoader.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPluginLoader.java similarity index 96% rename from apps/bukkit/src/main/java/com/mathhulk/spectra/plugin/ScriptPluginLoader.java rename to apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPluginLoader.java index 9fc7c87..65b3d10 100644 --- a/apps/bukkit/src/main/java/com/mathhulk/spectra/plugin/ScriptPluginLoader.java +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPluginLoader.java @@ -1,4 +1,4 @@ -package com.mathhulk.spectra.plugin; +package com.mathhulk.spectra.plugins; import java.io.File; import java.util.ArrayList; @@ -14,8 +14,8 @@ import org.bukkit.plugin.PluginLoader; import org.bukkit.plugin.RegisteredListener; -import com.mathhulk.spectra.Script; import com.mathhulk.spectra.Spectra; +import com.mathhulk.spectra.scripts.Script; public class ScriptPluginLoader implements PluginLoader { private static final Pattern[] pluginFileFilters = new Pattern[] { diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPluginManager.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPluginManager.java new file mode 100644 index 0000000..1fe2ada --- /dev/null +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/plugins/ScriptPluginManager.java @@ -0,0 +1,76 @@ +package com.mathhulk.spectra.plugins; + +import java.io.File; +import java.util.HashSet; + +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; + +import com.mathhulk.spectra.Spectra; + +public class ScriptPluginManager { + private ScriptPluginLoader pluginLoader; + private HashSet plugins = new HashSet<>(); + + private final Spectra plugin; + + public ScriptPluginManager(Spectra plugin) { + this.plugin = plugin; + } + + public Spectra getPlugin() { + return plugin; + } + + public ScriptPluginLoader getPluginLoader() { + return pluginLoader; + } + + public HashSet getPlugins() { + return plugins; + } + + public void load() { + // Register a custom plugin loader for Spectra plugins + PluginManager pluginManager = plugin.getServer().getPluginManager(); + pluginManager.registerInterface(ScriptPluginLoader.class); + + plugin.getLogger().info("Loading Spectra plugins..."); + + File[] files = plugin.getDataFolder().getParentFile().listFiles(); + + if (files == null) + return; + + for (File file : files) { + if (!ScriptPluginLoader.isSpectraPluginFile(file.getName())) + continue; + + try { + // Attempt to load Spectra plugins + Plugin loadedPlugin = pluginManager.loadPlugin(file); + + if (loadedPlugin == null) { + plugin.getLogger().severe("Failed to load Spectra plugin: " + file.getName()); + + continue; + } + + plugins.add((ScriptPlugin) loadedPlugin); + + plugin.getLogger().info("Loaded Spectra plugin: " + loadedPlugin.getName()); + + // Store the ScriptPluginLoader instance + if (pluginLoader != null) { + continue; + } + + pluginLoader = (ScriptPluginLoader) loadedPlugin.getPluginLoader(); + } catch (Exception e) { + plugin.getLogger().severe("Failed to load Spectra plugin: " + file.getName()); + + e.printStackTrace(); + } + } + } +} diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/CommandManager.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/CommandManager.java similarity index 99% rename from apps/bukkit/src/main/java/com/mathhulk/spectra/CommandManager.java rename to apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/CommandManager.java index c1742fb..7a50511 100644 --- a/apps/bukkit/src/main/java/com/mathhulk/spectra/CommandManager.java +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/CommandManager.java @@ -1,4 +1,4 @@ -package com.mathhulk.spectra; +package com.mathhulk.spectra.scripts; import org.bukkit.Bukkit; import org.bukkit.Server; diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/EventListenerManager.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/EventListenerManager.java similarity index 98% rename from apps/bukkit/src/main/java/com/mathhulk/spectra/EventListenerManager.java rename to apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/EventListenerManager.java index 80ebc53..e54a222 100644 --- a/apps/bukkit/src/main/java/com/mathhulk/spectra/EventListenerManager.java +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/EventListenerManager.java @@ -1,4 +1,4 @@ -package com.mathhulk.spectra; +package com.mathhulk.spectra.scripts; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/Script.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/Script.java similarity index 82% rename from apps/bukkit/src/main/java/com/mathhulk/spectra/Script.java rename to apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/Script.java index 1b91515..c1520ec 100644 --- a/apps/bukkit/src/main/java/com/mathhulk/spectra/Script.java +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/Script.java @@ -1,9 +1,10 @@ -package com.mathhulk.spectra; +package com.mathhulk.spectra.scripts; import org.bukkit.plugin.Plugin; import org.graalvm.polyglot.Context; import org.graalvm.polyglot.Source; import org.graalvm.polyglot.Value; +import org.graalvm.polyglot.io.IOAccess; import java.io.File; @@ -33,6 +34,10 @@ public Script(File file, Plugin plugin) { name = file.getName(); } + public Context getContext() { + return context; + } + public File getFile() { return file; } @@ -68,6 +73,7 @@ public Boolean load() { // TODO: Security context = Context.newBuilder(language) .allowAllAccess(true) + .allowIO(IOAccess.newBuilder().fileSystem(null).build()) .option("js.esm-eval-returns-exports", "true") .option("engine.WarnInterpreterOnly", "false") .build(); @@ -106,18 +112,27 @@ public Boolean load() { } } - public Boolean enable() { - // Load the script - load(); + public Value getMember(String name) { + if (!loaded) + return null; + + synchronized (context) { + return exports.getMember(name); + } + } + public Boolean enable() { if (!loaded) return false; - // Execute the onEnable event - Value enableEvent = exports.getMember("onEnable"); + synchronized (context) { + // Execute the onEnable event + Value value = exports.getMember("onEnable"); - if (enableEvent != null) - enableEvent.executeVoid(); + if (value != null && value.canExecute()) { + value.executeVoid(); + } + } enabled = true; @@ -128,11 +143,14 @@ public Boolean disable() { if (!loaded) return false; - // Execute the onDisable event - Value disableEvent = exports.getMember("onDisable"); + synchronized (context) { + // Execute the onDisable event + Value value = exports.getMember("onDisable"); - if (disableEvent != null) - disableEvent.executeVoid(); + if (value != null && value.canExecute()) { + value.executeVoid(); + } + } // Remove event listeners, commands, and tasks taskManager.removeTasks(); diff --git a/apps/bukkit/src/main/java/com/mathhulk/spectra/ScriptManager.java b/apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/ScriptManager.java similarity index 77% rename from apps/bukkit/src/main/java/com/mathhulk/spectra/ScriptManager.java rename to apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/ScriptManager.java index d8d442f..39836e0 100644 --- a/apps/bukkit/src/main/java/com/mathhulk/spectra/ScriptManager.java +++ b/apps/bukkit/src/main/java/com/mathhulk/spectra/scripts/ScriptManager.java @@ -1,4 +1,4 @@ -package com.mathhulk.spectra; +package com.mathhulk.spectra.scripts; import java.io.File; import java.nio.file.*; @@ -8,6 +8,13 @@ import java.util.Map; import org.bukkit.Bukkit; +import org.bukkit.generator.BiomeProvider; +import org.bukkit.generator.ChunkGenerator; +import org.graalvm.polyglot.Value; + +import com.mathhulk.spectra.Spectra; +import com.mathhulk.spectra.scripts.wrappers.BiomeProviderWrapper; +import com.mathhulk.spectra.scripts.wrappers.ChunkGeneratorWrapper; public class ScriptManager { private final Spectra plugin; @@ -265,4 +272,55 @@ public Boolean disable() { return true; } + + public BiomeProvider getDefaultBiomeProvider(String worldName, String id) { + ArrayList