Skip to content

Commit

Permalink
Rework event handling
Browse files Browse the repository at this point in the history
skript-gui no longer uses Skript as a middle man

also removes all reflection (events were the last thing using it)

Nightly users: Please note that this change is very experimental and there may be issues. Initial testing has resulted in some fixes, but there may be additional bugs I did not catch.
  • Loading branch information
APickledWalrus committed Aug 5, 2021
1 parent ccd7c47 commit 66bb8cc
Show file tree
Hide file tree
Showing 21 changed files with 368 additions and 584 deletions.
15 changes: 13 additions & 2 deletions src/main/java/io/github/apickledwalrus/skriptgui/SkriptGUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.io.IOException;

import ch.njol.skript.util.Version;
import io.github.apickledwalrus.skriptgui.gui.events.GUIEvents;
import io.github.apickledwalrus.skriptgui.gui.events.RecipeEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;

Expand All @@ -14,8 +16,8 @@ public class SkriptGUI extends JavaPlugin {

@SuppressWarnings("NotNullFieldNotInitialized")
private static SkriptGUI instance;

private static final GUIManager manager = new GUIManager();
@SuppressWarnings("NotNullFieldNotInitialized")
private static GUIManager manager;

@Override
public void onEnable() {
Expand Down Expand Up @@ -44,6 +46,15 @@ public void onEnable() {
e.printStackTrace();
getServer().getPluginManager().disablePlugin(this);
}

// Register manager and events
manager = new GUIManager();
getServer().getPluginManager().registerEvents(new GUIEvents(), this);
if (Skript.classExists("com.destroystokyo.paper.event.player.PlayerRecipeBookClickEvent")) {
// We need to track this event (see https://github.com/APickledWalrus/skript-gui/issues/33)
getServer().getPluginManager().registerEvents(new RecipeEvent(), this);
}

}

public static SkriptGUI getInstance() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import ch.njol.util.Kleenean;
import io.github.apickledwalrus.skriptgui.SkriptGUI;
import io.github.apickledwalrus.skriptgui.elements.sections.SecGUIOpenClose;
import io.github.apickledwalrus.skriptgui.gui.GUI;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;

Expand Down Expand Up @@ -51,7 +52,10 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye

@Override
protected void execute(Event e) {
SkriptGUI.getGUIManager().getGUIEvent(e).setCloseCancelled(cancel);
GUI gui = SkriptGUI.getGUIManager().getGUI(e);
if (gui != null) {
gui.setCloseCancelled(cancel);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,13 @@
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import io.github.apickledwalrus.skriptgui.SkriptGUI;
import io.github.apickledwalrus.skriptgui.gui.GUI;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;

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

@Name("Global GUI Identifiers")
@Description("A list of the identifiers of all registered global GUIs.")
@Examples({
Expand All @@ -38,7 +42,13 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye

@Override
protected String[] get(Event e) {
return SkriptGUI.getGUIManager().getGlobalIdentifiers();
List<String> identifiers = new ArrayList<>();
for (GUI gui : SkriptGUI.getGUIManager().getTrackedGUIs()) {
if (gui.getID() != null) {
identifiers.add(gui.getID());
}
}
return identifiers.toArray(new String[0]);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public void change(Event e, Object @Nullable [] delta, ChangeMode mode) {
if (delta == null || (mode != ChangeMode.SET && mode != ChangeMode.RESET)) {
return;
}
GUI gui = SkriptGUI.getGUIManager().getGUIEvent(e);
GUI gui = SkriptGUI.getGUIManager().getGUI(e);
if (gui != null) {
switch (mode) {
case SET:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ protected Object[] get(Event event) {
return e.getViewers().toArray(new HumanEntity[0]);
case 11:
case 12:
GUI gui = SkriptGUI.getGUIManager().getGUIEvent(event);
GUI gui = SkriptGUI.getGUIManager().getGUI(event);
if (pattern == 11) {
return gui != null ? new String[]{"" + gui.convert(e.getSlot())} : new GUI[0];
}
Expand All @@ -123,7 +123,7 @@ protected Object[] get(Event event) {
case 10:
return (e.getViewers().toArray(new HumanEntity[0]));
case 12:
GUI gui = SkriptGUI.getGUIManager().getGUIEvent(event);
GUI gui = SkriptGUI.getGUIManager().getGUI(event);
return gui != null ? new GUI[]{gui} : new GUI[0];
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package io.github.apickledwalrus.skriptgui.elements.expressions;

import ch.njol.skript.Skript;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import io.github.apickledwalrus.skriptgui.SkriptGUI;
import io.github.apickledwalrus.skriptgui.gui.GUI;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;

public class ExprGUIs extends SimpleExpression<GUI> {

static {
Skript.registerExpression(ExprGUIs.class, GUI.class, ExpressionType.SIMPLE, "all guis");
}

@Override
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
return true;
}

@Override
@Nullable
protected GUI[] get(Event e) {
return SkriptGUI.getGUIManager().getTrackedGUIs().toArray(new GUI[0]);
}

@Override
public boolean isSingle() {
return false;
}

@Override
public Class<? extends GUI> getReturnType() {
return GUI.class;
}

@Override
public String toString(@Nullable Event e, boolean debug) {
return "all guis";
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean kleenean
protected GUI[] get(Event e) {
if (id != null) {
String id = this.id.getSingle(e);
return id != null ? new GUI[]{SkriptGUI.getGUIManager().getGlobalGUI(id)} : new GUI[0];
return id != null ? new GUI[]{SkriptGUI.getGUIManager().getGUI(id)} : new GUI[0];
}
return new GUI[]{SkriptGUI.getGUIManager().getGUIEvent(e)};
return new GUI[]{SkriptGUI.getGUIManager().getGUI(e)};
}

@Override
Expand All @@ -69,10 +69,9 @@ public void change(Event e, Object @Nullable [] delta, ChangeMode mode) {
if (id != null) {
String id = this.id.getSingle(e);
if (id != null) {
GUI gui = SkriptGUI.getGUIManager().getGlobalGUI(id);
GUI gui = SkriptGUI.getGUIManager().getGUI(id);
if (gui != null) {
gui.setID(null);
gui.clear();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package io.github.apickledwalrus.skriptgui.elements.expressions;

import org.bukkit.event.Event;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;

import ch.njol.skript.Skript;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
Expand All @@ -14,7 +10,10 @@
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import io.github.apickledwalrus.skriptgui.util.InventoryUtils;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.eclipse.jdt.annotation.Nullable;

@Name("Virtual Inventory")
Expand All @@ -37,7 +36,7 @@ public class ExprVirtualInventory extends SimpleExpression<Inventory>{
@Nullable
private Expression<InventoryType> inventoryType;
@Nullable
private Expression<Number> size;
private Expression<Number> rows;
@Nullable
private Expression<String> name;

Expand Down Expand Up @@ -74,10 +73,10 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean kleenean

if (matchedPattern > 1) {
name = (Expression<String>) exprs[1];
size = (Expression<Number>) exprs[2];
rows = (Expression<Number>) exprs[2];
} else {
name = (Expression<String>) exprs[2];
size = (Expression<Number>) exprs[1];
rows = (Expression<Number>) exprs[1];
}

return true;
Expand All @@ -91,10 +90,31 @@ protected Inventory[] get(Event e) {
} else if (type == InventoryType.CRAFTING) { // Make it a valid inventory. It's not the same, but it's likely what the user wants.
type = InventoryType.WORKBENCH;
}
Number size = this.size != null ? this.size.getSingle(e) : null;

String name = this.name != null ? this.name.getSingle(e) : null;
invName = name != null ? name : type.getDefaultTitle();
return new Inventory[]{InventoryUtils.newInventory(type, (size != null ? size.intValue() * 9 : null), name)};

Inventory inventory;
if (type == InventoryType.CHEST) {
int size = -1;
if (rows != null) {
Number rows = this.rows.getSingle(e);
if (rows != null) {
size = rows.intValue();
if (size <= 6) {
size *= 9;
}
}
}
if (size == 0 || size % 9 != 0) { // Invalid inventory size
size = type.getDefaultSize();
}
inventory = Bukkit.getServer().createInventory(null, size, invName);
} else {
inventory = Bukkit.getServer().createInventory(null, type, invName);
}

return new Inventory[]{inventory};
}

@Override
Expand All @@ -111,7 +131,7 @@ public Class<? extends Inventory> getReturnType() {
public String toString(@Nullable Event e, boolean debug) {
return "virtual " + (inventoryType != null ? inventoryType.toString(e, debug) : specifiedType != null ? specifiedType.name().toLowerCase() : "unknown inventory type")
+ (name != null ? " with name" + name.toString(e, debug) : "")
+ (size != null ? " with " + size.toString(e, debug) + " rows" : "");
+ (rows != null ? " with " + rows.toString(e, debug) + " rows" : "");
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import io.github.apickledwalrus.skriptgui.SkriptGUI;
import io.github.apickledwalrus.skriptgui.elements.expressions.ExprVirtualInventory;
import io.github.apickledwalrus.skriptgui.gui.GUI;
import io.github.apickledwalrus.skriptgui.gui.SkriptGUIEvent;
import org.bukkit.event.Event;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
Expand Down Expand Up @@ -46,7 +45,7 @@ public class SecCreateGUI extends EffectSection {
private boolean stealableItems;

@Nullable
private Expression<GUI> exprGUI;
private Expression<GUI> gui;

@Override
@SuppressWarnings("unchecked")
Expand All @@ -56,7 +55,7 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean kleenean
Skript.error("You can't edit a gui inventory using an empty section, you need to change at least a slot or a property.");
return false;
}
exprGUI = (Expression<GUI>) exprs[0];
gui = (Expression<GUI>) exprs[0];
} else {
id = (Expression<String>) exprs[0];
inv = (Expression<Inventory>) exprs[1];
Expand All @@ -69,16 +68,13 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean kleenean
loadOptionalCode(sectionNode);
}

// Just a safe check, to make sure the listener was registered when this is loaded
SkriptGUIEvent.getInstance().register();

return true;
}

@Override
@Nullable
public TriggerItem walk(Event e) {
if (exprGUI == null) { // Creating a new GUI.
if (gui == null) { // Creating a new GUI.
Inventory inv = this.inv.getSingle(e);
if (inv != null) {

Expand Down Expand Up @@ -106,11 +102,11 @@ public TriggerItem walk(Event e) {
gui.setID(id);
}

SkriptGUI.getGUIManager().setGUIEvent(e, gui);
SkriptGUI.getGUIManager().setGUI(e, gui);
}
} else { // Editing the given GUI.
GUI gui = exprGUI.getSingle(e);
SkriptGUI.getGUIManager().setGUIEvent(e, gui);
GUI gui = this.gui.getSingle(e);
SkriptGUI.getGUIManager().setGUI(e, gui);
}

// 'first' will be null if no section is present
Expand All @@ -119,7 +115,22 @@ public TriggerItem walk(Event e) {

@Override
public String toString(@Nullable Event e, boolean debug) {
return exprGUI != null ? "edit GUI " + exprGUI.toString(e, debug) : "create gui";
if (gui != null) {
return "edit gui " + gui.toString(e, debug);
} else {
StringBuilder creation = new StringBuilder("create a gui");
if (id != null) {
creation.append(" with id ").append(id.toString(e, debug));
}
creation.append(" with ").append(inv.toString(e, debug));
if (stealableItems) {
creation.append(" with stealable items");
}
if (shape != null) {
creation.append(" and shape ").append(shape.toString(e, debug));
}
return creation.toString();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,12 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye
@Override
@Nullable
public TriggerItem walk(Event e) {
GUI gui = SkriptGUI.getGUIManager().getGUIEvent(e);
GUI gui = SkriptGUI.getGUIManager().getGUI(e);
if (gui != null) {
Object variables = Variables.copyLocalVariables(e);
if (close) {
if (variables != null) {
gui.setOnClose(event -> {
SkriptGUI.getGUIManager().setGUIEvent(event, gui);
Variables.setLocalVariables(event, variables);
trigger.execute(event);
});
Expand All @@ -84,7 +83,6 @@ public TriggerItem walk(Event e) {
} else {
if (variables != null) {
gui.setOnOpen(event -> {
SkriptGUI.getGUIManager().setGUIEvent(event, gui);
Variables.setLocalVariables(event, variables);
trigger.execute(event);
});
Expand Down
Loading

0 comments on commit 66bb8cc

Please sign in to comment.