From 198a521dd4395ac7e9350c0e1f78ad52ece77e02 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 5 Jun 2026 11:06:35 +0200 Subject: [PATCH 1/7] address the comment and use weakreference --- .../bridges/ASP/objects/SlimeWorldTag.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) 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 ef826c0..3cc91fb 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 @@ -16,6 +16,7 @@ import org.linia.linizen.bridges.ASP.ASPBridge; import java.io.IOException; +import java.lang.ref.WeakReference; public class SlimeWorldTag implements ObjectTag, Adjustable { @@ -35,15 +36,16 @@ public static boolean matches(String string) { return valueOf(string, null) != null; } - /* - * Maybe in the future if it becomes RAM issue, we could save only worldsName - * and not whole instance. In which case we would need to reconstruct it each - * time we are calling it. (With something like SlimeWorldTag#getSlimeWorld) - */ - public SlimeWorld slimeWorld; + private final String worldName; + private final WeakReference slimeWorldRef; public SlimeWorldTag(SlimeWorld slimeWorld) { - this.slimeWorld = slimeWorld; + this.worldName = slimeWorld.getName(); + this.slimeWorldRef = new WeakReference<>(slimeWorld); + } + + public SlimeWorld getSlimeWorld() { + return slimeWorldRef.get(); } public static void register() { @@ -56,11 +58,7 @@ public static void register() { // Returns whether the world is actually loaded. // --> tagProcessor.registerTag(ElementTag.class, "is_loaded", (attribute, object) -> { - try { - return new ElementTag(object.slimeWorld.getLoader().worldExists(object.slimeWorld.getName())); - } catch (IOException e) { - return new ElementTag(false); - } + return new ElementTag(ASPBridge.instance.getLoadedWorld(object.worldName) != null); }); // <--[tag] @@ -71,7 +69,8 @@ public static void register() { // Returns a file loader which this world is loaded from, if any. // --> tagProcessor.registerTag(FileWorldLoaderTag.class, "get_file_loader", (attribute, object) -> { - return object.slimeWorld.getLoader() instanceof FileWorldLoaderTag f ? f : null; + SlimeWorld sw = object.getSlimeWorld(); + return (sw != null && sw.getLoader() instanceof FileWorldLoaderTag f) ? f : null; }); // <--[tag] @@ -93,8 +92,13 @@ public static void register() { // Saves the world. // --> tagProcessor.registerMechanism("save", false, (object, mechanism) -> { + SlimeWorld sw = object.getSlimeWorld(); + if (sw == null) { + mechanism.echoError("World is not loaded"); + return; + } try { - ASPBridge.instance.saveWorld(object.slimeWorld); + ASPBridge.instance.saveWorld(sw); } catch (IOException e) { mechanism.echoError("Could not save world"); } @@ -125,7 +129,7 @@ public static void register() { } public World getWorld() { - return Bukkit.getWorld(slimeWorld.getName()); + return Bukkit.getWorld(worldName); } public String prefix = "SlimeWorld"; @@ -147,7 +151,7 @@ public boolean isUnique() { @Override public String identify() { - return "sw@" + slimeWorld.getName(); + return "sw@" + worldName; } @Override From 49112a8c0ae5fa6c86aa37a54d28e2ce487e1d1d Mon Sep 17 00:00:00 2001 From: david Date: Thu, 11 Jun 2026 17:31:42 +0200 Subject: [PATCH 2/7] init handler --- .../bridges/ASP/SlimeWorldFlagHandler.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/java/org/linia/linizen/bridges/ASP/SlimeWorldFlagHandler.java diff --git a/src/main/java/org/linia/linizen/bridges/ASP/SlimeWorldFlagHandler.java b/src/main/java/org/linia/linizen/bridges/ASP/SlimeWorldFlagHandler.java new file mode 100644 index 0000000..3cec1ff --- /dev/null +++ b/src/main/java/org/linia/linizen/bridges/ASP/SlimeWorldFlagHandler.java @@ -0,0 +1,50 @@ +package org.linia.linizen.bridges.ASP; + +import com.denizenscript.denizencore.flags.SavableMapFlagTracker; +import com.infernalsuite.asp.api.world.SlimeWorld; +import com.infernalsuite.asp.api.world.SlimeWorldInstance; +import net.kyori.adventure.nbt.BinaryTag; +import net.kyori.adventure.nbt.StringBinaryTag; + +import java.util.HashMap; +import java.util.Map; + +public class SlimeWorldFlagHandler { + + static final String EXTRA_DATA_KEY = "denizen_flags"; + + public static final HashMap trackers = new HashMap<>(); + + public static void loadFlags(SlimeWorld world) { + BinaryTag raw = world.getExtraData().get(EXTRA_DATA_KEY); + SavableMapFlagTracker tracker = (raw instanceof StringBinaryTag s) ? new SavableMapFlagTracker(s.value()) : new SavableMapFlagTracker(); + tracker.doTotalClean(); + trackers.put(world.getName(), tracker); + } + + public static void initEmpty(String worldName) { + trackers.put(worldName, new SavableMapFlagTracker()); + } + + public static void flushToWorld(SlimeWorld world) { + SavableMapFlagTracker tracker = trackers.get(world.getName()); + if (tracker == null || !tracker.modified) { + return; + } + world.getExtraData().put(EXTRA_DATA_KEY, StringBinaryTag.stringBinaryTag(tracker.toString())); + tracker.modified = false; + } + + public static void flushAll() { + for (Map.Entry entry : trackers.entrySet()) { + SlimeWorldInstance sw = ASPBridge.instance.getLoadedWorld(entry.getKey()); + if (sw != null) { + flushToWorld(sw); + } + } + } + + public static void unloadFlags(String worldName) { + trackers.remove(worldName); + } +} From d92e54caff449a5d0ca9a19f5a049eebbf3c885b Mon Sep 17 00:00:00 2001 From: david Date: Thu, 11 Jun 2026 17:32:00 +0200 Subject: [PATCH 3/7] use it --- src/main/java/org/linia/linizen/Linizen.java | 15 ++------- .../linia/linizen/bridges/ASP/ASPBridge.java | 26 ++++++++++++++- .../ASP/commands/SlimeWorldCommand.java | 4 +++ .../bridges/ASP/objects/SlimeWorldTag.java | 33 +++++++++++++++++-- 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/linia/linizen/Linizen.java b/src/main/java/org/linia/linizen/Linizen.java index 40c2e2c..48b8a61 100644 --- a/src/main/java/org/linia/linizen/Linizen.java +++ b/src/main/java/org/linia/linizen/Linizen.java @@ -1,15 +1,13 @@ package org.linia.linizen; import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.infernalsuite.asp.api.world.SlimeWorldInstance; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.linia.linizen.bridges.ASP.ASPBridge; +import org.linia.linizen.bridges.ASP.SlimeWorldFlagHandler; import org.linia.linizen.extensions.ExtensionsRegistry; import org.linia.linizen.oneblock.OneBlock; -import java.io.IOException; - public class Linizen extends JavaPlugin { public static Plugin instance; @@ -26,16 +24,9 @@ public void onEnable() { @Override public void onDisable() { - Debug.log("Saving slimeworlds..."); - for (SlimeWorldInstance s : ASPBridge.instance.getLoadedWorlds()) { - try { - ASPBridge.instance.saveWorld(s); - } - catch (IOException e) { - Debug.echoError(e); - } - } + SlimeWorldFlagHandler.flushAll(); + ASPBridge.saveAll(); } } 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 0b28ce7..5c877a1 100644 --- a/src/main/java/org/linia/linizen/bridges/ASP/ASPBridge.java +++ b/src/main/java/org/linia/linizen/bridges/ASP/ASPBridge.java @@ -7,6 +7,7 @@ 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; @@ -14,6 +15,7 @@ import com.infernalsuite.asp.api.exceptions.UnknownWorldException; import com.infernalsuite.asp.api.loaders.SlimeLoader; 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; @@ -48,7 +50,18 @@ public void init() { }); } - static class ASPTagBase extends PseudoObjectTagBase { + public static void saveAll() { + for (SlimeWorldInstance s : instance.getLoadedWorlds()) { + try { + instance.saveWorld(s); + } + catch (IOException e) { + Debug.echoError(e); + } + } + } + + public static class ASPTagBase extends PseudoObjectTagBase { public static ASPTagBase instance; @@ -71,6 +84,17 @@ public void register() { return new ListTag(ASPBridge.instance.getLoadedWorlds(), SlimeWorldTag::new); }); + // <--[tag] + // @attribute ]> + // @returns ElementTag(Boolean) + // @plugin Linizen, ASP + // @description + // Returns whether the world with a given name is loaded. + // --> + tagProcessor.registerTag(ElementTag.class, ElementTag.class, "is_loaded", (attribute, object, input) -> { + return new ElementTag(ASPBridge.instance.getLoadedWorld(input.asString()) != null); + }); + // <--[tag] // @attribute // @returns ListTag 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 67b079a..a108e14 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 @@ -17,6 +17,7 @@ import org.bukkit.Material; 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.utils.ExecutorUtil; @@ -94,6 +95,7 @@ public static void autoExecute(ScriptEntry scriptEntry, ExecutorUtil.runSyncAndWait(() -> { try { ASPBridge.instance.loadWorld(slimeWorld, true); + SlimeWorldFlagHandler.loadFlags(slimeWorld); World world = Bukkit.getWorld(name); if (world != null) { Location loc = new Location(world, 0, 61, 0); @@ -127,6 +129,7 @@ public static void autoExecute(ScriptEntry scriptEntry, ExecutorUtil.runSyncAndWait(() -> { try { ASPBridge.instance.loadWorld(slimeWorld, true); + SlimeWorldFlagHandler.loadFlags(slimeWorld); scriptEntry.saveObject("loaded_world", new SlimeWorldTag(slimeWorld)); } catch (IllegalArgumentException e) { @@ -161,6 +164,7 @@ public static void autoExecute(ScriptEntry scriptEntry, ExecutorUtil.runSyncAndWait(() -> { try { ASPBridge.instance.loadWorld(cloned, true); + SlimeWorldFlagHandler.initEmpty(cloned.getName()); scriptEntry.saveObject("cloned_world", new SlimeWorldTag(cloned)); } catch (IllegalArgumentException e) { 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 3cc91fb..30895a3 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 @@ -1,6 +1,8 @@ package org.linia.linizen.bridges.ASP.objects; import com.denizenscript.denizen.objects.WorldTag; +import com.denizenscript.denizencore.flags.AbstractFlagTracker; +import com.denizenscript.denizencore.flags.FlaggableObject; import com.denizenscript.denizencore.objects.Adjustable; import com.denizenscript.denizencore.objects.Fetchable; import com.denizenscript.denizencore.objects.Mechanism; @@ -14,11 +16,12 @@ import org.bukkit.Bukkit; import org.bukkit.World; import org.linia.linizen.bridges.ASP.ASPBridge; +import org.linia.linizen.bridges.ASP.SlimeWorldFlagHandler; import java.io.IOException; import java.lang.ref.WeakReference; -public class SlimeWorldTag implements ObjectTag, Adjustable { +public class SlimeWorldTag implements ObjectTag, Adjustable, FlaggableObject { @Fetchable("sw@") public static SlimeWorldTag valueOf(String string, TagContext context) { @@ -48,8 +51,24 @@ public SlimeWorld getSlimeWorld() { return slimeWorldRef.get(); } + @Override + public AbstractFlagTracker getFlagTracker() { + return SlimeWorldFlagHandler.trackers.get(worldName); + } + + @Override + public void reapplyTracker(AbstractFlagTracker tracker) { + } + + @Override + public String getReasonNotFlaggable() { + return "is the SlimeWorld loaded?"; + } + public static void register() { + AbstractFlagTracker.registerFlagHandlers(tagProcessor); + // <--[tag] // @attribute // @returns ElementTag(Boolean) @@ -62,7 +81,7 @@ public static void register() { }); // <--[tag] - // @attribute + // @attribute // @returns FileWorldLoaderTag // @plugin Linizen, ASP // @description @@ -98,6 +117,7 @@ public static void register() { return; } try { + SlimeWorldFlagHandler.flushToWorld(sw); ASPBridge.instance.saveWorld(sw); } catch (IOException e) { mechanism.echoError("Could not save world"); @@ -122,9 +142,18 @@ public static void register() { mechanism.echoError("Could not unload world, players are there."); return; } + if (input.asBoolean()) { + SlimeWorld sw = object.getSlimeWorld(); + if (sw != null) { + SlimeWorldFlagHandler.flushToWorld(sw); + } + } if (!Bukkit.unloadWorld(world, input.asBoolean())) { mechanism.echoError("Saving for SlimeWorld " + world.getName() + " refused by system."); } + else { + SlimeWorldFlagHandler.unloadFlags(object.worldName); + } }); } From 44cc148cc12c7e41589d4aa92dccee597e232574 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 5 Jun 2026 11:06:35 +0200 Subject: [PATCH 4/7] address the comment and use weakreference --- .../bridges/ASP/objects/SlimeWorldTag.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) 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 ef826c0..3cc91fb 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 @@ -16,6 +16,7 @@ import org.linia.linizen.bridges.ASP.ASPBridge; import java.io.IOException; +import java.lang.ref.WeakReference; public class SlimeWorldTag implements ObjectTag, Adjustable { @@ -35,15 +36,16 @@ public static boolean matches(String string) { return valueOf(string, null) != null; } - /* - * Maybe in the future if it becomes RAM issue, we could save only worldsName - * and not whole instance. In which case we would need to reconstruct it each - * time we are calling it. (With something like SlimeWorldTag#getSlimeWorld) - */ - public SlimeWorld slimeWorld; + private final String worldName; + private final WeakReference slimeWorldRef; public SlimeWorldTag(SlimeWorld slimeWorld) { - this.slimeWorld = slimeWorld; + this.worldName = slimeWorld.getName(); + this.slimeWorldRef = new WeakReference<>(slimeWorld); + } + + public SlimeWorld getSlimeWorld() { + return slimeWorldRef.get(); } public static void register() { @@ -56,11 +58,7 @@ public static void register() { // Returns whether the world is actually loaded. // --> tagProcessor.registerTag(ElementTag.class, "is_loaded", (attribute, object) -> { - try { - return new ElementTag(object.slimeWorld.getLoader().worldExists(object.slimeWorld.getName())); - } catch (IOException e) { - return new ElementTag(false); - } + return new ElementTag(ASPBridge.instance.getLoadedWorld(object.worldName) != null); }); // <--[tag] @@ -71,7 +69,8 @@ public static void register() { // Returns a file loader which this world is loaded from, if any. // --> tagProcessor.registerTag(FileWorldLoaderTag.class, "get_file_loader", (attribute, object) -> { - return object.slimeWorld.getLoader() instanceof FileWorldLoaderTag f ? f : null; + SlimeWorld sw = object.getSlimeWorld(); + return (sw != null && sw.getLoader() instanceof FileWorldLoaderTag f) ? f : null; }); // <--[tag] @@ -93,8 +92,13 @@ public static void register() { // Saves the world. // --> tagProcessor.registerMechanism("save", false, (object, mechanism) -> { + SlimeWorld sw = object.getSlimeWorld(); + if (sw == null) { + mechanism.echoError("World is not loaded"); + return; + } try { - ASPBridge.instance.saveWorld(object.slimeWorld); + ASPBridge.instance.saveWorld(sw); } catch (IOException e) { mechanism.echoError("Could not save world"); } @@ -125,7 +129,7 @@ public static void register() { } public World getWorld() { - return Bukkit.getWorld(slimeWorld.getName()); + return Bukkit.getWorld(worldName); } public String prefix = "SlimeWorld"; @@ -147,7 +151,7 @@ public boolean isUnique() { @Override public String identify() { - return "sw@" + slimeWorld.getName(); + return "sw@" + worldName; } @Override From ece0e2e2b693f124e6f8eeb5837fec2fbadf38f4 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 11 Jun 2026 17:31:42 +0200 Subject: [PATCH 5/7] init handler --- .../bridges/ASP/SlimeWorldFlagHandler.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/java/org/linia/linizen/bridges/ASP/SlimeWorldFlagHandler.java diff --git a/src/main/java/org/linia/linizen/bridges/ASP/SlimeWorldFlagHandler.java b/src/main/java/org/linia/linizen/bridges/ASP/SlimeWorldFlagHandler.java new file mode 100644 index 0000000..3cec1ff --- /dev/null +++ b/src/main/java/org/linia/linizen/bridges/ASP/SlimeWorldFlagHandler.java @@ -0,0 +1,50 @@ +package org.linia.linizen.bridges.ASP; + +import com.denizenscript.denizencore.flags.SavableMapFlagTracker; +import com.infernalsuite.asp.api.world.SlimeWorld; +import com.infernalsuite.asp.api.world.SlimeWorldInstance; +import net.kyori.adventure.nbt.BinaryTag; +import net.kyori.adventure.nbt.StringBinaryTag; + +import java.util.HashMap; +import java.util.Map; + +public class SlimeWorldFlagHandler { + + static final String EXTRA_DATA_KEY = "denizen_flags"; + + public static final HashMap trackers = new HashMap<>(); + + public static void loadFlags(SlimeWorld world) { + BinaryTag raw = world.getExtraData().get(EXTRA_DATA_KEY); + SavableMapFlagTracker tracker = (raw instanceof StringBinaryTag s) ? new SavableMapFlagTracker(s.value()) : new SavableMapFlagTracker(); + tracker.doTotalClean(); + trackers.put(world.getName(), tracker); + } + + public static void initEmpty(String worldName) { + trackers.put(worldName, new SavableMapFlagTracker()); + } + + public static void flushToWorld(SlimeWorld world) { + SavableMapFlagTracker tracker = trackers.get(world.getName()); + if (tracker == null || !tracker.modified) { + return; + } + world.getExtraData().put(EXTRA_DATA_KEY, StringBinaryTag.stringBinaryTag(tracker.toString())); + tracker.modified = false; + } + + public static void flushAll() { + for (Map.Entry entry : trackers.entrySet()) { + SlimeWorldInstance sw = ASPBridge.instance.getLoadedWorld(entry.getKey()); + if (sw != null) { + flushToWorld(sw); + } + } + } + + public static void unloadFlags(String worldName) { + trackers.remove(worldName); + } +} From 061a019d51c16f1c086a9b3ca13745cb9c922357 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 11 Jun 2026 17:32:00 +0200 Subject: [PATCH 6/7] use it --- src/main/java/org/linia/linizen/Linizen.java | 15 ++------- .../linia/linizen/bridges/ASP/ASPBridge.java | 26 ++++++++++++++- .../ASP/commands/SlimeWorldCommand.java | 4 +++ .../bridges/ASP/objects/SlimeWorldTag.java | 33 +++++++++++++++++-- 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/linia/linizen/Linizen.java b/src/main/java/org/linia/linizen/Linizen.java index e0660e3..7549bba 100644 --- a/src/main/java/org/linia/linizen/Linizen.java +++ b/src/main/java/org/linia/linizen/Linizen.java @@ -1,15 +1,13 @@ package org.linia.linizen; import com.denizenscript.denizencore.utilities.debugging.Debug; -import com.infernalsuite.asp.api.world.SlimeWorldInstance; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.linia.linizen.bridges.ASP.ASPBridge; +import org.linia.linizen.bridges.ASP.SlimeWorldFlagHandler; import org.linia.linizen.extensions.ExtensionsRegistry; import org.linia.linizen.oneblock.OneBlock; -import java.io.IOException; - public class Linizen extends JavaPlugin { public static Plugin instance; @@ -25,16 +23,9 @@ public void onEnable() { @Override public void onDisable() { - Debug.log("Saving slimeworlds..."); - for (SlimeWorldInstance s : ASPBridge.instance.getLoadedWorlds()) { - try { - ASPBridge.instance.saveWorld(s); - } - catch (IOException e) { - Debug.echoError(e); - } - } + SlimeWorldFlagHandler.flushAll(); + ASPBridge.saveAll(); } } 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 0b28ce7..5c877a1 100644 --- a/src/main/java/org/linia/linizen/bridges/ASP/ASPBridge.java +++ b/src/main/java/org/linia/linizen/bridges/ASP/ASPBridge.java @@ -7,6 +7,7 @@ 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; @@ -14,6 +15,7 @@ import com.infernalsuite.asp.api.exceptions.UnknownWorldException; import com.infernalsuite.asp.api.loaders.SlimeLoader; 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; @@ -48,7 +50,18 @@ public void init() { }); } - static class ASPTagBase extends PseudoObjectTagBase { + public static void saveAll() { + for (SlimeWorldInstance s : instance.getLoadedWorlds()) { + try { + instance.saveWorld(s); + } + catch (IOException e) { + Debug.echoError(e); + } + } + } + + public static class ASPTagBase extends PseudoObjectTagBase { public static ASPTagBase instance; @@ -71,6 +84,17 @@ public void register() { return new ListTag(ASPBridge.instance.getLoadedWorlds(), SlimeWorldTag::new); }); + // <--[tag] + // @attribute ]> + // @returns ElementTag(Boolean) + // @plugin Linizen, ASP + // @description + // Returns whether the world with a given name is loaded. + // --> + tagProcessor.registerTag(ElementTag.class, ElementTag.class, "is_loaded", (attribute, object, input) -> { + return new ElementTag(ASPBridge.instance.getLoadedWorld(input.asString()) != null); + }); + // <--[tag] // @attribute // @returns ListTag 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 67b079a..a108e14 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 @@ -17,6 +17,7 @@ import org.bukkit.Material; 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.utils.ExecutorUtil; @@ -94,6 +95,7 @@ public static void autoExecute(ScriptEntry scriptEntry, ExecutorUtil.runSyncAndWait(() -> { try { ASPBridge.instance.loadWorld(slimeWorld, true); + SlimeWorldFlagHandler.loadFlags(slimeWorld); World world = Bukkit.getWorld(name); if (world != null) { Location loc = new Location(world, 0, 61, 0); @@ -127,6 +129,7 @@ public static void autoExecute(ScriptEntry scriptEntry, ExecutorUtil.runSyncAndWait(() -> { try { ASPBridge.instance.loadWorld(slimeWorld, true); + SlimeWorldFlagHandler.loadFlags(slimeWorld); scriptEntry.saveObject("loaded_world", new SlimeWorldTag(slimeWorld)); } catch (IllegalArgumentException e) { @@ -161,6 +164,7 @@ public static void autoExecute(ScriptEntry scriptEntry, ExecutorUtil.runSyncAndWait(() -> { try { ASPBridge.instance.loadWorld(cloned, true); + SlimeWorldFlagHandler.initEmpty(cloned.getName()); scriptEntry.saveObject("cloned_world", new SlimeWorldTag(cloned)); } catch (IllegalArgumentException e) { 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 3cc91fb..30895a3 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 @@ -1,6 +1,8 @@ package org.linia.linizen.bridges.ASP.objects; import com.denizenscript.denizen.objects.WorldTag; +import com.denizenscript.denizencore.flags.AbstractFlagTracker; +import com.denizenscript.denizencore.flags.FlaggableObject; import com.denizenscript.denizencore.objects.Adjustable; import com.denizenscript.denizencore.objects.Fetchable; import com.denizenscript.denizencore.objects.Mechanism; @@ -14,11 +16,12 @@ import org.bukkit.Bukkit; import org.bukkit.World; import org.linia.linizen.bridges.ASP.ASPBridge; +import org.linia.linizen.bridges.ASP.SlimeWorldFlagHandler; import java.io.IOException; import java.lang.ref.WeakReference; -public class SlimeWorldTag implements ObjectTag, Adjustable { +public class SlimeWorldTag implements ObjectTag, Adjustable, FlaggableObject { @Fetchable("sw@") public static SlimeWorldTag valueOf(String string, TagContext context) { @@ -48,8 +51,24 @@ public SlimeWorld getSlimeWorld() { return slimeWorldRef.get(); } + @Override + public AbstractFlagTracker getFlagTracker() { + return SlimeWorldFlagHandler.trackers.get(worldName); + } + + @Override + public void reapplyTracker(AbstractFlagTracker tracker) { + } + + @Override + public String getReasonNotFlaggable() { + return "is the SlimeWorld loaded?"; + } + public static void register() { + AbstractFlagTracker.registerFlagHandlers(tagProcessor); + // <--[tag] // @attribute // @returns ElementTag(Boolean) @@ -62,7 +81,7 @@ public static void register() { }); // <--[tag] - // @attribute + // @attribute // @returns FileWorldLoaderTag // @plugin Linizen, ASP // @description @@ -98,6 +117,7 @@ public static void register() { return; } try { + SlimeWorldFlagHandler.flushToWorld(sw); ASPBridge.instance.saveWorld(sw); } catch (IOException e) { mechanism.echoError("Could not save world"); @@ -122,9 +142,18 @@ public static void register() { mechanism.echoError("Could not unload world, players are there."); return; } + if (input.asBoolean()) { + SlimeWorld sw = object.getSlimeWorld(); + if (sw != null) { + SlimeWorldFlagHandler.flushToWorld(sw); + } + } if (!Bukkit.unloadWorld(world, input.asBoolean())) { mechanism.echoError("Saving for SlimeWorld " + world.getName() + " refused by system."); } + else { + SlimeWorldFlagHandler.unloadFlags(object.worldName); + } }); } From 431710e2f67240d4dcf867d0e8c43ce7638c74e7 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 11 Jun 2026 22:12:00 +0200 Subject: [PATCH 7/7] cleanup --- .../bridges/ASP/objects/SlimeWorldTag.java | 68 ++++++++++++------- 1 file changed, 45 insertions(+), 23 deletions(-) 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 30895a3..c385360 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 @@ -69,17 +69,6 @@ public static void register() { AbstractFlagTracker.registerFlagHandlers(tagProcessor); - // <--[tag] - // @attribute - // @returns ElementTag(Boolean) - // @plugin Linizen, ASP - // @description - // Returns whether the world is actually loaded. - // --> - tagProcessor.registerTag(ElementTag.class, "is_loaded", (attribute, object) -> { - return new ElementTag(ASPBridge.instance.getLoadedWorld(object.worldName) != null); - }); - // <--[tag] // @attribute // @returns FileWorldLoaderTag @@ -88,8 +77,10 @@ public static void register() { // Returns a file loader which this world is loaded from, if any. // --> tagProcessor.registerTag(FileWorldLoaderTag.class, "get_file_loader", (attribute, object) -> { - SlimeWorld sw = object.getSlimeWorld(); - return (sw != null && sw.getLoader() instanceof FileWorldLoaderTag f) ? f : null; + if (!requireLoadedWorld(object, attribute)) { + return null; + } + return (object.getSlimeWorld().getLoader() instanceof FileWorldLoaderTag f) ? f : null; }); // <--[tag] @@ -100,7 +91,18 @@ public static void register() { // Returns a world representing this slimeworld. // --> tagProcessor.registerTag(WorldTag.class, "as_world", (attribute, object) -> { - return new WorldTag(object.getWorld()); + return requireLoadedWorld(object, attribute) ? new WorldTag(object.getWorld()) : null; + }); + + // <--[tag] + // @attribute + // @returns ElementTag + // @plugin Linizen, ASP + // @description + // Returns the name of the slimeworld. (Works even when unloaded) + // --> + tagProcessor.registerStaticTag(ElementTag.class, "name", (attribute, object) -> { + return new ElementTag(object.worldName); }); // <--[mechanism] @@ -111,11 +113,10 @@ public static void register() { // Saves the world. // --> tagProcessor.registerMechanism("save", false, (object, mechanism) -> { - SlimeWorld sw = object.getSlimeWorld(); - if (sw == null) { - mechanism.echoError("World is not loaded"); + if (!requireLoadedWorld(object, mechanism)) { return; } + SlimeWorld sw = object.getSlimeWorld(); try { SlimeWorldFlagHandler.flushToWorld(sw); ASPBridge.instance.saveWorld(sw); @@ -133,6 +134,9 @@ public static void register() { // Unloads a world // --> tagProcessor.registerMechanism("unload", false, ElementTag.class, (object, mechanism, input) -> { + if (!requireLoadedWorld(object, mechanism)) { + return; + } if (!input.isBoolean()) { mechanism.echoError("Must provide boolean"); return; @@ -142,13 +146,11 @@ public static void register() { mechanism.echoError("Could not unload world, players are there."); return; } - if (input.asBoolean()) { - SlimeWorld sw = object.getSlimeWorld(); - if (sw != null) { - SlimeWorldFlagHandler.flushToWorld(sw); - } + boolean inp = input.asBoolean(); + if (inp) { + SlimeWorldFlagHandler.flushToWorld(object.getSlimeWorld()); } - if (!Bukkit.unloadWorld(world, input.asBoolean())) { + if (!Bukkit.unloadWorld(world, inp)) { mechanism.echoError("Saving for SlimeWorld " + world.getName() + " refused by system."); } else { @@ -157,6 +159,26 @@ public static void register() { }); } + public static boolean requireLoadedWorld(SlimeWorldTag slimeWorldTag, Mechanism mechanism) { + if (!slimeWorldTag.isLoaded()) { + mechanism.echoError("World '" + slimeWorldTag.worldName + "' is unloaded, cannot adjust mechanism."); + return false; + } + return true; + } + + public static boolean requireLoadedWorld(SlimeWorldTag slimeWorldTag, Attribute attribute) { + if (!slimeWorldTag.isLoaded()) { + attribute.echoError("World '" + slimeWorldTag.worldName + "' is unloaded, cannot process tag."); + return false; + } + return true; + } + + public boolean isLoaded() { + return getSlimeWorld() == null || !ASPBridge.instance.worldLoaded(getSlimeWorld()); + } + public World getWorld() { return Bukkit.getWorld(worldName); }