From 3e12a9115dfbef2b8a8e4fb52c0bdfbfb2d87448 Mon Sep 17 00:00:00 2001 From: ceikry Date: Sat, 16 Jul 2022 10:12:27 -0500 Subject: [PATCH] Update to allow plugin metadata definition from annotations and load other classes in same folder as plugin.class. --- .../plugins/VarpLogPlugin/plugin.properties | 4 -- client/src/main/java/plugin/PluginInfo.java | 18 +++++++- .../main/java/plugin/PluginRepository.java | 29 ++++++++++--- .../java/plugin/annotations/PluginMeta.java | 11 +++++ .../java/InterfaceDebugPlugin/plugin.java | 6 +++ .../InterfaceDebugPlugin/plugin.properties | 3 -- .../main/java/OverheadDebugPlugin/plugin.java | 9 ++-- .../OverheadDebugPlugin/plugin.properties | 3 -- .../src/main/java/VarpLogPlugin/plugin.java | 6 +++ .../main/java/VarpLogPlugin/plugin.properties | 3 -- .../main/kotlin/SlayerTrackerPlugin/plugin.kt | 10 +++-- .../SlayerTrackerPlugin/plugin.properties | 3 -- .../src/main/kotlin/XPDropPlugin/XPSprites.kt | 40 ++++++++++++++++++ .../src/main/kotlin/XPDropPlugin/plugin.kt | 42 ++++--------------- .../kotlin/XPDropPlugin/plugin.properties | 3 -- 15 files changed, 122 insertions(+), 68 deletions(-) delete mode 100644 client/plugins/VarpLogPlugin/plugin.properties create mode 100644 client/src/main/java/plugin/annotations/PluginMeta.java delete mode 100644 plugin-playground/src/main/java/InterfaceDebugPlugin/plugin.properties delete mode 100644 plugin-playground/src/main/java/OverheadDebugPlugin/plugin.properties delete mode 100644 plugin-playground/src/main/java/VarpLogPlugin/plugin.properties delete mode 100644 plugin-playground/src/main/kotlin/SlayerTrackerPlugin/plugin.properties create mode 100644 plugin-playground/src/main/kotlin/XPDropPlugin/XPSprites.kt delete mode 100644 plugin-playground/src/main/kotlin/XPDropPlugin/plugin.properties diff --git a/client/plugins/VarpLogPlugin/plugin.properties b/client/plugins/VarpLogPlugin/plugin.properties deleted file mode 100644 index 97aa366..0000000 --- a/client/plugins/VarpLogPlugin/plugin.properties +++ /dev/null @@ -1,4 +0,0 @@ - -AUTHOR='Ceikry' -DESCRIPTION='Draws some info about varp changes on the screen.' -VERSION=-1.0 diff --git a/client/src/main/java/plugin/PluginInfo.java b/client/src/main/java/plugin/PluginInfo.java index 11d64f8..01fddc6 100644 --- a/client/src/main/java/plugin/PluginInfo.java +++ b/client/src/main/java/plugin/PluginInfo.java @@ -1,5 +1,7 @@ package plugin; +import plugin.annotations.PluginMeta; + import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; @@ -42,7 +44,21 @@ class PluginInfo { ); } - @Override + public static PluginInfo loadFromClass(Class clazz) { + PluginMeta info = clazz.getAnnotation(PluginMeta.class); + + if (info == null) { + return null; + } + + return new PluginInfo( + info.author(), + info.description(), + info.version() + ); + } + + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; diff --git a/client/src/main/java/plugin/PluginRepository.java b/client/src/main/java/plugin/PluginRepository.java index 89fa1e3..901e079 100644 --- a/client/src/main/java/plugin/PluginRepository.java +++ b/client/src/main/java/plugin/PluginRepository.java @@ -7,7 +7,9 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * Responsible for loading and broadcasting methods to all plugins. @@ -39,16 +41,11 @@ public class PluginRepository { for(File file : Objects.requireNonNull(pluginsDirectory.listFiles())) { if(!file.isDirectory()) continue; + if(file.getName().equals("META-INF")) continue; File infoFile = new File(file.getAbsoluteFile() + File.separator + "plugin.properties"); File pluginRoot = new File(file.getAbsoluteFile() + File.separator + "plugin.class"); - PluginInfo info; - if (infoFile.exists()) - info = PluginInfo.loadFromFile(infoFile); - else - info = new PluginInfo("Unknown", "", 1.0); - if (!pluginRoot.exists()) { System.err.println("Unable to load plugin " + file.getName() + " because plugin.class is absent!"); continue; @@ -56,6 +53,17 @@ public class PluginRepository { Class clazz = loader.loadClass(file.getName() + ".plugin"); + PluginInfo info; + if (infoFile.exists()) + info = PluginInfo.loadFromFile(infoFile); + else + info = PluginInfo.loadFromClass(clazz); + + if (info == null) { + System.err.println("Unable to load plugin " + file.getName() + " because it contains no information about author, version, etc!"); + continue; + } + try { Plugin thisPlugin = (Plugin) clazz.newInstance(); thisPlugin._init(); @@ -66,6 +74,15 @@ public class PluginRepository { return; } + List otherClasses = Arrays.stream(Objects.requireNonNull(file.listFiles())) + .filter((f) -> + !f.getName().equals("plugin.class") && f.getName().contains(".class")) + .collect(Collectors.toList()); + + for (File f : otherClasses) { + loader.loadClass(file.getName() + "." + f.getName().replace(".class","")); + } + System.out.println("Successfully loaded plugin " + file.getName() + ", version " + info.version); } } catch (Exception e) { diff --git a/client/src/main/java/plugin/annotations/PluginMeta.java b/client/src/main/java/plugin/annotations/PluginMeta.java new file mode 100644 index 0000000..cd84f12 --- /dev/null +++ b/client/src/main/java/plugin/annotations/PluginMeta.java @@ -0,0 +1,11 @@ +package plugin.annotations; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface PluginMeta { + String author(); + String description(); + double version(); +} diff --git a/plugin-playground/src/main/java/InterfaceDebugPlugin/plugin.java b/plugin-playground/src/main/java/InterfaceDebugPlugin/plugin.java index b6cd5a6..7d1eff7 100644 --- a/plugin-playground/src/main/java/InterfaceDebugPlugin/plugin.java +++ b/plugin-playground/src/main/java/InterfaceDebugPlugin/plugin.java @@ -1,6 +1,7 @@ package InterfaceDebugPlugin; import plugin.Plugin; +import plugin.annotations.PluginMeta; import plugin.api.*; import rt4.Component; import rt4.GameShell; @@ -8,6 +9,11 @@ import rt4.GameShell; import java.util.ArrayList; import java.util.Arrays; +@PluginMeta( + author = "Ceikry", + description = "Aids in identifying interface components/varps/model IDs.", + version = 1.2 +) public class plugin extends Plugin { private boolean isEnabled; private boolean isVerbose; diff --git a/plugin-playground/src/main/java/InterfaceDebugPlugin/plugin.properties b/plugin-playground/src/main/java/InterfaceDebugPlugin/plugin.properties deleted file mode 100644 index c3e8109..0000000 --- a/plugin-playground/src/main/java/InterfaceDebugPlugin/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -AUTHOR='Ceikry' -DESCRIPTION='Enables visual display of component children and a log of interface-related varps.' -VERSION=1.1 diff --git a/plugin-playground/src/main/java/OverheadDebugPlugin/plugin.java b/plugin-playground/src/main/java/OverheadDebugPlugin/plugin.java index 0cf52aa..ea77cd6 100644 --- a/plugin-playground/src/main/java/OverheadDebugPlugin/plugin.java +++ b/plugin-playground/src/main/java/OverheadDebugPlugin/plugin.java @@ -1,12 +1,15 @@ package OverheadDebugPlugin; import plugin.Plugin; +import plugin.annotations.PluginMeta; import plugin.api.*; import rt4.*; -/** - * @author ceikry - */ +@PluginMeta( + author = "Ceikry", + description = "Draws helpful overhead debug information.", + version = 1.3 +) public class plugin extends Plugin { private boolean isEnabled = false; diff --git a/plugin-playground/src/main/java/OverheadDebugPlugin/plugin.properties b/plugin-playground/src/main/java/OverheadDebugPlugin/plugin.properties deleted file mode 100644 index 9972734..0000000 --- a/plugin-playground/src/main/java/OverheadDebugPlugin/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -AUTHOR="Ceikry" -DESCRIPTION="Renders helpful debug text over the heads of players and NPCs." -VERSION=1.0 \ No newline at end of file diff --git a/plugin-playground/src/main/java/VarpLogPlugin/plugin.java b/plugin-playground/src/main/java/VarpLogPlugin/plugin.java index 32c5431..3c2a5b7 100644 --- a/plugin-playground/src/main/java/VarpLogPlugin/plugin.java +++ b/plugin-playground/src/main/java/VarpLogPlugin/plugin.java @@ -1,12 +1,18 @@ package VarpLogPlugin; import plugin.Plugin; +import plugin.annotations.PluginMeta; import plugin.api.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +@PluginMeta( + author = "Ceikry", + description = "Adds a simple log of varp changes drawn directly to the screen.", + version = 1.0 +) public class plugin extends Plugin { boolean isEnabled = false; diff --git a/plugin-playground/src/main/java/VarpLogPlugin/plugin.properties b/plugin-playground/src/main/java/VarpLogPlugin/plugin.properties deleted file mode 100644 index 2d38f54..0000000 --- a/plugin-playground/src/main/java/VarpLogPlugin/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -AUTHOR='Ceikry' -DESCRIPTION='Draws some info about varp changes on the screen.' -VERSION=1.0 diff --git a/plugin-playground/src/main/kotlin/SlayerTrackerPlugin/plugin.kt b/plugin-playground/src/main/kotlin/SlayerTrackerPlugin/plugin.kt index 0c1f50d..6efd375 100644 --- a/plugin-playground/src/main/kotlin/SlayerTrackerPlugin/plugin.kt +++ b/plugin-playground/src/main/kotlin/SlayerTrackerPlugin/plugin.kt @@ -1,6 +1,7 @@ package SlayerTrackerPlugin import plugin.Plugin +import plugin.annotations.PluginMeta import plugin.api.API import plugin.api.FontColor import plugin.api.FontType @@ -9,10 +10,11 @@ import rt4.Sprite import java.awt.Color import java.lang.Exception -/** - * Very simple slayer task tracker - * @author Ceikry - */ +@PluginMeta( + author = "Ceikry", + description = "Draws a simple slayer task tracker onto the screen if one is active.", + version = 1.0 +) class plugin : Plugin() { val boxColor = 6116423 val posX = 5 diff --git a/plugin-playground/src/main/kotlin/SlayerTrackerPlugin/plugin.properties b/plugin-playground/src/main/kotlin/SlayerTrackerPlugin/plugin.properties deleted file mode 100644 index afca955..0000000 --- a/plugin-playground/src/main/kotlin/SlayerTrackerPlugin/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -AUTHOR='Ceikry' -DESCRIPTION='Helps to keep track of kills remaining on a slayer task.' -VERSION=1.1 diff --git a/plugin-playground/src/main/kotlin/XPDropPlugin/XPSprites.kt b/plugin-playground/src/main/kotlin/XPDropPlugin/XPSprites.kt new file mode 100644 index 0000000..a7c2173 --- /dev/null +++ b/plugin-playground/src/main/kotlin/XPDropPlugin/XPSprites.kt @@ -0,0 +1,40 @@ +package XPDropPlugin + +import plugin.api.API +import rt4.Sprite + +object XPSprites { + fun getSpriteForSkill(skillId: Int) : Sprite? { + return API.GetSprite(getSpriteId(skillId)) + } + + private fun getSpriteId(skillId: Int) : Int { + return when (skillId) { + 0 -> 197 + 1 -> 199 + 2 -> 198 + 3 -> 203 + 4 -> 200 + 5 -> 201 + 6 -> 202 + 7 -> 212 + 8 -> 214 + 9 -> 208 + 10 -> 211 + 11 -> 213 + 12 -> 207 + 13 -> 210 + 14 -> 209 + 15 -> 205 + 16 -> 204 + 17 -> 206 + 18 -> 216 + 19 -> 217 + 20 -> 215 + 21 -> 220 + 22 -> 221 + 23 -> 222 + else -> 222 + } + } +} \ No newline at end of file diff --git a/plugin-playground/src/main/kotlin/XPDropPlugin/plugin.kt b/plugin-playground/src/main/kotlin/XPDropPlugin/plugin.kt index 2b4b082..6e316a2 100644 --- a/plugin-playground/src/main/kotlin/XPDropPlugin/plugin.kt +++ b/plugin-playground/src/main/kotlin/XPDropPlugin/plugin.kt @@ -1,14 +1,16 @@ package XPDropPlugin; import plugin.Plugin +import plugin.annotations.PluginMeta import plugin.api.* import java.awt.Color import kotlin.math.ceil -/** - * Displays some simple XP drops. - * @author Ceikry - */ +@PluginMeta( + author = "Ceikry", + description = "Draws nice and clean experience drops onto the screen.", + version = 1.2 +) class plugin : Plugin() { private val displayTimeout = 10000L // 10 seconds private val drawStart = 175 @@ -37,7 +39,7 @@ class plugin : Plugin() { removeList.add(gain) totalXp += gain.xp } else if (gain.currentPos <= drawStart){ - val sprite = API.GetSprite(getSpriteArchive(gain.skill)) + val sprite = XPSprites.getSpriteForSkill(skillId = gain.skill) sprite?.render(posX - 25, gain.currentPos - 20) API.DrawText( FontType.SMALL, @@ -143,34 +145,4 @@ class plugin : Plugin() { } return newString.reversed() } - - fun getSpriteArchive(skillId: Int): Int{ - return when(skillId) { - 0 -> 197 - 1 -> 199 - 2 -> 198 - 3 -> 203 - 4 -> 200 - 5 -> 201 - 6 -> 202 - 7 -> 212 - 8 -> 214 - 9 -> 208 - 10 -> 211 - 11 -> 213 - 12 -> 207 - 13 -> 210 - 14 -> 209 - 15 -> 205 - 16 -> 204 - 17 -> 206 - 18 -> 216 - 19 -> 217 - 20 -> 215 - 21 -> 220 - 22 -> 221 - 23 -> 222 - else -> 222 - } - } } diff --git a/plugin-playground/src/main/kotlin/XPDropPlugin/plugin.properties b/plugin-playground/src/main/kotlin/XPDropPlugin/plugin.properties deleted file mode 100644 index 9ce85d3..0000000 --- a/plugin-playground/src/main/kotlin/XPDropPlugin/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -AUTHOR='Ceikry' -DESCRIPTION='Displays some pretty awesome XP drops :)' -VERSION=1.1