Browse Source

Rework map voting

RedstoneFuture 2 years ago
parent
commit
1086085d10

+ 33 - 17
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java

@@ -18,7 +18,6 @@
 
 
 package de.butzlabben.missilewars.game;
 package de.butzlabben.missilewars.game;
 
 
-import com.google.common.base.Preconditions;
 import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.configuration.Config;
 import de.butzlabben.missilewars.configuration.Config;
@@ -30,7 +29,9 @@ import de.butzlabben.missilewars.event.GameStopEvent;
 import de.butzlabben.missilewars.game.enums.GameResult;
 import de.butzlabben.missilewars.game.enums.GameResult;
 import de.butzlabben.missilewars.game.enums.GameState;
 import de.butzlabben.missilewars.game.enums.GameState;
 import de.butzlabben.missilewars.game.enums.MapChooseProcedure;
 import de.butzlabben.missilewars.game.enums.MapChooseProcedure;
+import de.butzlabben.missilewars.game.enums.VoteState;
 import de.butzlabben.missilewars.game.equipment.EquipmentManager;
 import de.butzlabben.missilewars.game.equipment.EquipmentManager;
+import de.butzlabben.missilewars.game.equipment.PlayerEquipmentRandomizer;
 import de.butzlabben.missilewars.game.misc.MotdManager;
 import de.butzlabben.missilewars.game.misc.MotdManager;
 import de.butzlabben.missilewars.game.misc.ScoreboardManager;
 import de.butzlabben.missilewars.game.misc.ScoreboardManager;
 import de.butzlabben.missilewars.game.missile.Missile;
 import de.butzlabben.missilewars.game.missile.Missile;
@@ -51,19 +52,9 @@ import de.butzlabben.missilewars.util.PlayerDataProvider;
 import de.butzlabben.missilewars.util.geometry.GameArea;
 import de.butzlabben.missilewars.util.geometry.GameArea;
 import de.butzlabben.missilewars.util.geometry.Geometry;
 import de.butzlabben.missilewars.util.geometry.Geometry;
 import de.butzlabben.missilewars.util.serialization.Serializer;
 import de.butzlabben.missilewars.util.serialization.Serializer;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.function.Consumer;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.ToString;
 import lombok.ToString;
-import org.bukkit.Bukkit;
-import org.bukkit.GameMode;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.Sound;
-import org.bukkit.World;
+import org.bukkit.*;
 import org.bukkit.entity.Fireball;
 import org.bukkit.entity.Fireball;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.bukkit.event.HandlerList;
 import org.bukkit.event.HandlerList;
