Skip to content

Commit a80b804

Browse files
committed
Make EvtByReflection indicate whether its events are cancellable
1 parent 8f6bb82 commit a80b804

File tree

1 file changed

+43
-9
lines changed

1 file changed

+43
-9
lines changed

src/main/java/com/btk5h/skriptmirror/skript/reflect/EvtByReflection.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.btk5h.skriptmirror.skript.reflect;
22

33
import ch.njol.skript.Skript;
4-
import ch.njol.skript.SkriptConfig;
54
import ch.njol.skript.lang.Literal;
65
import ch.njol.skript.lang.SelfRegisteringSkriptEvent;
76
import ch.njol.skript.lang.SkriptParser;
@@ -10,7 +9,11 @@
109
import com.btk5h.skriptmirror.SkriptMirror;
1110
import com.btk5h.skriptmirror.WrappedEvent;
1211
import org.bukkit.Bukkit;
13-
import org.bukkit.event.*;
12+
import org.bukkit.event.Cancellable;
13+
import org.bukkit.event.Event;
14+
import org.bukkit.event.EventException;
15+
import org.bukkit.event.HandlerList;
16+
import org.bukkit.event.Listener;
1417
import org.bukkit.plugin.EventExecutor;
1518

1619
import java.util.Arrays;
@@ -19,7 +22,7 @@
1922
public class EvtByReflection extends SelfRegisteringSkriptEvent {
2023

2124
static {
22-
Skript.registerEvent("Bukkit", EvtByReflection.class, BukkitEvent.class,
25+
Skript.registerEvent("*reflection", EvtByReflection.class, BukkitEvent.class,
2326
"[(1¦all)] %javatypes%");
2427
}
2528

@@ -35,12 +38,16 @@ public MyEventExecutor(Class<? extends Event> eventClass, Trigger trigger) {
3538
@Override
3639
public void execute(Listener listener, Event event) throws EventException {
3740
if (eventClass.isInstance(event)) {
38-
trigger.execute(new BukkitEvent(event));
41+
Event scriptEvent;
42+
scriptEvent = event instanceof Cancellable
43+
? new CancellableBukkitEvent((Cancellable) event) : new BukkitEvent(event);
44+
45+
trigger.execute(scriptEvent);
3946
}
4047
}
4148
}
4249

43-
private static class BukkitEvent extends WrappedEvent implements Cancellable {
50+
private static class BukkitEvent extends WrappedEvent {
4451
public BukkitEvent(Event event) {
4552
super(event, event.isAsynchronous());
4653
}
@@ -50,19 +57,23 @@ public HandlerList getHandlers() {
5057
// No HandlerList implementation because this event should never be called
5158
throw new IllegalStateException();
5259
}
60+
}
61+
62+
private static class CancellableBukkitEvent extends BukkitEvent implements Cancellable {
63+
public CancellableBukkitEvent(Cancellable event) {
64+
super((Event) event);
65+
}
5366

5467
@Override
5568
public boolean isCancelled() {
5669
Event event = getDirectEvent();
57-
return event instanceof Cancellable && ((Cancellable) event).isCancelled();
70+
return ((Cancellable) event).isCancelled();
5871
}
5972

6073
@Override
6174
public void setCancelled(boolean cancel) {
6275
Event event = getDirectEvent();
63-
if (event instanceof Cancellable) {
64-
((Cancellable) event).setCancelled(cancel);
65-
}
76+
((Cancellable) event).setCancelled(cancel);
6677
}
6778
}
6879

@@ -116,6 +127,29 @@ public void unregisterAll() {
116127
HandlerList.unregisterAll(listener);
117128
}
118129

130+
@SuppressWarnings("unchecked")
131+
@Override
132+
public Class<? extends Event>[] getEventClasses() {
133+
boolean hasUncancellable = false;
134+
boolean hasCancellable = false;
135+
136+
for (Class<? extends Event> eventClass : classes) {
137+
if (Cancellable.class.isAssignableFrom(eventClass)) {
138+
hasCancellable = true;
139+
} else {
140+
hasUncancellable = true;
141+
}
142+
}
143+
144+
if (hasCancellable && hasUncancellable) {
145+
return new Class[] {BukkitEvent.class, CancellableBukkitEvent.class};
146+
} else if (hasCancellable) {
147+
return new Class[] {CancellableBukkitEvent.class};
148+
} else {
149+
return new Class[] {BukkitEvent.class};
150+
}
151+
}
152+
119153
@Override
120154
public boolean isEventPrioritySupported() {
121155
return true;

0 commit comments

Comments
 (0)