Skip to content

Commit be285a6

Browse files
Track GUI closing by events
1 parent 39663fb commit be285a6

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

src/main/java/io/github/apickledwalrus/skriptgui/elements/effects/EffCancelGUIClose.java renamed to src/main/java/io/github/apickledwalrus/skriptgui/elements/effects/EffCancelGuiClosing.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@
3030
"\t\tcancel the gui closing"
3131
})
3232
@Since("1.2.0")
33-
public class EffCancelGUIClose extends Effect {
33+
public class EffCancelGuiClosing extends Effect {
3434

3535
static {
36-
Skript.registerEffect(EffCancelGUIClose.class,
36+
Skript.registerEffect(EffCancelGuiClosing.class,
3737
"(:cancel|uncancel) [the] gui clos(e|ing)"
3838
);
3939
}
@@ -48,14 +48,15 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye
4848
return false;
4949
}
5050
cancel = parseResult.hasTag("cancel");
51+
parser.setHasDelayBefore(Kleenean.TRUE); // Cancelling forces a 1-tick delay
5152
return true;
5253
}
5354

5455
@Override
5556
protected void execute(Event event) {
5657
GUI gui = SkriptGUI.getGUIManager().getGUI(event);
5758
if (gui != null) {
58-
gui.setCloseCancelled(cancel);
59+
gui.setCloseCancelled(event, cancel);
5960
}
6061
}
6162

src/main/java/io/github/apickledwalrus/skriptgui/gui/GUI.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.bukkit.Material;
77
import org.bukkit.entity.HumanEntity;
88
import org.bukkit.entity.Player;
9+
import org.bukkit.event.Event;
910
import org.bukkit.event.inventory.InventoryClickEvent;
1011
import org.bukkit.event.inventory.InventoryCloseEvent;
1112
import org.bukkit.event.inventory.InventoryDragEvent;
@@ -17,8 +18,10 @@
1718

1819
import java.util.ArrayList;
1920
import java.util.HashMap;
21+
import java.util.HashSet;
2022
import java.util.Map;
2123
import java.util.Map.Entry;
24+
import java.util.Set;
2225
import java.util.function.Consumer;
2326

2427
public class GUI implements AnyNamed {
@@ -116,10 +119,10 @@ public void onClose(InventoryCloseEvent e) {
116119
if (onClose != null) {
117120
SkriptGUI.getGUIManager().setGUI(e, GUI.this);
118121
onClose.accept(e);
119-
if (closeCancelled) {
122+
if (closeCancelled.contains(e)) {
120123
Bukkit.getScheduler().runTaskLater(SkriptGUI.getInstance(), () -> {
121124
// Reset behavior (it shouldn't persist)
122-
setCloseCancelled(false);
125+
setCloseCancelled(e, false);
123126

124127
Player closer = (Player) e.getPlayer();
125128
pause(closer); // Avoid calling any open sections
@@ -153,7 +156,7 @@ public void onClose(InventoryCloseEvent e) {
153156
@Nullable
154157
private Consumer<InventoryCloseEvent> onClose;
155158
// Whether the inventory close event for this event handler is cancelled.
156-
private boolean closeCancelled;
159+
private final Set<Event> closeCancelled = new HashSet<>();
157160

158161
@Nullable
159162
private String id;
@@ -500,8 +503,12 @@ public void setOnClose(Consumer<InventoryCloseEvent> onClose) {
500503
* Sets whether this GUI's close event should be cancelled.
501504
* @param cancel Whether this GUI's close event should be cancelled.
502505
*/
503-
public void setCloseCancelled(boolean cancel) {
504-
closeCancelled = cancel;
506+
public void setCloseCancelled(Event event, boolean cancel) {
507+
if (cancel) {
508+
closeCancelled.add(event);
509+
} else {
510+
closeCancelled.remove(event);
511+
}
505512
}
506513

507514
/**

0 commit comments

Comments
 (0)