1313import java .util .stream .Collectors ;
1414import javax .annotation .Nonnull ;
1515import lombok .Getter ;
16- import lombok .NonNull ;
1716import me .realized .duels .api .Duels ;
1817import me .realized .duels .api .command .SubCommand ;
1918import me .realized .duels .arena .ArenaManager ;
2524import me .realized .duels .config .Lang ;
2625import me .realized .duels .data .UserManager ;
2726import me .realized .duels .duel .DuelManager ;
27+ import me .realized .duels .extension .ExtensionClassLoader ;
2828import me .realized .duels .extension .ExtensionManager ;
2929import me .realized .duels .extra .DamageListener ;
3030import me .realized .duels .extra .KitItemListener ;
3131import me .realized .duels .extra .PotionListener ;
32+ import me .realized .duels .extra .ProjectileHitListener ;
3233import me .realized .duels .extra .SoupListener ;
3334import me .realized .duels .extra .Teleport ;
3435import me .realized .duels .extra .TeleportListener ;
5051import me .realized .duels .util .command .AbstractCommand ;
5152import me .realized .duels .util .gui .GuiListener ;
5253import org .bukkit .command .CommandSender ;
54+ import org .bukkit .event .HandlerList ;
55+ import org .bukkit .event .Listener ;
5356import org .bukkit .plugin .java .JavaPlugin ;
5457import org .bukkit .scheduler .BukkitTask ;
5558import org .inventivetalent .update .spiget .SpigetUpdate ;
@@ -106,6 +109,7 @@ public class DuelsPlugin extends JavaPlugin implements Duels, LogSource {
106109 @ Getter
107110 private ExtensionManager extensionManager ;
108111 private final Map <String , AbstractCommand <DuelsPlugin >> commands = new HashMap <>();
112+ private final List <Listener > registeredListeners = new ArrayList <>();
109113
110114 @ Getter
111115 private volatile boolean updateAvailable ;
@@ -147,12 +151,6 @@ public void onEnable() {
147151 loadables .add (teleport = new Teleport (this ));
148152 loadables .add (extensionManager = new ExtensionManager (this ));
149153
150- registerCommands (
151- new DuelCommand (this ),
152- new SpectateCommand (this ),
153- new DuelsCommand (this )
154- );
155-
156154 if (!load ()) {
157155 getPluginLoader ().disablePlugin (this );
158156 return ;
@@ -163,6 +161,7 @@ public void onEnable() {
163161 new PotionListener (this );
164162 new TeleportListener (this );
165163 new SoupListener (this );
164+ new ProjectileHitListener (this );
166165
167166 new Metrics (this );
168167
@@ -202,6 +201,12 @@ public void onDisable() {
202201 * @return true if load was successful, otherwise false
203202 */
204203 private boolean load () {
204+ registerCommands (
205+ new DuelCommand (this ),
206+ new SpectateCommand (this ),
207+ new DuelsCommand (this )
208+ );
209+
205210 for (final Loadable loadable : loadables ) {
206211 try {
207212 loadable .handleLoad ();
@@ -220,6 +225,15 @@ private boolean load() {
220225 * @return true if unload was successful, otherwise false
221226 */
222227 private boolean unload () {
228+ registeredListeners .forEach (HandlerList ::unregisterAll );
229+ registeredListeners .clear ();
230+ // Unregister all extension listeners that isn't using the method Duels#registerListener
231+ HandlerList .getRegisteredListeners (this )
232+ .stream ()
233+ .filter (listener -> listener .getListener ().getClass ().getClassLoader ().getClass ().isAssignableFrom (ExtensionClassLoader .class ))
234+ .forEach (listener -> HandlerList .unregisterAll (listener .getListener ()));
235+ commands .clear ();
236+
223237 for (final Loadable loadable : Lists .reverse (loadables )) {
224238 try {
225239 if (loadables .indexOf (loadable ) > lastLoad ) {
@@ -265,6 +279,13 @@ protected void execute(final CommandSender sender, final String label, final Str
265279 return true ;
266280 }
267281
282+ @ Override
283+ public void registerListener (@ Nonnull final Listener listener ) {
284+ Objects .requireNonNull (listener , "listener" );
285+ registeredListeners .add (listener );
286+ getServer ().getPluginManager ().registerEvents (listener , this );
287+ }
288+
268289 @ Override
269290 public boolean reload () {
270291 if (!(unload () && load ())) {
@@ -296,61 +317,61 @@ public boolean reload(final Loadable loadable) {
296317 }
297318
298319 @ Override
299- public BukkitTask doSync (@ NonNull final Runnable task ) {
320+ public BukkitTask doSync (@ Nonnull final Runnable task ) {
300321 Objects .requireNonNull (task , "task" );
301322 return getServer ().getScheduler ().runTask (this , task );
302323 }
303324
304325 @ Override
305- public BukkitTask doSyncAfter (@ NonNull final Runnable task , final long delay ) {
326+ public BukkitTask doSyncAfter (@ Nonnull final Runnable task , final long delay ) {
306327 Objects .requireNonNull (task , "task" );
307328 return getServer ().getScheduler ().runTaskLater (this , task , delay );
308329 }
309330
310331 @ Override
311- public BukkitTask doSyncRepeat (@ NonNull final Runnable task , final long delay , final long period ) {
332+ public BukkitTask doSyncRepeat (@ Nonnull final Runnable task , final long delay , final long period ) {
312333 Objects .requireNonNull (task , "task" );
313334 return getServer ().getScheduler ().runTaskTimer (this , task , delay , period );
314335 }
315336
316337 @ Override
317- public BukkitTask doAsync (@ NonNull final Runnable task ) {
338+ public BukkitTask doAsync (@ Nonnull final Runnable task ) {
318339 Objects .requireNonNull (task , "task" );
319340 return getServer ().getScheduler ().runTaskAsynchronously (this , task );
320341 }
321342
322343 @ Override
323- public BukkitTask doAsyncAfter (@ NonNull final Runnable task , final long delay ) {
344+ public BukkitTask doAsyncAfter (@ Nonnull final Runnable task , final long delay ) {
324345 Objects .requireNonNull (task , "task" );
325346 return getServer ().getScheduler ().runTaskLaterAsynchronously (this , task , delay );
326347 }
327348
328349 @ Override
329- public BukkitTask doAsyncRepeat (@ NonNull final Runnable task , final long delay , final long period ) {
350+ public BukkitTask doAsyncRepeat (@ Nonnull final Runnable task , final long delay , final long period ) {
330351 Objects .requireNonNull (task , "task" );
331352 return getServer ().getScheduler ().runTaskTimerAsynchronously (this , task , delay , period );
332353 }
333354
334355 @ Override
335- public void info (@ NonNull final String message ) {
356+ public void info (@ Nonnull final String message ) {
336357 Objects .requireNonNull (message , "message" );
337358 Log .info (message );
338359 }
339360
340361 @ Override
341- public void warn (@ NonNull final String message ) {
362+ public void warn (@ Nonnull final String message ) {
342363 Objects .requireNonNull (message , "message" );
343364 Log .warn (message );
344365 }
345366
346367 @ Override
347- public void error (@ NonNull final String message ) {
368+ public void error (@ Nonnull final String message ) {
348369 Objects .requireNonNull (message , "message" );
349370 Log .error (message );
350371 }
351372
352373 @ Override
353- public void error (@ NonNull final String message , @ NonNull final Throwable thrown ) {
374+ public void error (@ Nonnull final String message , @ Nonnull final Throwable thrown ) {
354375 Objects .requireNonNull (message , "message" );
355376 Objects .requireNonNull (thrown , "thrown" );
356377 Log .error (message , thrown );
0 commit comments