From 92cd894f39187df9c5965d12f76a2facc56abf62 Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Tue, 13 Jan 2026 21:39:04 +0200 Subject: [PATCH] Improved JaninoScript hook generation --- .../java/noppes/npcs/janino/JaninoScript.java | 87 ++++++++++++++++--- 1 file changed, 76 insertions(+), 11 deletions(-) diff --git a/src/main/java/noppes/npcs/janino/JaninoScript.java b/src/main/java/noppes/npcs/janino/JaninoScript.java index 5fb02a46e..bac0b1cf8 100644 --- a/src/main/java/noppes/npcs/janino/JaninoScript.java +++ b/src/main/java/noppes/npcs/janino/JaninoScript.java @@ -46,6 +46,12 @@ public abstract class JaninoScript implements IScriptUnit { public final IScriptBodyBuilder builder; protected IScriptClassBody scriptBody; + private boolean hooksInitialized = false; + // Hook list for GUI display + private List hookList = new ArrayList<>(); + // Map from display name (with parameters if overloaded) to Method + private Map hookMap = new HashMap<>(); + protected JaninoScript(Class type, Consumer> buildSettings) { this.type = type; this.builder = IScriptBodyBuilder @@ -257,15 +263,22 @@ public abstract class JaninoScript implements IScriptUnit { return true; return script != null && !script.isEmpty(); } - + @Override public String generateHookStub(String hookName, Object hookData) { - // If hookData is a Method, generate full Java method stub - if (hookData instanceof Method) { - return generateMethodStub((Method) hookData); + // Build hook list and map + if (!hooksInitialized) { + createHookList(); + hooksInitialized = true; } - // Fallback for simple hook names - generate basic override - return String.format("@Override\npublic void %s() {\n \n}\n", hookName); + + // Look up in hookMap (handles both simple names and overloaded display names) + Method method = hookMap.get(hookName); + if (method != null) + return generateMethodStub(method); + + // Fallback for unknown hook names - generate basic override + return String.format("public void %s() {\n \n}\n", hookName); } /** @@ -285,12 +298,22 @@ public abstract class JaninoScript implements IScriptUnit { String params = Arrays.stream(method.getParameters()) .map(p -> { String typeName = p.getType().getSimpleName(); - String baseName = Character.toLowerCase(typeName.charAt(0)) + typeName.substring(1); - int count = typeCount.getOrDefault(baseName, 0) + 1; - typeCount.put(baseName, count); + // Check for @ParamName annotation first + ParamName paramNameAnnotation = p.getAnnotation(ParamName.class); + String paramName; - String paramName = count == 1 ? baseName : baseName + (count - 1); + if (paramNameAnnotation != null) { + // Use annotated name + paramName = paramNameAnnotation.value(); + } else { + // Fall back to generated name + String baseName = Character.toLowerCase(typeName.charAt(0)) + typeName.substring(1); + int count = typeCount.getOrDefault(baseName, 0) + 1; + typeCount.put(baseName, count); + paramName = count == 1 ? baseName : baseName + (count - 1); + } + return typeName + " " + paramName; }) .collect(Collectors.joining(", ")); @@ -310,7 +333,49 @@ public abstract class JaninoScript implements IScriptUnit { body = " return null;"; } - return String.format("@Override\n%s%s %s(%s) {\n%s\n}\n", mods, returnTypeStr, name, params, body); + return String.format("%s%s %s(%s) {\n%s\n}\n", mods, returnTypeStr, name, params, body); + } + + + /** + * Create the hook list and hook map for GUI display and generation. + * Groups methods by name and creates display names with parameters for overloaded methods. + */ + private void createHookList() { + // Group all declared methods by their name + Map> grouped = Arrays.stream(type.getDeclaredMethods()) + .collect(Collectors.groupingBy(Method::getName)); + + for (Map.Entry> entry : grouped.entrySet()) { + List methods = entry.getValue(); + + // Sort overloads by parameter count (ascending) + methods.sort(Comparator.comparingInt(Method::getParameterCount)); + boolean first = true; + + for (Method m : methods) { + if (Modifier.isFinal(m.getModifiers())) + continue; // Skip final methods + + // For first (simplest) overload, use just the method name + // For additional overloads, include parameter types in display name + String displayName = first ? m.getName() : + m.getName() + "(" + Arrays.stream(m.getParameterTypes()) + .map(Class::getSimpleName) + .collect(Collectors.joining(", ")) + ")"; + + hookList.add(displayName); + hookMap.put(displayName, m); + first = false; + } + } + } + + /** + * Get the list of hook names for GUI display. + */ + public List getHookList() { + return new ArrayList<>(hookList); }