Skip to content

Commit

Permalink
Fix SkriptEventInfo Compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
APickledWalrus committed Sep 29, 2024
1 parent 0c30aba commit 865ddd0
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 26 deletions.
20 changes: 2 additions & 18 deletions src/main/java/ch/njol/skript/Skript.java
Original file line number Diff line number Diff line change
Expand Up @@ -1528,24 +1528,8 @@ public static <E extends SkriptEvent> SkriptEventInfo<E> registerEvent(
checkAcceptRegistrations();
for (int i = 0; i < patterns.length; i++)
patterns[i] = BukkitSyntaxInfos.fixPattern(patterns[i]);
SkriptEventInfo<E> legacy = new SkriptEventInfo<>(name, patterns, eventClass, "", events);
BukkitSyntaxInfos.Event.Builder<?, E> builder = BukkitSyntaxInfos.Event.builder(legacy.getElementClass(), name)
.origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(legacy.getElementClass())))
.addPatterns(legacy.getPatterns())
.addEvents(legacy.events);
if (legacy.getSince() != null)
builder.since(legacy.getSince());
if (legacy.getDocumentationID() != null)
builder.documentationId(legacy.getDocumentationID());
if (legacy.getDescription() != null)
builder.addDescription(legacy.getDescription());
if (legacy.getExamples() != null)
builder.addExamples(legacy.getExamples());
if (legacy.getKeywords() != null)
builder.addKeywords(legacy.getKeywords());
if (legacy.getRequiredPlugins() != null)
builder.addRequiredPlugins(legacy.getRequiredPlugins());
skript.syntaxRegistry().register(BukkitRegistryKeys.EVENT, builder.build());
var legacy = new SkriptEventInfo.ModernSkriptEventInfo<>(name, patterns, eventClass, "", events);
skript.syntaxRegistry().register(BukkitRegistryKeys.EVENT, legacy);
return legacy;
}

Expand Down
131 changes: 130 additions & 1 deletion src/main/java/ch/njol/skript/lang/SkriptEventInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,29 @@
*/
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;
import ch.njol.skript.lang.SkriptEventInfo.ModernSkriptEventInfo;
import org.bukkit.event.Event;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos;
import org.skriptlang.skript.lang.structure.StructureInfo;
import org.skriptlang.skript.registration.SyntaxInfo;
import org.skriptlang.skript.registration.SyntaxOrigin;
import org.skriptlang.skript.util.Priority;

import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.List;
import java.util.Locale;

public final class SkriptEventInfo<E extends SkriptEvent> extends StructureInfo<E> {
public sealed class SkriptEventInfo<E extends SkriptEvent> extends StructureInfo<E> permits ModernSkriptEventInfo {

public Class<? extends Event>[] events;
public final String name;
Expand Down Expand Up @@ -200,4 +212,121 @@ public ListeningBehavior getListeningBehavior() {
return documentationID;
}

/*
* Registration API Compatibility
*/

@ApiStatus.Experimental
public static final class ModernSkriptEventInfo<E extends SkriptEvent>
extends SkriptEventInfo<E>
implements BukkitSyntaxInfos.Event<E> {

private final SyntaxOrigin origin;

public ModernSkriptEventInfo(String name, String[] patterns, Class<E> eventClass, String originClassPath, Class<? extends Event>[] events) {
super(name, patterns, eventClass, originClassPath, events);
origin = SyntaxOrigin.of(Skript.getAddon(JavaPlugin.getProvidingPlugin(eventClass)));
}

@Override
public Builder<? extends Builder<?, E>, E> builder() {
return BukkitSyntaxInfos.Event.builder(type(), name())
.origin(origin)
.addPatterns(patterns())
.priority(priority())
.listeningBehavior(listeningBehavior())
.since(since())
.documentationId(id())
.addDescription(description())
.addExamples(examples())
.addKeywords(keywords())
.addRequiredPlugins(requiredPlugins())
.addEvents(events());
}

@Override
public SyntaxOrigin origin() {
return origin;
}

@Override
public Class<E> type() {
return getElementClass();
}

@Override
public E instance() {
try {
return type().getDeclaredConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException |
NoSuchMethodException e) {
throw new RuntimeException(e);
}
}

@Override
public @Unmodifiable Collection<String> patterns() {
return List.of(getPatterns());
}

@Override
public Priority priority() {
return SyntaxInfo.COMBINED;
}

@Override
public ListeningBehavior listeningBehavior() {
return getListeningBehavior();
}

@Override
public String name() {
return getName();
}

@Override
public String id() {
return getId();
}

@Override
public @Nullable String since() {
return getSince();
}

@Override
public @Nullable String documentationId() {
return getDocumentationID();
}

@Override
public Collection<String> description() {
String[] description = getDescription();
return description != null ? List.of(description) : List.of();
}

@Override
public Collection<String> examples() {
String[] examples = getExamples();
return examples != null ? List.of(examples) : List.of();
}

@Override
public Collection<String> keywords() {
String[] keywords = getKeywords();
return keywords != null ? List.of(keywords) : List.of();
}

@Override
public Collection<String> requiredPlugins() {
String[] requiredPlugins = getRequiredPlugins();
return requiredPlugins != null ? List.of(requiredPlugins) : List.of();
}

@Override
public Collection<Class<? extends Event>> events() {
return List.of(events);
}
}

}
11 changes: 4 additions & 7 deletions src/main/java/ch/njol/skript/lang/SyntaxElementInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,7 @@ public String getOriginClassPath() {
@ApiStatus.Experimental
@SuppressWarnings("unchecked")
public static <I extends SyntaxElementInfo<E>, E extends SyntaxElement> I fromModern(SyntaxInfo<? extends E> info) {
if (info instanceof BukkitSyntaxInfos.Event) {
BukkitSyntaxInfos.Event<?> event = (BukkitSyntaxInfos.Event<?>) info;

if (info instanceof BukkitSyntaxInfos.Event<?> event) {
// We must first go back to the raw input
String rawName = event.name().startsWith("On ")
? event.name().substring(3)
Expand All @@ -109,12 +107,11 @@ public static <I extends SyntaxElementInfo<E>, E extends SyntaxElement> I fromMo
.requiredPlugins(event.requiredPlugins().toArray(new String[0]));

return (I) eventInfo;
} else if (info instanceof SyntaxInfo.Structure) {
SyntaxInfo.Structure<?> structure = (SyntaxInfo.Structure<?>) info;
} else if (info instanceof SyntaxInfo.Structure<?> structure) {
return (I) new StructureInfo<>(structure.patterns().toArray(new String[0]), structure.type(),
structure.origin().name(), structure.entryValidator(), structure.nodeType());
} else if (info instanceof SyntaxInfo.Expression) {
return (I) fromModernExpression((SyntaxInfo.Expression<?, ?>) info);
} else if (info instanceof SyntaxInfo.Expression<?, ?> expression) {
return (I) fromModernExpression(expression);
}

return (I) new SyntaxElementInfo<>(info.patterns().toArray(new String[0]), info.type(), info.origin().name());
Expand Down

0 comments on commit 865ddd0

Please sign in to comment.