From d2debda8d878395d47519a3c2016da28374bb353 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 30 Jan 2026 21:55:46 -0800 Subject: [PATCH 1/6] Start work on addon support --- .../skript/api/skript/addon/AddonLoader.java | 101 ++++++++++++++++++ .../api/skript/addon/HySkriptAddon.java | 47 ++++++++ .../skript/api/skript/addon/Manifest.java | 76 +++++++++++++ .../skriptdev/skript/plugin/Skript.java | 17 +++ .../skript/plugin/command/SkriptCommand.java | 27 +++++ 5 files changed, 268 insertions(+) create mode 100644 src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java create mode 100644 src/main/java/com/github/skriptdev/skript/api/skript/addon/HySkriptAddon.java create mode 100644 src/main/java/com/github/skriptdev/skript/api/skript/addon/Manifest.java diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java b/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java new file mode 100644 index 00000000..834dd984 --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java @@ -0,0 +1,101 @@ +package com.github.skriptdev.skript.api.skript.addon; + +import com.github.skriptdev.skript.plugin.HySk; +import com.hypixel.hytale.codec.ExtraInfo; +import com.hypixel.hytale.codec.util.RawJsonReader; +import io.github.syst3ms.skriptparser.log.ErrorType; +import io.github.syst3ms.skriptparser.log.SkriptLogger; +import org.bson.BsonDocument; +import org.bson.BsonValue; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class AddonLoader { + + private final SkriptLogger logger; + + public AddonLoader(SkriptLogger logger) { + this.logger = logger; + } + + public void loadAddonsFromFolder() { + Path resolve = HySk.getInstance().getDataDirectory().resolve("addons"); + File addonFolder = resolve.toFile(); + if (!addonFolder.exists()) { + if (!addonFolder.mkdirs()) { + this.logger.error("Failed to create addons folder", ErrorType.STRUCTURE_ERROR); + return; + } + } else if (!addonFolder.isDirectory()) { + this.logger.error("Addons folder is not a directory", ErrorType.STRUCTURE_ERROR); + return; + } + File[] files = addonFolder.listFiles(); + if (files == null) { + this.logger.error("Failed to list files in addons folder", ErrorType.STRUCTURE_ERROR); + return; + } + + for (File file : Arrays.stream(files) + .filter(File::isFile) + .filter(f -> f.getName().endsWith(".jar")) + .toList()) { + loadAddon(file); + } + } + + private void loadAddon(File file) { + try (JarFile jarFile = new JarFile(file)) { + JarEntry jarEntry = jarFile.getJarEntry("manifest.json"); + if (jarEntry == null) { + this.logger.error("Manifest.json not found in addon " + file.getName(), ErrorType.STRUCTURE_ERROR); + return; + } + + InputStream inputStream = jarFile.getInputStream(jarEntry); + InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); + char[] buffer = RawJsonReader.READ_BUFFER.get(); + RawJsonReader rawJsonReader = new RawJsonReader(reader, buffer); + + Manifest manifest = Manifest.CODEC.decodeJson(rawJsonReader, new ExtraInfo()); + if (manifest == null) { + this.logger.error("Failed to decode manifest.json in addon " + file.getName(), ErrorType.STRUCTURE_ERROR); + return; + } + + URL[] urls = {file.toURI().toURL()}; + URLClassLoader classLoader = new URLClassLoader(urls, HySk.getInstance().getClassLoader()); + Class externalClass; + try { + externalClass = classLoader.loadClass(manifest.getMainClass()); + } catch (ClassNotFoundException e) { + this.logger.error("Main class not found in addon " + file.getName(), ErrorType.STRUCTURE_ERROR); + return; + } + Object mainClassIntance; + try { + mainClassIntance = externalClass.getDeclaredConstructor(String.class).newInstance(manifest.getName()); + } catch (ReflectiveOperationException e) { + this.logger.error("Failed to create instance of addon " + file.getName(), ErrorType.EXCEPTION); + return; + } + if (mainClassIntance instanceof HySkriptAddon addon) { + addon.setManifest(manifest); + addon.onLoad(); + } + } catch (IOException e) { + this.logger.error("Failed to load addon " + file.getName(), ErrorType.EXCEPTION); + } + } + +} diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/addon/HySkriptAddon.java b/src/main/java/com/github/skriptdev/skript/api/skript/addon/HySkriptAddon.java new file mode 100644 index 00000000..30194bf3 --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/api/skript/addon/HySkriptAddon.java @@ -0,0 +1,47 @@ +package com.github.skriptdev.skript.api.skript.addon; + +import com.hypixel.hytale.server.core.Message; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public abstract class HySkriptAddon extends io.github.syst3ms.skriptparser.registration.SkriptAddon { + + private Manifest manifest; + + public HySkriptAddon(String name) { + super(name); + } + + /** + * Called when the addon starts to load. + * This is a good time to set up your syntaxes. + */ + abstract public void onLoad(); + + void setManifest(Manifest manifest) { + this.manifest = manifest; + } + + public Manifest getManifest() { + return manifest; + } + + public Message[] getInfo() { + List info = new ArrayList<>(); + info.add(Message.raw("Version: " + this.manifest.getVersion())); + + String description = this.manifest.getDescription(); + if (description != null) info.add(Message.raw("Description: " + description)); + + @Nullable String[] authors = this.manifest.getAuthors(); + if (authors != null) info.add(Message.raw("Authors: " + String.join(", ", authors))); + + String website = this.manifest.getWebsite(); + if (website != null) info.add(Message.raw("Website: ").insert(Message.raw(website).link(website))); + + return info.toArray(Message[]::new); + } + +} diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/addon/Manifest.java b/src/main/java/com/github/skriptdev/skript/api/skript/addon/Manifest.java new file mode 100644 index 00000000..41584760 --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/api/skript/addon/Manifest.java @@ -0,0 +1,76 @@ +package com.github.skriptdev.skript.api.skript.addon; + +import com.hypixel.hytale.codec.Codec; +import com.hypixel.hytale.codec.KeyedCodec; +import com.hypixel.hytale.codec.builder.BuilderCodec; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; + +public class Manifest { + + private static final BuilderCodec.Builder BUILDER = BuilderCodec.builder(Manifest.class, Manifest::new); + public static final Codec CODEC = BUILDER + .append(new KeyedCodec<>("Main", Codec.STRING), + ((manifest, string) -> manifest.mainClass = string), + (manifest -> manifest.mainClass)) + .add().append(new KeyedCodec<>("Name", Codec.STRING), + ((manifest, string) -> manifest.name = string), + (manifest -> manifest.name)) + .add().append(new KeyedCodec<>("Version", Codec.STRING), + ((manifest, string) -> manifest.version = string), + (manifest -> manifest.version)) + .add().append(new KeyedCodec<>("Description", Codec.STRING), + ((manifest, string) -> manifest.description = string), + (manifest -> manifest.description)) + .add().append(new KeyedCodec<>("Authors", Codec.STRING_ARRAY), + ((manifest, strings) -> manifest.authors = strings), + (manifest -> manifest.authors)) + .add().append(new KeyedCodec<>("Website", Codec.STRING), + ((manifest, string) -> manifest.website = string), + (manifest -> manifest.website)) + .add().build(); + private String mainClass; + private String name; + private String version; + private String description; + private String[] authors; + private String website; + + public String getMainClass() { + return this.mainClass; + } + + public String getName() { + return this.name; + } + + public String getVersion() { + return this.version; + } + + public String getDescription() { + return this.description; + } + + public String[] getAuthors() { + return this.authors; + } + + public String getWebsite() { + return this.website; + } + + @Override + public String toString() { + return "Manifest{" + + "name='" + name + '\'' + + ", version='" + version + '\'' + + ", description='" + description + '\'' + + ", authors=" + Arrays.toString(authors) + + ", website='" + website + '\'' + + '}'; + } + +} diff --git a/src/main/java/com/github/skriptdev/skript/plugin/Skript.java b/src/main/java/com/github/skriptdev/skript/plugin/Skript.java index 03281621..2b017591 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/Skript.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/Skript.java @@ -1,6 +1,7 @@ package com.github.skriptdev.skript.plugin; import com.github.skriptdev.skript.api.skript.ScriptsLoader; +import com.github.skriptdev.skript.api.skript.addon.AddonLoader; import com.github.skriptdev.skript.api.skript.command.ArgUtils; import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; import com.github.skriptdev.skript.api.skript.variables.JsonVariableStorage; @@ -35,6 +36,7 @@ public class Skript extends SkriptAddon { private final SkriptLogger logger; private SkriptRegistration registration; private ElementRegistration elementRegistration; + private AddonLoader addonLoader; private ScriptsLoader scriptsLoader; Skript(HySk hySk) { @@ -69,6 +71,12 @@ private void setup() { printSyntaxCount(); Utils.log("HySkript setup complete!"); + // LOAD ADDONS + Utils.log("Loading addons..."); + this.addonLoader = new AddonLoader(this.logger); + this.addonLoader.loadAddonsFromFolder(); + Utils.log("Finished loading addons!"); + // LOAD VARIABLES loadVariables(); @@ -183,4 +191,13 @@ public ScriptsLoader getScriptsLoader() { return this.scriptsLoader; } + /** + * Get an instance of Skript. + * + * @return Instance of Skript. + */ + public static Skript getInstance() { + return INSTANCE; + } + } diff --git a/src/main/java/com/github/skriptdev/skript/plugin/command/SkriptCommand.java b/src/main/java/com/github/skriptdev/skript/plugin/command/SkriptCommand.java index 1e50b08d..e9e9d19e 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/command/SkriptCommand.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/command/SkriptCommand.java @@ -1,5 +1,6 @@ package com.github.skriptdev.skript.plugin.command; +import com.github.skriptdev.skript.api.skript.addon.HySkriptAddon; import com.github.skriptdev.skript.api.skript.docs.JsonDocPrinter; import com.github.skriptdev.skript.api.skript.docs.MarkdownDocPrinter; import com.github.skriptdev.skript.api.utils.Utils; @@ -10,6 +11,7 @@ import com.hypixel.hytale.server.core.command.system.AbstractCommand; import com.hypixel.hytale.server.core.command.system.CommandContext; import com.hypixel.hytale.server.core.command.system.CommandRegistry; +import com.hypixel.hytale.server.core.command.system.CommandSender; import com.hypixel.hytale.server.core.command.system.arguments.system.FlagArg; import com.hypixel.hytale.server.core.command.system.arguments.system.OptionalArg; import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg; @@ -39,6 +41,7 @@ public SkriptCommand(CommandRegistry registry) { addAliases("sk"); // Keep these in alphabetical order + addSubCommand(addonsCommand()); addSubCommand(new DocsCommand()); addSubCommand(infoCommand()); addSubCommand(new ReloadCommand()); @@ -139,6 +142,30 @@ protected CompletableFuture execute(@NotNull CommandContext commandContext }; } + private AbstractCommand addonsCommand() { + return new AbstractCommand("addons", "Get info about loaded addons.") { + @Override + protected CompletableFuture execute(@NotNull CommandContext commandContext) { + return CompletableFuture.runAsync(() -> { + List addons = SkriptAddon.getAddons().stream() + .filter(addon -> !addon.getAddonName().equalsIgnoreCase("skript-parser") && !addon.getAddonName().equalsIgnoreCase("HySkript")) + .toList(); + if (addons.isEmpty()) return; + CommandSender sender = commandContext.sender(); + Utils.sendMessage(sender, "Loaded Addons:"); + addons.forEach(addon -> { + if (addon instanceof HySkriptAddon hySkriptAddon) { + Utils.sendMessage(sender, " - %s:", hySkriptAddon.getAddonName()); + for (Message s : hySkriptAddon.getInfo()) { + sender.sendMessage(Message.raw(" ").insert(s)); + } + } + }); + }); + } + }; + } + private void printInfo(IMessageReceiver sender) { Utils.sendMessage(sender, "HySkript Version: %s", HySk.getInstance().getManifest().getVersion()); Utils.sendMessage(sender, "Hytale Version: %s (%s)", ManifestUtil.getImplementationVersion(), ManifestUtil.getPatchline()); From 7248e8a838eb3da5fea495eae349811558546bec Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Sat, 31 Jan 2026 07:29:48 -0800 Subject: [PATCH 2/6] ExprTargetBlockOfPlayer - new expression to get target block --- .../expressions/ExpressionHandler.java | 2 + .../block/ExprTargetBlockOfPlayer.java | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/block/ExprTargetBlockOfPlayer.java diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java index 9688a612..d38114d5 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java @@ -4,6 +4,7 @@ import com.github.skriptdev.skript.plugin.elements.expressions.block.ExprBlockAt; import com.github.skriptdev.skript.plugin.elements.expressions.block.ExprBlockTypeAtLocation; import com.github.skriptdev.skript.plugin.elements.expressions.block.ExprBlockTypeOfBlock; +import com.github.skriptdev.skript.plugin.elements.expressions.block.ExprTargetBlockOfPlayer; import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprEntityHealth; import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprEntityStat; import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprNPCType; @@ -40,6 +41,7 @@ public static void register(SkriptRegistration registration) { ExprBlockAt.register(registration); ExprBlockTypeAtLocation.register(registration); ExprBlockTypeOfBlock.register(registration); + ExprTargetBlockOfPlayer.register(registration); // ENTITY ExprEntityHealth.register(registration); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/block/ExprTargetBlockOfPlayer.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/block/ExprTargetBlockOfPlayer.java new file mode 100644 index 00000000..657f2abb --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/block/ExprTargetBlockOfPlayer.java @@ -0,0 +1,63 @@ +package com.github.skriptdev.skript.plugin.elements.expressions.block; + +import com.github.skriptdev.skript.api.hytale.Block; +import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.component.Store; +import com.hypixel.hytale.math.vector.Vector3i; +import com.hypixel.hytale.server.core.entity.entities.Player; +import com.hypixel.hytale.server.core.universe.world.World; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; +import com.hypixel.hytale.server.core.util.TargetUtil; +import io.github.syst3ms.skriptparser.lang.Expression; +import io.github.syst3ms.skriptparser.lang.TriggerContext; +import io.github.syst3ms.skriptparser.parsing.ParseContext; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class ExprTargetBlockOfPlayer implements Expression { + + public static void register(SkriptRegistration reg) { + reg.newExpression(ExprTargetBlockOfPlayer.class, Block.class, true, + "target block of %player%") + .name("Target Block of Player") + .description("Returns the block the player is looking at.") + .examples("set {_block} to target block of player") + .since("1.0.0") + .register(); + } + + private Expression player; + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] expressions, int matchedPattern, @NotNull ParseContext parseContext) { + this.player = (Expression) expressions[0]; + return true; + } + + @Override + public Block[] getValues(@NotNull TriggerContext ctx) { + Optional single = this.player.getSingle(ctx); + if (single.isEmpty()) return null; + + Player player = single.get(); + Ref ref = player.getReference(); + World world = player.getWorld(); + if (world == null || ref == null) return null; + + Store store = world.getEntityStore().getStore(); + + // TODO configurable maxDistance + Vector3i targetBlock = TargetUtil.getTargetBlock(ref, 50, store); + if (targetBlock == null) return null; + return new Block[]{new Block(world, targetBlock)}; + } + + @Override + public String toString(@NotNull TriggerContext ctx, boolean debug) { + return "target block of " + this.player.toString(ctx, debug); + } + +} From 612564c188f9e1db248f3f502f170590ac58f926 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Sat, 31 Jan 2026 07:32:07 -0800 Subject: [PATCH 3/6] ExprTargetBlockOfPlayer - change version - AI auto did this for me, silly IJ-AI --- .../elements/expressions/block/ExprTargetBlockOfPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/block/ExprTargetBlockOfPlayer.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/block/ExprTargetBlockOfPlayer.java index 657f2abb..e1f1a9d1 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/block/ExprTargetBlockOfPlayer.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/block/ExprTargetBlockOfPlayer.java @@ -24,7 +24,7 @@ public static void register(SkriptRegistration reg) { .name("Target Block of Player") .description("Returns the block the player is looking at.") .examples("set {_block} to target block of player") - .since("1.0.0") + .since("INSERT VERSION") .register(); } From 836ce694f79233e1741f5924be676bbe315f9155 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Sat, 31 Jan 2026 07:43:22 -0800 Subject: [PATCH 4/6] ExprtargetEntityOfEntity - add target entity expression --- .../expressions/ExpressionHandler.java | 2 + .../entity/ExprTargetEntityOfEntity.java | 65 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprTargetEntityOfEntity.java diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java index d38114d5..89e4cc49 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java @@ -9,6 +9,7 @@ import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprEntityStat; import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprNPCType; import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprName; +import com.github.skriptdev.skript.plugin.elements.expressions.entity.ExprTargetEntityOfEntity; import com.github.skriptdev.skript.plugin.elements.expressions.item.ExprInventory; import com.github.skriptdev.skript.plugin.elements.expressions.item.ExprItemContainer; import com.github.skriptdev.skript.plugin.elements.expressions.item.ExprItemStack; @@ -48,6 +49,7 @@ public static void register(SkriptRegistration registration) { ExprEntityStat.register(registration); ExprName.register(registration); ExprNPCType.register(registration); + ExprTargetEntityOfEntity.register(registration); // ITEM ExprInventory.register(registration); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprTargetEntityOfEntity.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprTargetEntityOfEntity.java new file mode 100644 index 00000000..fb6fda46 --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprTargetEntityOfEntity.java @@ -0,0 +1,65 @@ +package com.github.skriptdev.skript.plugin.elements.expressions.entity; + +import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.component.Store; +import com.hypixel.hytale.server.core.entity.Entity; +import com.hypixel.hytale.server.core.entity.EntityUtils; +import com.hypixel.hytale.server.core.universe.world.World; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; +import com.hypixel.hytale.server.core.util.TargetUtil; +import io.github.syst3ms.skriptparser.lang.Expression; +import io.github.syst3ms.skriptparser.lang.TriggerContext; +import io.github.syst3ms.skriptparser.parsing.ParseContext; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class ExprTargetEntityOfEntity implements Expression { + + public static void register(SkriptRegistration reg) { + reg.newExpression(ExprTargetEntityOfEntity.class, Entity.class, true, + "target entity of %entity%") + .name("Target Entity of Entity") + .description("Returns the target entity of the given entity.") + .examples("set {_target} to target entity of player") + .since("INSERT VERSION") + .register(); + } + + private Expression entity; + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] expressions, int matchedPattern, @NotNull ParseContext parseContext) { + this.entity = (Expression) expressions[0]; + return true; + } + + @SuppressWarnings("deprecation") + @Override + public Entity[] getValues(@NotNull TriggerContext ctx) { + Optional single = this.entity.getSingle(ctx); + if (single.isEmpty()) return null; + + Entity entity = single.get(); + Ref ref = entity.getReference(); + World world = entity.getWorld(); + if (world == null || ref == null) return null; + + Store store = world.getEntityStore().getStore(); + Ref targetEntity = TargetUtil.getTargetEntity(ref, store); + if (targetEntity == null || !targetEntity.isValid()) return null; + + // TODO better handling of this deprecation + Entity target = EntityUtils.getEntity(targetEntity, store); + + return new Entity[]{target}; + } + + @Override + public String toString(@NotNull TriggerContext ctx, boolean debug) { + return "target entity of " + this.entity.toString(ctx, debug); + } + +} From df91a67341ae01290fe4b167aec4e5ac4f24818a Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Tue, 3 Feb 2026 15:04:29 -0800 Subject: [PATCH 5/6] HySkriptAddon - more changes --- .../skript/api/skript/addon/AddonLoader.java | 13 +++++++++--- .../api/skript/addon/HySkriptAddon.java | 20 ++++++++++++++----- .../skriptdev/skript/plugin/Skript.java | 3 +++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java b/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java index 834dd984..3c549a14 100644 --- a/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java +++ b/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java @@ -5,8 +5,7 @@ import com.hypixel.hytale.codec.util.RawJsonReader; import io.github.syst3ms.skriptparser.log.ErrorType; import io.github.syst3ms.skriptparser.log.SkriptLogger; -import org.bson.BsonDocument; -import org.bson.BsonValue; +import io.github.syst3ms.skriptparser.registration.SkriptAddon; import java.io.File; import java.io.IOException; @@ -91,11 +90,19 @@ private void loadAddon(File file) { } if (mainClassIntance instanceof HySkriptAddon addon) { addon.setManifest(manifest); - addon.onLoad(); + addon.setup(); } } catch (IOException e) { this.logger.error("Failed to load addon " + file.getName(), ErrorType.EXCEPTION); } } + public void shutdownAddons() { + for (SkriptAddon addon : SkriptAddon.getAddons()) { + if (addon instanceof HySkriptAddon hySkriptAddon) { + hySkriptAddon.shutdown(); + } + } + } + } diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/addon/HySkriptAddon.java b/src/main/java/com/github/skriptdev/skript/api/skript/addon/HySkriptAddon.java index 30194bf3..5e991674 100644 --- a/src/main/java/com/github/skriptdev/skript/api/skript/addon/HySkriptAddon.java +++ b/src/main/java/com/github/skriptdev/skript/api/skript/addon/HySkriptAddon.java @@ -1,12 +1,16 @@ package com.github.skriptdev.skript.api.skript.addon; import com.hypixel.hytale.server.core.Message; +import io.github.syst3ms.skriptparser.registration.SkriptAddon; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -public abstract class HySkriptAddon extends io.github.syst3ms.skriptparser.registration.SkriptAddon { +/** + * Base class for addons for HySkript. + */ +public abstract class HySkriptAddon extends SkriptAddon { private Manifest manifest; @@ -18,17 +22,23 @@ public HySkriptAddon(String name) { * Called when the addon starts to load. * This is a good time to set up your syntaxes. */ - abstract public void onLoad(); + abstract public void setup(); - void setManifest(Manifest manifest) { + /** + * Called when the addon is shutting down. + * This is a good time to clean up resources. + */ + abstract public void shutdown(); + + final void setManifest(Manifest manifest) { this.manifest = manifest; } - public Manifest getManifest() { + public final Manifest getManifest() { return manifest; } - public Message[] getInfo() { + public final Message[] getInfo() { List info = new ArrayList<>(); info.add(Message.raw("Version: " + this.manifest.getVersion())); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/Skript.java b/src/main/java/com/github/skriptdev/skript/plugin/Skript.java index a7006bc1..98ba1df8 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/Skript.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/Skript.java @@ -103,6 +103,9 @@ public void shutdown() { Utils.log("Saving variables..."); Variables.shutdown(); Utils.log("Variable saving complete!"); + + // SHUTDOWN ADDONS + this.addonLoader.shutdownAddons(); } private void printSyntaxCount() { From d17e1e728c5272a6edc292d66d6eac346bfdf01d Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Tue, 3 Feb 2026 16:22:43 -0800 Subject: [PATCH 6/6] More addon work --- .../skriptdev/skript/api/skript/addon/AddonLoader.java | 6 ++++++ .../java/com/github/skriptdev/skript/plugin/Skript.java | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java b/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java index 3c549a14..1c7707f7 100644 --- a/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java +++ b/src/main/java/com/github/skriptdev/skript/api/skript/addon/AddonLoader.java @@ -1,9 +1,11 @@ package com.github.skriptdev.skript.api.skript.addon; +import com.github.skriptdev.skript.api.utils.Utils; import com.github.skriptdev.skript.plugin.HySk; import com.hypixel.hytale.codec.ExtraInfo; import com.hypixel.hytale.codec.util.RawJsonReader; import io.github.syst3ms.skriptparser.log.ErrorType; +import io.github.syst3ms.skriptparser.log.LogEntry; import io.github.syst3ms.skriptparser.log.SkriptLogger; import io.github.syst3ms.skriptparser.registration.SkriptAddon; @@ -91,6 +93,10 @@ private void loadAddon(File file) { if (mainClassIntance instanceof HySkriptAddon addon) { addon.setManifest(manifest); addon.setup(); + // Finalize registration and logging + for (LogEntry logEntry : addon.getSkriptRegistration().register()) { + Utils.log(null, logEntry); + } } } catch (IOException e) { this.logger.error("Failed to load addon " + file.getName(), ErrorType.EXCEPTION); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/Skript.java b/src/main/java/com/github/skriptdev/skript/plugin/Skript.java index 98ba1df8..589f29db 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/Skript.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/Skript.java @@ -83,10 +83,10 @@ private void setup() { Utils.log("HySkript setup complete!"); // LOAD ADDONS - Utils.log("Loading addons..."); + this.logger.info("Loading addons..."); this.addonLoader = new AddonLoader(this.logger); this.addonLoader.loadAddonsFromFolder(); - Utils.log("Finished loading addons!"); + this.logger.info("Finished loading addons!"); // LOAD VARIABLES loadVariables();