2424import net .kyori .adventure .text .format .NamedTextColor ;
2525import org .bukkit .entity .Entity ;
2626import org .bukkit .event .Event ;
27+ import org .bukkit .event .HandlerList ;
2728
29+ import java .lang .invoke .MethodHandle ;
30+ import java .lang .invoke .MethodHandles ;
31+ import java .lang .reflect .Field ;
2832import java .util .Arrays ;
2933import java .util .List ;
34+ import java .util .Locale ;
35+ import java .util .Set ;
3036
3137public class EventCommand extends BukkitCommandReflection {
38+ private static final MethodHandle EVENT_TYPES_HANDLE ;
3239 private final DebuggeryBukkit plugin ;
3340
41+ static {
42+ MethodHandle handle = null ;
43+
44+ try {
45+ final Field eventTypesField = HandlerList .class .getDeclaredField ("EVENT_TYPES" );
46+ eventTypesField .setAccessible (true );
47+ handle = MethodHandles .lookup ().unreflectGetter (eventTypesField );
48+ } catch (final ReflectiveOperationException ignored ) {}
49+
50+ EVENT_TYPES_HANDLE = handle ;
51+ }
3452
3553 public EventCommand (DebuggeryBukkit debuggery ) {
3654 super ("devent" , "debuggery.devent" , true , true , Entity .class , debuggery );
@@ -68,8 +86,8 @@ public boolean commandLogic(Audience sender, String[] args) {
6886
6987 @ Override
7088 public List <String > tabCompleteLogic (Audience sender , String [] args ) {
71- if (args .length == 0 ) {
72- return List . of ();
89+ if (args .length == 0 || args . length == 1 ) {
90+ return knownEventClasses (). stream (). filter ( className -> args . length == 0 || className . toLowerCase ( Locale . ROOT ). contains ( args [ 0 ]. toLowerCase ( Locale . ROOT ))). toList ();
7391 }
7492 try {
7593 Class <?> event = Class .forName (args [0 ], true , this .getClass ().getClassLoader ());
@@ -85,4 +103,16 @@ public List<String> tabCompleteLogic(Audience sender, String[] args) {
85103
86104 return super .tabCompleteLogic (sender , trimmed );
87105 }
106+
107+ private Set <String > knownEventClasses () {
108+ if (EVENT_TYPES_HANDLE == null ) {
109+ return Set .of ();
110+ }
111+
112+ try {
113+ return (Set <String >) EVENT_TYPES_HANDLE .invokeExact ();
114+ } catch (Throwable e ) {
115+ return Set .of ();
116+ }
117+ }
88118}
0 commit comments