diff --git a/src/main/java/ch/njol/skript/Skript.java b/src/main/java/ch/njol/skript/Skript.java index 654f9efe3a5..9365404213e 100644 --- a/src/main/java/ch/njol/skript/Skript.java +++ b/src/main/java/ch/njol/skript/Skript.java @@ -1488,6 +1488,23 @@ public static Origin getSyntaxOrigin(Class source) { return Origin.UNKNOWN; } + private static final StackWalker STACK_WALKER = + StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); + + /** + * Finds the first class outside of {@link Skript} in the current call stack, + * which is the class that invoked a legacy registration method. + * @param fallback The class to return if no such class is found. + * @return The registering class, or {@code fallback}. + */ + private static Class getRegisteringClass(Class fallback) { + return STACK_WALKER.walk(frames -> frames + .map(StackWalker.StackFrame::getDeclaringClass) + .filter(declaringClass -> declaringClass != Skript.class) + .findFirst() + .orElse(fallback)); + } + /** * Registers a {@link Condition}. * @@ -1711,7 +1728,16 @@ public static SkriptEventInfo registerEvent( checkAcceptRegistrations(); for (int i = 0; i < patterns.length; i++) patterns[i] = BukkitSyntaxInfos.fixPattern(patterns[i]); - var legacy = new SkriptEventInfo.ModernSkriptEventInfo<>(name, patterns, eventClass, "", events); + + // Event classes may be shared between addons (e.g. SimpleEvent), so the origin is + // determined from the class that registered the event rather than the event class. + Class registeringClass = getRegisteringClass(eventClass); + Origin origin = getSyntaxOrigin(registeringClass); + if (origin == Origin.UNKNOWN) + origin = getSyntaxOrigin(eventClass); + + var legacy = new SkriptEventInfo.ModernSkriptEventInfo<>( + name, patterns, eventClass, registeringClass.getName(), events, origin); skript.syntaxRegistry().register(BukkitSyntaxInfos.Event.KEY, legacy); return legacy; } diff --git a/src/main/java/ch/njol/skript/lang/SkriptEventInfo.java b/src/main/java/ch/njol/skript/lang/SkriptEventInfo.java index 6ecb13e51f6..20846c7637e 100644 --- a/src/main/java/ch/njol/skript/lang/SkriptEventInfo.java +++ b/src/main/java/ch/njol/skript/lang/SkriptEventInfo.java @@ -1,6 +1,5 @@ package ch.njol.skript.lang; -import ch.njol.skript.Skript; import ch.njol.skript.SkriptAPIException; import ch.njol.skript.SkriptConfig; import ch.njol.skript.lang.SkriptEvent.ListeningBehavior; @@ -248,9 +247,10 @@ public static final class ModernSkriptEventInfo private final Origin origin; - public ModernSkriptEventInfo(String name, String[] patterns, Class eventClass, String originClassPath, Class[] events) { + public ModernSkriptEventInfo(String name, String[] patterns, Class eventClass, String originClassPath, + Class[] events, Origin origin) { super(name, patterns, eventClass, originClassPath, events); - this.origin = Skript.getSyntaxOrigin(eventClass); + this.origin = origin; } @Override