From b073365cd48ade1786b609d57a345e18f0a30ab9 Mon Sep 17 00:00:00 2001 From: Ceikry Date: Sun, 25 Sep 2022 19:54:54 -0500 Subject: [PATCH] Add API calls for setting varcs, varbits, etc. Add API support for arbitrary data storage Add RememberMyLogin plugin --- client/src/main/java/plugin/Plugin.java | 5 +++ .../main/java/plugin/PluginRepository.java | 24 +++++++++- client/src/main/java/plugin/api/API.java | 31 +++++++++++++ client/src/main/java/rt4/client.java | 3 ++ .../src/main/kotlin/RememberMyLogin/plugin.kt | 44 +++++++++++++++++++ 5 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 plugin-playground/src/main/kotlin/RememberMyLogin/plugin.kt diff --git a/client/src/main/java/plugin/Plugin.java b/client/src/main/java/plugin/Plugin.java index e2c0f16..17cfef0 100644 --- a/client/src/main/java/plugin/Plugin.java +++ b/client/src/main/java/plugin/Plugin.java @@ -85,6 +85,11 @@ public abstract class Plugin { */ public void OnVarpUpdate(int id, int value) {} + /** + * OnLogin is called when the client processes a login. + */ + public void OnLogin() {} + /** * OnLogout is called when the client logs out. This should be used to clear player-relevant plugin state. */ diff --git a/client/src/main/java/plugin/PluginRepository.java b/client/src/main/java/plugin/PluginRepository.java index 23c305c..3a5293f 100644 --- a/client/src/main/java/plugin/PluginRepository.java +++ b/client/src/main/java/plugin/PluginRepository.java @@ -5,7 +5,7 @@ import plugin.api.MiniMenuEntry; import plugin.api.MiniMenuType; import rt4.*; -import java.io.File; +import java.io.*; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; @@ -20,6 +20,7 @@ import java.util.stream.Collectors; */ public class PluginRepository { static HashMap loadedPlugins = new HashMap<>(); + public static HashMap pluginStorage = new HashMap<>(); public static void registerPlugin(PluginInfo info, Plugin plugin) { loadedPlugins.put(info, plugin); @@ -40,6 +41,23 @@ public class PluginRepository { return; } + File pluginStorage = new File(GlobalJsonConfig.instance.pluginsFolder + File.separator + "plsto"); + if (pluginStorage.exists()) { + try (FileInputStream fis = new FileInputStream(pluginStorage)) { + ObjectInputStream ois = new ObjectInputStream(fis); + PluginRepository.pluginStorage = (HashMap) ois.readObject(); + ois.close(); + } catch (Exception e) {e.printStackTrace();} + } + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try(FileOutputStream fos = new FileOutputStream(GlobalJsonConfig.instance.pluginsFolder + File.separator + "plsto")) { + ObjectOutputStream oos = new ObjectOutputStream(fos); + oos.writeObject(PluginRepository.pluginStorage); + oos.close(); + } catch (Exception e) {e.printStackTrace();} + })); + try { URL[] classPath = {pluginsDirectory.toURI().toURL()}; URLClassLoader loader = new URLClassLoader(classPath); @@ -142,4 +160,8 @@ public class PluginRepository { API.customMiniMenuIndex = 0; loadedPlugins.values().forEach((plugin) -> plugin.OnMiniMenuCreate(API.GetMiniMenuEntries())); } + + public static void OnLogin() { + loadedPlugins.values().forEach((plugin) -> plugin.OnLogin()); + } } diff --git a/client/src/main/java/plugin/api/API.java b/client/src/main/java/plugin/api/API.java index f980cf2..b3042a7 100644 --- a/client/src/main/java/plugin/api/API.java +++ b/client/src/main/java/plugin/api/API.java @@ -1,5 +1,6 @@ package plugin.api; +import plugin.PluginRepository; import rt4.*; import rt4.DisplayMode; import rt4.Font; @@ -222,4 +223,34 @@ public class API { MiniMenu.size++; return entry; } + + public static boolean IsLoggedIn() { + return client.gameState == 30; + } + + public static void StoreData(String key, Object value) { + PluginRepository.pluginStorage.put(key, value); + } + + public static Object GetData(String key) { + return PluginRepository.pluginStorage.get(key); + } + + public static void SetVarcStr(int varcId, String str) { + VarcDomain.varcstrs[varcId] = JagString.of(str); + VarcDomain.updatedVarcstrs[VarcDomain.updatedVarcstrsWriterIndex++] = varcId; + } + + public static void SetVarc(int varcId, int value) { + VarcDomain.varcs[varcId] = value; + VarcDomain.updatedVarcs[VarcDomain.updatedVarcsWriterIndex++] = varcId; + } + + public static void SetVarp(int varpId, int value) { + VarpDomain.setVarbit(varpId, value); + } + + public static void SetVarbit(int varbitId, int value) { + VarpDomain.setVarbitClient(varbitId, value); + } } diff --git a/client/src/main/java/rt4/client.java b/client/src/main/java/rt4/client.java index 53d04d6..7de6c57 100644 --- a/client/src/main/java/rt4/client.java +++ b/client/src/main/java/rt4/client.java @@ -322,6 +322,9 @@ public final class client extends GameShell { if (gameState == 0) { LoadingBarAwt.clear(); } + if (gameState == 30) { + PluginRepository.OnLogin(); + } if (arg0 == 40) { LoginManager.clear(); } diff --git a/plugin-playground/src/main/kotlin/RememberMyLogin/plugin.kt b/plugin-playground/src/main/kotlin/RememberMyLogin/plugin.kt new file mode 100644 index 0000000..8da104f --- /dev/null +++ b/plugin-playground/src/main/kotlin/RememberMyLogin/plugin.kt @@ -0,0 +1,44 @@ +package RememberMyLogin + +import plugin.Plugin +import plugin.annotations.PluginMeta +import plugin.api.API +import rt4.Component +import rt4.JagString +import rt4.Player + +@PluginMeta ( + author = "Ceikry", + description = "Stores your last used login for automatic reuse", + version = 1.0 +) +class plugin : Plugin() { + var hasRan = false + var username = "" + var password = "" + + override fun Init() { + username = API.GetData("login-user") as? String ?: "" + password = API.GetData("login-pass") as? String ?: "" + } + + override fun ComponentDraw(componentIndex: Int, component: Component?, screenX: Int, screenY: Int) { + if (hasRan || API.IsLoggedIn()) return + if (component!!.text == JagString.of("Please Log In")) { + API.SetVarcStr(32, username) + API.SetVarcStr(33, password) + hasRan = true + } + } + + override fun OnLogin() { + username = String(Player.usernameInput.chars) + password = String(Player.password.chars) + API.StoreData("login-user", username) + API.StoreData("login-pass", password) + } + + override fun OnLogout() { + hasRan = false + } +} \ No newline at end of file