From 35e76ea9ebd66f27fde9decbc89b11b9e2928682 Mon Sep 17 00:00:00 2001 From: somehussar <148253652+somehussar@users.noreply.github.com> Date: Tue, 3 Feb 2026 03:19:03 +0100 Subject: [PATCH 1/2] gay janino --- src/main/java/noppes/npcs/controllers/ScriptContainer.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index 738819500..60799c767 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -342,5 +342,10 @@ public class ScriptContainer implements IScriptUnit { public void setErrored(boolean errored) { this.errored = errored; } + + @Override + public boolean isJanino() { + return false; + } } From 11444946cb07bb8ba89cd184f90966dea362fad7 Mon Sep 17 00:00:00 2001 From: somehussar <148253652+somehussar@users.noreply.github.com> Date: Tue, 3 Feb 2026 03:27:32 +0100 Subject: [PATCH 2/2] Go back to reflections --- dependencies.gradle | 2 +- .../java/kamkeel/npcs/util/BukkitUtil.java | 142 +++++++++++------- .../java/kamkeel/npcs/util/VaultUtil.java | 6 +- 3 files changed, 91 insertions(+), 59 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index b2e1aedea..287ae0e20 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -38,7 +38,7 @@ dependencies { runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.5.4-GTNH:dev") runtimeOnlyNonPublishable("curse.maven:Nashorn-374413:2924946") - compileOnly(files("./tools/bukkit-api/spigot-api-ONLY.jar")) +// compileOnly(files("./tools/bukkit-api/spigot-api-ONLY.jar")) // compileOnly(files("./tools/bukkit-api/Vault-1.4.1.jar")) shadowImplementation(project.files("tools/standalone-JaninoLoader-1.0.1-ALPHA.jar")) diff --git a/src/main/java/kamkeel/npcs/util/BukkitUtil.java b/src/main/java/kamkeel/npcs/util/BukkitUtil.java index 14f6b3609..29f4a522f 100644 --- a/src/main/java/kamkeel/npcs/util/BukkitUtil.java +++ b/src/main/java/kamkeel/npcs/util/BukkitUtil.java @@ -2,8 +2,8 @@ package kamkeel.npcs.util; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.bukkit.Bukkit; -import org.bukkit.plugin.RegisteredServiceProvider; + +import java.lang.reflect.Method; /** * Utility class for Bukkit integration detection and common operations. @@ -15,6 +15,26 @@ public class BukkitUtil { private static boolean initialized = false; private static boolean bukkitEnabled = false; + // Bukkit classes + private static Class bukkitClass; + private static Class serverClass; + private static Class servicesManagerClass; + private static Class registeredServiceProviderClass; + private static Class offlinePlayerClass; + private static Class playerClass; + + // Bukkit methods + private static Method getServer; + private static Method getServicesManager; + private static Method getRegistration; + private static Method getProvider; + private static Method getOfflinePlayer; + private static Method getPlayer; + private static Method getPluginManager; + private static Method isPluginEnabled; + + private static Method getPlugin; + /** * Initializes Bukkit integration using reflection. * Should be called during FMLServerStartedEvent to ensure Bukkit is fully loaded. @@ -26,24 +46,26 @@ public class BukkitUtil { initialized = true; try { - // Make sure all necessary bukkit methods and classes are available. - Class bukkitClass = Class.forName("org.bukkit.Bukkit"); - Class.forName("org.bukkit.Server"); - Class servicesManagerClass =Class.forName("org.bukkit.plugin.ServicesManager"); - Class registeredServiceProviderClass = Class.forName("org.bukkit.plugin.RegisteredServiceProvider"); - Class.forName("org.bukkit.OfflinePlayer"); - Class.forName("org.bukkit.entity.Player"); + // Load Bukkit classes + bukkitClass = Class.forName("org.bukkit.Bukkit"); + serverClass = Class.forName("org.bukkit.Server"); + servicesManagerClass = Class.forName("org.bukkit.plugin.ServicesManager"); + registeredServiceProviderClass = Class.forName("org.bukkit.plugin.RegisteredServiceProvider"); + offlinePlayerClass = Class.forName("org.bukkit.OfflinePlayer"); + playerClass = Class.forName("org.bukkit.entity.Player"); - bukkitClass.getMethod("getServer"); - bukkitClass.getMethod("getServicesManager"); - servicesManagerClass.getMethod("getRegistration", Class.class); - registeredServiceProviderClass.getMethod("getProvider"); - bukkitClass.getMethod("getOfflinePlayer", String.class); - bukkitClass.getMethod("getPlayer", String.class); - bukkitClass.getMethod("getPluginManager"); + // Get Bukkit methods + getServer = bukkitClass.getMethod("getServer"); + getServicesManager = bukkitClass.getMethod("getServicesManager"); + getRegistration = servicesManagerClass.getMethod("getRegistration", Class.class); + getProvider = registeredServiceProviderClass.getMethod("getProvider"); + getOfflinePlayer = bukkitClass.getMethod("getOfflinePlayer", String.class); + getPlayer = bukkitClass.getMethod("getPlayer", String.class); + getPluginManager = bukkitClass.getMethod("getPluginManager"); Class pluginManagerClass = Class.forName("org.bukkit.plugin.PluginManager"); - pluginManagerClass.getMethod("isPluginEnabled", String.class); + isPluginEnabled = pluginManagerClass.getMethod("isPluginEnabled", String.class); + getPlugin = pluginManagerClass.getMethod("getPlugin", String.class); bukkitEnabled = true; logger.info("Bukkit integration enabled"); @@ -51,7 +73,7 @@ public class BukkitUtil { // Initialize Vault after Bukkit is confirmed VaultUtil.init(); - } catch (ClassNotFoundException | NoClassDefFoundError e) { + } catch (ClassNotFoundException e) { logger.debug("Bukkit not found, Bukkit integration disabled"); } catch (NoSuchMethodException e) { logger.error("Bukkit API method not found", e); @@ -76,87 +98,99 @@ public class BukkitUtil { /** * Checks if a specific Bukkit plugin is enabled. - * * @param pluginName the plugin name to check * @return true if the plugin is enabled */ public static boolean isPluginEnabled(String pluginName) { - if (!isEnabled()) return false; + if (!bukkitEnabled) return false; try { - return Bukkit.getPluginManager().isPluginEnabled(pluginName); + Object pluginManager = getPluginManager.invoke(null); + return (Boolean) isPluginEnabled.invoke(pluginManager, pluginName); } catch (Exception e) { - logger.error("Error checking if plugin is enabled: {}", pluginName, e); + logger.error("Error checking if plugin is enabled: " + pluginName, e); return false; } } - /** - * @param pluginName name of the plugin to get. - * @return {@linkplain org.bukkit.plugin.Plugin Plugin} object for the name. Cast to correct class manually. - */ - public static Object getPlugin(String pluginName) { - if (!isEnabled()) return null; - - try { - return Bukkit.getPluginManager().getPlugin(pluginName); - } catch (Exception e) { - logger.error("Error getting plugin object: {}", pluginName, e); - return null; - } - } - /** * Gets a Bukkit OfflinePlayer by name. - * * @param playerName the player name - * @return the {@link org.bukkit.OfflinePlayer} object, or null if not available + * @return the OfflinePlayer object, or null if not available */ - @SuppressWarnings({"deprecation"}) public static Object getOfflinePlayer(String playerName) { - if (!isEnabled()) return null; + if (!bukkitEnabled) return null; try { - return Bukkit.getOfflinePlayer(playerName); + return getOfflinePlayer.invoke(null, playerName); } catch (Exception e) { - logger.error("Error getting OfflinePlayer: {}", playerName, e); + logger.error("Error getting OfflinePlayer: " + playerName, e); return null; } } /** * Gets a Bukkit Player by name (online players only). - * * @param playerName the player name - * @return the {@link org.bukkit.entity.Player} object, or null if not online or not available + * @return the Player object, or null if not online or not available */ public static Object getPlayer(String playerName) { - if (!isEnabled()) return null; + if (!bukkitEnabled) return null; try { - return Bukkit.getPlayer(playerName); + return getPlayer.invoke(null, playerName); } catch (Exception e) { - logger.error("Error getting Player: {}", playerName, e); + logger.error("Error getting Player: " + playerName, e); return null; } } /** * Gets a service provider from Bukkit's ServicesManager. - * * @param serviceClass the service class to get * @return the service provider, or null if not available */ - public static T getServiceProvider(Class serviceClass) { - if (!isEnabled()) return null; + public static Object getServiceProvider(Class serviceClass) { + if (!bukkitEnabled) return null; try { - RegisteredServiceProvider registration = Bukkit.getServicesManager().getRegistration(serviceClass); + Object servicesManager = getServicesManager.invoke(null); + Object registration = getRegistration.invoke(servicesManager, serviceClass); if (registration != null) { - return registration.getProvider(); + return getProvider.invoke(registration); } } catch (Exception e) { - logger.error("Error getting service provider: {}", serviceClass.getName(), e); + logger.error("Error getting service provider: " + serviceClass.getName(), e); + } + return null; + } + + // Getters for classes (for use by other utils like VaultUtil) + public static Class getBukkitClass() { + return bukkitClass; + } + + public static Class getServicesManagerClass() { + return servicesManagerClass; + } + + public static Class getRegisteredServiceProviderClass() { + return registeredServiceProviderClass; + } + + public static Class getOfflinePlayerClass() { + return offlinePlayerClass; + } + + public static Class getPlayerClass() { + return playerClass; + } + + public static Object getPlugin(String plugin) { + try { + return getPlugin.invoke(getPluginManager.invoke(null), plugin); + } catch (Throwable ignored) { + } return null; } diff --git a/src/main/java/kamkeel/npcs/util/VaultUtil.java b/src/main/java/kamkeel/npcs/util/VaultUtil.java index ab485e186..c25ea3f3a 100644 --- a/src/main/java/kamkeel/npcs/util/VaultUtil.java +++ b/src/main/java/kamkeel/npcs/util/VaultUtil.java @@ -3,8 +3,6 @@ package kamkeel.npcs.util; import net.minecraft.entity.player.EntityPlayer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; import java.lang.reflect.Method; @@ -70,14 +68,14 @@ public class VaultUtil { } try { - Class offlinePlayerClass = Class.forName("org.bukkit.OfflinePlayer"); + Class offlinePlayerClass = BukkitUtil.getOfflinePlayerClass(); if (offlinePlayerClass == null) { logger.error("Could not get OfflinePlayer class from BukkitUtil"); return; } // Load Vault classes - Plugin vault = Bukkit.getPluginManager().getPlugin("Vault"); + Object vault = BukkitUtil.getPlugin("Vault"); if (vault == null) return; ClassLoader vaultLoader = vault.getClass().getClassLoader();