From e43495d70f97cba1dba0390be38a29a9c73da252 Mon Sep 17 00:00:00 2001 From: "Arnaud G. GIBERT" Date: Wed, 28 Apr 2021 01:35:10 +0200 Subject: [PATCH] Add "/quake list" command Add TableGenerator.java in Utils (From FisheyLP) Use TableGenerator to format list command output Add number of seconds in "Starting" status Use this status in lobby signs and list command Fix arena config file lookup: load only .yml files Don't start empty arena --- src/com/Geekpower14/Quake/Arena/Arena.java | 6 + .../Geekpower14/Quake/Arena/ArenaManager.java | 41 ++- src/com/Geekpower14/Quake/Arena/SArena.java | 37 +-- .../Quake/Commands/MyCommandExecutor.java | 21 +- .../Geekpower14/Quake/Lobby/LobbyManager.java | 5 +- src/com/Geekpower14/Quake/Quake.java | 2 +- .../Quake/Utils/TableGenerator.java | 240 ++++++++++++++++++ 7 files changed, 320 insertions(+), 32 deletions(-) create mode 100644 src/com/Geekpower14/Quake/Utils/TableGenerator.java diff --git a/src/com/Geekpower14/Quake/Arena/Arena.java b/src/com/Geekpower14/Quake/Arena/Arena.java index 2d179cb..8187bfa 100644 --- a/src/com/Geekpower14/Quake/Arena/Arena.java +++ b/src/com/Geekpower14/Quake/Arena/Arena.java @@ -423,5 +423,11 @@ public abstract class Arena { return null; } + public String getStatus() { + return this._etat <= this._pregame ? (this.getplayers() == this._maxplayer ? ChatColor.DARK_PURPLE + "[FULL]" : + (this._VIP ? ChatColor.AQUA + "[VIP]" : + (this._etat <= this._starting ? ChatColor.GOLD + "[Starting in " + this._etat + "s]" : + ChatColor.GREEN + "[Join]"))) : ChatColor.RED + "[In Game]"; + } } diff --git a/src/com/Geekpower14/Quake/Arena/ArenaManager.java b/src/com/Geekpower14/Quake/Arena/ArenaManager.java index 49d0331..732c6a2 100644 --- a/src/com/Geekpower14/Quake/Arena/ArenaManager.java +++ b/src/com/Geekpower14/Quake/Arena/ArenaManager.java @@ -1,6 +1,7 @@ package com.Geekpower14.Quake.Arena; import com.Geekpower14.Quake.Quake; +import com.Geekpower14.Quake.Utils.TableGenerator; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -8,6 +9,7 @@ import java.util.HashMap; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; public class ArenaManager { @@ -26,8 +28,12 @@ public class ArenaManager { } ArrayList Maps = new ArrayList<>(); for(File f: folder.listFiles()) { - String name = f.getName().replaceAll(".yml", ""); - Maps.add(name); + if(f.getName().endsWith(".yml")) { + String name = f.getName().replaceAll(".yml", ""); + Maps.add(name); + + _plugin.getLogger().info("Loading: [" + f.getName() + "]"); + } } if(Maps.isEmpty()) return; @@ -50,7 +56,7 @@ public class ArenaManager { if (Type2.equalsIgnoreCase("Solo")) { arena = new SArena(_plugin, name, _ARENAS.size()); _ARENAS.put(name, arena); - } else if(Type2.equalsIgnoreCase("Team")) { + } else if(Type2.equalsIgnoreCase("Team")) { arena = new TArena(_plugin, name, _ARENAS.size()); _ARENAS.put(name, arena); } @@ -169,4 +175,31 @@ public class ArenaManager { aren.updateScore(); } } -} \ No newline at end of file + + public void listArenas(Player player) { + String type, status; + + if(_ARENAS.size() < 1) { + player.sendMessage("No Arena!"); + } + else { + player.sendMessage(ChatColor.LIGHT_PURPLE +"Arena List:"); + TableGenerator tg = new TableGenerator(TableGenerator.Alignment.RIGHT, TableGenerator.Alignment.LEFT, TableGenerator.Alignment.LEFT, TableGenerator.Alignment.RIGHT); + + for(Arena aren : _ARENAS.values()) { + if(aren instanceof SArena) { + type="Solo"; + } else { + type="Team"; + } + + tg.addRow( ChatColor.RED + Integer.toString(aren._ID) + ChatColor.WHITE, ChatColor.GREEN + type , aren._name + ChatColor.WHITE, aren.getStatus()); + + } + + for (String line : tg.generate(TableGenerator.Receiver.CLIENT, true, true)) { + player.sendMessage(line); + } + } + } +} diff --git a/src/com/Geekpower14/Quake/Arena/SArena.java b/src/com/Geekpower14/Quake/Arena/SArena.java index 47fec56..5e821e9 100644 --- a/src/com/Geekpower14/Quake/Arena/SArena.java +++ b/src/com/Geekpower14/Quake/Arena/SArena.java @@ -41,7 +41,7 @@ public class SArena extends Arena { @Override public Boolean loadConfig() { File fichier_config = new File(_plugin.getDataFolder(), "/arenas/" + _name + ".yml"); - YamlConfiguration config = YamlConfiguration.loadConfiguration((File)fichier_config); + YamlConfiguration config = YamlConfiguration.loadConfiguration((File)fichier_config); if (config.contains("Nombre")) { int nombre = config.getInt("Nombre"); for (int i = 0; i < nombre; i++) { @@ -278,20 +278,25 @@ public class SArena extends Arena { @Override public void start() { - _etat = _ingame; - if (_objective != null) { - _objective.unregister(); - } - _objective = _board.registerNewObjective(_name, "dummy"); - _objective.setDisplaySlot(DisplaySlot.SIDEBAR); - _objective.setDisplayName("Score"); - for(APlayer play : _players.values()) { - Player player = play.getPlayer(); - cleaner(player); - giveStuff(player); - tp(player); - updateScore(); - giveEffect(player); + if( _players.values().size() == 0) { + _plugin.getLogger().info("Don't start empty Arena: Stop it!"); + stop(); + } else { + _etat = _ingame; + if (_objective != null) { + _objective.unregister(); + } + _objective = _board.registerNewObjective(_name, "dummy"); + _objective.setDisplaySlot(DisplaySlot.SIDEBAR); + _objective.setDisplayName("Score"); + for(APlayer play : _players.values()) { + Player player = play.getPlayer(); + cleaner(player); + giveStuff(player); + tp(player); + updateScore(); + giveEffect(player); + } } } @@ -346,4 +351,4 @@ public class SArena extends Arena { return loc; } -} \ No newline at end of file +} diff --git a/src/com/Geekpower14/Quake/Commands/MyCommandExecutor.java b/src/com/Geekpower14/Quake/Commands/MyCommandExecutor.java index 14dd962..27b4e19 100644 --- a/src/com/Geekpower14/Quake/Commands/MyCommandExecutor.java +++ b/src/com/Geekpower14/Quake/Commands/MyCommandExecutor.java @@ -20,22 +20,23 @@ public class MyCommandExecutor implements CommandExecutor { } private void loadCommands() { - _commands.put("leave", new LeaveCommand(_plugin)); - _commands.put("addspawn", new AddSpawnCommand(_plugin)); - _commands.put("addlobby", new AddLobbyCommand(_plugin)); _commands.put("create", new CreateCommand(_plugin)); - _commands.put("setlobbyspawn", new SetLobbySpawnCommand(_plugin)); - _commands.put("join", new JoinCommand(_plugin)); - _commands.put("removelobby", new RemoveLobbyCommand(_plugin)); - _commands.put("removespawn", new RemoveSpawnCommand(_plugin)); + _commands.put("remove", new RemoveCommand(_plugin)); _commands.put("save", new SaveCommand(_plugin)); + _commands.put("list", new ListCommand(_plugin)); + _commands.put("addspawn", new AddSpawnCommand(_plugin)); + _commands.put("removespawn", new RemoveSpawnCommand(_plugin)); _commands.put("setmap", new SetMapCommand(_plugin)); _commands.put("setmin", new SetMinCommand(_plugin)); _commands.put("setmax", new SetMaxCommand(_plugin)); + _commands.put("addlobby", new AddLobbyCommand(_plugin)); + _commands.put("setlobbyspawn", new SetLobbySpawnCommand(_plugin)); + _commands.put("removelobby", new RemoveLobbyCommand(_plugin)); + _commands.put("join", new JoinCommand(_plugin)); + _commands.put("leave", new LeaveCommand(_plugin)); _commands.put("start", new StartCommand(_plugin)); _commands.put("stop", new StopCommand(_plugin)); _commands.put("shop", new ShopCommand(_plugin)); - _commands.put("remove", new RemoveCommand(_plugin)); _commands.put("kill", new UtilsCommand(_plugin, "kill")); _commands.put("add", new UtilsCommand(_plugin, "add")); _commands.put("lol", new UtilsCommand(_plugin, "lol")); @@ -54,8 +55,8 @@ public class MyCommandExecutor implements CommandExecutor { player = (Player)sender; if(cmd.getName().equalsIgnoreCase("quake")) { if(args == null || args.length < 1) { - player.sendMessage(ChatColor.YELLOW + "Plugin By Geekpower14"); - player.sendMessage(ChatColor.YELLOW + "Reloaded by Bl4ckSkull666 ( wwww.Survival-Piraten.de )"); + player.sendMessage(ChatColor.YELLOW + "Plugin By Geekpower14u / Bl4ckSkull666"); + player.sendMessage(ChatColor.YELLOW + "Updated bt AlkorZ3 ( Obsidia.Rx3.net )"); player.sendMessage(ChatColor.YELLOW + "Version: " + _plugin.getDescription().getVersion()); return true; } diff --git a/src/com/Geekpower14/Quake/Lobby/LobbyManager.java b/src/com/Geekpower14/Quake/Lobby/LobbyManager.java index c0e66e6..f63ebef 100644 --- a/src/com/Geekpower14/Quake/Lobby/LobbyManager.java +++ b/src/com/Geekpower14/Quake/Lobby/LobbyManager.java @@ -232,7 +232,10 @@ public class LobbyManager { Block block = bloc.getBlock(); if (block.getState() instanceof Sign) { Sign sign = (Sign)block.getState(); - String ligne0 = arena._etat <= arena._pregame ? (arena.getplayers() == arena._maxplayer ? ChatColor.DARK_PURPLE + "[FULL]" : (arena._VIP ? ChatColor.AQUA + "[VIP]" : (arena._etat <= arena._starting ? ChatColor.GOLD + "[Starting]" : ChatColor.GREEN + "[Join]"))) : ChatColor.RED + "[InGame]"; + /* + String ligne0 = arena._etat <= arena._pregame ? (arena.getplayers() == arena._maxplayer ? ChatColor.DARK_PURPLE + "[FULL]" : (arena._VIP ? ChatColor.AQUA + "[VIP]" : (arena._etat <= arena._starting ? ChatColor.GOLD + "[Starting]" : ChatColor.GREEN + "[Join]"))) : ChatColor.RED + "[InGame]"; + */ + String ligne0 = arena.getStatus(); String tmp = ""; if (arena instanceof SArena) { tmp = "S-"; diff --git a/src/com/Geekpower14/Quake/Quake.java b/src/com/Geekpower14/Quake/Quake.java index 3be9daf..fabfc77 100644 --- a/src/com/Geekpower14/Quake/Quake.java +++ b/src/com/Geekpower14/Quake/Quake.java @@ -38,7 +38,7 @@ import org.bukkit.scoreboard.Scoreboard; public class Quake extends JavaPlugin { public static boolean _debug = false; - public static String _version = "3.4.0"; + public static String _version = "3.5.0"; public static Version _ver = new Version(_version); public ArenaManager _am = null; public LobbyManager _lobby = null; diff --git a/src/com/Geekpower14/Quake/Utils/TableGenerator.java b/src/com/Geekpower14/Quake/Utils/TableGenerator.java new file mode 100644 index 0000000..31ea3c6 --- /dev/null +++ b/src/com/Geekpower14/Quake/Utils/TableGenerator.java @@ -0,0 +1,240 @@ +package com.Geekpower14.Quake.Utils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +// Copyright by FisheyLP, Version 1.3 (12.08.16) +// https://github.com/FisheyLP/TableGenerator + +public class TableGenerator { + + private static String delimiter = " | "; + private static List char7 = Arrays.asList('°', '~', '@'); + private static List char5 = Arrays.asList('"', '{', '}', '(', ')', '*', 'f', 'k', '<', '>'); + private static List char4 = Arrays.asList('I', 't', ' ', '[', ']', '€'); + private static List char3 = Arrays.asList('l', '`', '³', '\''); + private static List char2 = Arrays.asList(',', '.', '!', 'i', '´', ':', ';', '|'); + private static char char1 = '\u17f2'; + private static Pattern regex = Pattern.compile(char1+"(?:§r)?(\\s*)" + + "(?:§r§8)?"+char1+"(?:§r)?(\\s*)" + + "(?:§r§8)?"+char1+"(?:§r)?(\\s*)" + + "(?:§r§8)?"+char1); + private static String colors = "[&§][0-9a-fA-Fk-oK-OrR]"; + private Alignment[] alignments; + private List table = new ArrayList<>(); + private int columns; + + public TableGenerator(Alignment... alignments) { + if (alignments == null || alignments.length < 1) + throw new IllegalArgumentException("Must atleast provide 1 alignment."); + + this.columns = alignments.length; + this.alignments = alignments; + } + + public List generate(Receiver receiver, boolean ignoreColors, + boolean coloredDistances) { + if (receiver == null) { + throw new IllegalArgumentException("Receiver must not be null."); + } + + Integer[] columWidths = new Integer[columns]; + + for (Row r : table) { + for (int i = 0; i < columns; i++) { + String text = r.texts.get(i); + int length; + + if (ignoreColors) + length = getCustomLength(text.replaceAll(colors, ""), + receiver); + else length = getCustomLength(text, receiver); + + if (columWidths[i] == null) { + columWidths[i] = length; + } + + else if (length > columWidths[i]) { + columWidths[i] = length; + } + } + } + + List lines = new ArrayList(); + + for (Row r : table) { + StringBuilder sb = new StringBuilder(); + + if (r.empty) { + lines.add(""); + continue; + } + + for (int i = 0; i < columns; i++) { + Alignment agn = alignments[i]; + String text = r.texts.get(i); + int length; + + if (ignoreColors) + length = getCustomLength(text.replaceAll(colors, ""), + receiver); + else length = getCustomLength(text, + receiver); + + int empty = columWidths[i] - length; + int spacesAmount = empty; + if (receiver == Receiver.CLIENT) + spacesAmount = (int) Math.floor(empty / 4d); + int char1Amount = 0; + if (receiver == Receiver.CLIENT) + char1Amount = empty - 4 * spacesAmount; + + String spaces = concatChars(' ', spacesAmount); + String char1s = concatChars(char1, char1Amount); + + if (coloredDistances) + char1s = "§r§8" + char1s + "§r"; + + if (agn == Alignment.LEFT) { + sb.append(text); + if (i < columns - 1) + sb.append(char1s).append(spaces); + } + if (agn == Alignment.RIGHT) { + sb.append(spaces).append(char1s).append(text); + } + if (agn == Alignment.CENTER) { + int leftAmount = empty / 2; + int rightAmount = empty - leftAmount; + + int spacesLeftAmount = leftAmount; + int spacesRightAmount = rightAmount; + if (receiver == Receiver.CLIENT) { + spacesLeftAmount = (int) Math.floor(spacesLeftAmount / 4d); + spacesRightAmount = (int) Math.floor(spacesRightAmount / 4d); + } + + int char1LeftAmount = 0; + int char1RightAmount = 0; + if (receiver == Receiver.CLIENT) { + char1LeftAmount = leftAmount - 4 * spacesLeftAmount; + char1RightAmount = rightAmount - 4 * spacesRightAmount; + } + + String spacesLeft = concatChars(' ', spacesLeftAmount); + String spacesRight = concatChars(' ', spacesRightAmount); + String char1Left = concatChars(char1, char1LeftAmount); + String char1Right = concatChars(char1, char1RightAmount); + + if (coloredDistances) { + char1Left = "§r§8" + char1Left + "§r"; + char1Right = "§r§8" + char1Right + "§r"; + } + + sb.append(spacesLeft).append(char1Left).append(text); + if (i < columns - 1) + sb.append(char1Right).append(spacesRight); + } + + if (i < columns - 1) sb.append("§r" + delimiter); + } + + String line = sb.toString(); + if (receiver == Receiver.CLIENT) { + for (int i = 0; i < 2; i++) { + Matcher matcher = regex.matcher(line); + line = matcher.replaceAll("$1$2$3 ").replace("§r§8§r", "§r") + .replaceAll("§r(\\s*)§r", "§r$1"); + } + } + lines.add(line); + } + return lines; + } + + protected static int getCustomLength(String text, Receiver receiver) { + if (text == null) { + throw new IllegalArgumentException("Text must not be null."); + } + if (receiver == null) { + throw new IllegalArgumentException("Receiver must not be null."); + } + if (receiver == Receiver.CONSOLE) return text.length(); + + int length = 0; + for (char c : text.toCharArray()) + length += getCustomCharLength(c); + + return length; + } + + protected static int getCustomCharLength(char c) { + if (char1 == c) return 1; + if (char2.contains(c)) return 2; + if (char3.contains(c)) return 3; + if (char4.contains(c)) return 4; + if (char5.contains(c)) return 5; + if (char7.contains(c)) return 7; + + return 6; + } + + protected String concatChars(char c, int length) { + String s = ""; + if (length < 1) return s; + + for (int i = 0; i < length; i++) + s += Character.toString(c); + return s; + } + + public void addRow(String... texts) { + if (texts == null) { + throw new IllegalArgumentException("Texts must not be null."); + } + if (texts != null && texts.length > columns) { + throw new IllegalArgumentException("Too big for the table."); + } + + Row r = new Row(texts); + + table.add(r); + } + + private class Row { + + public List texts = new ArrayList<>(); + public boolean empty = true; + + public Row(String... texts) { + if (texts == null) { + for (int i = 0; i < columns; i++) + this.texts.add(""); + return; + } + + for (String text : texts) { + if (text != null && !text.isEmpty()) empty = false; + + this.texts.add(text); + } + + for (int i = 0; i < columns; i++) { + if (i >= texts.length) this.texts.add(""); + } + } + } + + public enum Receiver { + + CONSOLE, CLIENT + } + + public enum Alignment { + + CENTER, LEFT, RIGHT + } +}