From e412264507185611e9c7b6b1c0ebc0f183a7b2ad Mon Sep 17 00:00:00 2001 From: david Date: Fri, 12 Jun 2026 10:59:49 +0200 Subject: [PATCH 1/5] utilize config --- src/main/java/org/linia/linizen/Linizen.java | 1 + .../linia/linizen/utils/LinizenConfig.java | 24 +++++++++++++++++++ src/main/resources/config.yml | 4 ++++ 3 files changed, 29 insertions(+) create mode 100644 src/main/java/org/linia/linizen/utils/LinizenConfig.java create mode 100644 src/main/resources/config.yml diff --git a/src/main/java/org/linia/linizen/Linizen.java b/src/main/java/org/linia/linizen/Linizen.java index 7549bba..2780480 100644 --- a/src/main/java/org/linia/linizen/Linizen.java +++ b/src/main/java/org/linia/linizen/Linizen.java @@ -15,6 +15,7 @@ public class Linizen extends JavaPlugin { @Override public void onEnable() { instance = this; + saveDefaultConfig(); Debug.log("Linizen loading..."); new ASPBridge().init(); OneBlock.init(); diff --git a/src/main/java/org/linia/linizen/utils/LinizenConfig.java b/src/main/java/org/linia/linizen/utils/LinizenConfig.java new file mode 100644 index 0000000..789b6ef --- /dev/null +++ b/src/main/java/org/linia/linizen/utils/LinizenConfig.java @@ -0,0 +1,24 @@ +package org.linia.linizen.utils; + +import org.bukkit.configuration.ConfigurationSection; +import org.linia.linizen.Linizen; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +public class LinizenConfig { + + public static Map getFileLoaders() { + ConfigurationSection section = Linizen.instance.getConfig().getConfigurationSection("asp.file-loaders"); + if (section == null) { + return Collections.emptyMap(); + } + Map result = new LinkedHashMap<>(); + for (String key : section.getKeys(false)) { + result.put(key, section.getString(key)); + } + return result; + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..17ba4a7 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,4 @@ +asp: + file-loaders: + # name: path + # worlds: plugins/Linizen/worlds From 15a3fba7df74fbbe24c8d642f750ec2f7a866e54 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 12 Jun 2026 11:00:23 +0200 Subject: [PATCH 2/5] wont be needed anymore --- .../ASP/commands/FileLoaderCommand.java | 57 ------------------- 1 file changed, 57 deletions(-) delete mode 100644 src/main/java/org/linia/linizen/bridges/ASP/commands/FileLoaderCommand.java diff --git a/src/main/java/org/linia/linizen/bridges/ASP/commands/FileLoaderCommand.java b/src/main/java/org/linia/linizen/bridges/ASP/commands/FileLoaderCommand.java deleted file mode 100644 index 276483a..0000000 --- a/src/main/java/org/linia/linizen/bridges/ASP/commands/FileLoaderCommand.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.linia.linizen.bridges.ASP.commands; - -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.scripts.ScriptEntry; -import com.denizenscript.denizencore.scripts.commands.AbstractCommand; -import com.denizenscript.denizencore.scripts.commands.Holdable; -import com.denizenscript.denizencore.scripts.commands.generator.ArgName; -import com.denizenscript.denizencore.scripts.commands.generator.ArgPrefixed; -import com.denizenscript.denizencore.scripts.commands.generator.ArgSubType; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import org.linia.linizen.bridges.ASP.ASPBridge; -import org.linia.linizen.bridges.ASP.objects.FileWorldLoaderTag; - -import java.io.File; -import java.util.List; - -public class FileLoaderCommand extends AbstractCommand implements Holdable { - - // <--[command] - // @Name FileLoader - // @Syntax fileloader [create:|...] - // @Required 1 - // @Maximum 1 - // @Short Creates a new fileloader with given names. - // @Group Linizen - // - // @Description - // This command is waitable. - // --> - - public FileLoaderCommand() { - setName("fileloader"); - setSyntax("fileloader [create:|...]"); - isProcedural = false; - setRequiredArguments(1, 1); - autoCompile(); - } - - public static void autoExecute(ScriptEntry scriptEntry, - @ArgName("create") @ArgPrefixed @ArgSubType(ElementTag.class) List names) { - for (ElementTag e : names) { - String folderName = e.asString(); - File folder = new File(folderName); - if (folder.exists() && !folder.isDirectory()) { - Debug.echoError("A file with the same name as the folder '" + folderName + "' already exists. Please delete it and try again."); - continue; - } - if (!folder.exists() && !folder.mkdirs()) { - Debug.echoError("Failed to create the folder '" + folderName + "'."); - continue; - } - FileWorldLoaderTag fwl = new FileWorldLoaderTag(folderName, folder); - ASPBridge.fileLoaders.registerLoader(folderName, fwl); - } - } - -} From b259eb4cfbbea3cd76d7702016943e066a14044a Mon Sep 17 00:00:00 2001 From: david Date: Fri, 12 Jun 2026 12:10:09 +0200 Subject: [PATCH 3/5] add new way to use slimeworld loaders --- .../AbstractSlimeWorldLoader.java | 82 +++++++++++ .../worldloaders/FileSlimeWorldLoader.java | 137 ++++++++++++++++++ .../SlimeWorldLoaderRegistry.java | 37 +++++ 3 files changed, 256 insertions(+) create mode 100644 src/main/java/org/linia/linizen/bridges/ASP/worldloaders/AbstractSlimeWorldLoader.java create mode 100644 src/main/java/org/linia/linizen/bridges/ASP/worldloaders/FileSlimeWorldLoader.java create mode 100644 src/main/java/org/linia/linizen/bridges/ASP/worldloaders/SlimeWorldLoaderRegistry.java diff --git a/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/AbstractSlimeWorldLoader.java b/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/AbstractSlimeWorldLoader.java new file mode 100644 index 0000000..b45d650 --- /dev/null +++ b/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/AbstractSlimeWorldLoader.java @@ -0,0 +1,82 @@ +package org.linia.linizen.bridges.ASP.worldloaders; + +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.tags.ObjectTagProcessor; +import com.infernalsuite.asp.api.loaders.SlimeLoader; + +import java.io.IOException; + +public abstract class AbstractSlimeWorldLoader implements SlimeLoader, ObjectTag { + + private String prefix; + + public AbstractSlimeWorldLoader(String prefix) { + this.prefix = prefix; + } + + @Override + public AbstractSlimeWorldLoader setPrefix(String prefix) { + this.prefix = prefix; + return this; + } + + @Override + public String getPrefix() { + return prefix; + } + + @Override + public boolean isUnique() { + return true; + } + + @Override + public String identifySimple() { + return identify(); + } + + @Override + public String toString() { + return identify(); + } + + public static void registerTags(ObjectTagProcessor tagProcessor) { + + // <--[tag] + // @attribute + // @returns ListTag + // @plugin Linizen, ASP + // @description + // Returns a list of all known worlds loaded and unloaded. + // --> + tagProcessor.registerTag(ListTag.class, "all_worlds", (attribute, object) -> { + try { + return new ListTag(object.listWorlds(), ElementTag::new); + } + catch (IOException e) { + attribute.echoError(e); + return null; + } + }); + + // <--[tag] + // @attribute ]> + // @returns ElementTag(Boolean) + // @plugin Linizen, ASP + // @description + // Returns whether the world exists. + // --> + tagProcessor.registerTag(ElementTag.class, ElementTag.class, "world_exists", (attribute, object, input) -> { + try { + return new ElementTag(object.worldExists(input.asString())); + } + catch (IOException e) { + attribute.echoError("Could not check if world exists."); + return null; + } + }); + } + +} diff --git a/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/FileSlimeWorldLoader.java b/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/FileSlimeWorldLoader.java new file mode 100644 index 0000000..aec3ec6 --- /dev/null +++ b/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/FileSlimeWorldLoader.java @@ -0,0 +1,137 @@ +package org.linia.linizen.bridges.ASP.worldloaders; + +import com.denizenscript.denizencore.objects.Fetchable; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.tags.Attribute; +import com.denizenscript.denizencore.tags.ObjectTagProcessor; +import com.denizenscript.denizencore.tags.TagContext; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.denizenscript.denizencore.utilities.text.StringHolder; +import com.infernalsuite.asp.api.exceptions.UnknownWorldException; + +import java.io.*; +import java.nio.file.NotDirectoryException; +import java.util.ArrayList; +import java.util.List; + +public class FileSlimeWorldLoader extends AbstractSlimeWorldLoader { + + private static final String FILE_EXTENSION = ".slime"; + private static final FilenameFilter WORLD_FILE_FILTER = (dir, name) -> name.endsWith(FILE_EXTENSION); + + @Fetchable("fwl") + public static FileSlimeWorldLoader valueOf(String name, TagContext context) { + if (name == null) { + return null; + } + if (name.startsWith("fwl@")) { + name = name.substring("fwl@".length()); + } + FileSlimeWorldLoader result = SlimeWorldLoaderRegistry.fileLoaders.getOrDefault(new StringHolder(name), null); + if (result == null) { + Debug.echoError("File world loader '" + name + "' not found. Make sure it is in config file!"); + return null; + } + return result; + } + + public static boolean matches(String name) { + if (name == null) { + return false; + } + if (name.startsWith("fwl@")) { + name = name.substring("fwl@".length()); + } + return SlimeWorldLoaderRegistry.fileLoaders.containsKey(new StringHolder(name)); + } + + private final String name; + private final File worldDir; + + public FileSlimeWorldLoader(String name, File worldDir) { + super("FileWorldLoader"); + this.worldDir = worldDir; + this.name = name; + } + + /////////////// + /// Object handling + ///////////// + + public static final ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); + + @Override + public ObjectTag getObjectAttribute(Attribute attribute) { + return tagProcessor.getObjectAttribute(this, attribute); + } + + public static void register() { + AbstractSlimeWorldLoader.registerTags(tagProcessor); + + // <--[tag] + // @attribute + // @returns ElementTag + // @plugin Linizen, ASP + // @description + // Returns a name of this folder. + // --> + tagProcessor.registerStaticTag(ElementTag.class, "folder_name", (attribute, object) -> { + return new ElementTag(object.worldDir.getName()); + }); + } + + @Override + public String identify() { + return "fwl@" + name; + } + + /////////////// + /// Loader handling + ///////////// + + @Override + public byte[] readWorld(String worldName) throws UnknownWorldException, IOException { + if (!worldExists(worldName)) { + throw new UnknownWorldException(worldName); + } + try (FileInputStream fis = new FileInputStream(new File(worldDir, worldName + FILE_EXTENSION))) { + return fis.readAllBytes(); + } + } + + @Override + public boolean worldExists(String worldName) { + return new File(worldDir, worldName + FILE_EXTENSION).exists(); + } + + @Override + public List listWorlds() throws NotDirectoryException { + String[] worlds = worldDir.list(WORLD_FILE_FILTER); + if (worlds == null) { + throw new NotDirectoryException(worldDir.getPath()); + } + List result = new ArrayList<>(worlds.length); + for (String world : worlds) { + result.add(world.substring(0, world.length() - FILE_EXTENSION.length())); + } + return result; + } + + @Override + public void saveWorld(String worldName, byte[] serializedWorld) throws IOException { + try (FileOutputStream fos = new FileOutputStream(new File(worldDir, worldName + FILE_EXTENSION))) { + fos.write(serializedWorld); + } + } + + @Override + public void deleteWorld(String worldName) throws UnknownWorldException, IOException { + if (!worldExists(worldName)) { + throw new UnknownWorldException(worldName); + } + if (!new File(worldDir, worldName + FILE_EXTENSION).delete()) { + throw new IOException("Failed to delete the world file. File#delete() returned false."); + } + } +} diff --git a/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/SlimeWorldLoaderRegistry.java b/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/SlimeWorldLoaderRegistry.java new file mode 100644 index 0000000..64a56a4 --- /dev/null +++ b/src/main/java/org/linia/linizen/bridges/ASP/worldloaders/SlimeWorldLoaderRegistry.java @@ -0,0 +1,37 @@ +package org.linia.linizen.bridges.ASP.worldloaders; + +import com.denizenscript.denizencore.objects.ObjectFetcher; +import com.denizenscript.denizencore.tags.TagManager; +import com.denizenscript.denizencore.utilities.CoreConfiguration; +import com.denizenscript.denizencore.utilities.debugging.Debug; +import com.denizenscript.denizencore.utilities.text.StringHolder; +import org.linia.linizen.utils.LinizenConfig; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +public class SlimeWorldLoaderRegistry { + + public static final HashMap fileLoaders = new HashMap<>(); + + public static void registerFileLoaders() { + ObjectFetcher.registerWithObjectFetcher(FileSlimeWorldLoader.class, FileSlimeWorldLoader.tagProcessor); + TagManager.registerStaticTagBaseHandler(FileSlimeWorldLoader.class, FileSlimeWorldLoader.class, "fileworldloader", (attribute, input) -> input); + + for (Map.Entry entry : LinizenConfig.getFileLoaders().entrySet()) { + String name = entry.getKey(); + String path = entry.getValue(); + File folder = new File(path); + if (!folder.exists() && !folder.mkdirs()) { + Debug.echoError("Failed to create loader folder '" + path + "'."); + continue; + } + if (CoreConfiguration.debugVerbose) { + Debug.echoApproval("Created loader '" + name + "' for folder '" + path + "'"); + } + fileLoaders.put(new StringHolder(name), new FileSlimeWorldLoader(name, folder)); + } + Debug.log("Registered " + fileLoaders.size() + " file world loaders."); + } +} From 140ca5bf2d4d9121261632d1b829f5971867a8c3 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 12 Jun 2026 12:10:46 +0200 Subject: [PATCH 4/5] remove old references --- .../linia/linizen/bridges/ASP/ASPBridge.java | 49 +---- .../ASP/objects/FileWorldLoaderTag.java | 185 ------------------ .../bridges/ASP/objects/SlimeLoaderTag.java | 7 - .../bridges/ASP/objects/SlimeWorldTag.java | 13 +- 4 files changed, 9 insertions(+), 245 deletions(-) delete mode 100644 src/main/java/org/linia/linizen/bridges/ASP/objects/FileWorldLoaderTag.java delete mode 100644 src/main/java/org/linia/linizen/bridges/ASP/objects/SlimeLoaderTag.java diff --git a/src/main/java/org/linia/linizen/bridges/ASP/ASPBridge.java b/src/main/java/org/linia/linizen/bridges/ASP/ASPBridge.java index 5c877a1..5eb23b1 100644 --- a/src/main/java/org/linia/linizen/bridges/ASP/ASPBridge.java +++ b/src/main/java/org/linia/linizen/bridges/ASP/ASPBridge.java @@ -4,11 +4,9 @@ import com.denizenscript.denizencore.objects.ObjectFetcher; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.core.ListTag; -import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.tags.PseudoObjectTagBase; import com.denizenscript.denizencore.tags.TagManager; import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.denizenscript.denizencore.utilities.text.StringHolder; import com.infernalsuite.asp.api.AdvancedSlimePaperAPI; import com.infernalsuite.asp.api.exceptions.CorruptedWorldException; import com.infernalsuite.asp.api.exceptions.NewerFormatException; @@ -17,37 +15,27 @@ import com.infernalsuite.asp.api.world.SlimeWorld; import com.infernalsuite.asp.api.world.SlimeWorldInstance; import com.infernalsuite.asp.api.world.properties.SlimePropertyMap; -import org.linia.linizen.bridges.ASP.commands.FileLoaderCommand; import org.linia.linizen.bridges.ASP.commands.SlimeWorldCommand; -import org.linia.linizen.bridges.ASP.objects.FileWorldLoaderTag; -import org.linia.linizen.bridges.ASP.objects.SlimeLoaderTag; import org.linia.linizen.bridges.ASP.objects.SlimeWorldTag; +import org.linia.linizen.bridges.ASP.worldloaders.SlimeWorldLoaderRegistry; import org.linia.linizen.bridges.Bridge; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; public class ASPBridge implements Bridge { public static AdvancedSlimePaperAPI instance; - public static Loaders fileLoaders; @Override public void init() { instance = AdvancedSlimePaperAPI.instance(); /* ASP Objects */ - ObjectFetcher.registerWithObjectFetcher(FileWorldLoaderTag.class, FileWorldLoaderTag.tagProcessor).generateBaseTag(); ObjectFetcher.registerWithObjectFetcher(SlimeWorldTag.class, SlimeWorldTag.tagProcessor).generateBaseTag(); new ASPTagBase(); /* ASP Commands */ DenizenCore.commandRegistry.registerCommand(SlimeWorldCommand.class); - DenizenCore.commandRegistry.registerCommand(FileLoaderCommand.class); /* ASP Utils */ - fileLoaders = new Loaders<>(); - TagManager.registerStaticTagBaseHandler(FileWorldLoaderTag.class, FileWorldLoaderTag.class, "fileworldloader", (attribute, input) -> { - return input; - }); + SlimeWorldLoaderRegistry.registerFileLoaders(); } public static void saveAll() { @@ -105,40 +93,7 @@ public void register() { tagProcessor.registerTag(ListTag.class, "worlds_in_use", (attribute, object) -> { return new ListTag(SlimeWorldCommand.worldsInUse, ElementTag::new); }); - - // <--[tag] - // @attribute - // @returns MapTag - // @plugin Linizen, ASP - // @description - // Returns a map of all known file loaders with their folder names. - // --> - tagProcessor.registerTag(MapTag.class, "file_loaders", (attribute, object) -> { - MapTag map = new MapTag(); - for (Map.Entry entry : fileLoaders.loaders.entrySet()) { - map.putObject(entry.getKey(), entry.getValue()); - } - return map; - }); - } - } - - public static class Loaders { - - private final Map loaders = new HashMap<>(); - - public void registerLoader(String name, T loader) { - loaders.put(new StringHolder(name), loader); - } - - public T getLoader(String name) { - return loaders.getOrDefault(new StringHolder(name), null); - } - - public boolean hasLoader(String name) { - return loaders.containsKey(new StringHolder(name)); } - } // https://github.com/InfernalSuite/AdvancedSlimePaper/blob/a192a031930f76dda4d68457e8381090b9e022bc/plugin/src/main/java/com/infernalsuite/asp/plugin/commands/SlimeCommand.java#L30 diff --git a/src/main/java/org/linia/linizen/bridges/ASP/objects/FileWorldLoaderTag.java b/src/main/java/org/linia/linizen/bridges/ASP/objects/FileWorldLoaderTag.java deleted file mode 100644 index 988e64a..0000000 --- a/src/main/java/org/linia/linizen/bridges/ASP/objects/FileWorldLoaderTag.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.linia.linizen.bridges.ASP.objects; - -import com.denizenscript.denizencore.objects.Fetchable; -import com.denizenscript.denizencore.objects.ObjectTag; -import com.denizenscript.denizencore.objects.core.ElementTag; -import com.denizenscript.denizencore.objects.core.ListTag; -import com.denizenscript.denizencore.tags.Attribute; -import com.denizenscript.denizencore.tags.ObjectTagProcessor; -import com.denizenscript.denizencore.tags.TagContext; -import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.infernalsuite.asp.api.exceptions.UnknownWorldException; - -import java.io.*; -import java.nio.file.NotDirectoryException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.stream.Collectors; - -public class FileWorldLoaderTag implements SlimeLoaderTag { - - private static final String FILE_EXTENSION = ".slime"; - private static final FilenameFilter WORLD_FILE_FILTER = (dir, name) -> name.endsWith(FILE_EXTENSION); - public static final HashMap loaders = new HashMap<>(); - - @Fetchable("fwl") - public static FileWorldLoaderTag valueOf(String folderName, TagContext context) { - if (folderName == null) { - return null; - } - if (folderName.startsWith("fwl@")) { - folderName = folderName.substring("fwl@".length()); - } - return loaders.getOrDefault(folderName, null); - } - - public static boolean matches(String string) { - return valueOf(string, null) != null; - } - - public FileWorldLoaderTag(String name, File worldDir) { - this.worldDir = worldDir; - this.name = name; - } - - /////////////// - /// Object handling - ///////////// - - public static final ObjectTagProcessor tagProcessor = new ObjectTagProcessor<>(); - - public String prefix = "FileWorldLoader"; - - @Override - public String getPrefix() { - return prefix; - } - - @Override - public boolean isUnique() { - return true; - } - - @Override - public String identify() { - return "fwl@" + name; - } - - @Override - public String identifySimple() { - return identify(); - } - - @Override - public ObjectTag setPrefix(String s) { - prefix = s; - return this; - } - - @Override - public String toString() { - return identify(); - } - - @Override - public ObjectTag getObjectAttribute(Attribute attribute) { - return tagProcessor.getObjectAttribute(this, attribute); - } - - public static void register() { - - // <--[tag] - // @attribute - // @returns ElementTag - // @plugin Linizen, ASP - // @description - // Returns a name of this folder. - // --> - tagProcessor.registerStaticTag(ElementTag.class, "folder_name", (attribute, object) -> { - return new ElementTag(object.name); - }); - - // <--[tag] - // @attribute - // @returns ListTag - // @plugin Linizen, ASP - // @description - // Returns a list of all known worlds loaded and unloaded. - // --> - tagProcessor.registerTag(ListTag.class, "all_worlds", (attribute, object) -> { - try { - return new ListTag(object.listWorlds(), ElementTag::new); - } - catch (IOException e) { - Debug.echoError(e); - return null; - } - }); - - // <--[tag] - // @attribute ]> - // @returns ElementTag(Boolean) - // @plugin Linizen, ASP - // @description - // Returns whether the world exists. - // --> - tagProcessor.registerTag(ElementTag.class, ElementTag.class, "world_exists", (attribute, object, input) -> { - return new ElementTag(object.worldExists(input.asString())); - }); - } - - /////////////// - /// Loader handling - ///////////// - - private final String name; - private final File worldDir; - - @Override - public byte[] readWorld(String worldName) throws UnknownWorldException, IOException { - if (!worldExists(worldName)) { - throw new UnknownWorldException(worldName); - } - - try (FileInputStream fis = new FileInputStream(new File(worldDir, worldName + FILE_EXTENSION))) { - return fis.readAllBytes(); - } - } - - @Override - public boolean worldExists(String worldName) { - return new File(worldDir, worldName + FILE_EXTENSION).exists(); - } - - @Override - public List listWorlds() throws NotDirectoryException { - String[] worlds = worldDir.list(WORLD_FILE_FILTER); - - if (worlds == null) { - throw new NotDirectoryException(worldDir.getPath()); - } - - return Arrays.stream(worlds).map((c) -> c.substring(0, c.length() - FILE_EXTENSION.length())).collect(Collectors.toList()); - } - - @Override - public void saveWorld(String worldName, byte[] serializedWorld) throws IOException { - try (FileOutputStream fos = new FileOutputStream(new File(worldDir, worldName + FILE_EXTENSION))) { - fos.write(serializedWorld); - } - } - - @Override - public void deleteWorld(String worldName) throws UnknownWorldException, IOException { - if (!worldExists(worldName)) { - throw new UnknownWorldException(worldName); - } - else { - if (!new File(worldDir, worldName + FILE_EXTENSION).delete()) { - throw new IOException("Failed to delete the world file. File#delete() returned false."); - } - } - } - -} diff --git a/src/main/java/org/linia/linizen/bridges/ASP/objects/SlimeLoaderTag.java b/src/main/java/org/linia/linizen/bridges/ASP/objects/SlimeLoaderTag.java deleted file mode 100644 index 5a88b23..0000000 --- a/src/main/java/org/linia/linizen/bridges/ASP/objects/SlimeLoaderTag.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.linia.linizen.bridges.ASP.objects; - -import com.denizenscript.denizencore.objects.ObjectTag; -import com.infernalsuite.asp.api.loaders.SlimeLoader; - -public interface SlimeLoaderTag extends ObjectTag, SlimeLoader { -} diff --git a/src/main/java/org/linia/linizen/bridges/ASP/objects/SlimeWorldTag.java b/src/main/java/org/linia/linizen/bridges/ASP/objects/SlimeWorldTag.java index c385360..7cba675 100644 --- a/src/main/java/org/linia/linizen/bridges/ASP/objects/SlimeWorldTag.java +++ b/src/main/java/org/linia/linizen/bridges/ASP/objects/SlimeWorldTag.java @@ -17,6 +17,7 @@ import org.bukkit.World; import org.linia.linizen.bridges.ASP.ASPBridge; import org.linia.linizen.bridges.ASP.SlimeWorldFlagHandler; +import org.linia.linizen.bridges.ASP.worldloaders.AbstractSlimeWorldLoader; import java.io.IOException; import java.lang.ref.WeakReference; @@ -70,17 +71,17 @@ public static void register() { AbstractFlagTracker.registerFlagHandlers(tagProcessor); // <--[tag] - // @attribute - // @returns FileWorldLoaderTag + // @attribute + // @returns AbstractSlimeWorldLoaderTag // @plugin Linizen, ASP // @description - // Returns a file loader which this world is loaded from, if any. + // Returns a loader which this world is loaded from, if any. // --> - tagProcessor.registerTag(FileWorldLoaderTag.class, "get_file_loader", (attribute, object) -> { + tagProcessor.registerTag(AbstractSlimeWorldLoader.class, "loader", (attribute, object) -> { if (!requireLoadedWorld(object, attribute)) { return null; } - return (object.getSlimeWorld().getLoader() instanceof FileWorldLoaderTag f) ? f : null; + return (object.getSlimeWorld().getLoader() instanceof AbstractSlimeWorldLoader l) ? l : null; }); // <--[tag] @@ -176,7 +177,7 @@ public static boolean requireLoadedWorld(SlimeWorldTag slimeWorldTag, Attribute } public boolean isLoaded() { - return getSlimeWorld() == null || !ASPBridge.instance.worldLoaded(getSlimeWorld()); + return getSlimeWorld() != null && ASPBridge.instance.worldLoaded(getSlimeWorld()); } public World getWorld() { From d0f4a1f99313d44fb0357e316aad727edbeaaa03 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 12 Jun 2026 14:20:27 +0200 Subject: [PATCH 5/5] update slimeworld command ability to clone from other loaders --- .../bridges/ASP/commands/SlimeWorldCommand.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/linia/linizen/bridges/ASP/commands/SlimeWorldCommand.java b/src/main/java/org/linia/linizen/bridges/ASP/commands/SlimeWorldCommand.java index a108e14..7411ee7 100644 --- a/src/main/java/org/linia/linizen/bridges/ASP/commands/SlimeWorldCommand.java +++ b/src/main/java/org/linia/linizen/bridges/ASP/commands/SlimeWorldCommand.java @@ -18,8 +18,8 @@ import org.bukkit.World; import org.linia.linizen.bridges.ASP.ASPBridge; import org.linia.linizen.bridges.ASP.SlimeWorldFlagHandler; -import org.linia.linizen.bridges.ASP.objects.FileWorldLoaderTag; import org.linia.linizen.bridges.ASP.objects.SlimeWorldTag; +import org.linia.linizen.bridges.ASP.worldloaders.AbstractSlimeWorldLoader; import org.linia.linizen.utils.ExecutorUtil; import java.io.IOException; @@ -58,7 +58,7 @@ public class SlimeWorldCommand extends AbstractCommand implements Holdable { public SlimeWorldCommand() { setName("slimeworld"); - setSyntax("slimeworld [create/load/clone] [] (loader:) (from:)"); + setSyntax("slimeworld [create/load/clone] [] (loader:) (from:) (from_loader:)"); isProcedural = false; setRequiredArguments(3, 4); autoCompile(); @@ -69,8 +69,9 @@ public enum Action { CREATE, LOAD, CLONE } public static void autoExecute(ScriptEntry scriptEntry, @ArgName("action") @ArgLinear Action action, @ArgName("name") @ArgLinear String name, - @ArgName("loader") @ArgPrefixed FileWorldLoaderTag loader, - @ArgName("from") @ArgPrefixed @ArgDefaultNull String cloneFrom) { + @ArgName("loader") @ArgPrefixed AbstractSlimeWorldLoader loader, + @ArgName("from") @ArgPrefixed @ArgDefaultNull String cloneFrom, + @ArgName("from_loader") @ArgPrefixed @ArgDefaultNull AbstractSlimeWorldLoader cloneLoader) { switch (action) { case CREATE -> { if (Bukkit.getWorld(name) != null) { @@ -158,7 +159,7 @@ public static void autoExecute(ScriptEntry scriptEntry, CompletableFuture.runAsync(() -> { try { - SlimeWorld sw = ASPBridge.getWorldReadyForCloning(cloneFrom, loader, new SlimePropertyMap()); + SlimeWorld sw = ASPBridge.getWorldReadyForCloning(cloneFrom, cloneLoader == null ? loader : cloneLoader, new SlimePropertyMap()); SlimeWorld cloned = sw.clone(name, loader); ExecutorUtil.runSyncAndWait(() -> {