forked from SteamWar/SteamWar
Stop the loader task and listener when a loader ends
Every loader started a timer and registered itself as listener, but neither was stopped, so each loader kept running every tick until the server restarted. Both are now stopped when the loader is stopped or replaced by a new one.
This commit is contained in:
@@ -36,9 +36,11 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -63,13 +65,14 @@ public class Loader implements Listener, SWPlayer.Component {
|
||||
private List<LoaderElement> elements = new ArrayList<>();
|
||||
private int currentElement = 0;
|
||||
private long waitTime = 0;
|
||||
private final BukkitTask task;
|
||||
|
||||
public Loader(Player p) {
|
||||
this.p = p;
|
||||
this.recorder = new LoaderRecorder(p, elements);
|
||||
Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance());
|
||||
|
||||
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
task = BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
if (stage != Stage.RUNNING && stage != Stage.SINGLE) return;
|
||||
if (!Permission.BUILD.hasPermission(p)) return;
|
||||
if (waitTime > 0) {
|
||||
@@ -136,13 +139,27 @@ public class Loader implements Listener, SWPlayer.Component {
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
end();
|
||||
if (getLoader(p) == this) {
|
||||
SWPlayer.of(p).removeComponent(Loader.class);
|
||||
}
|
||||
}
|
||||
|
||||
// Also called when the loader is replaced by a new one
|
||||
@Override
|
||||
public void onUnmount(SWPlayer player) {
|
||||
end();
|
||||
}
|
||||
|
||||
private void end() {
|
||||
stage = Stage.END;
|
||||
if (recorder != null) {
|
||||
recorder.stop();
|
||||
recorder = null;
|
||||
}
|
||||
elements.clear();
|
||||
SWPlayer.of(p).removeComponent(Loader.class);
|
||||
task.cancel();
|
||||
HandlerList.unregisterAll(this);
|
||||
}
|
||||
|
||||
public boolean setTicksBetweenShots(int delay) {
|
||||
|
||||
Reference in New Issue
Block a user