7575import java .util .Enumeration ;
7676import java .util .HashMap ;
7777import java .util .HashSet ;
78+ import java .util .Iterator ;
7879import java .util .LinkedHashSet ;
7980import java .util .List ;
8081import java .util .Map ;
@@ -103,6 +104,8 @@ public final class ScalaLoader extends JavaPlugin implements IScalaLoader, Liste
103104 Migration .addMigrator (PaperPluginTransformer ::new );
104105 //TODO Paper's ClassloaderBytecodeModifier api gives us the ability to transform bytecode of JavaPlugins.
105106 //TODO should I make use of this? Are there any ScalaLoader apis that I broke that can be called by JavaPlugins?
107+ //TODO the only thing that comes to mind right now is ScalaPluginLoader.openUpToJavaPlugin(ScalaPlugin, JavaPlugin).
108+ //TODO the replacement would be to make the ScalaPlugin's classloader accessible to the JavaPlugin's classloader (perhaps through ClassLoader groups).
106109 }
107110
108111 private EventBus eventBus ;
@@ -167,13 +170,23 @@ public void onEnable() {
167170 initCommands ();
168171 getServer ().getPluginManager ().registerEvents (this , this );
169172 enableScalaPlugins (PluginLoadOrder .STARTUP ); //Enable ScalaPlugins at STARTUP because ScalaLoader itself enables on STARTUP.
173+ for (ScalaPlugin scalaPlugin : getScalaPlugins ()) {
174+ registerScalaPlugin (scalaPlugin );
175+ }
170176 ScalaLoaderUtils .initBStats (this );
171177 }
172178
179+ @ Override
180+ public void onDisable () {
181+ scalaPlugins .clear ();
182+ }
183+
173184 @ EventHandler
174185 public void onServerLoad (ServerLoadEvent event ) {
175- //enable ScalaPlugin's at POSTWORLD for both load types (STARTUP, RELOAD)
176- enableScalaPlugins (PluginLoadOrder .POSTWORLD );
186+ if (event .getType () == LoadType .STARTUP ) {
187+ enableScalaPlugins (PluginLoadOrder .POSTWORLD );
188+ }
189+ //Don't need to enable ScalaPlugins at LoadType.RELOAD, because the server itself already does this.
177190 }
178191
179192 private void initCommands () {
@@ -363,16 +376,9 @@ private static void bootstrap(PluginBootstrap bootstrapper, ScalaPluginProviderC
363376
364377 private void enableScalaPlugins (PluginLoadOrder loadOrder ) {
365378 for (ScalaPlugin scalaPlugin : getScalaPlugins ()) {
379+ //if this is the right moment to load
366380 if (scalaPlugin .getPluginMeta ().getLoadOrder () == loadOrder ) {
367-
368- //register the ScalaPlugin with Paper's pluginManager.
369- PaperPluginManagerImpl paperPluginManager = PaperHacks .getPaperPluginManager ();
370- if (paperPluginManager .getPlugin (scalaPlugin .getName ()) == null ) { //ensure idempotency
371- paperPluginManager .loadPlugin (scalaPlugin ); //more like "registerPlugin" since PaperPluginInstanceManager.loadPlugin(Plugin) does not call Plugin.onLoad()!
372- //note that scalaPlugin.onLoad() has already been called!
373- }
374-
375- //now, enable the scalaPlugin.
381+ //enable the scalaPlugin.
376382 if (!scalaPlugin .isEnabled ()) {
377383 ScalaPluginEnableEvent event = new ScalaPluginEnableEvent (scalaPlugin );
378384 getServer ().getPluginManager ().callEvent (event );
@@ -385,6 +391,14 @@ private void enableScalaPlugins(PluginLoadOrder loadOrder) {
385391 }
386392 }
387393
394+ private static void registerScalaPlugin (ScalaPlugin scalaPlugin ) {
395+ PaperPluginManagerImpl paperPluginManager = PaperHacks .getPaperPluginManager ();
396+ if (paperPluginManager .getPlugin (scalaPlugin .getName ()) == null ) { //ensure idempotency
397+ paperPluginManager .loadPlugin (scalaPlugin ); //more like "registerPlugin" since PaperPluginInstanceManager.loadPlugin(Plugin) does not call Plugin.onLoad()!
398+ //note that scalaPlugin.onLoad() has already been called!
399+ }
400+ }
401+
388402 private static Comparator <String > dependencyOrder (MutableGraph <String > dependencies ) {
389403 return new Comparator <String >() {
390404 @ Override
0 commit comments