@@ -72,6 +63,12 @@ import org.bukkit.inventory.ItemStack;
 import org.bukkit.scheduler.BukkitTask;
 import org.bukkit.scheduler.BukkitTask;
 import org.bukkit.util.Vector;
 import org.bukkit.util.Vector;
 
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.function.Consumer;
+
 /**
 /**
  * @author Butzlabben
  * @author Butzlabben
  * @since 01.01.2018
  * @since 01.01.2018
@@ -159,18 +156,24 @@ public class Game {
         // choose the game arena
         // choose the game arena
         if (lobby.getMapChooseProcedure() == MapChooseProcedure.FIRST) {
         if (lobby.getMapChooseProcedure() == MapChooseProcedure.FIRST) {
             setArena(lobby.getArenas().get(0));
             setArena(lobby.getArenas().get(0));
-            
+
+            finalStartGame();
+
         } else if (lobby.getMapChooseProcedure() == MapChooseProcedure.MAPCYCLE) {
         } else if (lobby.getMapChooseProcedure() == MapChooseProcedure.MAPCYCLE) {
             final int lastMapIndex = cycles.getOrDefault(lobby.getName(), -1);
             final int lastMapIndex = cycles.getOrDefault(lobby.getName(), -1);
             List<Arena> arenas = lobby.getArenas();
             List<Arena> arenas = lobby.getArenas();
             int index = lastMapIndex >= arenas.size() - 1 ? 0 : lastMapIndex + 1;
             int index = lastMapIndex >= arenas.size() - 1 ? 0 : lastMapIndex + 1;
             cycles.put(lobby.getName(), index);
             cycles.put(lobby.getName(), index);
             setArena(arenas.get(index));
             setArena(arenas.get(index));
-            
+
+            finalStartGame();
+
         } else if (lobby.getMapChooseProcedure() == MapChooseProcedure.MAPVOTING) {
         } else if (lobby.getMapChooseProcedure() == MapChooseProcedure.MAPVOTING) {
             if (mapVoting.onlyOneArenaFound()) {
             if (mapVoting.onlyOneArenaFound()) {
                 setArena(lobby.getArenas().get(0));
                 setArena(lobby.getArenas().get(0));
                 Logger.WARN.log("Only one arena was found for the lobby \"" + lobby.getName() + "\". The configured map voting was skipped.");
                 Logger.WARN.log("Only one arena was found for the lobby \"" + lobby.getName() + "\". The configured map voting was skipped.");
+
+                finalStartGame();
             } else {
             } else {
                 mapVoting.startVote();
                 mapVoting.startVote();
             }
             }
@@ -178,18 +181,27 @@ public class Game {
 
 
         scoreboardManager = new ScoreboardManager(this);
         scoreboardManager = new ScoreboardManager(this);
         scoreboardManager.createScoreboard();
         scoreboardManager.createScoreboard();
+    }
+
+    public void finalStartGame() {
+        if (this.arena == null) {
+            throw new IllegalStateException("The arena is not yet set");
+        }
+
+        scoreboardManager.resetScoreboard();
 
 
         equipmentManager = new EquipmentManager(this);
         equipmentManager = new EquipmentManager(this);
+        equipmentManager.createGameItems();
 
 
         Logger.DEBUG.log("Making game ready");
         Logger.DEBUG.log("Making game ready");
         ++fights;
         ++fights;
-        if (fights >= Config.getFightRestart())
+        if (fights >= Config.getFightRestart()) {
             restart = true;
             restart = true;
+        }
 
 
         FightStats.checkTables();
         FightStats.checkTables();
         Logger.DEBUG.log("Fights: " + fights);
         Logger.DEBUG.log("Fights: " + fights);
 
 
-        equipmentManager.createGameItems();
     }
     }
 
 
     private void updateGameListener(GameBoundListener newListener) {
     private void updateGameListener(GameBoundListener newListener) {
@@ -505,6 +517,9 @@ public class Game {
      * @return true, if it's in the game world
      * @return true, if it's in the game world
      */
      */
     public boolean isInGameWorld(Location location) {
     public boolean isInGameWorld(Location location) {
+        // Is possible during the map voting phase:
+        if (gameArea == null) return false;
+
         return Geometry.isInWorld(location, gameArea.getWorld());
         return Geometry.isInWorld(location, gameArea.getWorld());
     }
     }
 
 
@@ -558,6 +573,8 @@ public class Game {
         equipmentManager.sendGameItems(player, false);
         equipmentManager.sendGameItems(player, false);
         setPlayerAttributes(player);
         setPlayerAttributes(player);
 
 
+        mwPlayer.setRandomGameEquipment(new PlayerEquipmentRandomizer(mwPlayer, this));
+
         playerTasks.put(player.getUniqueId(),
         playerTasks.put(player.getUniqueId(),
                 Bukkit.getScheduler().runTaskTimer(MissileWars.getInstance(), mwPlayer, 40, 20));
                 Bukkit.getScheduler().runTaskTimer(MissileWars.getInstance(), mwPlayer, 40, 20));
     }
     }
