Skip to content

Commit

Permalink
Add support for 2.6-alpha1
Browse files Browse the repository at this point in the history
  • Loading branch information
APickledWalrus committed May 24, 2021
1 parent ae70d25 commit 5f6c066
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 88 deletions.
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ plugins {
id 'eclipse'
}

version '1.2.2'
version '1.3-alpha1'

repositories {
mavenCentral()
Expand All @@ -16,7 +16,7 @@ repositories {
dependencies {
implementation 'org.eclipse.jdt:org.eclipse.jdt.annotation:1.1.0'
implementation 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT'
implementation ('com.github.SkriptLang:Skript:2.3') {
implementation ('com.github.SkriptLang.Skript:Skript:2.6-alpha1') {
transitive = false
}
}
Original file line number Diff line number Diff line change
@@ -1,42 +1,46 @@
package io.github.apickledwalrus.skriptgui.gui;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import ch.njol.skript.Skript;
import ch.njol.skript.SkriptEventHandler;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.Trigger;
import ch.njol.util.NonNullPair;
import io.github.apickledwalrus.skriptgui.util.ReflectionUtils;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;

import ch.njol.skript.SkriptEventHandler;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.Trigger;

import io.github.apickledwalrus.skriptgui.util.ReflectionUtils;
import java.util.ArrayList;
import java.util.List;

public class SkriptGUIEvent extends SkriptEvent {

private static SkriptGUIEvent instance;
public static SkriptGUIEvent getInstance() {
if (instance == null)
instance = new SkriptGUIEvent();
return instance;
}
private final List<NonNullPair<Class<? extends Event>, Trigger>> triggers = ReflectionUtils.getField(SkriptEventHandler.class, null, "triggers");

private final Map<Class<?>, List<Trigger>> triggers = ReflectionUtils.getField(SkriptEventHandler.class, null, "triggers");
private final List<GUIListener> listeners = new ArrayList<>();
private boolean registered = false;

private SkriptGUIEvent() {
register();
}

public static SkriptGUIEvent getInstance() {
if (instance == null)
instance = new SkriptGUIEvent();
return instance;
}

@Override
public boolean init(Literal<?>[] literals, int i, ParseResult parseResult) {
return true;
}

@Override
public boolean check(Event event) {
List<GUIListener> current = new ArrayList<>(listeners);
Expand All @@ -48,7 +52,11 @@ public boolean check(Event event) {
return false; // It needs to be false to not call Trigger#execute(e).
}

@SuppressWarnings("unchecked")
@Override
public String toString(Event event, boolean b) {
return event != null ? "gui event: " + event.getEventName() : "gui event";
}

public void register() {
if (!registered) {

Expand All @@ -67,20 +75,23 @@ public void register() {
* # Check here if it's a proper GUI.
* stop
*/
Trigger t = new Trigger(null, "gui inventory click", this, new ArrayList<>());

// These will be added before all triggers to cancel it before them.
addTrigger(t, 0 , InventoryClickEvent.class, InventoryDragEvent.class);
Trigger t = new Trigger(null, "gui inventory event", this, new ArrayList<>());
ReflectionUtils.setField(SkriptEvent.class, this, "eventPriority", EventPriority.LOWEST); // Try to make sure these are called first

// It will add for the last one
addTrigger(t, 1 , InventoryCloseEvent.class, InventoryOpenEvent.class);
// Add this trigger to the beginning of the triggers list for each event so that it can be cancelled first
assert triggers != null;
triggers.add(0, new NonNullPair<>(InventoryClickEvent.class, t));
triggers.add(0, new NonNullPair<>(InventoryDragEvent.class, t));
triggers.add(0, new NonNullPair<>(InventoryCloseEvent.class, t));
triggers.add(0, new NonNullPair<>(InventoryOpenEvent.class, t));

// Register these events with Skript
ReflectionUtils.invokeMethod(SkriptEventHandler.class, "registerBukkitEvents", null);
}
}

public void register(GUIListener gui) {
// Just in case it didn't enable the listener before opening a GUI.
// Just in case it didn't enable the listener before opening a GUI
register();
listeners.add(gui);
}
Expand All @@ -95,50 +106,8 @@ public void unregister(GUIListener gui) {
public void unregisterAll(){
listeners.forEach(GUIListener::finalize);
listeners.clear();
// When running '/skript reload all', it removes this object from Skript's event listener.
// When running '/skript reload all', it removes this object from Skript's event listener
registered = false;
}

@SuppressWarnings("unchecked")
private void addTrigger(Trigger t, int priority, Class<? extends Event>... classes) {
if (priority == 0) {
for (Class<?> clazz : classes) {
List<Trigger> current = null;
try {
current = triggers.get(clazz);
} catch (NullPointerException ex) {
Skript.exception(ex, "An error occured while trying to add triggers. If you are unsure why this occured, please report the error on the skript-gui GitHub.");
}
List<Trigger> newList = new ArrayList<>();
if (current == null) {
// It will add a new array in case it doesn't have the event.
newList.add(t);
triggers.put(clazz, newList);
} else {
/*
* This trigger will be put at the first index
* Then, the rest will be added again.
* This workaround is needed to not have conflicts between different objects.
*/
newList.addAll(current);
current.clear();
current.add(t);
current.addAll(newList);
}
}
} else {
SkriptEventHandler.addTrigger(classes, t);
}
}

@Override
public boolean init(Literal<?>[] literals, int i, ParseResult parseResult) {
return true;
}

@Override
public String toString(Event event, boolean b) {
return event != null ? "gui event: " + event.getEventName() : "gui event";
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.github.apickledwalrus.skriptgui.util;

import ch.njol.skript.ScriptLoader;
import ch.njol.skript.Skript;
import ch.njol.skript.config.Node;
import ch.njol.skript.config.SectionNode;
Expand All @@ -9,14 +8,14 @@
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.TriggerItem;
import ch.njol.skript.lang.TriggerSection;
import ch.njol.skript.lang.parser.ParserInstance;
import ch.njol.skript.log.HandlerList;
import ch.njol.skript.log.LogHandler;
import ch.njol.skript.log.ParseLogHandler;
import ch.njol.skript.log.RetainingLogHandler;
import ch.njol.skript.log.SkriptLogger;
import ch.njol.util.Kleenean;
import ch.njol.util.StringUtils;
import io.github.apickledwalrus.skriptgui.util.ReflectionUtils;
import org.bukkit.event.Event;

import java.util.ArrayList;
Expand All @@ -39,7 +38,7 @@ public abstract class EffectSection extends Condition {

public EffectSection() {
Node n = SkriptLogger.getNode(); // Skript sets the node before parsing this 'effect'
if (n == null || !(n instanceof SectionNode)) // Check in case it wasn't loaded as an inline condition
if (!(n instanceof SectionNode)) // Check in case it wasn't loaded as an inline condition
return;
// True if it was used as condition
hasIfOrElseIf = StringUtils.startsWithIgnoreCase(n.getKey(), "if ") || StringUtils.startsWithIgnoreCase(n.getKey(), "else if ");
Expand Down Expand Up @@ -83,10 +82,7 @@ public static <T extends EffectSection> T getCurrentSection(Class<? extends Effe
public static void stopLog(RetainingLogHandler logger) {
// Stop the current log handler
logger.stop();
// Using reflection to access the iterator of handlers
HandlerList handler = ReflectionUtils.getField(SkriptLogger.class, null, "handlers");
if (handler == null)
return;
HandlerList handler = ParserInstance.get().getHandlers();
Iterator<LogHandler> it = handler.iterator();
// A list containing the last handlers that will be stopped
List<LogHandler> toStop = new ArrayList<>();
Expand Down Expand Up @@ -156,7 +152,7 @@ public TriggerItem walk(Event event) {

/**
* It will load the section of this if any and then it will parse as in specific event.
* Basically it will call {@link ScriptLoader#setCurrentEvent(String, Class[])}, parse the current section,
* Basically it will call {@link ParserInstance#setCurrentEvent(String, Class[])}, parse the current section,
* and then set the current event back to the previous one.
* Useful to load a code from event X and parse as Y, allowing to use syntaxes that work on it.
*
Expand All @@ -167,13 +163,13 @@ public TriggerItem walk(Event event) {
@SuppressWarnings("unchecked")
public void loadSection(String name, boolean setNext, Class<? extends Event>... events) {
if (section != null && name != null && events != null && events.length > 0) {
String previousName = ScriptLoader.getCurrentEventName();
Class<? extends Event>[] previousEvents = ScriptLoader.getCurrentEvents();
Kleenean previousDelay = ScriptLoader.hasDelayBefore;
ScriptLoader.setCurrentEvent(name, events);
String previousName = getParser().getCurrentEventName();
Class<? extends Event>[] previousEvents = getParser().getCurrentEvents();
Kleenean previousDelay = getParser().getHasDelayBefore();
getParser().setCurrentEvent(name, events);
loadSection(setNext);
ScriptLoader.setCurrentEvent(previousName, previousEvents);
ScriptLoader.hasDelayBefore = previousDelay;
getParser().setCurrentEvent(previousName, previousEvents);
getParser().setHasDelayBefore(previousDelay);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ public static <T> T invokeMethod(Class<?> clazz, String method, Object instance,
* @param clazz The class to create the instance of.
* @return A instance object of the given class.
*/
public static <T> T newInstance(Class<T> clz) {
public static <T> T newInstance(Class<T> clazz) {
try {
Constructor<T> c = clz.getDeclaredConstructor();
Constructor<T> c = clazz.getDeclaredConstructor();
c.setAccessible(true);
return c.newInstance();
} catch (Exception e) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: skript-gui
main: io.github.apickledwalrus.skriptgui.SkriptGUI
version: 1.2.2
version: 1.3-alpha1
authors: [APickledWalrus, Tuke_Nuke]
description: Enables the easy creation of advanced and organized GUIs with Skript.
website: https://github.com/APickledWalrus/skript-gui
Expand Down

0 comments on commit 5f6c066

Please sign in to comment.