Răsfoiți Sursa

Merge pull request #94 from RedstoneFuture/refactoring/task-manager

Adding TaskManager, Fixing player-data reset & scoreboard issue
Daniel 2 ani în urmă
părinte
comite
f043132da6

+ 22 - 23
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java

@@ -40,7 +40,7 @@ import de.butzlabben.missilewars.game.stats.FightStats;
 import de.butzlabben.missilewars.game.timer.EndTimer;
 import de.butzlabben.missilewars.game.timer.GameTimer;
 import de.butzlabben.missilewars.game.timer.LobbyTimer;
-import de.butzlabben.missilewars.game.timer.Timer;
+import de.butzlabben.missilewars.game.timer.TaskManager;
 import de.butzlabben.missilewars.inventory.OrcItem;
 import de.butzlabben.missilewars.listener.game.EndListener;
 import de.butzlabben.missilewars.listener.game.GameBoundListener;
@@ -84,8 +84,6 @@ public class Game {
     private final Map<String, Integer> votes = new HashMap<>(); // Votes for the maps.
     private final Lobby lobby;
     private final HashMap<UUID, BukkitTask> playerTasks = new HashMap<>();
-    private Timer timer;
-    private BukkitTask bt;
     private GameState state = GameState.LOBBY;
     private Team team1;
     private Team team2;
@@ -99,6 +97,8 @@ public class Game {
     private ScoreboardManager scoreboardManager;
     private GameBoundListener listener;
     private EquipmentManager equipmentManager;
+    private TaskManager taskManager;
+    private int remainingGameDuration;
 
     public Game(Lobby lobby) {
         Logger.BOOT.log("Loading lobby " + lobby.getName());
@@ -139,10 +139,11 @@ public class Game {
 
         Logger.DEBUG.log("Start timer");
 
-        stopTimer();
+        taskManager = new TaskManager(this);
+        taskManager.stopTimer();
         updateGameListener(new LobbyListener(this));
-        timer = new LobbyTimer(this, lobby.getLobbyTime());
-        bt = Bukkit.getScheduler().runTaskTimer(MissileWars.getInstance(), timer, 0, 20);
+        taskManager.setTimer(new LobbyTimer(this, lobby.getLobbyTime()));
+        taskManager.runTimer(0, 20);
         state = GameState.LOBBY;
 
         Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> applyForAllPlayers(this::runTeleportEventForPlayer), 2);
@@ -214,10 +215,10 @@ public class Game {
             return;
         }
 
-        stopTimer();
+        taskManager.stopTimer();
         updateGameListener(new GameListener(this));
-        timer = new GameTimer(this);
-        bt = Bukkit.getScheduler().runTaskTimer(MissileWars.getInstance(), timer, 5, 20);
+        taskManager.setTimer(new GameTimer(this));
+        taskManager.runTimer(5, 20);
         state = GameState.INGAME;
 
         timestart = System.currentTimeMillis();
@@ -229,11 +230,6 @@ public class Game {
         Bukkit.getPluginManager().callEvent(new GameStartEvent(this));
     }
 
-    private void stopTimer() {
-        if (bt != null)
-            bt.cancel();
-    }
-
     public void stopGame() {
         if (Config.isSetup()) return;
 
@@ -251,11 +247,14 @@ public class Game {
             teleportToArenaSpectatorSpawn(player);
 
         }
-
-        stopTimer();
+        
+        // Save the remaining game duration.
+        remainingGameDuration = taskManager.getTimer().getSeconds();
+        
+        taskManager.stopTimer();
         updateGameListener(new EndListener(this));
-        timer = new EndTimer(this);
-        bt = Bukkit.getScheduler().runTaskTimer(MissileWars.getInstance(), timer, 5, 20);
+        taskManager.setTimer(new EndTimer(this));
+        taskManager.runTimer(5, 20);
         state = GameState.END;
 
         updateMOTD();
@@ -441,14 +440,14 @@ public class Game {
     }
 
     public void resetGame() {
-        HandlerList.unregisterAll(listener);
-
-        stopTimer();
-
+        // Teleporting players; the event listener will handle the teleport event
         applyForAllPlayers(this::teleportToAfterGameSpawn);
+        
+        // Deactivation of all event handlers
+        HandlerList.unregisterAll(listener);
+        taskManager.stopTimer();
 
         if (gameWorld != null) {
-            gameWorld.sendPlayersBack();
             gameWorld.unload();
             gameWorld.delete();
         }

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/equipment/PlayerEquipmentRandomizer.java

@@ -172,7 +172,7 @@ public class PlayerEquipmentRandomizer {
             return DEFAULT_FACTOR_BY_GAME_TIME;
         }
 
-        int seconds = game.getTimer().getSeconds();
+        int seconds = game.getTaskManager().getTimer().getSeconds();
         for (int i = seconds; i <= maxGameDuration; i++) {
             if (arena.getInterval().getIntervalFactorByGameTime().containsKey(Integer.toString(i))) {
                 return arena.getInterval().getIntervalFactorByGameTime().get(Integer.toString(i));

+ 8 - 3
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/misc/ScoreboardManager.java

@@ -228,11 +228,16 @@ public class ScoreboardManager {
      */
     private String replaceScoreboardPlaceholders(String text) {
 
-        String time;
+        String time = "";
         if (game.getState() == GameState.LOBBY) {
+            // Show the planned duration of the next game:
             time = Integer.toString(game.getArena().getGameDuration());
-        } else {
-            time = Integer.toString(game.getTimer().getSeconds() / 60);
+        } else if (game.getState() == GameState.INGAME) {
+            // Show the remaining duration of the running game:
+            time = Integer.toString(game.getTaskManager().getTimer().getSeconds() / 60);
+        } else if (game.getState() == GameState.END) {
+            // Show the remaining duration of the last game:
+            time = Integer.toString(game.getRemainingGameDuration() / 60);
         }
 
 

+ 54 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/TaskManager.java

@@ -0,0 +1,54 @@
+/*
+ * This file is part of MissileWars (https://github.com/Butzlabben/missilewars).
+ * Copyright (c) 2018-2021 Daniel Nägele.
+ *
+ * MissileWars is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MissileWars is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MissileWars.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package de.butzlabben.missilewars.game.timer;
+
+import de.butzlabben.missilewars.MissileWars;
+import de.butzlabben.missilewars.game.Game;
+import lombok.Getter;
+import lombok.Setter;
+import org.bukkit.Bukkit;
+import org.bukkit.scheduler.BukkitTask;
+
+/**
+ * @author Butzlabben
+ * @since 14.01.2018
+ */
+
+@Getter
+public class TaskManager {
+
+    private final Game game;
+
+    @Setter private Timer timer;
+    private BukkitTask bukkitTask;
+
+    public TaskManager(Game game) {
+        this.game = game;
+    }
+    
+    public void runTimer(long delay, long period) {
+        bukkitTask = Bukkit.getScheduler().runTaskTimer(MissileWars.getInstance(), timer , delay, period);
+    }
+
+    public void stopTimer() {
+        if (bukkitTask != null)
+            bukkitTask.cancel();
+    }
+    
+}

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/LobbyListener.java

@@ -69,7 +69,7 @@ public class LobbyListener extends GameBoundListener {
             if (displayName.equals(getGame().getPlayer(player).getTeam().getFullname())) return;
 
             // too late for team change:
-            if (getGame().getTimer().getSeconds() < 10) {
+            if (getGame().getTaskManager().getTimer().getSeconds() < 10) {
                 player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_CHANGE_TEAM_NO_LONGER_NOW));
                 return;
             }