@@ -629,7 +646,6 @@ public class Game {
     }
     }
 
 
     public void setArena(Arena arena) {
     public void setArena(Arena arena) {
-        Preconditions.checkNotNull(arena);
         if (this.arena != null) {
         if (this.arena != null) {
             throw new IllegalStateException("Arena already set");
             throw new IllegalStateException("Arena already set");
         }
         }

+ 10 - 5
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/MapVoting.java

@@ -102,15 +102,15 @@ public class MapVoting {
      */
      */
     private Arena getVotedArena() {
     private Arena getVotedArena() {
 
 
+        // If no one voted:
+        if (arenaVotes.size() == 0) return game.getLobby().getArenas().get(0);
+
         Arena arena = arenaVotes.values().stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
         Arena arena = arenaVotes.values().stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                 .entrySet()
                 .entrySet()
                 .stream()
                 .stream()
                 .max(Map.Entry.comparingByValue()).orElseThrow()
                 .max(Map.Entry.comparingByValue()).orElseThrow()
                 .getKey();
                 .getKey();
 
 
-        // If no one voted:
-        if (arena == null) arena = game.getLobby().getArenas().get(0);
-        
         return arena;
         return arena;
     }
     }
 
 
@@ -142,14 +142,19 @@ public class MapVoting {
      * This method sets the selected arena of map voting for the current game.
      * This method sets the selected arena of map voting for the current game.
      */
      */
     public void setVotedArena() {
     public void setVotedArena() {
-        if (game.getLobby().getMapChooseProcedure() != MapChooseProcedure.MAPVOTING) return;
+        if (game.getLobby().getMapChooseProcedure() != MapChooseProcedure.MAPVOTING)
+            throw new IllegalStateException("MapChooseProcedure is not \"MAPVOTING\"");
+
         if (onlyOneArenaFound()) return;
         if (onlyOneArenaFound()) return;
+        if (state != VoteState.RUNNING) return;
 
 
         stopVote();
         stopVote();
-        
+
         Arena arena = game.getMapVoting().getVotedArena();
         Arena arena = game.getMapVoting().getVotedArena();
         if (arena == null) throw new IllegalStateException("Voted arena is not present");
         if (arena == null) throw new IllegalStateException("Voted arena is not present");
         game.setArena(arena);
         game.setArena(arena);
+
+        game.finalStartGame();
     }
     }
     
     
 }
 }

+ 21 - 9
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/misc/ScoreboardManager.java

@@ -19,21 +19,22 @@
 package de.butzlabben.missilewars.game.misc;
 package de.butzlabben.missilewars.game.misc;
 
 
 import de.butzlabben.missilewars.configuration.Config;
 import de.butzlabben.missilewars.configuration.Config;
-import de.butzlabben.missilewars.configuration.arena.Arena;
 import de.butzlabben.missilewars.game.Game;
 import de.butzlabben.missilewars.game.Game;
 import de.butzlabben.missilewars.game.Team;
 import de.butzlabben.missilewars.game.Team;
 import de.butzlabben.missilewars.game.enums.GameState;
 import de.butzlabben.missilewars.game.enums.GameState;
 import de.butzlabben.missilewars.player.MWPlayer;
 import de.butzlabben.missilewars.player.MWPlayer;
-import java.util.HashMap;
-import java.util.List;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
+import lombok.Setter;
 import org.bukkit.Bukkit;
 import org.bukkit.Bukkit;
 import org.bukkit.ChatColor;
 import org.bukkit.ChatColor;
 import org.bukkit.scoreboard.DisplaySlot;
 import org.bukkit.scoreboard.DisplaySlot;
 import org.bukkit.scoreboard.Objective;
 import org.bukkit.scoreboard.Objective;
 import org.bukkit.scoreboard.Scoreboard;
 import org.bukkit.scoreboard.Scoreboard;
 
 
+import java.util.HashMap;
+import java.util.List;
+
 // Scoreboard Management: https://www.spigotmc.org/wiki/making-scoreboard-with-teams-no-flicker
 // Scoreboard Management: https://www.spigotmc.org/wiki/making-scoreboard-with-teams-no-flicker
 
 
 @RequiredArgsConstructor
 @RequiredArgsConstructor
@@ -43,7 +44,11 @@ public class ScoreboardManager {
 
 
     private Team team1;
     private Team team1;
     private Team team2;
     private Team team2;
-    private Arena arena;
+
+    @Setter
+    private String arenaDisplayName;
+    @Setter
+    private String arenaGameDuration;
 
 
     // get config options
     // get config options
     private static final String SCOREBOARD_TITLE = Config.getScoreboardTitle();
     private static final String SCOREBOARD_TITLE = Config.getScoreboardTitle();
@@ -66,7 +71,15 @@ public class ScoreboardManager {
 
 
         team1 = game.getTeam1();
         team1 = game.getTeam1();
         team2 = game.getTeam2();
         team2 = game.getTeam2();
-        arena = game.getArena();
+
+        if (game.getArena() == null) {
+            // using of placeholders until the area is not set
+            setArenaDisplayName("?");
+            setArenaGameDuration("0");
+        } else {
+            setArenaDisplayName(game.getArena().getDisplayName());
+            setArenaGameDuration(Integer.toString(game.getArena().getGameDuration()));
+        }
 
 
         // register Scoreboard
         // register Scoreboard
         if (board == null) {
         if (board == null) {
@@ -97,7 +110,7 @@ public class ScoreboardManager {
         org.bukkit.scoreboard.Team team;
         org.bukkit.scoreboard.Team team;
 
 
         if (teams.size() < line) {
         if (teams.size() < line) {
-            team = board.registerNewTeam(arena.getName() + "-" + line);
+            team = board.registerNewTeam(arenaDisplayName + "-" + line);
             team.addEntry("§" + COLOR_CODES[line - 1]);
             team.addEntry("§" + COLOR_CODES[line - 1]);
             obj.getScore("§" + COLOR_CODES[line - 1]).setScore(line);
             obj.getScore("§" + COLOR_CODES[line - 1]).setScore(line);
             teams.put(line, team);
             teams.put(line, team);
@@ -233,7 +246,7 @@ public class ScoreboardManager {
         String time = "";
         String time = "";
         if (game.getState() == GameState.LOBBY) {
         if (game.getState() == GameState.LOBBY) {
             // Show the planned duration of the next game:
             // Show the planned duration of the next game:
-            time = Integer.toString(game.getArena().getGameDuration());
+            time = arenaGameDuration;
         } else if (game.getState() == GameState.INGAME) {
         } else if (game.getState() == GameState.INGAME) {
             // Show the remaining duration of the running game:
             // Show the remaining duration of the running game:
             time = Integer.toString(game.getTaskManager().getTimer().getSeconds() / 60);
             time = Integer.toString(game.getTaskManager().getTimer().getSeconds() / 60);
@@ -255,12 +268,11 @@ public class ScoreboardManager {
         text = text.replace("%team2_amount%", Integer.toString(team2.getMembers().size()));
         text = text.replace("%team2_amount%", Integer.toString(team2.getMembers().size()));
 
 
         text = text.replace("%lobby_name%", game.getLobby().getDisplayName());
         text = text.replace("%lobby_name%", game.getLobby().getDisplayName());
-        text = text.replace("%arena_name%", arena.getDisplayName());
+        text = text.replace("%arena_name%", arenaDisplayName);
 
 
         text = text.replace("%time%", time);
         text = text.replace("%time%", time);
 
 
         return text;
         return text;
     }
     }
 
 
-
 }
 }

+ 0 - 2
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/LobbyTimer.java

@@ -21,8 +21,6 @@ package de.butzlabben.missilewars.game.timer;
 import de.butzlabben.missilewars.configuration.Messages;
 import de.butzlabben.missilewars.configuration.Messages;
 import de.butzlabben.missilewars.game.Game;
 import de.butzlabben.missilewars.game.Game;
 import de.butzlabben.missilewars.player.MWPlayer;
 import de.butzlabben.missilewars.player.MWPlayer;
-import java.util.Map;
-import java.util.Optional;
 import org.bukkit.Sound;
 import org.bukkit.Sound;
 
 
 /**
 /**

+ 6 - 7
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/PlayerListener.java

@@ -34,12 +34,7 @@ import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.Listener;
 import org.bukkit.event.block.BlockPlaceEvent;
 import org.bukkit.event.block.BlockPlaceEvent;
 import org.bukkit.event.entity.FoodLevelChangeEvent;
 import org.bukkit.event.entity.FoodLevelChangeEvent;
-import org.bukkit.event.player.PlayerDropItemEvent;
-import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.event.player.PlayerMoveEvent;
-import org.bukkit.event.player.PlayerPickupItemEvent;
-import org.bukkit.event.player.PlayerQuitEvent;
-import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.event.player.*;
 import org.bukkit.event.server.ServerListPingEvent;
 import org.bukkit.event.server.ServerListPingEvent;
 import org.bukkit.scheduler.BukkitRunnable;
 import org.bukkit.scheduler.BukkitRunnable;
 
 
@@ -202,9 +197,13 @@ public class PlayerListener implements Listener {
         Logger.DEBUG.log("Location: " + player.getLocation());
         Logger.DEBUG.log("Location: " + player.getLocation());
         Logger.DEBUG.log("Current game amount: " + GameManager.getInstance().getGameAmount());
         Logger.DEBUG.log("Current game amount: " + GameManager.getInstance().getGameAmount());
         Logger.DEBUG.log("Lobby: " + game.getLobby().getDisplayName());
         Logger.DEBUG.log("Lobby: " + game.getLobby().getDisplayName());
-        Logger.DEBUG.log("Arena: " + game.getArena().getDisplayName());
         Logger.DEBUG.log("Team 1: " + game.getTeam1());
         Logger.DEBUG.log("Team 1: " + game.getTeam1());
         Logger.DEBUG.log("Team 2: " + game.getTeam2());
         Logger.DEBUG.log("Team 2: " + game.getTeam2());
 
 
+        if (game.getArena() != null) {
+            Logger.DEBUG.log("Arena: " + game.getArena().getDisplayName());
+        } else {
+            Logger.DEBUG.log("Arena: not yet selected (Map Voting)");
+        }
     }
     }
 }
 }

+ 8 - 5
missilewars-plugin/src/main/java/de/butzlabben/missilewars/player/MWPlayer.java

@@ -21,14 +21,15 @@ package de.butzlabben.missilewars.player;
 import de.butzlabben.missilewars.game.Game;
 import de.butzlabben.missilewars.game.Game;
 import de.butzlabben.missilewars.game.Team;
 import de.butzlabben.missilewars.game.Team;
 import de.butzlabben.missilewars.game.equipment.PlayerEquipmentRandomizer;
 import de.butzlabben.missilewars.game.equipment.PlayerEquipmentRandomizer;
-import java.util.UUID;
-import java.util.concurrent.atomic.AtomicLong;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
 import org.bukkit.Bukkit;
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 
 
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+
 /**
 /**
  * @author Butzlabben
  * @author Butzlabben
  * @since 01.01.2018
  * @since 01.01.2018
@@ -41,14 +42,16 @@ public class MWPlayer implements Runnable {
     final long id = NEXT_ID.getAndIncrement();
     final long id = NEXT_ID.getAndIncrement();
     private final UUID uuid;
     private final UUID uuid;
     private final Game game;
     private final Game game;
-    @Setter private Team team;
+    @Setter
+    private Team team;
+    @Setter
     private PlayerEquipmentRandomizer randomGameEquipment;
     private PlayerEquipmentRandomizer randomGameEquipment;
-    @Setter private boolean playerInteractEventCancel = false;
+    @Setter
+    private boolean playerInteractEventCancel = false;
 
 
     public MWPlayer(Player player, Game game) {
     public MWPlayer(Player player, Game game) {
         this.uuid = player.getUniqueId();
         this.uuid = player.getUniqueId();
         this.game = game;
         this.game = game;
-        this.randomGameEquipment = new PlayerEquipmentRandomizer(this, game);
     }
     }
 
 
     public Player getPlayer() {
     public Player getPlayer() {