diff options
Diffstat (limited to 'src/main/java/net/tylermurphy/hideAndSeek')
86 files changed, 3377 insertions, 1905 deletions
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/Main.java b/src/main/java/net/tylermurphy/hideAndSeek/Main.java index 4d8581f..36d92ee 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/Main.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/Main.java @@ -1,49 +1,34 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek; -import net.tylermurphy.hideAndSeek.configuration.Config; -import net.tylermurphy.hideAndSeek.configuration.Items; -import net.tylermurphy.hideAndSeek.configuration.Localization; +import net.tylermurphy.hideAndSeek.command.*; +import net.tylermurphy.hideAndSeek.command.map.*; +import net.tylermurphy.hideAndSeek.command.map.blockhunt.Enabled; +import net.tylermurphy.hideAndSeek.command.map.set.*; +import net.tylermurphy.hideAndSeek.command.world.Create; +import net.tylermurphy.hideAndSeek.command.world.Delete; +import net.tylermurphy.hideAndSeek.command.world.Tp; +import net.tylermurphy.hideAndSeek.configuration.*; import net.tylermurphy.hideAndSeek.database.Database; import net.tylermurphy.hideAndSeek.game.*; -import net.tylermurphy.hideAndSeek.game.util.Status; -import net.tylermurphy.hideAndSeek.util.CommandHandler; +import net.tylermurphy.hideAndSeek.command.util.CommandGroup; import net.tylermurphy.hideAndSeek.game.listener.*; import net.tylermurphy.hideAndSeek.util.PAPIExpansion; -import net.tylermurphy.hideAndSeek.util.TabCompleter; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import java.io.File; -import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition; -import static net.tylermurphy.hideAndSeek.configuration.Config.exitWorld; +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class Main extends JavaPlugin implements Listener { @@ -55,51 +40,136 @@ public class Main extends JavaPlugin implements Listener { private Disguiser disguiser; private EntityHider entityHider; private Game game; + private CommandGroup commandGroup; + private boolean loaded; public void onEnable() { + + long start = System.currentTimeMillis(); + + getLogger().info("Loading Kenshin's Hide and Seek"); Main.instance = this; - this.updateVersion(); - Config.loadConfig(); - Localization.loadLocalization(); - Items.loadItems(); + getLogger().info("Getting minecraft version..."); + this.updateVersion();; + + try { + getLogger().info("Loading config.yml..."); + Config.loadConfig(); + getLogger().info("Loading maps.yml..."); + Maps.loadMaps(); + getLogger().info("Loading localization.yml..."); + Localization.loadLocalization(); + getLogger().info("Loading items.yml..."); + Items.loadItems(); + getLogger().info("Loading leaderboard.yml..."); + Leaderboard.loadLeaderboard(); + } catch (Exception e) { + getLogger().severe(e.getMessage()); + Bukkit.getPluginManager().disablePlugin(this); + return; + } + getLogger().info("Creating internal scoreboard..."); this.board = new Board(); + getLogger().info("Connecting to database..."); this.database = new Database(); + getLogger().info("Loading disguises..."); this.disguiser = new Disguiser(); + getLogger().info("Loading entity hider..."); this.entityHider = new EntityHider(this, EntityHider.Policy.BLACKLIST); + getLogger().info("Registering listeners..."); this.registerListeners(); - CommandHandler.registerCommands(); + getLogger().info("Registering commands..."); + this.commandGroup = new CommandGroup("hs", + new Help(), + new Reload(), + new Join(), + new Leave(), + new Send(), + new Start(), + new Stop(), + new CommandGroup("map", + new CommandGroup("blockhunt", + new CommandGroup("blocks", + new net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks.Add(), + new net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks.Remove(), + new net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks.List() + ), + new Enabled() + ), + new CommandGroup("set", + new Lobby(), + new Spawn(), + new SeekerLobby(), + new Border(), + new Bounds() + ), + new Add(), + new Remove(), + new List(), + new Status(), + new Save(), + new Debug(), + new GoTo() + ), + new CommandGroup("world", + new Create(), + new Delete(), + new net.tylermurphy.hideAndSeek.command.world.List(), + new Tp() + ), + new SetExitLocation(), + new Top(), + new Wins(), + new Confirm() + ); - game = new Game(board); + getLogger().info("Loading game..."); + game = new Game(null, board); + getLogger().info("Scheduling tick tasks..."); getServer().getScheduler().runTaskTimer(this, this::onTick,0,1).getTaskId(); + getLogger().info("Registering outgoing bungeecord plugin channel..."); Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + getLogger().info("Checking for PlaceholderAPI..."); if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) { + getLogger().info("PlaceholderAPI found..."); + getLogger().info("Registering PlaceholderAPI expansion..."); new PAPIExpansion().register(); } + + long end = System.currentTimeMillis(); + getLogger().info("Finished loading plugin ("+(end-start)+"ms)"); + loaded = true; + } public void onDisable() { version = 0; - board.getPlayers().forEach(player -> { - board.removeBoard(player); - PlayerLoader.unloadPlayer(player); - player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); - }); + if(board != null) { + board.getPlayers().forEach(player -> { + board.removeBoard(player); + PlayerLoader.unloadPlayer(player); + exitPosition.teleport(player); + }); + board.cleanup(); + } + + if(disguiser != null) { + disguiser.cleanUp(); + } Bukkit.getServer().getMessenger().unregisterOutgoingPluginChannel(this); - board.cleanup(); - disguiser.cleanUp(); } private void onTick() { - if(game.getStatus() == Status.ENDED) game = new Game(board); + if(game.getStatus() == net.tylermurphy.hideAndSeek.game.util.Status.ENDED) game = new Game(game.getCurrentMap(), board); game.onTick(); disguiser.check(); } @@ -115,6 +185,7 @@ public class Main extends JavaPlugin implements Listener { getServer().getPluginManager().registerEvents(new MovementHandler(), this); getServer().getPluginManager().registerEvents(new PlayerHandler(), this); getServer().getPluginManager().registerEvents(new RespawnHandler(), this); + getServer().getPluginManager().registerEvents(new WorldInteractHandler(), this); } private void updateVersion(){ @@ -127,11 +198,20 @@ public class Main extends JavaPlugin implements Listener { } public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { - return CommandHandler.handleCommand(sender, args); + if (!(sender instanceof Player)) { + sender.sendMessage(errorPrefix + message("COMMAND_PLAYER_ONLY")); + return true; + } + commandGroup.handleCommand((Player)sender, args); + return true; } - public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - return TabCompleter.handleTabComplete(sender, args); + public java.util.List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage(errorPrefix + message("COMMAND_PLAYER_ONLY")); + return new ArrayList<>(); + } + return commandGroup.handleTabComplete((Player)sender, args); } public static Main getInstance() { @@ -158,8 +238,34 @@ public class Main extends JavaPlugin implements Listener { public EntityHider getEntityHider() { return entityHider; } + public CommandGroup getCommandGroup() { return commandGroup; } + public boolean supports(int v){ return version >= v; } + + public java.util.List<String> getWorlds() { + java.util.List<String> worlds = new ArrayList<>(); + File[] containers = getWorldContainer().listFiles(); + if(containers != null) { + Arrays.stream(containers).forEach(file -> { + if (!file.isDirectory()) return; + String[] files = file.list(); + if (files == null) return; + if (!Arrays.asList(files).contains("session.lock") && !Arrays.asList(files).contains("level.dat")) return; + worlds.add(file.getName()); + }); + } + return worlds; + } + + public boolean isLoaded() { + return loaded; + } + + public void scheduleTask(Runnable task) { + if(!isEnabled()) return; + Bukkit.getServer().getScheduler().runTask(this, task); + } }
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/About.java b/src/main/java/net/tylermurphy/hideAndSeek/command/About.java deleted file mode 100644 index 54af32b..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/About.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command; - -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; - -public class About implements ICommand { - - public void execute(Player sender, String[] args) { - sender.sendMessage( - String.format("%s%sHide and Seek %s(%s1.6.2%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY,ChatColor.WHITE,ChatColor.GRAY) + - String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) + - String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE) - ); - } - - public String getLabel() { - return "about"; - } - - public String getUsage() { - return ""; - } - - public String getDescription() { - return "Get information about the plugin"; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Confirm.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Confirm.java new file mode 100644 index 0000000..a25185d --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Confirm.java @@ -0,0 +1,62 @@ +package net.tylermurphy.hideAndSeek.command; + +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.function.Consumer; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Confirm implements ICommand { + + public static final Map<UUID, Confirmation> confirmations = new HashMap<>(); + + public void execute(Player sender, String[] args) { + Confirmation confirmation = confirmations.get(sender.getUniqueId()); + confirmations.remove(sender.getUniqueId()); + if(confirmation == null) { + sender.sendMessage(errorPrefix + message("NO_CONFIRMATION")); + } else { + long now = System.currentTimeMillis(); + float secs = (now - confirmation.start) / 1000F; + if(secs > 10) { + sender.sendMessage(errorPrefix + message("CONFIRMATION_TIMED_OUT")); + return; + } + confirmation.callback.accept(confirmation.data); + } + } + + public String getLabel() { + return "confirm"; + } + + public String getUsage() { + return ""; + } + + public String getDescription() { + return "Confirm another command if required"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return null; + } + + public static class Confirmation { + public final Consumer<String> callback; + public final String data; + public final long start; + + public Confirmation(String data, Consumer<String> callback) { + this.callback = callback; + this.data = data; + this.start = System.currentTimeMillis(); + } + + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java deleted file mode 100644 index 61d0c46..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Debug.java +++ /dev/null @@ -1,110 +0,0 @@ -package net.tylermurphy.hideAndSeek.command; - -import com.cryptomorin.xseries.XMaterial; -import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.game.PlayerLoader; -import net.tylermurphy.hideAndSeek.game.util.Status; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition; - -public class Debug implements ICommand { - - private static final Map<Integer, Consumer<Player>> debugMenuFunctions = new HashMap<>(); - private Inventory debugMenu; - - public void execute(Player sender, String[] args) { - if(debugMenu == null) createMenu(); - sender.openInventory(debugMenu); - } - - private void createMenu(){ - debugMenu = Main.getInstance().getServer().createInventory(null, 18, "Debug Menu"); - debugMenu.setItem(0, createOption(0, XMaterial.LEATHER_CHESTPLATE.parseMaterial(), "&6Become a &lHider", 1, player -> { - if(mapSaveEnabled) { - if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap(); - } - Main.getInstance().getBoard().addHider(player); - PlayerLoader.loadHider(player, Main.getInstance().getGame().getGameWorld()); - if(Main.getInstance().getGame().getStatus() != Status.STARTING) - PlayerLoader.resetPlayer(player, Main.getInstance().getBoard()); - })); - debugMenu.setItem(1, createOption(1, XMaterial.GOLDEN_CHESTPLATE.parseMaterial(), "&cBecome a &lSeeker", 1, player -> { - if(mapSaveEnabled) { - if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap(); - } - Main.getInstance().getBoard().addSeeker(player); - PlayerLoader.loadSeeker(player, Main.getInstance().getGame().getGameWorld()); - if(Main.getInstance().getGame().getStatus() != Status.STARTING) - PlayerLoader.resetPlayer(player, Main.getInstance().getBoard()); - })); - debugMenu.setItem(2, createOption(2, XMaterial.IRON_CHESTPLATE.parseMaterial(), "&8Become a &lSpectator", 1, player -> { - if(mapSaveEnabled) { - if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap(); - } - Main.getInstance().getBoard().addSpectator(player); - PlayerLoader.loadSpectator(player, Main.getInstance().getGame().getGameWorld()); - })); - debugMenu.setItem(3, createOption(3, XMaterial.BARRIER.parseMaterial(), "&cUnload from Game", 1, player -> { - Main.getInstance().getBoard().remove(player); - PlayerLoader.unloadPlayer(player); - player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); - })); - debugMenu.setItem(4, createOption(4, XMaterial.BARRIER.parseMaterial(), "&cDie In Game", 2, player -> { - if((Main.getInstance().getBoard().isSeeker(player) || Main.getInstance().getBoard().isHider(player)) && Main.getInstance().getGame().getStatus() == Status.PLAYING){ - player.setHealth(0.1); - } - })); - debugMenu.setItem(6, createOption(6, Material.ENDER_PEARL, "&d&lTeleport: &fGame spawn", 1, player -> { - if(mapSaveEnabled) { - if(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()) == null) Main.getInstance().getGame().getWorldLoader().loadMap(); - } - player.teleport(new Location(Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); - })); - debugMenu.setItem(7, createOption(7, Material.ENDER_PEARL, "&d&lTeleport: &fLobby", 2, player -> player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(), lobbyPosition.getY(), lobbyPosition.getZ())))); - debugMenu.setItem(8, createOption(8, Material.ENDER_PEARL, "&d&lTeleport: &fExit", 3, player -> player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())))); - debugMenu.setItem(9, createOption(9, XMaterial.GLASS.parseMaterial(), "&dEnable Disguise", 1, PlayerLoader::openBlockHuntPicker)); - debugMenu.setItem(10, createOption(10, XMaterial.PLAYER_HEAD.parseMaterial(), "&dDisable Disguise", 1, player -> Main.getInstance().getDisguiser().reveal(player))); - } - - private ItemStack createOption(int slow, Material material, String name, int amount, Consumer<Player> callback){ - ItemStack temp = new ItemStack(material, amount); - ItemMeta meta = temp.getItemMeta(); - meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); - temp.setItemMeta(meta); - debugMenuFunctions.put(slow, callback); - return temp; - } - - public static void handleOption(Player player, int slotId){ - Main.getInstance().getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> { - Consumer<Player> callback = debugMenuFunctions.get(slotId); - if(callback != null) callback.accept(player); - }, 0); - } - - public String getLabel() { - return "debug"; - } - - public String getUsage() { - return ""; - } - - public String getDescription() { - return "Run debug commands"; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Help.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Help.java index 97224d7..41db5a9 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Help.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Help.java @@ -1,36 +1,70 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.command; -import net.md_5.bungee.api.ChatColor; -import net.tylermurphy.hideAndSeek.util.CommandHandler; +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.util.Pair; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class Help implements ICommand { public void execute(Player sender, String[] args) { + final int pageSize = 4; + List<Pair<String, ICommand>> commands = Main.getInstance().getCommandGroup().getCommands(); + int pages = (commands.size() - 1) / pageSize + 1; + int page; + try { + if(args.length < 1) { + page = 1; + } else { + page = Integer.parseInt(args[0]); + if (page < 1) { + throw new IllegalArgumentException("Inavlid Input"); + } + } + } catch (Exception e) { + sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[0])); + return; + } + String spacer = ChatColor.GRAY + "?" + ChatColor.WHITE; StringBuilder message = new StringBuilder(); - for(ICommand command : CommandHandler.COMMAND_REGISTER.values()) { - message.append(String.format("%s/hs %s%s %s%s\n %s%s%s", ChatColor.AQUA, ChatColor.WHITE, command.getLabel().toLowerCase(), ChatColor.BLUE, command.getUsage(), ChatColor.GRAY, ChatColor.ITALIC, command.getDescription() + "\n")); + message.append(String.format("%s================ %sHelp: Page (%s/%s) %s================", + ChatColor.AQUA, ChatColor.WHITE, page, pages, ChatColor.AQUA)); + int lines = 0; + for(Pair<String, ICommand> pair : commands.stream().skip((long) (page - 1) * pageSize).limit(pageSize).collect(Collectors.toList())) { + ICommand command = pair.getRight(); + String label = pair.getLeft(); + String start = label.substring(0, label.indexOf(" ")); + String invoke = label.substring(label.indexOf(" ")+1); + message.append(String.format("\n%s %s/%s %s%s %s%s\n%s %s%s%s", + spacer, + ChatColor.AQUA, + start, + ChatColor.WHITE, + invoke, + ChatColor.BLUE, + command.getUsage(), + spacer, + ChatColor.GRAY, + ChatColor.ITALIC, + command.getDescription() + )); + lines += 2; } - message = new StringBuilder(message.substring(0, message.length() - 1)); + if(lines / 2 < pageSize) { + for(int i = 0; i < pageSize * 2 - lines; i++) { + message.append("\n").append(spacer); + } + } + message.append("\n").append(ChatColor.AQUA).append("==============================================="); sender.sendMessage(message.toString()); } @@ -39,11 +73,15 @@ public class Help implements ICommand { } public String getUsage() { - return ""; + return "<*page>"; } public String getDescription() { return "Get the commands for the plugin"; } + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return Collections.singletonList(parameter); + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/ICommand.java b/src/main/java/net/tylermurphy/hideAndSeek/command/ICommand.java deleted file mode 100644 index 275d189..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/ICommand.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command; - -import org.bukkit.entity.Player; - -public interface ICommand { - - void execute(Player sender, String[] args); - - String getLabel(); - - String getUsage(); - - String getDescription(); - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Join.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Join.java index 941cec0..0c01265 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Join.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Join.java @@ -1,27 +1,14 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Maps; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.Collectors; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; @@ -29,7 +16,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class Join implements ICommand { public void execute(Player sender, String[] args) { - if (Main.getInstance().getGame().isNotSetup()) { + if (Main.getInstance().getGame().checkCurrentMap()) { sender.sendMessage(errorPrefix + message("GAME_SETUP")); return; } @@ -42,7 +29,18 @@ public class Join implements ICommand { sender.sendMessage(errorPrefix + message("GAME_INGAME")); return; } - + if(args.length > 0) { + if(Main.getInstance().getBoard().size() > 0) { + sender.sendMessage(errorPrefix + message("LOBBY_IN_USE")); + return; + } + net.tylermurphy.hideAndSeek.configuration.Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + Main.getInstance().getGame().setCurrentMap(map); + } Main.getInstance().getGame().join(player); } @@ -51,11 +49,18 @@ public class Join implements ICommand { } public String getUsage() { - return ""; + return "<*map>"; } public String getDescription() { return "Joins the lobby if game is set to manual join/leave"; } + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("*map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java index 092ff50..109930b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Leave.java @@ -1,27 +1,12 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; @@ -29,7 +14,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class Leave implements ICommand { public void execute(Player sender, String[] args) { - if (Main.getInstance().getGame().isNotSetup()) { + if (Main.getInstance().getGame().checkCurrentMap()) { sender.sendMessage(errorPrefix + message("GAME_SETUP")); return; } @@ -57,4 +42,8 @@ public class Leave implements ICommand { return "Leaves the lobby if game is set to manual join/leave"; } + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return null; + } + }
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java index 56f4517..0c2b6b1 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Reload.java @@ -1,30 +1,13 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.configuration.Config; -import net.tylermurphy.hideAndSeek.configuration.Items; -import net.tylermurphy.hideAndSeek.configuration.Localization; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.*; import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; @@ -38,9 +21,18 @@ public class Reload implements ICommand { sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); return; } - Config.loadConfig(); - Localization.loadLocalization(); - Items.loadItems(); + + try { + Config.loadConfig(); + Maps.loadMaps(); + Localization.loadLocalization(); + Items.loadItems(); + Leaderboard.loadLeaderboard(); + } catch (Exception e) { + sender.sendMessage(errorPrefix + message("CONFIG_ERROR")); + return; + } + sender.sendMessage(messagePrefix + message("CONFIG_RELOAD")); } @@ -55,5 +47,9 @@ public class Reload implements ICommand { public String getDescription() { return "Reloads the config"; } - + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return null; + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Send.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Send.java new file mode 100644 index 0000000..43620c5 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Send.java @@ -0,0 +1,69 @@ +package net.tylermurphy.hideAndSeek.command; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Send implements ICommand { + + public void execute(Player sender, String[] args) { + + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + + if(map.isNotSetup()){ + sender.sendMessage(errorPrefix + message("MAP_NOT_SETUP")); + return; + } + + if (!Main.getInstance().getBoard().contains(sender)) { + sender.sendMessage(errorPrefix + message("GAME_NOT_INGAME")); + return; + } + + Main.getInstance().getGame().setCurrentMap(map); + Main.getInstance().getBoard().reloadLobbyBoards(); + for(Player player : Main.getInstance().getBoard().getPlayers()) { + map.getLobby().teleport(player); + } + + } + + public String getLabel() { + return "send"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "Set the current lobby to another map"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().filter(map -> !map.isNotSetup()).map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java deleted file mode 100644 index b456e6a..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBorder.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command; - -import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.game.util.Status; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Localization.message; - -public class SetBorder implements ICommand { - - public void execute(Player sender, String[] args) { - if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { - sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); - return; - } - if (spawnPosition == null) { - sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN")); - return; - } - if (args.length < 3) { - worldBorderEnabled = false; - addToConfig("worldBorder.enabled",false); - saveConfig(); - sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE")); - Main.getInstance().getGame().getBorder().resetWorldBorder(spawnWorld); - return; - } - int num,delay,change; - try { num = Integer.parseInt(args[0]); } catch (Exception e) { - sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[0])); - return; - } - try { delay = Integer.parseInt(args[1]); } catch (Exception e) { - sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[1])); - return; - } - try { change = Integer.parseInt(args[2]); } catch (Exception e) { - sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[2])); - return; - } - if (num < 100) { - sender.sendMessage(errorPrefix + message("WORLDBORDER_MIN_SIZE")); - return; - } - if (change < 1) { - sender.sendMessage(errorPrefix + message("WORLDBORDER_CHANGE_SIZE")); - return; - } - Vector vec = new Vector(); - vec.setX(sender.getLocation().getBlockX()); - vec.setY(0); - vec.setZ(sender.getLocation().getBlockZ()); - if (spawnPosition.distance(vec) > 100) { - sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION")); - return; - } - worldBorderPosition = vec; - worldBorderSize = num; - worldBorderDelay = delay; - worldBorderChange = change; - worldBorderEnabled = true; - addToConfig("worldBorder.x", worldBorderPosition.getBlockX()); - addToConfig("worldBorder.z", worldBorderPosition.getBlockZ()); - addToConfig("worldBorder.delay", worldBorderDelay); - addToConfig("worldBorder.size", worldBorderSize); - addToConfig("worldBorder.enabled", true); - addToConfig("worldBorder.move", worldBorderChange); - sender.sendMessage(messagePrefix + message("WORLDBORDER_ENABLE").addAmount(num).addAmount(delay)); - saveConfig(); - Main.getInstance().getGame().getBorder().resetWorldBorder(spawnWorld); - } - - public String getLabel() { - return "setBorder"; - } - - public String getUsage() { - return "<size> <delay> <move>"; - } - - public String getDescription() { - return "Sets worldboarder's center location, size in blocks, and delay in minutes per shrink. Add no arguments to disable."; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java deleted file mode 100644 index 434e4a6..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/SetBounds.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command; - -import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.game.util.Status; -import org.bukkit.entity.Player; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Localization.message; - -public class SetBounds implements ICommand { - - public void execute(Player sender, String[] args) { - if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { - sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); - return; - } - if (spawnPosition == null) { - sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN")); - return; - } - if (!sender.getWorld().getName().equals(spawnWorld)) { - sender.sendMessage(errorPrefix + message("BOUNDS_WRONG_WORLD")); - return; - } - if (sender.getLocation().getBlockX() == 0 || sender.getLocation().getBlockZ() == 0) { - sender.sendMessage(errorPrefix + message("NOT_AT_ZERO")); - return; - } - boolean first = true; - if (saveMinX != 0 && saveMinZ != 0 && saveMaxX != 0 && saveMaxZ != 0) { - saveMinX = 0; saveMinZ= 0; saveMaxX = 0; saveMaxZ = 0; - } - if (saveMaxX == 0) { - addToConfig("bounds.max.x", sender.getLocation().getBlockX()); - saveMaxX = sender.getLocation().getBlockX(); - } else if (saveMaxX < sender.getLocation().getBlockX()) { - first = false; - addToConfig("bounds.max.x", sender.getLocation().getBlockX()); - addToConfig("bounds.min.x", saveMaxX); - saveMinX = saveMaxX; - saveMaxX = sender.getLocation().getBlockX(); - } else { - first = false; - addToConfig("bounds.min.x", sender.getLocation().getBlockX()); - saveMinX = sender.getLocation().getBlockX(); - } - if (saveMaxZ == 0) { - addToConfig("bounds.max.z", sender.getLocation().getBlockZ()); - saveMaxZ = sender.getLocation().getBlockZ(); - } else if (saveMaxZ < sender.getLocation().getBlockZ()) { - first = false; - addToConfig("bounds.max.z", sender.getLocation().getBlockZ()); - addToConfig("bounds.min.z", saveMaxZ); - saveMinZ = saveMaxZ; - saveMaxZ = sender.getLocation().getBlockZ(); - } else { - first = false; - addToConfig("bounds.min.z", sender.getLocation().getBlockZ()); - saveMinZ = sender.getLocation().getBlockZ(); - } - sender.sendMessage(messagePrefix + message("BOUNDS").addAmount(first ? 1 : 2)); - saveConfig(); - } - - public String getLabel() { - return "setBounds"; - } - - public String getUsage() { - return ""; - } - - public String getDescription() { - return "Sets the map bounds for the game."; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SetExitLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/SetExitLocation.java new file mode 100644 index 0000000..7da404f --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/SetExitLocation.java @@ -0,0 +1,43 @@ +package net.tylermurphy.hideAndSeek.command; + +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.command.location.LocationUtils; +import net.tylermurphy.hideAndSeek.command.location.Locations; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; + +public class SetExitLocation implements ICommand { + + public void execute(Player sender, String[] args) { + LocationUtils.setLocation(sender, Locations.EXIT, null, map -> { + addToConfig("exit.x", sender.getLocation().getBlockX()); + addToConfig("exit.y", sender.getLocation().getBlockY()); + addToConfig("exit.z", sender.getLocation().getBlockZ()); + addToConfig("exit.world", sender.getLocation().getWorld().getName()); + exitPosition = Location.from(sender); + saveConfig(); + }); + } + + public String getLabel() { + return "setexit"; + } + + public String getUsage() { + return ""; + } + + public String getDescription() { + return "Sets the plugins exit location"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java deleted file mode 100644 index e961188..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Setup.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command; - -import net.tylermurphy.hideAndSeek.Main; -import org.bukkit.entity.Player; - -import java.io.File; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Localization.message; - -public class Setup implements ICommand { - - public void execute(Player sender, String[] args) { - - String msg = message("SETUP").toString(); - int count = 0; - - if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) { - msg = msg + "\n" + message("SETUP_GAME"); - count++; - } - if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0) { - msg = msg + "\n" + message("SETUP_LOBBY"); - count++; - } - if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0) { - msg = msg + "\n" + message("SETUP_SEEKER_LOBBY"); - count++; - } - if (exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) { - msg = msg + "\n" + message("SETUP_EXIT"); - count++; - } - if (saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0) { - msg = msg + "\n" + message("SETUP_BOUNDS"); - count++; - } - if (mapSaveEnabled) { - File destenation = new File(Main.getInstance().getWorldContainer() + File.separator + Main.getInstance().getGame().getGameWorld()); - if (!destenation.exists()) { - msg = msg + "\n" + message("SETUP_SAVEMAP"); - count++; - } - } - if (count < 1) { - sender.sendMessage(messagePrefix + message("SETUP_COMPLETE")); - } else { - sender.sendMessage(msg); - } - } - - public String getLabel() { - return "setup"; - } - - public String getUsage() { - return ""; - } - - public String getDescription() { - return "Shows what needs to be setup"; - } - -}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java index 18bcbba..5184933 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Start.java @@ -1,31 +1,14 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; -import java.util.Optional; -import java.util.Random; +import java.util.List; +import java.util.stream.Collectors; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.minPlayers; @@ -34,7 +17,7 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class Start implements ICommand { public void execute(Player sender, String[] args) { - if (Main.getInstance().getGame().isNotSetup()) { + if (Main.getInstance().getGame().checkCurrentMap()) { sender.sendMessage(errorPrefix + message("GAME_SETUP")); return; } @@ -52,22 +35,13 @@ public class Start implements ICommand { } String seekerName; if (args.length < 1) { - Optional<Player> rand = Main.getInstance().getBoard().getPlayers().stream().skip(new Random().nextInt(Main.getInstance().getBoard().size())).findFirst(); - if (!rand.isPresent()) { - Main.getInstance().getLogger().warning("Failed to select random seeker."); - return; - } - seekerName = rand.get().getName(); + Main.getInstance().getGame().start(); + return; } else { seekerName = args[0]; } - Player temp = Bukkit.getPlayer(seekerName); - if (temp == null) { - sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(seekerName)); - return; - } - Player seeker = Main.getInstance().getBoard().getPlayer(temp.getUniqueId()); - if (seeker == null) { + Player seeker = Bukkit.getPlayer(seekerName); + if (seeker == null || !Main.getInstance().getBoard().contains(seeker)) { sender.sendMessage(errorPrefix + message("START_INVALID_NAME").addPlayer(seekerName)); return; } @@ -79,11 +53,18 @@ public class Start implements ICommand { } public String getUsage() { - return "<player>"; + return "<*player>"; } public String getDescription() { return "Starts the game either with a random seeker or chosen one"; } + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("player")) { + return Main.getInstance().getBoard().getPlayers().stream().map(Player::getName).collect(Collectors.toList()); + } + return null; + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java index 9280b53..498e30d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Stop.java @@ -1,27 +1,12 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; import static net.tylermurphy.hideAndSeek.configuration.Config.abortPrefix; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; @@ -30,8 +15,8 @@ import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class Stop implements ICommand { public void execute(Player sender, String[] args) { - if (Main.getInstance().getGame().isNotSetup()) { - sender.sendMessage(errorPrefix + "Game is not setup. Run /hs setup to see what you needed to do"); + if (Main.getInstance().getGame().checkCurrentMap()) { + sender.sendMessage(errorPrefix + message("GAME_SETUP")); return; } if (Main.getInstance().getGame().getStatus() == Status.STARTING || Main.getInstance().getGame().getStatus() == Status.PLAYING) { @@ -54,4 +39,8 @@ public class Stop implements ICommand { return "Stops the game"; } + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return null; + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java index 72a695c..13f3069 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Top.java @@ -1,29 +1,13 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; import net.tylermurphy.hideAndSeek.database.util.PlayerInfo; import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.List; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; @@ -74,10 +58,15 @@ public class Top implements ICommand { } public String getUsage() { - return "<page>"; + return "<*page>"; } public String getDescription() { return "Gets the top players in the server."; } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return Collections.singletonList(parameter); + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java b/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java index e12d2d4..fb61fb2 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/Wins.java @@ -1,29 +1,14 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.command; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; import net.tylermurphy.hideAndSeek.database.util.PlayerInfo; import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import java.util.Collections; +import java.util.List; import java.util.UUID; import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; @@ -70,10 +55,14 @@ public class Wins implements ICommand { } public String getUsage() { - return "<player>"; + return "<*player>"; } public String getDescription() { return "Get the win information for yourself or another player."; } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return Collections.singletonList(parameter); + } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/LocationUtils.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/LocationUtils.java new file mode 100644 index 0000000..5e4afb5 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/location/LocationUtils.java @@ -0,0 +1,53 @@ +package net.tylermurphy.hideAndSeek.command.location; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +/** + * @author bobby29831 + */ +public class LocationUtils { + + public static void setLocation(@NotNull Player player, @NotNull Locations place, String mapName, @NotNull Consumer<Map> consumer) { + + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + player.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + + if (player.getLocation().getBlockX() == 0 || player.getLocation().getBlockZ() == 0 || player.getLocation().getBlockY() == 0){ + player.sendMessage(errorPrefix + message("NOT_AT_ZERO")); + return; + } + + Map map = null; + if(mapName != null) { + map = Maps.getMap(mapName); + if (map == null) { + player.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + } + + try { + consumer.accept(map); + } catch (Exception e) { + player.sendMessage(errorPrefix + e.getMessage()); + return; + } + + if(map != null) + Maps.setMap(mapName, map); + player.sendMessage(messagePrefix + message(place.message())); + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/Locations.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/Locations.java new file mode 100644 index 0000000..c1316f8 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/location/Locations.java @@ -0,0 +1,17 @@ +package net.tylermurphy.hideAndSeek.command.location; + +/** + * @author bobby29831 + */ +public enum Locations { + + GAME, + LOBBY, + EXIT, + SEEKER; + + public String message() { + return this + "_SPAWN"; + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetExitLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetExitLocation.java deleted file mode 100644 index 93c0d8c..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetExitLocation.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command.location; - -import net.tylermurphy.hideAndSeek.command.ICommand; -import net.tylermurphy.hideAndSeek.command.location.util.LocationUtils; -import net.tylermurphy.hideAndSeek.command.location.util.Locations; -import org.bukkit.entity.Player; -import static net.tylermurphy.hideAndSeek.configuration.Config.*; - -public class SetExitLocation implements ICommand { - - public void execute(Player sender, String[] args) { - LocationUtils.setLocation(sender, Locations.EXIT, vector -> { - exitWorld = sender.getLocation().getWorld().getName(); - exitPosition = vector; - }); - } - - public String getLabel() { - return "setexit"; - } - - public String getUsage() { - return ""; - } - - public String getDescription() { - return "Sets hide and seeks exit location to current position and world"; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetLobbyLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetLobbyLocation.java deleted file mode 100644 index eb228f9..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetLobbyLocation.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command.location; - -import net.tylermurphy.hideAndSeek.command.ICommand; -import net.tylermurphy.hideAndSeek.command.location.util.LocationUtils; -import net.tylermurphy.hideAndSeek.command.location.util.Locations; -import org.bukkit.entity.Player; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; - -public class SetLobbyLocation implements ICommand { - - public void execute(Player sender, String[] args) { - LocationUtils.setLocation(sender, Locations.LOBBY, vector -> { - lobbyWorld = sender.getLocation().getWorld().getName(); - lobbyPosition = vector; - }); - } - - public String getLabel() { - return "setlobby"; - } - - public String getUsage() { - return ""; - } - - public String getDescription() { - return "Sets hide and seeks lobby location to current position"; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSeekerLobbyLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSeekerLobbyLocation.java deleted file mode 100644 index c6c3ccb..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSeekerLobbyLocation.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.tylermurphy.hideAndSeek.command.location; - -import net.tylermurphy.hideAndSeek.command.ICommand; -import net.tylermurphy.hideAndSeek.command.location.util.LocationUtils; -import net.tylermurphy.hideAndSeek.command.location.util.Locations; -import org.bukkit.entity.Player; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; - -public class SetSeekerLobbyLocation implements ICommand { - - public void execute(Player sender, String[] args) { - LocationUtils.setLocation(sender, Locations.SEEKER, vector -> { - seekerLobbyWorld = sender.getLocation().getWorld().getName(); - seekerLobbyPosition = vector; - }); - } - - public String getLabel() { - return "setseekerlobby"; - } - - public String getUsage() { - return ""; - } - - public String getDescription() { - return "Sets hide and seeks seeker lobby location to current position"; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java deleted file mode 100644 index 5ecfb8d..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/SetSpawnLocation.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command.location; - -import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.command.ICommand; -import net.tylermurphy.hideAndSeek.command.location.util.LocationUtils; -import net.tylermurphy.hideAndSeek.command.location.util.Locations; -import org.bukkit.entity.Player; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Localization.message; - -public class SetSpawnLocation implements ICommand { - - public void execute(Player sender, String[] args) { - LocationUtils.setLocation(sender, Locations.GAME, vector -> { - if (worldBorderEnabled && vector.distance(worldBorderPosition) > 100) { - sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION")); - throw new RuntimeException("World border not enabled or not in valid position!"); - } - - if (!sender.getLocation().getWorld().getName().equals(spawnWorld)) { - Main.getInstance().getGame().getWorldLoader().unloadMap(); - Main.getInstance().getGame().getWorldLoader().setNewMap(sender.getLocation().getWorld().getName()); - } - - spawnWorld = sender.getLocation().getWorld().getName(); - spawnPosition = vector; - }); - } - - public String getLabel() { - return "setspawn"; - } - - public String getUsage() { - return ""; - } - - public String getDescription() { - return "Sets hide and seeks spawn location to current position"; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/LocationUtils.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/LocationUtils.java deleted file mode 100644 index 50d1776..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/LocationUtils.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.tylermurphy.hideAndSeek.command.location.util; - -import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.game.util.Status; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Consumer; - -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Localization.message; - -/** - * @author bobby29831 - */ -public class LocationUtils { - - /** - * Provides a vector for a player - * @param player the player to create the vector for - * @return the vector - */ - private static @Nullable Vector vector(Player player) { - if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { - player.sendMessage(errorPrefix + message("GAME_INPROGRESS")); - return null; - } - - if (player.getLocation().getBlockX() == 0 || player.getLocation().getBlockZ() == 0 || player.getLocation().getBlockY() == 0){ - player.sendMessage(errorPrefix + message("NOT_AT_ZERO")); - return null; - } - - Location loc = player.getLocation(); - return new Vector(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - } - - public static void setLocation(Player player, Locations place, @Nullable Consumer<Vector> consumer) { - Vector vec = vector(player); - - World world = player.getLocation().getWorld(); - if(world == null) { - throw new RuntimeException("Unable to get world: " + spawnWorld); - } - - consumer.accept(vec); - - player.sendMessage(messagePrefix + message(place.message())); - addToConfig(place.path("x"), vec.getX()); - addToConfig(place.path("y"), vec.getY()); - addToConfig(place.path("z"), vec.getZ()); - addToConfig(place.path("world"), player.getLocation().getWorld().getName()); - saveConfig(); - } - -}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/Locations.java b/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/Locations.java deleted file mode 100644 index 35f74ea..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/location/util/Locations.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.tylermurphy.hideAndSeek.command.location.util; - -/** - * @author bobby29831 - */ -public enum Locations { - - GAME("spawns.game"), - LOBBY("spawns.lobby"), - EXIT("spawns.exit"), - SEEKER("spawns.seeker"); - - private final String path; - Locations(String path) { - this.path = path; - } - - public String message() { - return this + "_SPAWN"; - } - - public String path(String additive) { - return path + "." + additive; - } - -}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/Add.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Add.java new file mode 100644 index 0000000..72f0740 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Add.java @@ -0,0 +1,55 @@ +package net.tylermurphy.hideAndSeek.command.map; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Add implements ICommand { + + public void execute(Player sender, String[] args) { + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + Map map = Maps.getMap(args[0]); + if(map != null) { + sender.sendMessage(errorPrefix + message("MAP_ALREADY_EXISTS")); + } else if(!args[0].matches("[a-zA-Z0-9]*") || args[0].length() < 1) { + sender.sendMessage(errorPrefix + message("INVALID_MAP_NAME")); + } else { + Maps.setMap(args[0], new Map(args[0])); + sender.sendMessage(messagePrefix + message("MAP_CREATED").addAmount(args[0])); + } + } + + public String getLabel() { + return "add"; + } + + public String getUsage() { + return "<name>"; + } + + public String getDescription() { + return "Add a map to the plugin!"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("name")) { + return Collections.singletonList("name"); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java new file mode 100644 index 0000000..209d0d6 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Debug.java @@ -0,0 +1,123 @@ +package net.tylermurphy.hideAndSeek.command.map; + +import com.cryptomorin.xseries.XMaterial; +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.PlayerLoader; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Debug implements ICommand { + + private static final Map<Player, Map<Integer, Consumer<Player>>> debugMenuFunctions = new HashMap<>(); + + public void execute(Player sender, String[] args) { + net.tylermurphy.hideAndSeek.configuration.Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + Inventory debugMenu = createMenu(map, sender); + sender.openInventory(debugMenu); + } + + private Inventory createMenu(net.tylermurphy.hideAndSeek.configuration.Map map, Player sender){ + Map<Integer, Consumer<Player>> functions = new HashMap<>(); + Inventory debugMenu = Main.getInstance().getServer().createInventory(null, 9, "Debug Menu"); + debugMenu.setItem(0, createOption(functions, 0, XMaterial.LEATHER_CHESTPLATE.parseMaterial(), "&6Become a &lHider", 1, player -> { + if(mapSaveEnabled) { + if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap(); + } + Main.getInstance().getBoard().addHider(player); + PlayerLoader.loadHider(player, map); + if(Main.getInstance().getGame().getStatus() != Status.STARTING) + PlayerLoader.resetPlayer(player, Main.getInstance().getBoard()); + })); + debugMenu.setItem(1, createOption(functions, 1, XMaterial.GOLDEN_CHESTPLATE.parseMaterial(), "&cBecome a &lSeeker", 1, player -> { + if(mapSaveEnabled) { + if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap(); + } + Main.getInstance().getBoard().addSeeker(player); + PlayerLoader.loadSeeker(player, map); + if(Main.getInstance().getGame().getStatus() != Status.STARTING) + PlayerLoader.resetPlayer(player, Main.getInstance().getBoard()); + })); + debugMenu.setItem(2, createOption(functions, 2, XMaterial.IRON_CHESTPLATE.parseMaterial(), "&8Become a &lSpectator", 1, player -> { + if(mapSaveEnabled) { + if(map.getGameSpawn().getWorld() == null) map.getWorldLoader().loadMap(); + } + Main.getInstance().getBoard().addSpectator(player); + PlayerLoader.loadSpectator(player, map); + })); + debugMenu.setItem(3, createOption(functions, 3, XMaterial.BARRIER.parseMaterial(), "&cUnload from Game", 1, player -> { + Main.getInstance().getBoard().remove(player); + PlayerLoader.unloadPlayer(player); + exitPosition.teleport(player); + })); + debugMenu.setItem(4, createOption(functions, 4, XMaterial.BARRIER.parseMaterial(), "&cDie In Game", 2, player -> { + if((Main.getInstance().getBoard().isSeeker(player) || Main.getInstance().getBoard().isHider(player)) && Main.getInstance().getGame().getStatus() == Status.PLAYING){ + player.setHealth(0.1); + } + })); + if(map.isBlockHuntEnabled()) { + debugMenu.setItem(7, createOption(functions, 7, XMaterial.GLASS.parseMaterial(), "&dEnable Disguise", 1, player -> { + PlayerLoader.openBlockHuntPicker(player, map); + })); + debugMenu.setItem(8, createOption(functions, 8, XMaterial.PLAYER_HEAD.parseMaterial(), "&dDisable Disguise", 1, player -> Main.getInstance().getDisguiser().reveal(player))); + } + debugMenuFunctions.put(sender, functions); + return debugMenu; + } + + private ItemStack createOption(Map<Integer, Consumer<Player>> functions, int slow, Material material, String name, int amount, Consumer<Player> callback){ + ItemStack temp = new ItemStack(material, amount); + ItemMeta meta = temp.getItemMeta(); + meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name)); + temp.setItemMeta(meta); + functions.put(slow, callback); + return temp; + } + + public static void handleOption(Player player, int slotId){ + Main.getInstance().getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> { + Consumer<Player> callback = debugMenuFunctions.get(player).get(slotId); + if(callback != null) callback.accept(player); + }, 0); + } + + public String getLabel() { + return "debug"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "Run debug commands"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/GoTo.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/GoTo.java new file mode 100644 index 0000000..7d27642 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/GoTo.java @@ -0,0 +1,63 @@ +package net.tylermurphy.hideAndSeek.command.map; + +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class GoTo implements ICommand { + + public void execute(Player sender, String[] args) { + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + if (map.isNotSetup()) { + sender.sendMessage(errorPrefix + message("MAP_NOT_SETUP").addAmount(map.getName())); + return; + } + switch (args[1].toLowerCase()) { + case "spawn": + map.getSpawn().teleport(sender); break; + case "lobby": + map.getLobby().teleport(sender); break; + case "seekerlobby": + map.getSeekerLobby().teleport(sender); break; + case "exit": + exitPosition.teleport(sender); break; + default: + sender.sendMessage(errorPrefix + message("COMMAND_INVALID_ARG").addAmount(args[1].toLowerCase())); + } + } + + public String getLabel() { + return "goto"; + } + + public String getUsage() { + return "<map> <spawn>"; + } + + public String getDescription() { + return "Teleport to a map spawn zone"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } else if(parameter.equals("spawn")) { + return Arrays.asList("spawn","lobby","seekerlobby","exit"); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/List.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/List.java new file mode 100644 index 0000000..ac2badf --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/List.java @@ -0,0 +1,47 @@ +package net.tylermurphy.hideAndSeek.command.map; + +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class List implements ICommand { + + public void execute(Player sender, String[] args) { + Collection<Map> maps = Maps.getAllMaps(); + if(maps.size() < 1) { + sender.sendMessage(errorPrefix + message("NO_MAPS")); + return; + } + StringBuilder response = new StringBuilder(messagePrefix + message("LIST_MAPS")); + for(Map map : maps) { + response.append("\n ").append(map.getName()).append(": ").append(map.isNotSetup() ? ChatColor.RED + "NOT SETUP" : ChatColor.GREEN + "SETUP").append(ChatColor.WHITE); + } + sender.sendMessage(response.toString()); + } + + public String getLabel() { + return "list"; + } + + public String getUsage() { + return ""; + } + + public String getDescription() { + return "List all maps in the plugin"; + } + + public java.util.List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return null; + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/Remove.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Remove.java new file mode 100644 index 0000000..d681848 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Remove.java @@ -0,0 +1,54 @@ +package net.tylermurphy.hideAndSeek.command.map; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Remove implements ICommand { + + public void execute(Player sender, String[] args) { + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + } else if(!Maps.removeMap(args[0])){ + sender.sendMessage(errorPrefix + message("MAP_FAIL_DELETE").addAmount(args[0])); + } else { + sender.sendMessage(messagePrefix + message("MAP_DELETED").addAmount(args[0])); + } + } + + public String getLabel() { + return "remove"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "Remove a map from the plugin!"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Save.java index 1e66395..03e23a8 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Save.java @@ -1,35 +1,22 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.command; +package net.tylermurphy.hideAndSeek.command.map; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; import net.tylermurphy.hideAndSeek.game.util.Status; -import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.Collectors; import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; -public class SaveMap implements ICommand { +public class Save implements ICommand { public static boolean runningBackup = false; @@ -42,21 +29,31 @@ public class SaveMap implements ICommand { sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); return; } - if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) { + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + if (map.getSpawn().isNotSetup()) { sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN")); return; } + if (map.isBoundsNotSetup()) { + sender.sendMessage(errorPrefix + message("ERROR_MAP_BOUNDS")); + return; + } sender.sendMessage(messagePrefix + message("MAPSAVE_START")); sender.sendMessage(warningPrefix + message("MAPSAVE_WARNING")); - World world = Bukkit.getServer().getWorld(spawnWorld); + World world = map.getSpawn().load(); if (world == null) { - throw new RuntimeException("Unable to get world: " + spawnWorld); + sender.sendMessage(warningPrefix + message("MAPSAVE_FAIL_WORLD")); + return; } world.save(); BukkitRunnable runnable = new BukkitRunnable() { public void run() { sender.sendMessage( - Main.getInstance().getGame().getWorldLoader().save() + map.getWorldLoader().save() ); runningBackup = false; } @@ -66,15 +63,22 @@ public class SaveMap implements ICommand { } public String getLabel() { - return "saveMap"; + return "save"; } public String getUsage() { - return ""; + return "<map>"; } public String getDescription() { - return "Saves current map for the game. May lag server."; + return "Saves the map to its own separate playable map"; } - + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/Status.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Status.java new file mode 100644 index 0000000..90615e5 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/Status.java @@ -0,0 +1,79 @@ +package net.tylermurphy.hideAndSeek.command.map; + +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Status implements ICommand { + + public void execute(Player sender, String[] args) { + + String msg = message("SETUP").toString(); + int count = 0; + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + if (map.getSpawn().getBlockX() == 0 && map.getSpawn().getBlockY() == 0 && map.getSpawn().getBlockZ() == 0 || !map.getSpawn().exists()) { + msg = msg + "\n" + message("SETUP_GAME"); + count++; + } + if (map.getLobby().getBlockX() == 0 && map.getLobby().getBlockY() == 0 && map.getLobby().getBlockZ() == 0 || !map.getLobby().exists()) { + msg = msg + "\n" + message("SETUP_LOBBY"); + count++; + } + if (map.getSeekerLobby().getBlockX() == 0 && map.getSeekerLobby().getBlockY() == 0 && map.getSeekerLobby().getBlockZ() == 0 || !map.getSeekerLobby().exists()) { + msg = msg + "\n" + message("SETUP_SEEKER_LOBBY"); + count++; + } + if (exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0 || !exitPosition.exists()) { + msg = msg + "\n" + message("SETUP_EXIT"); + count++; + } + if (map.isBoundsNotSetup()) { + msg = msg + "\n" + message("SETUP_BOUNDS"); + count++; + } + if (mapSaveEnabled && !map.getGameSpawn().exists()) { + msg = msg + "\n" + message("SETUP_SAVEMAP"); + count++; + } + if (map.isBlockHuntEnabled() && map.getBlockHunt().isEmpty()) { + msg = msg + "\n" + message("SETUP_BLOCKHUNT"); + } + if (count < 1) { + sender.sendMessage(messagePrefix + message("SETUP_COMPLETE")); + } else { + sender.sendMessage(msg); + } + } + + public String getLabel() { + return "status"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "Shows what needs to be setup on a map"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/Enabled.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/Enabled.java new file mode 100644 index 0000000..2567427 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/Enabled.java @@ -0,0 +1,65 @@ +package net.tylermurphy.hideAndSeek.command.map.blockhunt; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Enabled implements ICommand { + + public void execute(Player sender, String[] args) { + if (!Main.getInstance().supports(9)) { + sender.sendMessage(errorPrefix + message("BLOCKHUNT_UNSUPPORTED")); + return; + } + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + boolean bool = Boolean.parseBoolean(args[1]); + map.setBlockhunt(bool, map.getBlockHunt()); + Maps.setMap(map.getName(), map); + sender.sendMessage(messagePrefix + message("BLOCKHUNT_SET_TO") + .addAmount(bool ? ChatColor.GREEN + "true" : ChatColor.RED + "false") + ChatColor.WHITE); + } + + public String getLabel() { + return "enabled"; + } + + public String getUsage() { + return "<map> <bool>"; + } + + public String getDescription() { + return "Sets blockhunt enabled or disabled in a current map"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + if(parameter.equals("bool")) { + return Arrays.asList("true", "false"); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Add.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Add.java new file mode 100644 index 0000000..fea08ef --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Add.java @@ -0,0 +1,77 @@ +package net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Add implements ICommand { + + public void execute(Player sender, String[] args) { + if (!Main.getInstance().supports(9)) { + sender.sendMessage(errorPrefix + message("BLOCKHUNT_UNSUPPORTED")); + return; + } + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + Material block; + try { block = Material.valueOf(args[1]); } + catch (IllegalArgumentException e) { + sender.sendMessage(errorPrefix + message("COMMAND_INVALID_ARG").addAmount(args[1])); + return; + } + List<Material> blocks = map.getBlockHunt(); + if(blocks.contains(block)) { + sender.sendMessage(errorPrefix + message("BLOCKHUNT_BLOCK_EXISTS").addAmount(args[1])); + } + blocks.add(block); + map.setBlockhunt(map.isBlockHuntEnabled(), blocks); + Maps.setMap(map.getName(), map); + sender.sendMessage(messagePrefix + message("BLOCKHUNT_BLOCK_ADDED").addAmount(args[1])); + } + + public String getLabel() { + return "add"; + } + + public String getUsage() { + return "<map> <block>"; + } + + public String getDescription() { + return "Add a blockhunt block to a map!"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } else if(parameter.equals("block")) { + return Arrays.stream(Material.values()) + .filter(Material::isBlock) + .map(Material::toString) + .filter(s -> s.toUpperCase().startsWith(typed.toUpperCase())) + .collect(Collectors.toList()); + } + return null; + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/List.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/List.java new file mode 100644 index 0000000..de783ce --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/List.java @@ -0,0 +1,60 @@ +package net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class List implements ICommand { + + public void execute(Player sender, String[] args) { + if (!Main.getInstance().supports(9)) { + sender.sendMessage(errorPrefix + message("BLOCKHUNT_UNSUPPORTED")); + return; + } + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + java.util.List<Material> blocks = map.getBlockHunt(); + if(blocks.isEmpty()) { + sender.sendMessage(errorPrefix + message("NO_BLOCKS")); + return; + } + StringBuilder response = new StringBuilder(messagePrefix + message("BLOCKHUNT_LIST_BLOCKS")); + for(int i = 0; i < blocks.size(); i++) { + response.append(String.format("\n%s. %s", i, blocks.get(i).toString())); + } + sender.sendMessage(response.toString()); + } + + public String getLabel() { + return "list"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "List all blockhunt blocks in a map"; + } + + public java.util.List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Remove.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Remove.java new file mode 100644 index 0000000..1c16fdc --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/blockhunt/blocks/Remove.java @@ -0,0 +1,77 @@ +package net.tylermurphy.hideAndSeek.command.map.blockhunt.blocks; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Remove implements ICommand { + + public void execute(Player sender, String[] args) { + if (!Main.getInstance().supports(9)) { + sender.sendMessage(errorPrefix + message("BLOCKHUNT_UNSUPPORTED")); + return; + } + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + Material block; + try { block = Material.valueOf(args[1]); } + catch (IllegalArgumentException e) { + sender.sendMessage(errorPrefix + message("COMMAND_INVALID_ARG").addAmount(args[1])); + return; + } + java.util.List<Material> blocks = map.getBlockHunt(); + if(!blocks.contains(block)) { + sender.sendMessage(errorPrefix + message("BLOCKHUNT_BLOCK_DOESNT_EXIT").addAmount(args[1])); + } + blocks.remove(block); + map.setBlockhunt(map.isBlockHuntEnabled(), blocks); + Maps.setMap(map.getName(), map); + sender.sendMessage(messagePrefix + message("BLOCKHUNT_BLOCK_REMOVED").addAmount(args[1])); + } + + public String getLabel() { + return "remove"; + } + + public String getUsage() { + return "<map> <block>"; + } + + public String getDescription() { + return "Remove a blockhunt block from a map!"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } else if(parameter.equals("block")) { + return Arrays.stream(Material.values()) + .filter(Material::isBlock) + .map(Material::toString) + .filter(s -> s.toUpperCase().startsWith(typed.toUpperCase())) + .collect(Collectors.toList()); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java new file mode 100644 index 0000000..64bf5d4 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Border.java @@ -0,0 +1,94 @@ +package net.tylermurphy.hideAndSeek.command.map.set; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Border implements ICommand { + + public void execute(Player sender, String[] args) { + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + if (map.getSpawn().isNotSetup()) { + sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN")); + return; + } + if (args.length < 4) { + map.setWorldBorderData(0, 0, 0, 0, 0); + addToConfig("worldBorder.enabled",false); + saveConfig(); + sender.sendMessage(messagePrefix + message("WORLDBORDER_DISABLE")); + Main.getInstance().getGame().getCurrentMap().getWorldBorder().resetWorldBorder(); + return; + } + int num,delay,change; + try { num = Integer.parseInt(args[1]); } catch (Exception e) { + sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[0])); + return; + } + try { delay = Integer.parseInt(args[2]); } catch (Exception e) { + sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[1])); + return; + } + try { change = Integer.parseInt(args[3]); } catch (Exception e) { + sender.sendMessage(errorPrefix + message("WORLDBORDER_INVALID_INPUT").addAmount(args[2])); + return; + } + if (num < 100) { + sender.sendMessage(errorPrefix + message("WORLDBORDER_MIN_SIZE")); + return; + } + if (change < 1) { + sender.sendMessage(errorPrefix + message("WORLDBORDER_CHANGE_SIZE")); + return; + } + map.setWorldBorderData( + sender.getLocation().getBlockX(), + sender.getLocation().getBlockZ(), + num, + delay, + change + ); + Maps.setMap(map.getName(), map); + sender.sendMessage(messagePrefix + message("WORLDBORDER_ENABLE").addAmount(num).addAmount(delay).addAmount(change)); + map.getWorldBorder().resetWorldBorder(); + } + + public String getLabel() { + return "border"; + } + + public String getUsage() { + return "<map> <*size> <*delay> <*move>"; + } + + public String getDescription() { + return "Sets a maps world border information"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return Collections.singletonList(parameter); + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Bounds.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Bounds.java new file mode 100644 index 0000000..3d1f036 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Bounds.java @@ -0,0 +1,113 @@ +package net.tylermurphy.hideAndSeek.command.map.set; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.game.util.Status; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Bounds implements ICommand { + + public void execute(Player sender, String[] args) { + if (Main.getInstance().getGame().getStatus() != Status.STANDBY) { + sender.sendMessage(errorPrefix + message("GAME_INPROGRESS")); + return; + } + Map map = Maps.getMap(args[0]); + if(map == null) { + sender.sendMessage(errorPrefix + message("INVALID_MAP")); + return; + } + if (map.getSpawn().isNotSetup()) { + sender.sendMessage(errorPrefix + message("ERROR_GAME_SPAWN")); + return; + } + if (map.getSeekerLobby().isNotSetup()) { + sender.sendMessage(errorPrefix + message("ERROR_GAME_SEEKER_SPAWN")); + return; + } + if (!sender.getWorld().getName().equals(map.getSpawnName())) { + sender.sendMessage(errorPrefix + message("BOUNDS_WRONG_WORLD")); + return; + } + if (sender.getLocation().getBlockX() == 0 || sender.getLocation().getBlockZ() == 0) { + sender.sendMessage(errorPrefix + message("NOT_AT_ZERO")); + return; + } + boolean first = true; + int bxs = map.getBoundsMin().getBlockX(); + int bzs = map.getBoundsMin().getBlockZ(); + int bxl = map.getBoundsMax().getBlockX(); + int bzl = map.getBoundsMax().getBlockZ(); + if (bxs != 0 && bzs != 0 && bxl != 0 && bzl != 0) { + bxs = bzs = bxl = bzl = 0; + } + if (bxl == 0) { + bxl = sender.getLocation().getBlockX(); + } else if (map.getBoundsMax().getX() < sender.getLocation().getBlockX()) { + first = false; + bxs = bxl; + bxl = sender.getLocation().getBlockX(); + } else { + first = false; + bxs = sender.getLocation().getBlockX(); + } + if (bzl == 0) { + bzl = sender.getLocation().getBlockZ(); + } else if (map.getBoundsMax().getZ() < sender.getLocation().getBlockZ()) { + first = false; + bzs = bzl; + bzl = sender.getLocation().getBlockZ(); + } else { + first = false; + bzs = sender.getLocation().getBlockZ(); + } + map.setBoundMin(bxs, bzs); + map.setBoundMax(bxl, bzl); + if(!map.isBoundsNotSetup()) { + if(!map.getSpawn().isNotSetup()) { + if(map.getSpawn().isNotInBounds(bxs, bxl, bzs, bzl)) { + map.setSpawn(Location.getDefault()); + sender.sendMessage(warningPrefix + message("WARN_SPAWN_RESET")); + } + } + if(!map.getSeekerLobby().isNotSetup()) { + if(map.getSeekerLobby().isNotInBounds(bxs, bxl, bzs, bzl)) { + map.setSeekerLobby(Location.getDefault()); + sender.sendMessage(warningPrefix + message("WARN_SEEKER_SPAWN_RESET")); + } + } + } + Maps.setMap(map.getName(), map); + sender.sendMessage(messagePrefix + message("BOUNDS").addAmount(first ? 1 : 2)); + } + + public String getLabel() { + return "bounds"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "Sets the map bounds for the game."; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Lobby.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Lobby.java new file mode 100644 index 0000000..6690ae9 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Lobby.java @@ -0,0 +1,41 @@ +package net.tylermurphy.hideAndSeek.command.map.set; + +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.command.location.LocationUtils; +import net.tylermurphy.hideAndSeek.command.location.Locations; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.Collectors; + +public class Lobby implements ICommand { + + public void execute(Player sender, String[] args) { + LocationUtils.setLocation(sender, Locations.LOBBY, args[0], map -> { + map.setLobby(Location.from(sender)); + }); + } + + public String getLabel() { + return "lobby"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "Sets the maps lobby location"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/SeekerLobby.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/SeekerLobby.java new file mode 100644 index 0000000..b6c5cf0 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/SeekerLobby.java @@ -0,0 +1,58 @@ +package net.tylermurphy.hideAndSeek.command.map.set; + +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.command.location.LocationUtils; +import net.tylermurphy.hideAndSeek.command.location.Locations; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; + +import java.util.List;; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.warningPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class SeekerLobby implements ICommand { + + public void execute(Player sender, String[] args) { + LocationUtils.setLocation(sender, Locations.SEEKER, args[0], map -> { + if(map.getSpawn().isNotSetup()) { + throw new RuntimeException(message("GAME_SPAWN_NEEDED").toString()); + } + if(!map.getSpawnName().equals(sender.getLocation().getWorld().getName())) { + throw new RuntimeException(message("SEEKER_LOBBY_INVALID").toString()); + } + map.setSeekerLobby(Location.from(sender)); + if(!map.isBoundsNotSetup()) { + Vector boundsMin = map.getBoundsMin(); + Vector boundsMax = map.getBoundsMax(); + if(map.getSeekerLobby().isNotInBounds(boundsMin.getBlockX(), boundsMax.getBlockX(), boundsMin.getBlockZ(), boundsMax.getBlockZ())) { + sender.sendMessage(warningPrefix + message("WARN_MAP_BOUNDS")); + } + } + }); + } + + public String getLabel() { + return "seekerlobby"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "Sets the maps seeker lobby location"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Spawn.java b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Spawn.java new file mode 100644 index 0000000..0baf55e --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/map/set/Spawn.java @@ -0,0 +1,69 @@ +package net.tylermurphy.hideAndSeek.command.map.set; + +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.command.location.LocationUtils; +import net.tylermurphy.hideAndSeek.command.location.Locations; +import net.tylermurphy.hideAndSeek.configuration.Maps; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Spawn implements ICommand { + + public void execute(Player sender, String[] args) { + LocationUtils.setLocation(sender, Locations.GAME, args[0], map -> { + + if (map.isWorldBorderEnabled() && + new Vector(sender.getLocation().getX(), 0, sender.getLocation().getZ()).distance(map.getWorldBorderPos()) > 100) { + sender.sendMessage(errorPrefix + message("WORLDBORDER_POSITION")); + throw new RuntimeException("World border not enabled or not in valid position!"); + } + + map.setSpawn(Location.from(sender)); + + if(!map.isBoundsNotSetup()) { + Vector boundsMin = map.getBoundsMin(); + Vector boundsMax = map.getBoundsMax(); + if(map.getSpawn().isNotInBounds(boundsMin.getBlockX(), boundsMax.getBlockX(), boundsMin.getBlockZ(), boundsMax.getBlockZ())) { + sender.sendMessage(warningPrefix + message("WARN_MAP_BOUNDS")); + } + } + + if(map.getSeekerLobby().getWorld() != null && !map.getSeekerLobby().getWorld().equals(sender.getLocation().getWorld().getName())) { + sender.sendMessage(warningPrefix + message("SEEKER_LOBBY_SPAWN_RESET")); + map.setSeekerLobby(Location.getDefault()); + } + + if (!sender.getLocation().getWorld().getName().equals(map.getSpawnName()) && mapSaveEnabled) { + map.getWorldLoader().unloadMap(); + } + }); + } + + public String getLabel() { + return "spawn"; + } + + public String getUsage() { + return "<map>"; + } + + public String getDescription() { + return "Sets the maps game spawn location"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("map")) { + return Maps.getAllMaps().stream().map(net.tylermurphy.hideAndSeek.configuration.Map::getName).collect(Collectors.toList()); + } + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java b/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java new file mode 100644 index 0000000..0cb307b --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/util/CommandGroup.java @@ -0,0 +1,188 @@ +package net.tylermurphy.hideAndSeek.command.util; + +import net.tylermurphy.hideAndSeek.command.map.Save; +import net.tylermurphy.hideAndSeek.util.Pair; +import net.tylermurphy.hideAndSeek.util.Tuple; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.permissionsRequired; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class CommandGroup { + + private final Map<String, Object> commandRegister; + private final String label; + + public CommandGroup(String label, Object... data) { + this.label = label; + this.commandRegister = new LinkedHashMap<>(); + for(Object o : data) { + registerCommand(o); + } + } + + public String getLabel() { + return label; + } + + private void registerCommand(Object object) { + if (object instanceof ICommand) { + ICommand command = (ICommand) object; + if (!commandRegister.containsKey(command.getLabel())) { + commandRegister.put(command.getLabel().toLowerCase(), command); + } + } else if(object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + if (!commandRegister.containsKey(group.getLabel())) { + commandRegister.put(group.getLabel().toLowerCase(), group); + } + } + } + + public void handleCommand(Player player, String[] args) { + + Tuple<ICommand, String, String[]> data = getCommand(args, this.getLabel()); + + if (data == null) { + player.sendMessage( + String.format("%s%sKenshin's Hide and Seek %s(%s1.7.0%s)\n", ChatColor.AQUA, ChatColor.BOLD, ChatColor.GRAY, ChatColor.WHITE, ChatColor.GRAY) + + String.format("%sAuthor: %s[KenshinEto]\n", ChatColor.GRAY, ChatColor.WHITE) + + String.format("%sHelp Command: %s/hs %shelp", ChatColor.GRAY, ChatColor.AQUA, ChatColor.WHITE) + ); + return; + } + + ICommand command = data.getLeft(); + String permission = data.getCenter(); + String[] parameters = data.getRight(); + + if (Save.runningBackup) { + player.sendMessage(errorPrefix + message("MAPSAVE_INPROGRESS")); + return; + } + + if (permissionsRequired && !player.hasPermission(permission)) { + player.sendMessage(errorPrefix + message("COMMAND_NOT_ALLOWED")); + return; + } + + int parameterCount = (int) Arrays.stream(command.getUsage().split(" ")).filter(p -> p.startsWith("<") && !p.startsWith("<*")).count(); + if(parameters.length < parameterCount) { + player.sendMessage(errorPrefix + message("ARGUMENT_COUNT")); + return; + } + + try { + command.execute(player, parameters); + } catch (Exception e) { + player.sendMessage(errorPrefix + "An error has occurred."); + e.printStackTrace(); + } + } + + @Nullable + private Tuple<ICommand, String, String[]> getCommand(String[] args, String permission) { + if(args.length < 1) { + return null; + } + String invoke = args[0]; + if(commandRegister.containsKey(invoke)) { + Object o = commandRegister.get(invoke); + if (o instanceof CommandGroup) { + CommandGroup group = (CommandGroup) o; + return group.getCommand( + Arrays.copyOfRange(args, 1, args.length), + permission + "." + group.getLabel() + ); + } else if(o instanceof ICommand) { + ICommand command = (ICommand) o; + return new Tuple<>(command, permission + "." + command.getLabel(), Arrays.copyOfRange(args, 1, args.length)); + } + } + return null; + } + + public List<String> handleTabComplete(Player player, String[] args) { + return handleTabComplete(player, this.getLabel(), args); + } + + private List<String> handleTabComplete(Player player, String permission, String[] args) { + String invoke = args[0].toLowerCase(); + if (args.length == 1) { + return new ArrayList<>(commandRegister.keySet()) + .stream() + .filter(handle -> handle.toLowerCase().startsWith(invoke)) + .filter(handle -> { + Object object = commandRegister.get(handle); + if (object instanceof ICommand) { + ICommand command = (ICommand) object; + return !permissionsRequired || player.hasPermission(permission + "." + command.getLabel()); + } else if (object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + return !permissionsRequired || group.hasPermission(player, permission + "." + group.getLabel()); + } + return false; + }) + .collect(Collectors.toList()); + } else { + if (commandRegister.containsKey(invoke)) { + Object object = commandRegister.get(invoke); + if (object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + return group.handleTabComplete(player, permission + "." + group.getLabel(), Arrays.copyOfRange(args, 1, args.length)); + } else if (object instanceof ICommand) { + ICommand command = (ICommand) object; + String[] usage = command.getUsage().split(" "); + if (args.length - 2 < usage.length) { + String parameter = usage[args.length - 2]; + String name = parameter.replace("<", "").replace(">", ""); + List<String> list = command.autoComplete(name, args[args.length - 1]); + if (list != null) { + return list; + } + } + } + } + return new ArrayList<>(); + } + } + + private boolean hasPermission(Player player, String permission) { + for(Object object : commandRegister.values()) { + if(object instanceof ICommand) { + ICommand command = (ICommand) object; + if(player.hasPermission(permission + command.getLabel())) return true; + } else if(object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + if (group.hasPermission(player, permission + this.label + ".")) return true; + } + } + return false; + } + + public List<Pair<String, ICommand>> getCommands() { + return getCommands(this.getLabel()); + } + + private List<Pair<String, ICommand>> getCommands(String prefix) { + List<Pair<String, ICommand>> commands = new LinkedList<>(); + for(Object object : commandRegister.values()) { + if(object instanceof ICommand) { + ICommand command = (ICommand) object; + commands.add(new Pair<>(prefix+" "+command.getLabel(), command)); + } else if(object instanceof CommandGroup) { + CommandGroup group = (CommandGroup) object; + commands.addAll(group.getCommands(prefix+" "+group.getLabel())); + } + } + return commands; + } + + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/util/ICommand.java b/src/main/java/net/tylermurphy/hideAndSeek/command/util/ICommand.java new file mode 100644 index 0000000..1be678c --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/util/ICommand.java @@ -0,0 +1,20 @@ +package net.tylermurphy.hideAndSeek.command.util; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public interface ICommand { + + void execute(Player sender, String[] args); + + String getLabel(); + + String getUsage(); + + String getDescription(); + + List<String> autoComplete(@NotNull String parameter, @NotNull String typed); + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/world/Create.java b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Create.java new file mode 100644 index 0000000..e399993 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Create.java @@ -0,0 +1,82 @@ +package net.tylermurphy.hideAndSeek.command.world; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.World; +import org.bukkit.WorldType; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Create implements ICommand { + + public void execute(Player sender, String[] args) { + List<String> worlds = Main.getInstance().getWorlds(); + if(worlds.contains(args[0])) { + sender.sendMessage(errorPrefix + message("WORLD_EXISTS").addAmount(args[0])); + return; + } + WorldType type; + World.Environment environment; + switch (args[1]) { + case "normal": + type = WorldType.NORMAL; + environment = World.Environment.NORMAL; + break; + case "flat": + type = WorldType.FLAT; + environment = World.Environment.NORMAL; + break; + case "nether": + type = WorldType.NORMAL; + environment = World.Environment.NETHER; + break; + case "end": + type = WorldType.NORMAL; + environment = World.Environment.THE_END; + break; + default: + sender.sendMessage(errorPrefix + message("INVALID_WORLD_TYPE").addAmount(args[1])); + return; + } + + Location temp = new Location(args[0], 0, 0, 0); + + if (temp.load(type, environment) == null) { + sender.sendMessage(errorPrefix + message("WORLD_ADDED_FAILED")); + } else { + sender.sendMessage(messagePrefix + message("WORLD_ADDED").addAmount(args[0])); + } + + } + + public String getLabel() { + return "create"; + } + + public String getUsage() { + return "<name> <type>"; + } + + public String getDescription() { + return "Create a new world"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("name")) { + return Collections.singletonList("name"); + } + if(parameter.equals("type")) { + return Arrays.asList("normal", "flat", "nether", "end"); + } + return null; + } +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/world/Delete.java b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Delete.java new file mode 100644 index 0000000..985ccdc --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Delete.java @@ -0,0 +1,76 @@ +package net.tylermurphy.hideAndSeek.command.world; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.Confirm; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.world.WorldLoader; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.List; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Delete implements ICommand { + + public void execute(Player sender, String[] args) { + java.util.List<String> worlds = Main.getInstance().getWorlds(); + if(!worlds.contains(args[0])) { + sender.sendMessage(errorPrefix + message("WORLD_DOESNT_EXIST").addAmount(args[0])); + return; + } + + Confirm.Confirmation confirmation = new Confirm.Confirmation(args[0], world -> { + java.util.List<String> worlds_now = Main.getInstance().getWorlds(); + if(!worlds_now.contains(world)) { + sender.sendMessage(errorPrefix + message("WORLD_DOESNT_EXIST").addAmount(world)); + return; + } + World bukkit_world = Bukkit.getWorld(world); + if(bukkit_world != null && bukkit_world.getPlayers().size() > 0) { + sender.sendMessage(errorPrefix + message("WORLD_NOT_EMPTY")); + return; + } + String path = Main.getInstance().getWorldContainer().getPath() + File.separator + world; + if (!Bukkit.getServer().unloadWorld(world, false)) { + sender.sendMessage(errorPrefix + message("WORLD_REMOVED_FAILED")); + return; + } + try { + WorldLoader.deleteDirectory(new File(path)); + } catch (Exception e) { + sender.sendMessage(errorPrefix + message("WORLD_REMOVED_FAILED")); + return; + } + sender.sendMessage(messagePrefix + message("WORLD_REMOVED").addAmount(world)); + }); + + Confirm.confirmations.put(sender.getUniqueId(), confirmation); + sender.sendMessage(messagePrefix + message("CONFIRMATION")); + + } + + public String getLabel() { + return "delete"; + } + + public String getUsage() { + return "<name>"; + } + + public String getDescription() { + return "Delete a world"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("name")) { + return Main.getInstance().getWorlds(); + } + return null; + } +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/world/List.java b/src/main/java/net/tylermurphy/hideAndSeek/command/world/List.java new file mode 100644 index 0000000..bdb98e5 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/world/List.java @@ -0,0 +1,57 @@ +package net.tylermurphy.hideAndSeek.command.world; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Config.messagePrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class List implements ICommand { + + public void execute(Player sender, String[] args) { + java.util.List<String> worlds = Main.getInstance().getWorlds(); + if(worlds.isEmpty()) { + sender.sendMessage(errorPrefix + message("NO_WORLDS")); + } else { + StringBuilder response = new StringBuilder(messagePrefix + message("LIST_WORLDS")); + for (String world : worlds) { + String status = ChatColor.GRAY + "NOT LOADED"; + World bukkit_world = Bukkit.getWorld(world); + if(bukkit_world != null) { + if(bukkit_world.getEnvironment() == World.Environment.NETHER) { + status = ChatColor.RED + "NETHER"; + } else if(bukkit_world.getEnvironment() == World.Environment.THE_END) { + status = ChatColor.YELLOW + "THE END"; + } else { + status = ChatColor.GREEN + bukkit_world.getWorldType().toString(); + } + } + response.append("\n ").append(world).append(": ").append(status).append(ChatColor.WHITE); + } + sender.sendMessage(response.toString()); + } + } + + public String getLabel() { + return "list"; + } + + public String getUsage() { + return ""; + } + + public String getDescription() { + return "List all worlds in the server"; + } + + public java.util.List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + return null; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/command/world/Tp.java b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Tp.java new file mode 100644 index 0000000..b166297 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/command/world/Tp.java @@ -0,0 +1,49 @@ +package net.tylermurphy.hideAndSeek.command.world; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.command.util.ICommand; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; + +public class Tp implements ICommand { + public void execute(Player sender, String[] args) { + Location test = new Location(args[0], 0, 0,0); + if(!test.exists()) { + sender.sendMessage(errorPrefix + message("WORLD_DOESNT_EXIT")); + return; + } + World world = test.load(); + if(world == null) { + sender.sendMessage(errorPrefix + message("WORLD_LOAD_FAILED")); + return; + } + Location loc = new Location(world.getName(), world.getSpawnLocation()); + loc.teleport(sender); + } + + public String getLabel() { + return "tp"; + } + + public String getUsage() { + return "<world>"; + } + + public String getDescription() { + return "Teleport to another world"; + } + + public List<String> autoComplete(@NotNull String parameter, @NotNull String typed) { + if(parameter.equals("world")) { + return Main.getInstance().getWorlds(); + } + return null; + } +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java index a71369f..5881d19 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Config.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.configuration; import com.cryptomorin.xseries.XItemStack; @@ -24,16 +5,15 @@ import com.cryptomorin.xseries.XMaterial; import com.cryptomorin.xseries.XSound; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.game.util.CountdownDisplay; +import net.tylermurphy.hideAndSeek.util.Location; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; @@ -49,10 +29,6 @@ public class Config { abortPrefix, gameOverPrefix, warningPrefix, - spawnWorld, - seekerLobbyWorld, - exitWorld, - lobbyWorld, locale, leaveServer, placeholderError, @@ -64,18 +40,10 @@ public class Config { databasePass, databaseName; - public static Vector - spawnPosition, - lobbyPosition, - exitPosition, - seekerLobbyPosition, - worldBorderPosition; - public static boolean nameTagsVisible, permissionsRequired, announceMessagesToNonPlayers, - worldBorderEnabled, tauntEnabled, tauntCountdown, tauntLast, @@ -93,20 +61,11 @@ public class Config { mapSaveEnabled, allowNaturalCauses, saveInventory, - blockhuntEnabled, delayedRespawn; public static int minPlayers, - worldBorderSize, - worldBorderDelay, - currentWorldborderSize, - worldBorderChange, gameLength, - saveMinX, - saveMinZ, - saveMaxX, - saveMaxZ, tauntDelay, glowLength, countdown, @@ -120,7 +79,6 @@ public class Config { lobbyItemStartPosition, flightToggleItemPosition, teleportItemPosition, - solidifyTime, delayedRespawnDelay; public static float @@ -132,27 +90,6 @@ public class Config { blockedCommands, blockedInteracts; - public static List<Material> - blockhuntBlocks; - - public static String - LOBBY_TITLE, - GAME_TITLE, - COUNTDOWN_WAITING, - COUNTDOWN_COUNTING, - COUNTDOWN_ADMINSTART, - TAUNT_COUNTING, - TAUNT_ACTIVE, - TAUNT_EXPIRED, - GLOW_ACTIVE, - GLOW_INACTIVE, - BORDER_COUNTING, - BORDER_DECREASING; - - public static List<String> - LOBBY_CONTENTS, - GAME_CONTENTS; - public static ItemStack lobbyLeaveItem, lobbyStartItem, @@ -166,74 +103,36 @@ public class Config { public static CountdownDisplay countdownDisplay; + + public static Location + exitPosition; public static void loadConfig() { config = ConfigManager.create("config.yml"); config.saveConfig(); - ConfigManager leaderboard = ConfigManager.create("leaderboard.yml"); - - //Spawn - spawnPosition = new Vector( - config.getDouble("spawns.game.x"), - Math.max(Main.getInstance().supports(18) ? -64 : 0, Math.min(255, config.getDouble("spawns.game.y"))), - config.getDouble("spawns.game.z") - ); - spawnWorld = config.getString("spawns.game.world"); - - ///Lobby - lobbyPosition = new Vector( - config.getDouble("spawns.lobby.x"), - Math.max(Main.getInstance().supports(18) ? -64 : 0, Math.min(255, config.getDouble("spawns.lobby.y"))), - config.getDouble("spawns.lobby.z") - ); - lobbyWorld = config.getString("spawns.lobby.world"); - - ///Seeker Lobby - seekerLobbyPosition = new Vector( - config.getDouble("spawns.seeker.x"), - Math.max(Main.getInstance().supports(18) ? -64 : 0, Math.min(255, config.getDouble("spawns.seeker.y"))), - config.getDouble("spawns.seeker.z") - ); - seekerLobbyWorld = config.getString("spawns.seeker.world"); announceMessagesToNonPlayers = config.getBoolean("announceMessagesToNonPlayers"); - exitPosition = new Vector( - config.getDouble("spawns.exit.x"), - Math.max(Main.getInstance().supports(18) ? -64 : 0, Math.min(255, config.getDouble("spawns.exit.y"))), - config.getDouble("spawns.exit.z") - ); - exitWorld = config.getString("spawns.exit.world"); - - //World border - worldBorderPosition = new Vector( - config.getInt("worldBorder.x"), - 0, - config.getInt("worldBorder.z") - ); - worldBorderSize = Math.max(100, config.getInt("worldBorder.size")); - worldBorderDelay = Math.max(1, config.getInt("worldBorder.delay")); - worldBorderEnabled = config.getBoolean("worldBorder.enabled"); - worldBorderChange = config.getInt("worldBorder.moveAmount"); - //Prefix - char SYMBOLE = '\u00A7'; - String SYMBOLE_STRING = String.valueOf(SYMBOLE); + char SYMBOL = '\u00A7'; + String SYMBOL_STRING = String.valueOf(SYMBOL); - messagePrefix = config.getString("prefix.default").replace("&", SYMBOLE_STRING); - errorPrefix = config.getString("prefix.error").replace("&", SYMBOLE_STRING); - tauntPrefix = config.getString("prefix.taunt").replace("&", SYMBOLE_STRING); - worldBorderPrefix = config.getString("prefix.border").replace("&", SYMBOLE_STRING); - abortPrefix = config.getString("prefix.abort").replace("&", SYMBOLE_STRING); - gameOverPrefix = config.getString("prefix.gameover").replace("&", SYMBOLE_STRING); - warningPrefix = config.getString("prefix.warning").replace("&", SYMBOLE_STRING); + messagePrefix = config.getString("prefix.default").replace("&", SYMBOL_STRING); + errorPrefix = config.getString("prefix.error").replace("&", SYMBOL_STRING); + tauntPrefix = config.getString("prefix.taunt").replace("&", SYMBOL_STRING); + worldBorderPrefix = config.getString("prefix.border").replace("&", SYMBOL_STRING); + abortPrefix = config.getString("prefix.abort").replace("&", SYMBOL_STRING); + gameOverPrefix = config.getString("prefix.gameover").replace("&", SYMBOL_STRING); + warningPrefix = config.getString("prefix.warning").replace("&", SYMBOL_STRING); - //Map Bounds - saveMinX = config.getInt("bounds.min.x"); - saveMinZ = config.getInt("bounds.min.z"); - saveMaxX = config.getInt("bounds.max.x"); - saveMaxZ = config.getInt("bounds.max.z"); + // Locations + exitPosition = new Location( + config.getString("exit.world"), + config.getInt("exit.x"), + config.getInt("exit.y"), + config.getInt("exit.z") + ); mapSaveEnabled = config.getBoolean("mapSaveEnabled"); //Taunt @@ -289,8 +188,7 @@ public class Config { try { countdownDisplay = CountdownDisplay.valueOf(config.getString("hideCountdownDisplay")); } catch (IllegalArgumentException e) { - countdownDisplay = CountdownDisplay.CHAT; - Main.getInstance().getLogger().warning("hideCountdownDisplay: "+config.getString("hideCountdownDisplay")+" is not a valid configuration option!"); + throw new RuntimeException("hideCountdownDisplay: "+config.getString("hideCountdownDisplay")+", is not a valid configuration option!"); } blockedInteracts = new ArrayList<>(); List<String> tempInteracts = config.getStringList("blockedInteracts"); @@ -305,37 +203,6 @@ public class Config { } bungeeLeave = config.getString("leaveType") == null || config.getString("leaveType").equalsIgnoreCase("proxy"); leaveServer = config.getString("leaveServer"); - blockhuntEnabled = config.getBoolean("blockhunt.enabled") && Main.getInstance().supports(9); - blockhuntBlocks = new ArrayList<>(); - tempInteracts = config.getStringList("blockhunt.blocks"); - for(String id : tempInteracts) { - Optional<XMaterial> optional_mat = XMaterial.matchXMaterial(id); - if (optional_mat.isPresent()) { - Material mat = optional_mat.get().parseMaterial(); - if (mat != null) { - blockhuntBlocks.add(mat); - } - } - } - solidifyTime = Math.max(20,config.getInt("blockhunt.solidifyTime")); - - //Leaderboard - LOBBY_TITLE = leaderboard.getString("lobby.title"); - GAME_TITLE = leaderboard.getString("game.title"); - LOBBY_CONTENTS = leaderboard.getStringList("lobby.content"); - Collections.reverse(LOBBY_CONTENTS); - GAME_CONTENTS = leaderboard.getStringList("game.content"); - Collections.reverse(GAME_CONTENTS); - COUNTDOWN_WAITING = leaderboard.getString("countdown.waiting"); - COUNTDOWN_COUNTING = leaderboard.getString("countdown.counting"); - COUNTDOWN_ADMINSTART = leaderboard.getString("countdown.adminStart"); - TAUNT_COUNTING = leaderboard.getString("taunt.counting"); - TAUNT_ACTIVE = leaderboard.getString("taunt.active"); - TAUNT_EXPIRED = leaderboard.getString("taunt.expired"); - GLOW_ACTIVE = leaderboard.getString("glow.active"); - GLOW_INACTIVE = leaderboard.getString("glow.inactive"); - BORDER_COUNTING = leaderboard.getString("border.counting"); - BORDER_DECREASING = leaderboard.getString("border.decreasing"); //Lobby Items if (config.getBoolean("lobbyItems.leave.enabled")) { @@ -364,8 +231,7 @@ public class Config { databaseType = config.getString("databaseType").toUpperCase(); if(!databaseType.equals("SQLITE") && !databaseType.equals("MYSQL")){ - Main.getInstance().getLogger().warning("databaseType: "+databaseType+" is not a valid configuration option!"); - databaseType = "SQLITE"; + throw new RuntimeException("databaseType: "+databaseType+" is not a valid configuration option!"); } delayedRespawn = config.getBoolean("delayedRespawn.enabled"); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java index 5e28258..92fa4ce 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/ConfigManager.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.configuration; import net.tylermurphy.hideAndSeek.Main; @@ -25,8 +6,8 @@ import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import java.io.*; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.List; import java.util.Map; @@ -93,6 +74,7 @@ public class ConfigManager { try { this.config.load(reader); } catch(InvalidConfigurationException e) { + Main.getInstance().getLogger().severe(e.getMessage()); throw new RuntimeException("Invalid configuration in config file: "+file.getPath()); } catch(IOException e) { throw new RuntimeException("Could not access file: "+file.getPath()); @@ -107,9 +89,10 @@ public class ConfigManager { try { this.defaultConfig.load(default_reader); } catch(InvalidConfigurationException e) { - throw new RuntimeException("Invalid configuration in config file: "+file.getPath()); + Main.getInstance().getLogger().severe(e.getMessage()); + throw new RuntimeException("Invalid configuration in internal config file: "+defaultFilename); } catch(IOException e) { - throw new RuntimeException("Could not access file: "+file.getPath()); + throw new RuntimeException("Could not access internal file: "+defaultFilename); } try{ @@ -124,6 +107,7 @@ public class ConfigManager { return config.contains(path); } + @SuppressWarnings("unused") public double getDouble(String path) { if (!config.contains(path)) { return defaultConfig.getDouble(path); @@ -226,71 +210,122 @@ public class ConfigManager { config.set(path, value); } + public void overwriteConfig() { + try { + this.config.save(file); + } catch (IOException e) { + e.printStackTrace(); + } + } + public void saveConfig() { try { + // open config file InputStream is = Main.getInstance().getResource(defaultFilename); + // if failed error if (is == null) { throw new RuntimeException("Could not create input stream for "+defaultFilename); } + // manually read in each character to preserve string data StringBuilder textBuilder = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8)); - Reader reader = new BufferedReader(new InputStreamReader(is, Charset.forName(StandardCharsets.UTF_8.name()))); + Reader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); int c; - while((c = reader.read()) != -1) { + while((c = reader.read()) != -1) textBuilder.append((char) c); - } - String yamlString = new String(textBuilder.toString().getBytes(), StandardCharsets.UTF_8); - Map<String, Object> temp = config.getValues(true); - for(Map.Entry<String, Object> entry: temp.entrySet()) { - if (entry.getValue() instanceof Integer || entry.getValue() instanceof Double || entry.getValue() instanceof String || entry.getValue() instanceof Boolean || entry.getValue() instanceof List) { - String[] parts = entry.getKey().split("\\."); - int index = 0; - int i = 0; - for(String part : parts) { - if (i == 0) { - index = yamlString.indexOf(part+":", index); - } else { - index = yamlString.indexOf(" " + part+":", index); - index++; - } - i++; - if (index == -1) break; - } - if (index < 10) continue; - int start = yamlString.indexOf(' ', index); - int end = yamlString.indexOf('\n', index); - if (end == -1) end = yamlString.length(); - StringBuilder replace = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8)); - if (entry.getValue() instanceof List) { - if (((List<?>) entry.getValue()).isEmpty()) { - replace.append("[]"); - } else { - replace.append("["); - for (Object o : (List<?>) entry.getValue()) { - replace.append(o.toString()).append(", "); - } - replace = new StringBuilder(replace.substring(0, replace.length() - 2)); - replace.append("]"); - } + // store yaml file into a string + String yaml = new String(textBuilder.toString().getBytes(), StandardCharsets.UTF_8); + // get config values + Map<String, Object> data = config.getValues(true); + // write each stored config value into the yaml string + for(Map.Entry<String, Object> entry: data.entrySet()) { + // if type isn't supported, skip + if(!isSupported(entry.getValue())) continue; + // get index of key in yaml string + int index = getIndex(yaml, entry.getKey()); + // if index not found, skip + if (index < 10) continue; + // get start and end of the value + int start = yaml.indexOf(' ', index) + 1; + int end = yaml.indexOf('\n', index); + // if end not found, set it to the end of the file + if (end == -1) end = yaml.length(); + // create new replace sting + StringBuilder replace = new StringBuilder(new String("".getBytes(), StandardCharsets.UTF_8)); + // get value + Object value = entry.getValue(); + // if the value is a list, + if (value instanceof List) { + end = yaml.indexOf(']', start) + 1; + List<?> list = (List<?>) entry.getValue(); + if (list.isEmpty()) { + // if list is empty, put an empty list + replace.append("[]"); } else { - replace.append(entry.getValue()); - } - if (entry.getValue() instanceof String) { - replace.append("\""); - replace.reverse(); - replace.append("\""); - replace.reverse(); + // if list has values, populate values into the string + // get gap before key + int gap = whitespaceBefore(yaml, index); + String space = new String(new char[gap]).replace('\0', ' '); + replace.append("[\n"); + for (int i = 0; i < list.size(); i++) { + replace.append(space).append(" ").append(convert(list.get(i))); + if(i != list.size() -1) replace.append(",\n"); + } + replace.append('\n').append(space).append("]"); } - StringBuilder builder = new StringBuilder(yamlString); - builder.replace(start+1, end, replace.toString()); - yamlString = builder.toString(); + // otherwise just put the value directly + } else { + replace.append(convert(value)); } + // replace the new value in the yaml string + StringBuilder builder = new StringBuilder(yaml); + builder.replace(start, end, replace.toString()); + yaml = builder.toString(); } - Writer fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)); - fileWriter.write(yamlString); + + // write yaml string to file + Writer fileWriter = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(file.toPath()), StandardCharsets.UTF_8)); + fileWriter.write(yaml); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } + private int getIndex(String yaml, String key) { + String[] parts = key.split("\\."); + int index = 0; + for(String part : parts) { + if (index == 0) { + index = yaml.indexOf("\n" + part + ":", index) + 1; + } else { + index = yaml.indexOf(" " + part + ":", index) + 1; + } + if (index == 0) break; + } + return index; + } + + public boolean isSupported(Object o) { + return o instanceof Integer || + o instanceof Double || + o instanceof String || + o instanceof Boolean || + o instanceof List; + } + + public int whitespaceBefore(String yaml, int index) { + int count = 0; + for(int i = index - 1; yaml.charAt(i) == ' '; i--) count++; + return count; + } + + private String convert(Object o) { + if(o instanceof String) { + return "\"" + o + "\""; + } else if (o instanceof Boolean) { + return (boolean)o ? "true" : "false"; + } + return o.toString(); + } + } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java index 06dbb99..e5f970b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Items.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.configuration; import com.cryptomorin.xseries.XItemStack; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Leaderboard.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Leaderboard.java new file mode 100644 index 0000000..63dc850 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Leaderboard.java @@ -0,0 +1,51 @@ +package net.tylermurphy.hideAndSeek.configuration; + +import java.util.Collections; +import java.util.List; + +public class Leaderboard { + + public static String + LOBBY_TITLE, + GAME_TITLE, + COUNTDOWN_WAITING, + COUNTDOWN_COUNTING, + COUNTDOWN_ADMINSTART, + TAUNT_COUNTING, + TAUNT_ACTIVE, + TAUNT_EXPIRED, + GLOW_ACTIVE, + GLOW_INACTIVE, + BORDER_COUNTING, + BORDER_DECREASING; + + public static List<String> + LOBBY_CONTENTS, + GAME_CONTENTS; + + public static void loadLeaderboard() { + + ConfigManager leaderboard = ConfigManager.create("leaderboard.yml"); + + LOBBY_TITLE = leaderboard.getString("lobby.title"); + GAME_TITLE = leaderboard.getString("game.title"); + LOBBY_CONTENTS = leaderboard.getStringList("lobby.content"); + Collections.reverse(LOBBY_CONTENTS); + GAME_CONTENTS = leaderboard.getStringList("game.content"); + Collections.reverse(GAME_CONTENTS); + COUNTDOWN_WAITING = leaderboard.getString("countdown.waiting"); + COUNTDOWN_COUNTING = leaderboard.getString("countdown.counting"); + COUNTDOWN_ADMINSTART = leaderboard.getString("countdown.adminStart"); + TAUNT_COUNTING = leaderboard.getString("taunt.counting"); + TAUNT_ACTIVE = leaderboard.getString("taunt.active"); + TAUNT_EXPIRED = leaderboard.getString("taunt.expired"); + GLOW_ACTIVE = leaderboard.getString("glow.active"); + GLOW_INACTIVE = leaderboard.getString("glow.inactive"); + BORDER_COUNTING = leaderboard.getString("border.counting"); + BORDER_DECREASING = leaderboard.getString("border.decreasing"); + + leaderboard.saveConfig(); + + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java index 9418414..b9f9b69 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Localization.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.configuration; import net.md_5.bungee.api.ChatColor; @@ -31,8 +12,16 @@ public class Localization { public static final Map<String,LocalizationString> DEFAULT_LOCAL = new HashMap<>(); private static final Map<String,String[][]> CHANGES = new HashMap<String,String[][]>() {{ - put("en-US", new String[][]{{"WORLDBORDER_DECREASING"},{"START","TAUNTED"}}); - put("de-DE", new String[][]{{},{"TAUNTED"}}); + put("en-US", new String[][]{ + {"WORLDBORDER_DECREASING"}, + {"START","TAUNTED"}, + {"GAME_SETUP", "SETUP_GAME", "SETUP_LOBBY", "SETUP_SEEKER_LOBBY", "SETUP_EXIT", "SETUP_SAVEMAP", "SETUP_BOUNDS"} + }); + put("de-DE", new String[][]{ + {}, + {"TAUNTED"}, + {"GAME_SETUP", "SETUP_GAME", "SETUP_LOBBY", "SETUP_SEEKER_LOBBY", "SETUP_EXIT", "SETUP_SAVEMAP", "SETUP_BOUNDS"} + }); }}; public static void loadLocalization() { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java index 3d8bc0f..b457622 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/LocalizationString.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.configuration; import org.bukkit.entity.Entity; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java new file mode 100644 index 0000000..a23a1f7 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Map.java @@ -0,0 +1,238 @@ +package net.tylermurphy.hideAndSeek.configuration; + +import java.util.ArrayList; +import java.util.List; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.events.Border; +import net.tylermurphy.hideAndSeek.world.WorldLoader; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.*; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; + +import static net.tylermurphy.hideAndSeek.configuration.Config.*; + +public class Map { + + private final String name; + + private Location + spawnPosition = Location.getDefault(), + lobbyPosition = Location.getDefault(), + seekerLobbyPosition = Location.getDefault(); + + private int + xBoundMin = 0, + zBoundMin = 0, + xBoundMax = 0, + zBoundMax = 0, + xWorldBorder = 0, + zWorldBorder = 0, + worldBorderSize = 0, + worldBorderDelay = 0, + worldBorderChange = 0; + + private boolean + blockhunt = false; + + private List<Material> + blockhuntBlocks = new ArrayList<>(); + + private final Border + worldBorder; + + private final WorldLoader + worldLoader; + + public Map(String name) { + this.name = name; + this.worldBorder = new Border(this); + this.worldLoader = new WorldLoader(this); + } + + public void setSpawn(Location pos) { + this.spawnPosition = pos; + } + + public void setLobby(Location pos) { + this.lobbyPosition = pos; + } + + public void setSeekerLobby(Location pos) { + this.seekerLobbyPosition = pos; + } + + public void setWorldBorderData(int x, int z, int size, int delay, int move) { + if(size < 1) { + this.worldBorderSize = 0; + this.worldBorderDelay = 0; + this.worldBorderChange = 0; + this.xWorldBorder = 0; + this.zWorldBorder = 0; + } else { + this.worldBorderSize = size; + this.worldBorderDelay = delay; + this.worldBorderChange = move; + this.xWorldBorder = x; + this.zWorldBorder = z; + } + this.worldBorder.resetWorldBorder(); + } + + public void setBlockhunt(boolean enabled, List<Material> blocks) { + if (Main.getInstance().supports(9)) { + this.blockhunt = enabled; + } else { + this.blockhunt = false; + } + this.blockhuntBlocks = blocks; + } + + public void setBoundMin(int x, int z) { + this.xBoundMin = x; + this.zBoundMin = z; + } + + public void setBoundMax(int x, int z) { + this.xBoundMax = x; + this.zBoundMax = z; + } + + @NotNull + public Location getGameSpawn() { + if(mapSaveEnabled) { + return spawnPosition.changeWorld("hs_"+name); + } else { + return spawnPosition; + } + } + + @NotNull + public String getGameSpawnName() { + if(mapSaveEnabled) + return getGameSpawn().getWorld(); + else + return getSpawn().getWorld(); + } + + @NotNull + public Location getSpawn() { + return spawnPosition; + } + + @NotNull + public String getSpawnName() { + return getSpawn().getWorld(); + } + + @NotNull + public Location getLobby() { + return lobbyPosition; + } + + @NotNull + public String getLobbyName() { + return getLobby().getWorld(); + } + + @NotNull + public Location getSeekerLobby() { + return seekerLobbyPosition; + } + + @NotNull + public String getSeekerLobbyName() { + return getSeekerLobby().getWorld(); + } + + @NotNull + public Location getGameSeekerLobby() { + if(mapSaveEnabled) { + return seekerLobbyPosition.changeWorld("hs_"+name); + } else { + return seekerLobbyPosition; + } + } + + public boolean isWorldBorderEnabled() { + return worldBorderSize > 0; + } + + @NotNull + public Vector getWorldBorderPos() { + return new Vector( + xWorldBorder, + 0, + zWorldBorder + ); + } + + @NotNull + public Vector getWorldBorderData() { + return new Vector( + worldBorderSize, + worldBorderDelay, + worldBorderChange + ); + } + + @NotNull + public Border getWorldBorder() { + return worldBorder; + } + + public boolean isBlockHuntEnabled() { + return blockhunt; + } + + @NotNull + public List<Material> getBlockHunt() { + return blockhuntBlocks; + } + + @NotNull + public Vector getBoundsMin() { + return new Vector( + xBoundMin, + 0, + zBoundMin + ); + } + + @NotNull + public Vector getBoundsMax() { + return new Vector( + xBoundMax, + 0, + zBoundMax + ); + } + + @NotNull + public String getName() { + return name; + } + + @NotNull + public WorldLoader getWorldLoader() { + return worldLoader; + } + + public boolean isNotSetup() { + if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0 || !spawnPosition.exists()) return true; + if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0 || !lobbyPosition.exists()) return true; + if (exitPosition == null || exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0 || !exitPosition.exists()) return true; + if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0 || !seekerLobbyPosition.exists()) return true; + if (mapSaveEnabled && !getGameSpawn().exists()) return true; + if (blockhunt && blockhuntBlocks.isEmpty()) return true; + if(isWorldBorderEnabled() && + new Vector(spawnPosition.getX(), 0, spawnPosition.getZ()).distance(new Vector(xWorldBorder, 0, zWorldBorder)) > 100) return true; + return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0; + } + + public boolean isBoundsNotSetup() { + return xBoundMin == 0 || zBoundMin == 0 || xBoundMax == 0 || zBoundMax == 0; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/configuration/Maps.java b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Maps.java new file mode 100644 index 0000000..d691fa9 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/configuration/Maps.java @@ -0,0 +1,158 @@ +package net.tylermurphy.hideAndSeek.configuration; + +import java.util.*; +import java.util.stream.Collectors; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.util.Location; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; + +import com.cryptomorin.xseries.XMaterial; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class Maps { + + private static final HashMap<String, Map> MAPS = new HashMap<>(); + + @Nullable + public static Map getMap(String name) { + return MAPS.get(name); + } + + @Nullable + public static Map getRandomMap() { + Optional<Map> map; + if(MAPS.values().size() > 0) { + Collection<Map> setupMaps = MAPS.values().stream().filter(m -> !m.isNotSetup()).collect(Collectors.toList()); + if(setupMaps.size() < 1) { + return null; + } + map = setupMaps.stream().skip(new Random().nextInt(setupMaps.size())).findFirst(); + } else { + map = Optional.empty(); + } + return map.orElse(null); + } + + public static void setMap(String name, Map map) { + MAPS.put(name, map); + saveMaps(); + } + + public static boolean removeMap(String name) { + boolean status = MAPS.remove(name) != null; + saveMaps(); + return status; + } + + @NotNull + public static Collection<Map> getAllMaps() { + return MAPS.values(); + } + + public static void loadMaps() { + + ConfigManager manager = ConfigManager.create("maps.yml"); + + ConfigurationSection maps = manager.getConfigurationSection("maps"); + if(maps == null) return; + Set<String> keys = maps.getKeys(false); + if(keys == null) return; + + MAPS.clear(); + for(String key : keys) { + MAPS.put(key, parseMap(maps, key)); + } + + } + + private static Map parseMap(ConfigurationSection maps, String name) { + ConfigurationSection data = maps.getConfigurationSection(name); + if(data == null) return null; + Map map = new Map(name); + Main.getInstance().getLogger().info("Loading map: " + name + "..."); + map.setSpawn(getSpawn(data, "game")); + map.setLobby(getSpawn(data, "lobby")); + map.setSeekerLobby(getSpawn(data, "seeker")); + map.setBoundMin(data.getInt("bounds.min.x"), data.getInt("bounds.min.z")); + map.setBoundMax(data.getInt("bounds.max.x"), data.getInt("bounds.max.z")); + map.setWorldBorderData( + data.getInt("worldborder.pos.x"), + data.getInt("worldborder.pos.z"), + data.getInt("worldborder.size"), + data.getInt("worldborder.delay"), + data.getInt("worldborder.change") + ); + List<String> blockhunt = data.getStringList("blockhunt.blocks"); + if(blockhunt == null) blockhunt = new ArrayList<>(); + map.setBlockhunt( + data.getBoolean("blockhunt.enabled"), + blockhunt + .stream() + .map(XMaterial::matchXMaterial) + .filter(Optional::isPresent) + .map(e -> e.get().parseMaterial()) + .filter(Objects::nonNull) + .collect(Collectors.toList()) + ); + return map; + } + + private static Location getSpawn(ConfigurationSection data, String spawn) { + String world = data.getString("spawns."+spawn+".world"); + double x = data.getDouble("spawns."+spawn+".x"); + double y = data.getDouble("spawns."+spawn+".y"); + double z = data.getDouble("spawns."+spawn+".z"); + return new Location(world, x, y, z); + } + + private static void saveMaps() { + + ConfigManager manager = ConfigManager.create("maps.yml"); + ConfigurationSection maps = new YamlConfiguration(); + + for(Map map : MAPS.values()) { + ConfigurationSection data = new YamlConfiguration(); + saveSpawn(data, map.getSpawn(), "game", map); + saveSpawn(data, map.getLobby(), "lobby", map); + saveSpawn(data, map.getSeekerLobby(), "seeker", map); + data.set("bounds.min.x", map.getBoundsMin().getX()); + data.set("bounds.min.z", map.getBoundsMin().getZ()); + data.set("bounds.max.x", map.getBoundsMax().getX()); + data.set("bounds.max.z", map.getBoundsMax().getZ()); + data.set("worldborder.pos.x", map.getWorldBorderPos().getX()); + data.set("worldborder.pos.z", map.getWorldBorderPos().getZ()); + data.set("worldborder.pos.size", map.getWorldBorderData().getX()); + data.set("worldborder.pos.delay", map.getWorldBorderData().getY()); + data.set("worldborder.pos.change", map.getWorldBorderData().getZ()); + data.set("blockhunt.enabled", map.isBlockHuntEnabled()); + data.set("blockhunt.blocks", map.getBlockHunt().stream().map(Material::name).collect(Collectors.toList())); + maps.set(map.getName(), data); + } + + manager.set("maps", maps); + manager.overwriteConfig(); + + } + + private static void saveSpawn(ConfigurationSection data, Location spawn, String name, Map map) { + String worldName = getWorldName(name, map); + data.set("spawns." + name + ".world", worldName); + data.set("spawns." + name + ".x", spawn.getX()); + data.set("spawns." + name + ".y", spawn.getY()); + data.set("spawns." + name + ".z", spawn.getZ()); + } + + private static String getWorldName(String name, Map map) { + switch (name) { + case "game": return map.getSpawnName(); + case "lobby": return map.getLobbyName(); + case "seeker": return map.getSeekerLobbyName(); + default: return null; + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java index e7bfb26..dca2de0 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.database; import com.google.common.io.ByteStreams; @@ -45,8 +26,10 @@ public class Database { public Database(){ if(databaseType.equals("SQLITE")) { + Main.getInstance().getLogger().info("SQLITE database chosen"); connection = new SQLiteConnection(); } else { + Main.getInstance().getLogger().info("MYSQL database chosen"); connection = new MySQLConnection(); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java index 8f0ddde..c01f615 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/GameDataTable.java @@ -175,10 +175,10 @@ public class GameDataTable { @NotNull Board board, @NotNull List<UUID> uuids, @NotNull List<UUID> winners, - @NotNull Map<String,Integer> hider_kills, - @NotNull Map<String,Integer> hider_deaths, - @NotNull Map<String,Integer> seeker_kills, - @NotNull Map<String,Integer> seeker_deaths, + @NotNull Map<UUID,Integer> hider_kills, + @NotNull Map<UUID,Integer> hider_deaths, + @NotNull Map<UUID,Integer> seeker_kills, + @NotNull Map<UUID,Integer> seeker_deaths, @NotNull WinType type ) { for(UUID uuid : uuids) { @@ -192,10 +192,10 @@ public class GameDataTable { info.getSeekerWins() + (winners.contains(uuid) && type == WinType.SEEKER_WIN ? 1 : 0), info.getHiderGames() + (board.isHider(uuid) || (board.isSeeker(uuid) && !board.getFirstSeeker().getUniqueId().equals(uuid)) ? 1 : 0), info.getSeekerGames() + (board.getFirstSeeker().getUniqueId().equals(uuid) ? 1 : 0), - info.getHiderKills() + hider_kills.getOrDefault(uuid.toString(), 0), - info.getSeekerKills() + seeker_kills.getOrDefault(uuid.toString(), 0), - info.getHiderDeaths() + hider_deaths.getOrDefault(uuid.toString(), 0), - info.getSeekerDeaths() + seeker_deaths.getOrDefault(uuid.toString(), 0) + info.getHiderKills() + hider_kills.getOrDefault(uuid, 0), + info.getSeekerKills() + seeker_kills.getOrDefault(uuid, 0), + info.getHiderDeaths() + hider_deaths.getOrDefault(uuid, 0), + info.getSeekerDeaths() + seeker_deaths.getOrDefault(uuid, 0) ); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java index b7c1b1d..56f53f6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/connections/MySQLConnection.java @@ -21,6 +21,7 @@ package net.tylermurphy.hideAndSeek.database.connections; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; +import net.tylermurphy.hideAndSeek.Main; import java.sql.Connection; import java.sql.SQLException; @@ -35,6 +36,13 @@ public class MySQLConnection implements DatabaseConnection { HikariConfig config = new HikariConfig(); + Main.getInstance().getLogger().info("Database host: " + databaseHost); + Main.getInstance().getLogger().info("Database port: " + databasePort); + Main.getInstance().getLogger().info("Database user: " + databaseUser); + Main.getInstance().getLogger().info("Database pass: xxxxxxxxxxx"); + Main.getInstance().getLogger().info("Database name: " + databaseName); + + config.setJdbcUrl("jdbc:mariadb://"+databaseHost+":"+databasePort+"/"+databaseName); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java index 55dfa3c..2050f33 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Board.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.game; import net.tylermurphy.hideAndSeek.Main; @@ -33,114 +14,133 @@ import java.util.*; import java.util.stream.Collectors; import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Leaderboard.*; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; -@SuppressWarnings("deprecation") public class Board { - private final List<String> Hider = new ArrayList<>(), Seeker = new ArrayList<>(), Spectator = new ArrayList<>(); - private final Map<String, Player> playerList = new HashMap<>(); - private final Map<String, CustomBoard> customBoards = new HashMap<>(); - private final Map<String, Integer> hider_kills = new HashMap<>(), seeker_kills = new HashMap<>(), hider_deaths = new HashMap<>(), seeker_deaths = new HashMap<>(); + private enum Type { + HIDER, + SEEKER, + SPECTATOR, + } + + private UUID initialSeeker = null; + private final Map<UUID, Type> Players = new HashMap<>(); + private final Map<UUID, CustomBoard> customBoards = new HashMap<>(); + private final Map<UUID, Integer> hider_kills = new HashMap<>(), seeker_kills = new HashMap<>(), hider_deaths = new HashMap<>(), seeker_deaths = new HashMap<>(); public boolean contains(Player player) { - return playerList.containsKey(player.getUniqueId().toString()); + return Players.containsKey(player.getUniqueId()); } public boolean isHider(Player player) { - return Hider.contains(player.getUniqueId().toString()); + return isHider(player.getUniqueId()); } public boolean isHider(UUID uuid) { - return Hider.contains(uuid.toString()); + if(!Players.containsKey(uuid)) return false; + return Players.get(uuid) == Type.HIDER; } public boolean isSeeker(Player player) { - return Seeker.contains(player.getUniqueId().toString()); + return isSeeker(player.getUniqueId()); } public boolean isSeeker(UUID uuid) { - return Seeker.contains(uuid.toString()); + if(!Players.containsKey(uuid)) return false; + return Players.get(uuid) == Type.SEEKER; } public boolean isSpectator(Player player) { - return Spectator.contains(player.getUniqueId().toString()); + return isSpectator(player.getUniqueId()); + } + + public boolean isSpectator(UUID uuid) { + if(!Players.containsKey(uuid)) return false; + return Players.get(uuid) == Type.SPECTATOR; } public int sizeHider() { - return Hider.size(); + return getHiders().size(); } public int sizeSeeker() { - return Seeker.size(); + return getSeekers().size(); } public int size() { - return playerList.values().size(); + return getPlayers().size(); } public List<Player> getHiders() { - return Hider.stream().filter(Objects::nonNull).map(playerList::get).collect(Collectors.toList()); + return Players.keySet().stream() + .filter(s -> Players.get(s) == Type.HIDER) + .map(Bukkit::getPlayer) + .filter(Objects::nonNull) + .collect(Collectors.toList()); } public List<Player> getSeekers() { - return Seeker.stream().filter(Objects::nonNull).map(playerList::get).collect(Collectors.toList()); - } - - public Player getFirstSeeker() { - return playerList.get(Seeker.get(0)); + return Players.keySet().stream() + .filter(s -> Players.get(s) == Type.SEEKER) + .map(Bukkit::getPlayer) + .filter(Objects::nonNull) + .collect(Collectors.toList()); } public List<Player> getSpectators() { - return Spectator.stream().filter(Objects::nonNull).map(playerList::get).collect(Collectors.toList()); + return Players.keySet().stream() + .filter(s -> Players.get(s) == Type.SPECTATOR) + .map(Bukkit::getPlayer) + .filter(Objects::nonNull) + .collect(Collectors.toList()); } public List<Player> getPlayers() { - return playerList.values().stream().filter(Objects::nonNull).collect(Collectors.toList()); + return Players.keySet().stream() + .map(Bukkit::getPlayer) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + public Player getFirstSeeker() { + if(initialSeeker == null) return null; + return Bukkit.getPlayer(initialSeeker); } public Player getPlayer(UUID uuid) { - return playerList.get(uuid.toString()); + if(!Players.containsKey(uuid)) { + return null; + } + return Bukkit.getPlayer(uuid); } public void addHider(Player player) { - Hider.add(player.getUniqueId().toString()); - Seeker.remove(player.getUniqueId().toString()); - Spectator.remove(player.getUniqueId().toString()); - playerList.put(player.getUniqueId().toString(), player); + Players.put(player.getUniqueId(), Type.HIDER); } public void addSeeker(Player player) { - Hider.remove(player.getUniqueId().toString()); - Seeker.add(player.getUniqueId().toString()); - Spectator.remove(player.getUniqueId().toString()); - playerList.put(player.getUniqueId().toString(), player); + if(initialSeeker == null) { + initialSeeker = player.getUniqueId(); + } + Players.put(player.getUniqueId(), Type.SEEKER); } public void addSpectator(Player player) { - Hider.remove(player.getUniqueId().toString()); - Seeker.remove(player.getUniqueId().toString()); - Spectator.add(player.getUniqueId().toString()); - playerList.put(player.getUniqueId().toString(), player); + Players.put(player.getUniqueId(), Type.SPECTATOR); } public void remove(Player player) { - Hider.remove(player.getUniqueId().toString()); - Seeker.remove(player.getUniqueId().toString()); - Spectator.remove(player.getUniqueId().toString()); - playerList.remove(player.getUniqueId().toString()); + Players.remove(player.getUniqueId()); } public boolean onSameTeam(Player player1, Player player2) { - if (Hider.contains(player1.getUniqueId().toString()) && Hider.contains(player2.getUniqueId().toString())) return true; - else if (Seeker.contains(player1.getUniqueId().toString()) && Seeker.contains(player2.getUniqueId().toString())) return true; - else return Spectator.contains(player1.getUniqueId().toString()) && Spectator.contains(player2.getUniqueId().toString()); + return Players.get(player1.getUniqueId()) == Players.get(player2.getUniqueId()); } public void reload() { - Hider.clear(); - Seeker.clear(); - Spectator.clear(); + Players.replaceAll((u, v) -> Type.HIDER); hider_kills.clear(); seeker_kills.clear(); hider_deaths.clear(); @@ -148,47 +148,38 @@ public class Board { } public void addKill(UUID uuid) { - if (Hider.contains(uuid.toString())) { - if (hider_kills.containsKey(uuid.toString())) { - hider_kills.put(uuid.toString(), hider_kills.get(uuid.toString())+1); - } else { - hider_kills.put(uuid.toString(), 1); - } - } else if (Seeker.contains(uuid.toString())) { - if (seeker_kills.containsKey(uuid.toString())) { - seeker_kills.put(uuid.toString(), seeker_kills.get(uuid.toString())+1); - } else { - seeker_kills.put(uuid.toString(), 1); - } + if(Players.get(uuid) == Type.HIDER) { + int kills = hider_kills.getOrDefault(uuid, 0); + hider_kills.put(uuid, kills + 1); + } else if(Players.get(uuid) == Type.SEEKER) { + int kills = seeker_kills.getOrDefault(uuid, 0); + seeker_kills.put(uuid, kills + 1); } } public void addDeath(UUID uuid) { - if (Hider.contains(uuid.toString())) { - if (hider_deaths.containsKey(uuid.toString())) { - hider_deaths.put(uuid.toString(), hider_deaths.get(uuid.toString())+1); - } else { - hider_deaths.put(uuid.toString(), 1); - } - } else if (Seeker.contains(uuid.toString())) { - if (seeker_deaths.containsKey(uuid.toString())) { - seeker_deaths.put(uuid.toString(), seeker_deaths.get(uuid.toString())+1); - } else { - seeker_deaths.put(uuid.toString(), 1); - } + if(Players.get(uuid) == Type.HIDER) { + int kills = hider_deaths.getOrDefault(uuid, 0); + hider_deaths.put(uuid, kills + 1); + } else if(Players.get(uuid) == Type.SEEKER) { + int kills = seeker_deaths.getOrDefault(uuid, 0); + seeker_deaths.put(uuid, kills + 1); } } - public Map<String, Integer> getHiderKills() { + public Map<UUID, Integer> getHiderKills() { return new HashMap<>(hider_kills); } - public Map<String, Integer> getSeekerKills() { + + public Map<UUID, Integer> getSeekerKills() { return new HashMap<>(seeker_kills); } - public Map<String, Integer> getHiderDeaths() { + + public Map<UUID, Integer> getHiderDeaths() { return new HashMap<>(hider_deaths); } - public Map<String, Integer> getSeekerDeaths() { + + public Map<UUID, Integer> getSeekerDeaths() { return new HashMap<>(seeker_deaths); } @@ -197,7 +188,7 @@ public class Board { } private void createLobbyBoard(Player player, boolean recreate) { - CustomBoard board = customBoards.get(player.getUniqueId().toString()); + CustomBoard board = customBoards.get(player.getUniqueId()); if (recreate || board == null) { board = new CustomBoard(player, LOBBY_TITLE); board.updateTeams(); @@ -219,14 +210,22 @@ public class Board { } else if (line.contains("{SEEKER%}")) { board.setLine(String.valueOf(i), line.replace("{SEEKER%}", getSeekerPercent()+"")); } else if (line.contains("{HIDER%}")) { - board.setLine(String.valueOf(i), line.replace("{HIDER%}", getHiderPercent()+"")); + board.setLine(String.valueOf(i), line.replace("{HIDER%}", getHiderPercent() + "")); + } else if (line.contains("{MAP}")) { + board.setLine(String.valueOf(i), line.replace("{MAP}", getMapName() + "")); } else { board.setLine(String.valueOf(i), line); } i++; } board.display(); - customBoards.put(player.getUniqueId().toString(), board); + customBoards.put(player.getUniqueId(), board); + } + + public String getMapName() { + net.tylermurphy.hideAndSeek.configuration.Map map = Main.getInstance().getGame().getCurrentMap(); + if(map == null) return "Invalid"; + else return map.getName(); } public void createGameBoard(Player player) { @@ -234,7 +233,7 @@ public class Board { } private void createGameBoard(Player player, boolean recreate) { - CustomBoard board = customBoards.get(player.getUniqueId().toString()); + CustomBoard board = customBoards.get(player.getUniqueId()); if (recreate || board == null) { board = new CustomBoard(player, GAME_TITLE); board.updateTeams(); @@ -244,7 +243,7 @@ public class Board { Status status = Main.getInstance().getGame().getStatus(); Taunt taunt = Main.getInstance().getGame().getTaunt(); - Border worldBorder = Main.getInstance().getGame().getBorder(); + Border worldBorder = Main.getInstance().getGame().getCurrentMap().getWorldBorder(); Glow glow = Main.getInstance().getGame().getGlow(); int i = 0; @@ -259,8 +258,8 @@ public class Board { String value = getTeam(player); board.setLine(String.valueOf(i), line.replace("{TEAM}", value)); } else if (line.contains("{BORDER}")) { - if (!worldBorderEnabled) continue; - if (worldBorder == null || status == Status.STARTING) { + if (!Main.getInstance().getGame().getCurrentMap().isWorldBorderEnabled()) continue; + if (status == Status.STARTING) { board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replace("{AMOUNT}", "0"))); } else if (!worldBorder.isRunning()) { board.setLine(String.valueOf(i), line.replace("{BORDER}", BORDER_COUNTING.replaceFirst("\\{AMOUNT}", worldBorder.getDelay()/60+"").replaceFirst("\\{AMOUNT}", worldBorder.getDelay()%60+""))); @@ -271,7 +270,7 @@ public class Board { if (!tauntEnabled) continue; if (taunt == null || status == Status.STARTING) { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replace("{AMOUNT}", "0"))); - } else if (!tauntLast && Hider.size() == 1) { + } else if (!tauntLast && sizeHider() == 1) { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_EXPIRED)); } else if (!taunt.isRunning()) { board.setLine(String.valueOf(i), line.replace("{TAUNT}", TAUNT_COUNTING.replaceFirst("\\{AMOUNT}", taunt.getDelay() / 60 + "").replaceFirst("\\{AMOUNT}", taunt.getDelay() % 60 + ""))); @@ -289,6 +288,8 @@ public class Board { board.setLine(String.valueOf(i), line.replace("{#SEEKER}", getSeekers().size()+"")); } else if (line.contains("{#HIDER}")) { board.setLine(String.valueOf(i), line.replace("{#HIDER}", getHiders().size()+"")); + } else if (line.contains("{MAP}")) { + board.setLine(String.valueOf(i), line.replace("{MAP}", getMapName() + "")); } else { board.setLine(String.valueOf(i), line); } @@ -296,23 +297,23 @@ public class Board { i++; } board.display(); - customBoards.put(player.getUniqueId().toString(), board); + customBoards.put(player.getUniqueId(), board); } public void removeBoard(Player player) { ScoreboardManager manager = Bukkit.getScoreboardManager(); assert manager != null; player.setScoreboard(manager.getMainScoreboard()); - customBoards.remove(player.getUniqueId().toString()); + customBoards.remove(player.getUniqueId()); } public void reloadLobbyBoards() { - for(Player player : playerList.values()) + for(Player player : getPlayers()) createLobbyBoard(player, false); } public void reloadGameBoards() { - for(Player player : playerList.values()) + for(Player player : getPlayers()) createGameBoard(player, false); } @@ -322,17 +323,19 @@ public class Board { } private String getSeekerPercent() { - if (playerList.values().size() < 2) + int size = size(); + if (size < 2) return " --"; else - return " "+(int)(100*(1.0/playerList.size())); + return " "+(int)(100*(1.0/size)); } private String getHiderPercent() { - if (playerList.size() < 2) + int size = size(); + if (size < 2) return " --"; else - return " "+(int)(100-100*(1.0/playerList.size())); + return " "+(int)(100-100*(1.0/size)); } private String getTeam(Player player) { @@ -343,10 +346,8 @@ public class Board { } public void cleanup() { - playerList.clear(); - Hider.clear(); - Seeker.clear(); - Spectator.clear(); + Players.clear();; + initialSeeker = null; customBoards.clear(); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java index 2f8cbf6..351ba10 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Disguiser.java @@ -1,21 +1,23 @@ package net.tylermurphy.hideAndSeek.game; import static net.tylermurphy.hideAndSeek.configuration.Config.*; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; +import net.tylermurphy.hideAndSeek.configuration.Map; import net.tylermurphy.hideAndSeek.game.util.Disguise; import org.bukkit.Material; import org.bukkit.entity.Player; import org.jetbrains.annotations.Nullable; import java.util.HashMap; -import java.util.Map; public class Disguiser { - private final Map<Player, Disguise> disguises; + private final HashMap<Player, Disguise> disguises; public Disguiser(){ this.disguises = new HashMap<>(); + } public Disguise getDisguise(Player player){ @@ -35,7 +37,7 @@ public class Disguiser { } public void check(){ - for(Map.Entry<Player, Disguise> set : disguises.entrySet()){ + for(HashMap.Entry<Player, Disguise> set : disguises.entrySet()){ Disguise disguise = set.getValue(); Player player = set.getKey(); if(!player.isOnline()) { @@ -47,9 +49,9 @@ public class Disguiser { } } - public void disguise(Player player, Material material){ - if(!blockhuntEnabled){ - player.sendMessage(errorPrefix + "Please enable blockhunt in config.yml to enable disguises. Blockhunt does not work on 1.8"); + public void disguise(Player player, Material material, Map map){ + if(!map.isBlockHuntEnabled()){ + player.sendMessage(errorPrefix + message("BLOCKHUNT_DISABLED")); return; } if(disguises.containsKey(player)){ diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java index 8274655..3892f6f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/EntityHider.java @@ -235,11 +235,7 @@ public class EntityHider implements Listener { destroyEntity.getIntegerArrays().write(0, new int[]{entity.getEntityId()}); } catch (Exception e){ return false; } // Make the entity disappear - try { - manager.sendServerPacket(observer, destroyEntity); - } catch (InvocationTargetException e) { - throw new RuntimeException("Cannot send server packet.", e); - } + manager.sendServerPacket(observer, destroyEntity); } return visibleBefore; } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java index 71c3e84..e18a309 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/Game.java @@ -24,18 +24,17 @@ import com.cryptomorin.xseries.messages.Titles; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.game.events.Border; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; import net.tylermurphy.hideAndSeek.game.events.Glow; import net.tylermurphy.hideAndSeek.game.events.Taunt; import net.tylermurphy.hideAndSeek.game.listener.RespawnHandler; import net.tylermurphy.hideAndSeek.game.util.*; -import net.tylermurphy.hideAndSeek.world.WorldLoader; import org.bukkit.*; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.io.File; import java.util.*; import java.util.stream.Collectors; @@ -46,24 +45,25 @@ public class Game { private final Taunt taunt; private final Glow glow; - private final Border worldBorder; - private final WorldLoader worldLoader; private final Board board; private Status status; + private Map currentMap; + private int gameTick; private int lobbyTimer; private int startingTimer; private int gameTimer; private boolean hiderLeft; - public Game(Board board){ + public Game(Map map, Board board) { + + this.currentMap = map; + this.taunt = new Taunt(); this.glow = new Glow(); - this.worldBorder = new Border(); - this.worldLoader = new WorldLoader(spawnWorld); this.status = Status.STANDBY; @@ -92,40 +92,34 @@ public class Game { return glow; } - public Border getBorder(){ - return worldBorder; - } - public Taunt getTaunt(){ return taunt; } - public WorldLoader getWorldLoader(){ - return worldLoader; - } - public void start() { + Player seeker; try { - Optional<Player> rand = board.getPlayers().stream().skip(new Random().nextInt(board.size())).findFirst(); - Player seeker = rand.orElse(board.getPlayers().get(0)); - start(seeker); + int rand = (int) (Math.random() * board.getPlayers().size()); + seeker = board.getPlayers().get(rand); } catch (Exception e){ Main.getInstance().getLogger().warning("Failed to select random seeker."); + return; } + start(seeker); } public void start(Player seeker) { - if (mapSaveEnabled) worldLoader.rollback(); + if (mapSaveEnabled) currentMap.getWorldLoader().rollback(); board.reload(); board.addSeeker(seeker); - PlayerLoader.loadSeeker(seeker, getGameWorld()); + PlayerLoader.loadSeeker(seeker, currentMap); board.getPlayers().forEach(player -> { if(board.isSeeker(player)) return; board.addHider(player); - PlayerLoader.loadHider(player, getGameWorld()); + PlayerLoader.loadHider(player, currentMap); }); board.getPlayers().forEach(board::createGameBoard); - worldBorder.resetWorldBorder(getGameWorld()); + currentMap.getWorldBorder().resetWorldBorder(); if (gameLength > 0) gameTimer = gameLength; status = Status.STARTING; startingTimer = 30; @@ -147,21 +141,23 @@ public class Game { public void end() { board.getPlayers().forEach(PlayerLoader::unloadPlayer); - worldBorder.resetWorldBorder(getGameWorld()); + currentMap.getWorldBorder().resetWorldBorder(); + Map nextMap = Maps.getRandomMap(); + if(nextMap != null) this.currentMap = nextMap; board.getPlayers().forEach(player -> { if (leaveOnEnd) { board.removeBoard(player); board.remove(player); handleBungeeLeave(player); } else { - player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); + currentMap.getLobby().teleport(player); board.createLobbyBoard(player); board.addHider(player); - PlayerLoader.joinPlayer(player); + PlayerLoader.joinPlayer(player, currentMap); } }); RespawnHandler.temp_loc.clear(); - if (mapSaveEnabled) worldLoader.unloadMap(); + if (mapSaveEnabled) currentMap.getWorldLoader().unloadMap(); board.reloadLobbyBoards(); status = Status.ENDED; } @@ -172,14 +168,14 @@ public class Game { ItemStack[] data = player.getInventory().getContents(); Main.getInstance().getDatabase().getInventoryData().saveInventory(player.getUniqueId(), data); } - PlayerLoader.joinPlayer(player); + PlayerLoader.joinPlayer(player, currentMap); board.addHider(player); board.createLobbyBoard(player); board.reloadLobbyBoards(); if (announceMessagesToNonPlayers) Bukkit.broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); else broadcastMessage(messagePrefix + message("GAME_JOIN").addPlayer(player)); } else { - PlayerLoader.loadSpectator(player, getGameWorld()); + PlayerLoader.loadSpectator(player, currentMap); board.addSpectator(player); board.createGameBoard(player); player.sendMessage(messagePrefix + message("GAME_JOIN_SPECTATOR")); @@ -216,12 +212,12 @@ public class Game { out.writeUTF(leaveServer); player.sendPluginMessage(Main.getInstance(), "BungeeCord", out.toByteArray()); } else { - player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); + exitPosition.teleport(player); } } public void onTick() { - if (isNotSetup()) return; + if (currentMap == null || currentMap.isNotSetup()) return; if (status == Status.STANDBY) whileWaiting(); else if (status == Status.STARTING) whileStarting(); else if (status == Status.PLAYING) whilePlaying(); @@ -257,7 +253,7 @@ public class Game { board.getPlayers().forEach(player -> { PlayerLoader.resetPlayer(player, board); if(board.isSeeker(player)){ - player.teleport(new Location(Bukkit.getWorld(getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + currentMap.getGameSpawn().teleport(player); } }); } else if (startingTimer == 1){ @@ -317,7 +313,7 @@ public class Game { board.reloadGameBoards(); gameTimer--; } - if (worldBorderEnabled) worldBorder.update(); + if (currentMap.isWorldBorderEnabled()) currentMap.getWorldBorder().update(); if (tauntEnabled) taunt.update(); if (glowEnabled || alwaysGlow) glow.update(); } @@ -331,21 +327,22 @@ public class Game { } } - public boolean isNotSetup() { - if (spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) return true; - if (lobbyPosition.getBlockX() == 0 && lobbyPosition.getBlockY() == 0 && lobbyPosition.getBlockZ() == 0) return true; - if (exitPosition.getBlockX() == 0 && exitPosition.getBlockY() == 0 && exitPosition.getBlockZ() == 0) return true; - if (seekerLobbyPosition.getBlockX() == 0 && seekerLobbyPosition.getBlockY() == 0 && seekerLobbyPosition.getBlockZ() == 0) return true; - if (mapSaveEnabled) { - File destination = new File(Main.getInstance().getWorldContainer() + File.separator + getGameWorld()); - if (!destination.exists()) return true; - } - return saveMinX == 0 || saveMinZ == 0 || saveMaxX == 0 || saveMaxZ == 0; + public boolean isCurrentMapValid() { + return currentMap != null && !currentMap.isNotSetup(); + } + + public boolean checkCurrentMap() { + if(currentMap != null && !currentMap.isNotSetup()) return false; + this.currentMap = Maps.getRandomMap(); + return this.currentMap == null; + } + + public void setCurrentMap(Map map) { + this.currentMap = map; } - public String getGameWorld() { - if (mapSaveEnabled) return "hideandseek_"+spawnWorld; - else return spawnWorld; + public Map getCurrentMap() { + return currentMap; } private void checkWinConditions() { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java index eedfabe..10157cd 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/PlayerLoader.java @@ -23,9 +23,8 @@ import com.cryptomorin.xseries.messages.Titles; import net.md_5.bungee.api.ChatColor; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.configuration.Items; -import org.bukkit.Bukkit; +import net.tylermurphy.hideAndSeek.configuration.Map; import org.bukkit.GameMode; -import org.bukkit.Location; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Player; @@ -35,30 +34,29 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Config.lobbyPosition; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; @SuppressWarnings("deprecation") public class PlayerLoader { - public static void loadHider(Player player, String gameWorld){ - player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); + public static void loadHider(Player player, Map map){ + map.getGameSpawn().teleport(player); loadPlayer(player); player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,1000000,5,false,false)); Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("HIDER_TEAM_NAME"), ChatColor.WHITE + message("HIDERS_SUBTITLE").toString()); - if(blockhuntEnabled){ - openBlockHuntPicker(player); + if(map.isBlockHuntEnabled()){ + openBlockHuntPicker(player, map); } } - public static void loadSeeker(Player player, String gameWorld){ - player.teleport(new Location(Bukkit.getWorld(gameWorld), seekerLobbyPosition.getX(),seekerLobbyPosition.getY(),seekerLobbyPosition.getZ())); + public static void loadSeeker(Player player, Map map){ + map.getGameSeekerLobby().teleport(player); loadPlayer(player); Titles.sendTitle(player, 10, 70, 20, ChatColor.WHITE + "" + message("SEEKER_TEAM_NAME"), ChatColor.WHITE + message("SEEKERS_SUBTITLE").toString()); } - public static void loadSpectator(Player player, String gameWorld){ - player.teleport(new Location(Bukkit.getWorld(gameWorld), spawnPosition.getX(),spawnPosition.getY(),spawnPosition.getZ())); + public static void loadSpectator(Player player, Map map){ + map.getGameSpawn().teleport(player); loadPlayer(player); player.setAllowFlight(true); player.setFlying(true); @@ -115,8 +113,8 @@ public class PlayerLoader { player.setFallDistance(0.0F); } - public static void joinPlayer(Player player){ - player.teleport(new Location(Bukkit.getWorld(lobbyWorld), lobbyPosition.getX(),lobbyPosition.getY(),lobbyPosition.getZ())); + public static void joinPlayer(Player player, Map map){ + map.getLobby().teleport(player); loadPlayer(player); if (lobbyStartItem != null && (!lobbyItemStartAdmin || player.hasPermission("hideandseek.start"))) player.getInventory().setItem(lobbyItemStartPosition, lobbyStartItem); @@ -143,11 +141,11 @@ public class PlayerLoader { } } - public static void openBlockHuntPicker(Player player){ - int slots = ((blockhuntBlocks.size()-1)/9)*9+9; - Inventory inventory = Main.getInstance().getServer().createInventory(null, slots, "Select a Block"); - for(int i=0;i<blockhuntBlocks.size();i++){ - inventory.setItem(i, new ItemStack(blockhuntBlocks.get(i))); + public static void openBlockHuntPicker(Player player, Map map){ + int slots = ((map.getBlockHunt().size()-1)/9)*9+9; + Inventory inventory = Main.getInstance().getServer().createInventory(null, slots, "Select a Block: " + map.getName()); + for(int i=0;i<map.getBlockHunt().size();i++){ + inventory.setItem(i, new ItemStack(map.getBlockHunt().get(i))); } player.openInventory(inventory); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java index 647c4b6..9f7b5bf 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Border.java @@ -1,8 +1,7 @@ package net.tylermurphy.hideAndSeek.game.events; import net.tylermurphy.hideAndSeek.Main; -import org.bukkit.Bukkit; -import org.bukkit.World; +import net.tylermurphy.hideAndSeek.configuration.Map; import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; @@ -11,9 +10,13 @@ public class Border { private int delay; private boolean running; + private final Map map; + private int currentSize; - public Border() { - delay = 60 * worldBorderDelay; + public Border(Map map) { + this.map = map; + this.delay = (int) (60 * map.getWorldBorderData().getY()); + this.currentSize = (int) map.getWorldBorderData().getX(); } public void update() { @@ -21,7 +24,7 @@ public class Border { Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_WARN")); } else if (delay == 0) { if (running) { - delay = 60 * worldBorderDelay; + delay = (int) (60 * map.getWorldBorderData().getY()); running = false; } else decreaseWorldBorder(); @@ -30,34 +33,32 @@ public class Border { } private void decreaseWorldBorder() { - if (currentWorldborderSize == 100) return; - int change = worldBorderChange; - if (currentWorldborderSize-worldBorderChange < 100) { - change = currentWorldborderSize-100; + if (currentSize == 100) return; + if(map.getGameSpawn().load() == null) return; + int change = (int) map.getWorldBorderData().getZ(); + if (currentSize-change < 100) { + change = currentSize-100; } running = true; Main.getInstance().getGame().broadcastMessage(worldBorderPrefix + message("WORLDBORDER_DECREASING").addAmount(change)); - currentWorldborderSize -= worldBorderChange; - World world = Bukkit.getWorld(Main.getInstance().getGame().getGameWorld()); - assert world != null; - org.bukkit.WorldBorder border = world.getWorldBorder(); + currentSize -= map.getWorldBorderData().getZ(); + org.bukkit.WorldBorder border = map.getGameSpawn().load().getWorldBorder(); border.setSize(border.getSize()-change,30); delay = 30; } - public void resetWorldBorder(String worldName) { - World world = Bukkit.getWorld(worldName); - assert world != null; - org.bukkit.WorldBorder border = world.getWorldBorder(); - if (worldBorderEnabled) { - border.setSize(worldBorderSize); - border.setCenter(worldBorderPosition.getX(), worldBorderPosition.getZ()); - currentWorldborderSize = worldBorderSize; + public void resetWorldBorder() { + if(map.getGameSpawn().load() == null) return; + org.bukkit.WorldBorder border = map.getGameSpawn().load().getWorldBorder(); + if (map.isWorldBorderEnabled()) { + border.setSize(map.getWorldBorderData().getX()); + border.setCenter(map.getWorldBorderPos().getX(), map.getWorldBorderPos().getY()); + currentSize = (int) map.getWorldBorderData().getX(); } else { border.setSize(30000000); border.setCenter(0, 0); } - delay = 60 * worldBorderDelay; + delay = (int) (60 * map.getWorldBorderData().getY()); } public int getDelay() { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java index 8631ef5..dec23d7 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/events/Glow.java @@ -6,6 +6,7 @@ import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.util.packet.EntityMetadataPacket; import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; @@ -64,22 +65,13 @@ public class Glow { } public void setGlow(Player player, Player target, boolean glowing) { - PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.ENTITY_METADATA); - packet.getIntegers().write(0, target.getEntityId()); - WrappedDataWatcher watcher = new WrappedDataWatcher(); - WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class); - watcher.setEntity(target); - if (glowing) { - watcher.setObject(0, serializer, (byte) (0x40)); - } else { - watcher.setObject(0, serializer, (byte) (0x0)); - } - packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); - try { - protocolManager.sendServerPacket(player, packet); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } + + EntityMetadataPacket packet = new EntityMetadataPacket(); + packet.setEntity(target); + packet.setGlow(glowing); + packet.writeMetadata(); + packet.send(player); + } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java index 27a6235..27347c2 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/ChatHandler.java @@ -11,7 +11,7 @@ public class ChatHandler implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onChat(AsyncPlayerChatEvent event) { - if (Main.getInstance().getBoard().isSeeker(event.getPlayer())) { + if (Main.getInstance().getBoard().isSpectator(event.getPlayer())) { event.setCancelled(true); Main.getInstance().getBoard().getSpectators().forEach(spectator -> spectator.sendMessage(ChatColor.GRAY + "[SPECTATOR] " + event.getPlayer().getName() + ": " + event.getMessage())); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java index d03d5d6..37537d6 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DamageHandler.java @@ -7,7 +7,6 @@ import net.tylermurphy.hideAndSeek.game.Game; import net.tylermurphy.hideAndSeek.game.PlayerLoader; import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; @@ -18,7 +17,6 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Config.spawnPosition; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class DamageHandler implements Listener { @@ -32,8 +30,8 @@ public class DamageHandler implements Listener { // Define variables Player player = (Player) event.getEntity(); Player attacker = null; - // If no spawn position, we won't be able to manage their death :o - if (spawnPosition == null) { return; } + // If map is not setup we won't be able to process on it :o + if (!game.isCurrentMapValid()) { return; } // If there is an attacker, find them if (event instanceof EntityDamageByEntityEvent) { if (((EntityDamageByEntityEvent) event).getDamager() instanceof Player) @@ -44,7 +42,6 @@ public class DamageHandler implements Listener { } // Makes sure that if there was an attacking player, that the event is allowed for the game if (attacker != null) { - System.out.println(event.getFinalDamage() + " " + player.getDisplayName() + " " + attacker.getDisplayName()); // Cancel if one player is in the game but other isn't if ((board.contains(player) && !board.contains(attacker)) || (!board.contains(player) && board.contains(attacker))) { event.setCancelled(true); @@ -73,9 +70,9 @@ public class DamageHandler implements Listener { if (board.isSpectator(player)) { event.setCancelled(true); if (Main.getInstance().supports(18) && player.getLocation().getBlockY() < -64) { - player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + game.getCurrentMap().getGameSpawn().teleport(player); } else if (!Main.getInstance().supports(18) && player.getLocation().getY() < 0) { - player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + game.getCurrentMap().getGameSpawn().teleport(player); } return; } @@ -98,15 +95,15 @@ public class DamageHandler implements Listener { Main.getInstance().getDisguiser().reveal(player); // Teleport player to seeker spawn if(delayedRespawn){ - player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), seekerLobbyPosition.getX(), seekerLobbyPosition.getY(), seekerLobbyPosition.getZ())); + game.getCurrentMap().getGameSeekerLobby().teleport(player); player.sendMessage(messagePrefix + message("RESPAWN_NOTICE").addAmount(delayedRespawnDelay)); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> { if(game.getStatus() == Status.PLAYING){ - player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + game.getCurrentMap().getGameSpawn().teleport(player); } }, delayedRespawnDelay * 20L); } else { - player.teleport(new Location(Bukkit.getWorld(game.getGameWorld()), spawnPosition.getX(), spawnPosition.getY(), spawnPosition.getZ())); + game.getCurrentMap().getGameSpawn().teleport(player); } // Add leaderboard stats board.addDeath(player.getUniqueId()); diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java index cb8ad04..c80e83f 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/DisguiseHandler.java @@ -1,7 +1,6 @@ package net.tylermurphy.hideAndSeek.game.listener; import static com.comphenix.protocol.PacketType.Play.Client.*; -import static net.tylermurphy.hideAndSeek.configuration.Config.solidifyTime; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; @@ -42,7 +41,7 @@ public class DisguiseHandler implements Listener { if(lastLocation.getWorld() != currentLocation.getWorld()) return; double distance = lastLocation.distance(currentLocation); disguise.setSolidify(distance < .1); - }, solidifyTime); + }, 20 * 3); if(event.getFrom().distance(event.getTo()) > .1) disguise.setSolidify(false); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java index 3440780..0326391 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InteractHandler.java @@ -50,7 +50,7 @@ public class InteractHandler implements Listener { if (temp.isSimilar(lobbyStartItem) && event.getPlayer().hasPermission("hideandseek.start")) { event.setCancelled(true); - if (Main.getInstance().getGame().isNotSetup()) { + if (Main.getInstance().getGame().checkCurrentMap()) { event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP")); return; } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java index e72bea0..0f306b1 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/InventoryHandler.java @@ -19,11 +19,11 @@ package net.tylermurphy.hideAndSeek.game.listener; -import static net.tylermurphy.hideAndSeek.configuration.Config.*; - import com.cryptomorin.xseries.XMaterial; import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.command.Debug; +import net.tylermurphy.hideAndSeek.command.map.Debug; +import net.tylermurphy.hideAndSeek.configuration.Map; +import net.tylermurphy.hideAndSeek.configuration.Maps; import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -79,17 +79,23 @@ public class InventoryHandler implements Listener { private void checkForBlockHuntMenu(InventoryClickEvent event){ boolean test; + String mapName; if(Main.getInstance().supports(14)){ - test = event.getView().getTitle().equals("Select a Block"); + test = event.getView().getTitle().startsWith("Select a Block: "); + if(!test) return; + mapName = event.getView().getTitle().substring("Select a Block: ".length()); } else { - test = event.getInventory().getName().equals("Select a Block"); + test = event.getInventory().getName().startsWith("Select a Block: "); + if(!test) return; + mapName = event.getInventory().getName().substring("Select a Block: ".length()); } - if(!test) return; event.setCancelled(true); - Material mat = blockhuntBlocks.get(event.getRawSlot()); + Map map = Maps.getMap(mapName); + if(map == null) return; + Material mat = map.getBlockHunt().get(event.getRawSlot()); if(mat == null) return; Player player = (Player) event.getWhoClicked(); - Main.getInstance().getDisguiser().disguise(player, mat); + Main.getInstance().getDisguiser().disguise(player, mat, map); player.closeInventory(); } @@ -97,17 +103,23 @@ public class InventoryHandler implements Listener { public void onInventoryClose(InventoryCloseEvent event){ if (!(event.getPlayer() instanceof Player)) return; boolean test; + String mapName; if(Main.getInstance().supports(14)){ - test = event.getView().getTitle().equals("Select a Block"); + test = event.getView().getTitle().startsWith("Select a Block: "); + if(!test) return; + mapName = event.getView().getTitle().substring("Select a Block: ".length()); } else { - test = event.getInventory().getName().equals("Select a Block"); + test = event.getInventory().getName().startsWith("Select a Block: "); + if(!test) return; + mapName = event.getInventory().getName().substring("Select a Block: ".length()); } - if(!test) return; - Material mat = blockhuntBlocks.get(0); + Map map = Maps.getMap(mapName); + if(map == null) return; + Material mat = map.getBlockHunt().get(0); if(mat == null) return; Player player = (Player) event.getPlayer(); if(Main.getInstance().getDisguiser().disguised(player)) return; - Main.getInstance().getDisguiser().disguise(player, mat); + Main.getInstance().getDisguiser().disguise(player, mat, map); player.closeInventory(); } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java index 6d88ebf..d8534a3 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/JoinLeaveHandler.java @@ -4,9 +4,7 @@ import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.configuration.Items; import net.tylermurphy.hideAndSeek.game.PlayerLoader; import net.tylermurphy.hideAndSeek.game.util.Status; -import org.bukkit.Bukkit; import org.bukkit.GameMode; -import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -17,7 +15,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Config.exitPosition; +import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class JoinLeaveHandler implements Listener { @@ -28,20 +26,27 @@ public class JoinLeaveHandler implements Listener { } Main.getInstance().getBoard().remove(event.getPlayer()); removeItems(event.getPlayer()); - if (Main.getInstance().getGame().isNotSetup()) return; + if (Main.getInstance().getGame().checkCurrentMap()) return; if (autoJoin) { + if (Main.getInstance().getGame().checkCurrentMap()) { + event.getPlayer().sendMessage(errorPrefix + message("GAME_SETUP")); + return; + } Main.getInstance().getGame().join(event.getPlayer()); } else if (teleportToExit) { - if (event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld()) || event.getPlayer().getWorld().getName().equals(lobbyWorld)) { - event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); + if ( + event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getLobbyName()) || + event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName()) + ) { + exitPosition.teleport(event.getPlayer()); event.getPlayer().setGameMode(GameMode.ADVENTURE); } } else { - if (mapSaveEnabled && event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) { + if (mapSaveEnabled && event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) { if (Main.getInstance().getGame().getStatus() != Status.STANDBY && Main.getInstance().getGame().getStatus() != Status.ENDING) { Main.getInstance().getGame().join(event.getPlayer()); } else { - event.getPlayer().teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ())); + exitPosition.teleport(event.getPlayer()); event.getPlayer().setGameMode(GameMode.ADVENTURE); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java index e6e32f6..1dd6cfc 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/MovementHandler.java @@ -2,6 +2,7 @@ package net.tylermurphy.hideAndSeek.game.listener; import com.google.common.collect.Sets; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.configuration.Map; import net.tylermurphy.hideAndSeek.game.listener.events.PlayerJumpEvent; import org.bukkit.Material; import org.bukkit.event.EventHandler; @@ -12,9 +13,6 @@ import org.bukkit.event.player.PlayerMoveEvent; import java.util.Set; import java.util.UUID; -import static net.tylermurphy.hideAndSeek.configuration.Config.*; -import static net.tylermurphy.hideAndSeek.configuration.Config.saveMaxZ; - public class MovementHandler implements Listener { private final Set<UUID> prevPlayersOnGround = Sets.newHashSet(); @@ -51,10 +49,11 @@ public class MovementHandler implements Listener { private void checkBounds(PlayerMoveEvent event){ if (!Main.getInstance().getBoard().contains(event.getPlayer())) return; - if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) return; - if (!event.getTo().getWorld().getName().equals(Main.getInstance().getGame().getGameWorld())) return; + if (!event.getPlayer().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) return; + if (!event.getTo().getWorld().getName().equals(Main.getInstance().getGame().getCurrentMap().getGameSpawnName())) return; if (event.getPlayer().hasPermission("hideandseek.leavebounds")) return; - if (event.getTo().getBlockX() < saveMinX || event.getTo().getBlockX() > saveMaxX || event.getTo().getBlockZ() < saveMinZ || event.getTo().getBlockZ() > saveMaxZ) { + Map map = Main.getInstance().getGame().getCurrentMap(); + if (event.getTo().getBlockX() < map.getBoundsMin().getBlockX() || event.getTo().getBlockX() > map.getBoundsMax().getBlockX() || event.getTo().getBlockZ() < map.getBoundsMin().getZ() || event.getTo().getBlockZ() > map.getBoundsMax().getZ()) { event.setCancelled(true); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java index 1e7ba69..d34cb11 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/PlayerHandler.java @@ -2,7 +2,6 @@ package net.tylermurphy.hideAndSeek.game.listener; import net.tylermurphy.hideAndSeek.Main; import net.tylermurphy.hideAndSeek.configuration.Items; -import net.tylermurphy.hideAndSeek.game.Game; import net.tylermurphy.hideAndSeek.game.util.Status; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/listener/WorldInteractHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/WorldInteractHandler.java new file mode 100644 index 0000000..10b8e3e --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/listener/WorldInteractHandler.java @@ -0,0 +1,48 @@ +package net.tylermurphy.hideAndSeek.game.listener; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.game.Board; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.entity.EntityBreakDoorEvent; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; + +public class WorldInteractHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBlockBreak(BlockBreakEvent event) { + Player player = event.getPlayer(); + Board board = Main.getInstance().getBoard(); + if(board.contains(player)) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onHangingEntityBreakByEntity(HangingBreakByEntityEvent event) { + if (!(event.getRemover() instanceof Player)) { + return; + } + Player player = (Player) event.getRemover(); + Board board = Main.getInstance().getBoard(); + if(board.contains(player)) { + event.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBreakDoor(EntityBreakDoorEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + Player player = (Player) event.getEntity(); + Board board = Main.getInstance().getBoard(); + if(board.contains(player)) { + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java index e630070..44f19b2 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/Status.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.game.util; public enum Status { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java b/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java index f584d80..24544ba 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/game/util/WinType.java @@ -1,22 +1,3 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.game.util; public enum WinType { diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java b/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java deleted file mode 100644 index 2dda402..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/CommandHandler.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.util; - -import net.tylermurphy.hideAndSeek.command.*; -import net.tylermurphy.hideAndSeek.command.location.SetExitLocation; -import net.tylermurphy.hideAndSeek.command.location.SetLobbyLocation; -import net.tylermurphy.hideAndSeek.command.location.SetSeekerLobbyLocation; -import net.tylermurphy.hideAndSeek.command.location.SetSpawnLocation; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.Map; - -import static net.tylermurphy.hideAndSeek.configuration.Config.errorPrefix; -import static net.tylermurphy.hideAndSeek.configuration.Config.permissionsRequired; -import static net.tylermurphy.hideAndSeek.configuration.Localization.LOCAL; -import static net.tylermurphy.hideAndSeek.configuration.Localization.message; - -public class CommandHandler { - - public static final Map<String,ICommand> COMMAND_REGISTER = new LinkedHashMap<>(); - - private static void registerCommand(ICommand command) { - if (!COMMAND_REGISTER.containsKey(command.getLabel())) { - COMMAND_REGISTER.put(command.getLabel().toLowerCase(), command); - } - } - - public static void registerCommands() { - registerCommand(new About()); - registerCommand(new Help()); - registerCommand(new Setup()); - registerCommand(new Start()); - registerCommand(new Stop()); - registerCommand(new SetSpawnLocation()); - registerCommand(new SetLobbyLocation()); - registerCommand(new SetSeekerLobbyLocation()); - registerCommand(new SetExitLocation()); - registerCommand(new SetBorder()); - registerCommand(new Reload()); - registerCommand(new SaveMap()); - registerCommand(new SetBounds()); - registerCommand(new Join()); - registerCommand(new Leave()); - registerCommand(new Top()); - registerCommand(new Wins()); - registerCommand(new Debug()); - } - - public static boolean handleCommand(CommandSender sender, String[] args) { - if (!(sender instanceof Player)) { - sender.sendMessage(errorPrefix + message("COMMAND_PLAYER_ONLY")); - return true; - } - Player player = (Player) sender; - if (args.length < 1 || !COMMAND_REGISTER.containsKey(args[0].toLowerCase()) ) { - if (permissionsRequired && !sender.hasPermission("hideandseek.about")) { - sender.sendMessage(errorPrefix + LOCAL.get("")); - } else { - COMMAND_REGISTER.get("about").execute(player, null); - } - } else { - if (!args[0].equalsIgnoreCase("about") && !args[0].equalsIgnoreCase("help") && SaveMap.runningBackup) { - sender.sendMessage(errorPrefix + message("MAPSAVE_INPROGRESS")); - } else if (permissionsRequired && !sender.hasPermission("hideandseek."+args[0].toLowerCase())) { - sender.sendMessage(errorPrefix + message("COMMAND_NOT_ALLOWED")); - } else { - try { - COMMAND_REGISTER.get(args[0].toLowerCase()).execute(player,Arrays.copyOfRange(args, 1, args.length)); - } catch (Exception e) { - sender.sendMessage(errorPrefix + "An error has occurred."); - e.printStackTrace(); - } - } - } - return true; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java b/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java new file mode 100644 index 0000000..606b64b --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/Location.java @@ -0,0 +1,145 @@ +package net.tylermurphy.hideAndSeek.util; + +import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.world.VoidGenerator; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; +import org.bukkit.WorldType; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +public class Location { + + private final String world; + private final double x; + private final double y; + private final double z; + + public static Location getDefault() { + return new Location( + "", + 0.0, + 0.0, + 0.0 + ); + } + + public static Location from(Player player) { + org.bukkit.Location location = player.getLocation(); + return new Location( + player.getWorld().getName(), + location.getX(), + location.getY(), + location.getZ() + ); + } + + public Location(@NotNull String world, double x, double y, double z) { + this.world = world; + this.x = x; + this.y = y; + this.z = z; + } + + public Location(@NotNull String world, @NotNull org.bukkit.Location location) { + this.world = world; + this.x = location.getX(); + this.y = location.getY(); + this.z = location.getZ(); + } + + public World load(WorldType type, World.Environment environment) { + boolean mapSave = world.startsWith("hs_"); + World bukkitWorld = Bukkit.getWorld(world); + if(bukkitWorld != null) return bukkitWorld; + WorldCreator creator = new WorldCreator(world); + if(type != null) { + creator.type(type); + } + if(environment != null) { + creator.environment(environment); + } + if(mapSave) { + creator.generator(new VoidGenerator()); + } + Bukkit.getServer().createWorld(creator).setAutoSave(!mapSave); + return Bukkit.getWorld(world); + } + + public World load() { + if(!exists()) return null; + if(!Main.getInstance().isLoaded()) return null; + return load(null, null); + } + + private org.bukkit.Location toBukkit() { + return new org.bukkit.Location( + Bukkit.getWorld(world), + x, + y, + z + ); + } + + public void teleport(Player player) { + if(!exists()) return; + if(load() == null) return; + player.teleport(toBukkit()); + } + + public Location changeWorld(String world) { + return new Location( + world, + x, + y, + z + ); + } + + public String getWorld() { + return world; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public int getBlockX() { + return (int)x; + } + + public int getBlockY() { + return (int)y; + } + + public int getBlockZ() { + return (int)z; + } + + public boolean exists() { + if(world.equals("")) return false; + String path = Main.getInstance().getWorldContainer()+File.separator+world; + File destination = new File(path); + return destination.isDirectory(); + } + + public boolean isNotSetup() { + return getBlockX() == 0 && getBlockY() == 0 && getBlockZ() == 0; + } + + public boolean isNotInBounds(int xmin, int xmax, int zmin, int zmax) { + return getBlockX() < xmin || getBlockX() > xmax || getBlockZ() < zmin || getBlockZ() > zmax; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java b/src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java new file mode 100644 index 0000000..0aad195 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/Pair.java @@ -0,0 +1,21 @@ +package net.tylermurphy.hideAndSeek.util; + +public class Pair<L, R> { + + private final L left; + private final R right; + + public Pair(L left, R right) { + this.left = left; + this.right = right; + } + + public L getLeft() { + return left; + } + + public R getRight() { + return right; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/TabCompleter.java b/src/main/java/net/tylermurphy/hideAndSeek/util/TabCompleter.java deleted file mode 100644 index 2605e7b..0000000 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/TabCompleter.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package net.tylermurphy.hideAndSeek.util; - -import org.bukkit.command.CommandSender; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.stream.Collectors; - -public class TabCompleter { - - public static List<String> handleTabComplete(CommandSender sender, String[] args) { - if (args.length == 1) { - return new ArrayList<>(CommandHandler.COMMAND_REGISTER.keySet()) - .stream() - .filter(handle -> sender.hasPermission("hideandseek."+handle.toLowerCase()) && handle.toLowerCase().startsWith(args[0].toLowerCase(Locale.ROOT))) - .collect(Collectors.toList()); - } else if (args.length > 1) { - if (!CommandHandler.COMMAND_REGISTER.containsKey(args[0].toLowerCase())) { - return null; - } else { - String[] usage = CommandHandler.COMMAND_REGISTER.get(args[0].toLowerCase()).getUsage().split(" "); - if (args.length - 2 < usage.length) { - String parameter = usage[args.length-2]; - if (parameter.equals("<player>")) { - return null; - } else { - List<String> temp = new ArrayList<>(); - temp.add(parameter.replace("<", "").replace(">", "")); - return temp; - } - } else { - return null; - } - } - } - return null; - } - -} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java b/src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java new file mode 100644 index 0000000..5a40ff8 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/Tuple.java @@ -0,0 +1,27 @@ +package net.tylermurphy.hideAndSeek.util; + +public class Tuple<L, C, R> { + + private final L left; + private final C center; + private final R right; + + public Tuple(L left, C center, R right) { + this.left = left; + this.center = center; + this.right = right; + } + + public L getLeft() { + return left; + } + + public C getCenter() { + return center; + } + + public R getRight() { + return right; + } + +} diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java index 9293beb..4e3fc3b 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/AbstractPacket.java @@ -23,9 +23,7 @@ public class AbstractPacket { } public void send(Player player){ - try { - protocolManager.sendServerPacket(player, packet); - } catch (InvocationTargetException ignored) {} + protocolManager.sendServerPacket(player, packet); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java new file mode 100644 index 0000000..d77a227 --- /dev/null +++ b/src/main/java/net/tylermurphy/hideAndSeek/util/packet/EntityMetadataPacket.java @@ -0,0 +1,70 @@ +package net.tylermurphy.hideAndSeek.util.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.wrappers.WrappedDataValue; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.wrappers.WrappedWatchableObject; +import org.bukkit.entity.Entity; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class EntityMetadataPacket extends AbstractPacket { + + private final WrappedDataWatcher watcher; + private final WrappedDataWatcher.Serializer serializer; + + public EntityMetadataPacket(){ + super(PacketType.Play.Server.ENTITY_METADATA); + watcher = new WrappedDataWatcher(); + serializer = WrappedDataWatcher.Registry.get(Byte.class); + } + + public void setEntity(@NotNull Entity target){ + super.packet.getIntegers().write(0, target.getEntityId()); + watcher.setEntity(target); + } + + public void setGlow(boolean glowing){ + if (glowing) { + watcher.setObject(0, serializer, (byte) (0x40)); + } else { + watcher.setObject(0, serializer, (byte) (0x0)); + } + } + + public void writeMetadata() { + + // thank you to + // https://www.spigotmc.org/threads/unable-to-modify-entity-metadata-packet-using-protocollib-1-19-3.582442/ + + try { + // 1.19.3 And Up + Class.forName("com.comphenix.protocol.wrappers.WrappedDataValue"); + + final List<WrappedDataValue> wrappedDataValueList = new ArrayList<>(); + + for(final WrappedWatchableObject entry : watcher.getWatchableObjects()) { + if(entry == null) continue; + + final WrappedDataWatcher.WrappedDataWatcherObject watcherObject = entry.getWatcherObject(); + wrappedDataValueList.add( + new WrappedDataValue( + watcherObject.getIndex(), + watcherObject.getSerializer(), + entry.getRawValue() + ) + ); + } + + packet.getDataValueCollectionModifier().write(0, wrappedDataValueList); + + } catch (ClassCastException | ClassNotFoundException ignored) { + // 1.9 to 1.19.2 And Up + packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); + } + + } + +}
\ No newline at end of file diff --git a/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java b/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java index b0ce824..4f9ad0d 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/world/VoidGenerator.java @@ -1,25 +1,8 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.world; +import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.block.Biome; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; @@ -36,41 +19,27 @@ public class VoidGenerator extends ChunkGenerator { return Collections.emptyList(); } - public boolean shouldGenerateNoise() { - return false; - } - - public boolean shouldGenerateSurface() { - return false; - } - - public boolean shouldGenerateBedrock() { - return false; - } - - public boolean shouldGenerateCaves() { - return false; - } - - public boolean shouldGenerateDecorations() { - return false; + @Override + public boolean canSpawn(World world, int x, int z) { + return true; } - public boolean shouldGenerateMobs() { - return false; + @Override + public Location getFixedSpawnLocation(World world, Random random) { + return new Location(world, 0, 100, 0); } - public boolean shouldGenerateStructures() { - return false; - } + // 1.13 And Prev + public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) { + ChunkData chunkData = super.createChunkData(world); - public boolean canSpawn(@NotNull World world, int x, int z) { - return true; - } + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + biome.setBiome(x, z, Biome.PLAINS); + } + } - // 1.13 And Prev - public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { - return createChunkData(world); + return chunkData; } // 1.8 diff --git a/src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java b/src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java index 1d4ff71..e5913aa 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/world/WorldLoader.java @@ -1,27 +1,8 @@ -/* - * This file is part of Kenshins Hide and Seek - * - * Copyright (c) 2021 Tyler Murphy. - * - * Kenshins Hide and Seek free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * he Free Software Foundation version 3. - * - * Kenshins Hide and Seek 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 this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - package net.tylermurphy.hideAndSeek.world; import net.tylermurphy.hideAndSeek.Main; +import net.tylermurphy.hideAndSeek.configuration.Map; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.World; import org.bukkit.WorldCreator; @@ -32,46 +13,43 @@ import static net.tylermurphy.hideAndSeek.configuration.Config.*; import static net.tylermurphy.hideAndSeek.configuration.Localization.message; public class WorldLoader { - - private String mapName; - private String saveName; - - public WorldLoader(String mapName) { - this.mapName = mapName; - this.saveName = "hideandseek_"+ mapName; - } - public void setNewMap(String mapName){ - this.mapName = mapName; - this.saveName = "hideandseek_"+ mapName; + private final Map map; + + public WorldLoader(Map map) { + this.map = map; } public World getWorld() { - return Bukkit.getServer().getWorld(saveName); + return Bukkit.getServer().getWorld(map.getGameSpawnName()); } public void unloadMap() { - World world = Bukkit.getServer().getWorld(saveName); + World world = Bukkit.getServer().getWorld(map.getGameSpawnName()); if (world == null) { - Main.getInstance().getLogger().warning(saveName + " already unloaded."); + Main.getInstance().getLogger().warning(map.getGameSpawnName() + " already unloaded."); return; } - world.getPlayers().forEach(player -> player.teleport(new Location(Bukkit.getWorld(exitWorld), exitPosition.getX(), exitPosition.getY(), exitPosition.getZ()))); - if (Bukkit.getServer().unloadWorld(world, false)) { - Main.getInstance().getLogger().info("Successfully unloaded " + saveName); - }else{ - Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + saveName); - } + world.getPlayers().forEach(player -> exitPosition.teleport(player)); + Main.getInstance().scheduleTask(() -> { + if (Bukkit.getServer().unloadWorld(world, false)) { + Main.getInstance().getLogger().info("Successfully unloaded " + map.getGameSpawnName()); + } else { + Main.getInstance().getLogger().severe("COULD NOT UNLOAD " + map.getGameSpawnName()); + } + }); } public void loadMap() { - Bukkit.getServer().createWorld(new WorldCreator(saveName).generator(new VoidGenerator())); - World world = Bukkit.getServer().getWorld(saveName); - if (world == null) { - Main.getInstance().getLogger().severe("COULD NOT LOAD " + saveName); - return; - } - world.setAutoSave(false); + Main.getInstance().scheduleTask(() -> { + Bukkit.getServer().createWorld(new WorldCreator(map.getGameSpawnName()).generator(new VoidGenerator())); + World world = Bukkit.getServer().getWorld(map.getGameSpawnName()); + if (world == null) { + Main.getInstance().getLogger().severe("COULD NOT LOAD " + map.getGameSpawnName()); + return; + } + world.setAutoSave(false); + }); } public void rollback() { @@ -80,15 +58,15 @@ public class WorldLoader { } public String save() { - World world = Bukkit.getServer().getWorld(mapName); + World world = Bukkit.getServer().getWorld(map.getSpawnName()); if(world == null){ - throw new RuntimeException("Invalid world to save: " + mapName); + return errorPrefix + message("MAPSAVE_INVALID").addAmount(map.getSpawnName()); } - File current = new File(Main.getInstance().getWorldContainer()+File.separator+ mapName); + File current = new File(Main.getInstance().getWorldContainer()+File.separator+ map.getSpawnName()); if (current.exists()) { try { - File destination = new File(Main.getInstance().getWorldContainer()+File.separator+ saveName); - File temp_destination = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ saveName); + File destination = new File(Main.getInstance().getWorldContainer()+File.separator+ map.getGameSpawnName()); + File temp_destination = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ map.getGameSpawnName()); copyFileFolder("region",true); copyFileFolder("entities",true); copyFileFolder("datapacks",false); @@ -101,7 +79,7 @@ public class WorldLoader { } if (!temp_destination.renameTo(destination)) { - throw new RuntimeException("Failed to rename directory: "+temp_destination.getPath()); + return errorPrefix + message("MAPSAVE_FAIL_DIR").addAmount(temp_destination.getPath()); } } catch(IOException e) { e.printStackTrace(); @@ -114,8 +92,8 @@ public class WorldLoader { } private void copyFileFolder(String name, Boolean isMca) throws IOException { - File region = new File(Main.getInstance().getWorldContainer()+File.separator+ mapName +File.separator+name); - File temp = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ saveName +File.separator+name); + File region = new File(Main.getInstance().getWorldContainer()+File.separator+ map.getSpawnName() +File.separator+name); + File temp = new File(Main.getInstance().getWorldContainer()+File.separator+"temp_"+ map.getGameSpawnName() +File.separator+name); if (region.exists() && region.isDirectory()) { if (!temp.exists()) if (!temp.mkdirs()) @@ -127,10 +105,10 @@ public class WorldLoader { } for (String file : files) { if (isMca) { - int minX = (int)Math.floor(saveMinX / 512.0); - int minZ = (int)Math.floor(saveMinZ / 512.0); - int maxX = (int)Math.floor(saveMaxX / 512.0); - int maxZ = (int)Math.floor(saveMaxZ / 512.0); + int minX = (int)Math.floor(map.getBoundsMin().getX() / 512.0); + int minZ = (int)Math.floor(map.getBoundsMin().getZ() / 512.0); + int maxX = (int)Math.floor(map.getBoundsMax().getX() / 512.0); + int maxZ = (int)Math.floor(map.getBoundsMax().getZ() / 512.0); String[] parts = file.split("\\."); if (parts.length > 1) { @@ -162,7 +140,7 @@ public class WorldLoader { out.close(); } - private void deleteDirectory(File directoryToBeDeleted) { + public static void deleteDirectory(File directoryToBeDeleted) { File[] allContents = directoryToBeDeleted.listFiles(); if (allContents != null) { for (File file : allContents) { |