22
33import org .bukkit .plugin .java .JavaPlugin ;
44
5- import java .util .Collections ;
6- import java .util .List ;
7- import java .util .Map ;
5+ import java .util .*;
86import java .util .function .Consumer ;
9- import java .util .stream .Collectors ;
107
118/**
129 * Base plugin class that provides a simple way to manage components
@@ -18,9 +15,36 @@ public class BasePlugin extends JavaPlugin implements Loadable {
1815 * Create a new plugin instance
1916 */
2017 public BasePlugin () {
21- components = getComponents ()
22- .stream ()
23- .collect (Collectors .toMap (Object ::getClass , o -> o ));
18+ components = getComponentMap (getComponents ());
19+ }
20+
21+ /**
22+ * Get a map of components by their class and interfaces
23+ *
24+ * @param components the components to map
25+ * @return the map of components
26+ */
27+ private static Map <Class <?>, Object > getComponentMap (List <Object > components ) {
28+ Map <Class <?>, Object > componentMap = new HashMap <>();
29+ for (Object component : components ) {
30+ Set <Class <?>> addedClasses = new HashSet <>();
31+ Queue <Class <?>> classQueue = new LinkedList <>();
32+ classQueue .add (component .getClass ());
33+ while (true ) {
34+ Class <?> clazz = classQueue .poll ();
35+ if (clazz == null ) break ;
36+ if (!addedClasses .add (clazz )) continue ;
37+
38+ componentMap .put (clazz , component );
39+
40+ Class <?> superClass = clazz .getSuperclass ();
41+ if (superClass != null ) {
42+ classQueue .add (superClass );
43+ }
44+ classQueue .addAll (Arrays .asList (clazz .getInterfaces ()));
45+ }
46+ }
47+ return componentMap ;
2448 }
2549
2650 /**
0 commit comments