diff --git a/src/main/java/com/benjocraeft/sharehealth/AbsorptionManager.java b/src/main/java/com/benjocraeft/sharehealth/AbsorptionManager.java index 40c5066..690edbc 100644 --- a/src/main/java/com/benjocraeft/sharehealth/AbsorptionManager.java +++ b/src/main/java/com/benjocraeft/sharehealth/AbsorptionManager.java @@ -3,7 +3,6 @@ package com.benjocraeft.sharehealth; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; public class AbsorptionManager { @@ -28,7 +27,7 @@ public class AbsorptionManager { } private void onSecond(){ - if (Bukkit.getOnlinePlayers().size() == 0) + if (Sharehealth.GetPlayers().size() == 0) return; duration -= 20; @@ -55,7 +54,7 @@ public class AbsorptionManager { amount = 0; } this.amount = amount; - List players = new ArrayList<>(Bukkit.getOnlinePlayers()); + List players = Sharehealth.GetPlayers(); players.remove(player); players.forEach(this::setAbsorption); } diff --git a/src/main/java/com/benjocraeft/sharehealth/Commands.java b/src/main/java/com/benjocraeft/sharehealth/Commands.java index bc156a3..91881a7 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Commands.java +++ b/src/main/java/com/benjocraeft/sharehealth/Commands.java @@ -1,5 +1,7 @@ package com.benjocraeft.sharehealth; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; @@ -7,39 +9,48 @@ import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; import java.util.*; +import java.util.function.BiConsumer; import java.util.function.Consumer; public class Commands implements TabExecutor { - final private Map, Pair, String>> commands = new HashMap<>(); + final private Map, Pair, String>> commands = new HashMap<>(); { commands.put( Arrays.asList("get"), - Pair.pair(this::commandGetHealth, "Displays current health value.") + Pair.pair((sender, arg) -> commandGetHealth(sender), "Displays current health value.") ); commands.put( Arrays.asList("reset"), - Pair.pair(this::commandReset, "Gives every player full health and resets 'isFailed' to false. GameMode becomes Survival.") + Pair.pair((sender, arg) -> commandReset(sender), "Gives every player full health and resets 'isFailed' to false. GameMode becomes Survival.") + ); + commands.put( + Arrays.asList("add"), + Pair.pair((sender, name) -> commandActivePlayer(sender, name, true), "Adds a player to the Plugin") + ); + commands.put( + Arrays.asList("remove"), + Pair.pair((sender, name) -> commandActivePlayer(sender, name, false), "Removes a player from the Plugin") ); commands.put( Arrays.asList("log", "on"), - Pair.pair(sender -> this.commandSetLogging(sender, true), "Enables Logging.") + Pair.pair((sender, arg) -> commandSetLogging(sender, true), "Enables Logging.") ); commands.put( Arrays.asList("log", "off"), - Pair.pair(sender -> this.commandSetLogging(sender, false), "Disables Logging.") + Pair.pair((sender, arg) -> commandSetLogging(sender, false), "Disables Logging.") ); commands.put( Arrays.asList("log", "get"), - Pair.pair(this::commandGetLogging, "Displays if Logging is enabled.") + Pair.pair((sender, arg) -> commandGetLogging(sender), "Displays if Logging is enabled.") ); commands.put( Arrays.asList("stats"), - Pair.pair(this::commandSendStats, "Displays statistics about every player.") + Pair.pair((sender, arg) -> commandSendStats(sender), "Displays statistics about every player.") ); commands.put( Arrays.asList("help"), - Pair.pair(this::commandGetHelp, "Displays help message for command usage.") + Pair.pair((sender, arg) -> commandGetHelp(sender), "Displays help message for command usage.") ); } @@ -90,10 +101,13 @@ public class Commands implements TabExecutor { public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){ List argList = Arrays.asList(args); - Pair, String> command = commands.get(argList); + Pair, String> command = commands.get(argList); + if (args.length > 1 && (args[0].equals("add") || args[0].equals("remove"))){ + command = commands.get(Arrays.asList(args[0])); + } if (command == null) - command = Pair.pair(this::unknownCommand, ""); - command.first.accept(sender); + command = Pair.pair((cmdSender, arg) -> unknownCommand(cmdSender), ""); + command.first.accept(sender, args.length > 0 ? args[args.length - 1] : ""); return true; } @@ -106,6 +120,21 @@ public class Commands implements TabExecutor { Sharehealth.Instance.reset(); } + private void commandActivePlayer(CommandSender sender, String playerName, boolean add){ + if (!sender.hasPermission("sharehealth.players")){ + sender.sendMessage("You don't have permissions for this command!"); + return; + } + UUID uuid = Bukkit.getOfflinePlayer(playerName).getUniqueId(); + if (add){ + Sharehealth.Instance.addPlayer(uuid); + sender.sendMessage("Added player " + playerName); + } else { + Sharehealth.Instance.removePlayer(uuid); + sender.sendMessage("Removed player " + playerName); + } + } + private void commandGetHealth(CommandSender sender){ String message = "Current health: " + Sharehealth.Instance.getHealthManager().getHealthString(); sender.sendMessage(message); diff --git a/src/main/java/com/benjocraeft/sharehealth/FileManager.java b/src/main/java/com/benjocraeft/sharehealth/FileManager.java index 87252ac..050e285 100644 --- a/src/main/java/com/benjocraeft/sharehealth/FileManager.java +++ b/src/main/java/com/benjocraeft/sharehealth/FileManager.java @@ -9,6 +9,7 @@ public class FileManager { final private File settingsFile; final private File statisticsFile; final private File statusFile; + final private File playersFile; final private File pluginFolder = new File(System.getProperty("user.dir"), "plugins/sharehealth"); final private String pluginPath = pluginFolder.getPath(); @@ -24,7 +25,7 @@ public class FileManager { settingsFile = new File(pluginPath + "/settings.txt"); statisticsFile = new File(pluginPath + "/statistics.txt"); statusFile = new File(pluginPath + "/status.txt"); - + playersFile = new File(pluginPath + "/players.txt"); try { if (settingsFile.createNewFile()) @@ -33,6 +34,8 @@ public class FileManager { logger.info(statisticsFile.getName() + " created"); if (statusFile.createNewFile()) logger.info(statusFile.getName() + " created"); + if (playersFile.createNewFile()) + logger.info(playersFile.getName() + " created"); } catch(IOException e){ e.printStackTrace(); } @@ -41,7 +44,7 @@ public class FileManager { public Map loadSettings(){ Map settingsMap = new HashMap<>(); - Map map = loadFromFile(settingsFile); + Map map = loadMapFromFile(settingsFile); map.forEach((String uuidString, String hasLoggingString) -> { UUID uuid = UUID.fromString(uuidString); Boolean hasLogging = Boolean.parseBoolean(hasLoggingString); @@ -50,10 +53,11 @@ public class FileManager { return settingsMap; } + public Map> loadStatistics(){ Map> statisticsMap = new HashMap<>(); - Map map = loadFromFile(statisticsFile); + Map map = loadMapFromFile(statisticsFile); map.forEach((String s1, String s2) -> { UUID uuid = UUID.fromString(s1); @@ -67,10 +71,11 @@ public class FileManager { return statisticsMap; } + public Map loadStatus(){ Map statusMap = new HashMap<>(); - Map map = loadFromFile(statusFile); + Map map = loadMapFromFile(statusFile); map.forEach((String key, String value) -> { if (value.matches("-?\\d+")) @@ -84,11 +89,18 @@ public class FileManager { return statusMap; } + public List loadPlayers(){ + Map loaded = loadMapFromFile(playersFile); + List playerUUIDs = new ArrayList<>(); + loaded.keySet().forEach(s -> playerUUIDs.add(UUID.fromString(s))); + return playerUUIDs; + } + public void saveStatistics(Map> statistics){ saveStatistics(statisticsFile, statistics); } - private void saveStatistics(File file, Map> statistics){ + private void saveStatistics(File file, Map> statistics) { Map map = new HashMap<>(); statistics.forEach((UUID uuid, Pair pair) -> { @@ -96,11 +108,11 @@ public class FileManager { map.put(uuidString, Statistics.Rounded(pair.first) + "," + Statistics.Rounded(pair.second)); }); - saveToFile(file, map); + saveMapToFile(file, map); } public void saveStatus(Map statusMap){ - saveToFile(statusFile, statusMap); + saveMapToFile(statusFile, statusMap); } public void saveSettings(Map settingsMap){ @@ -108,7 +120,15 @@ public class FileManager { settingsMap.forEach((UUID uuid, Boolean hasLogging) -> map.put(uuid.toString(), hasLogging)); - saveToFile(settingsFile, map); + saveMapToFile(settingsFile, map); + } + + public void savePlayers(List playerUUIDs){ + Map map = new HashMap<>(); + + playerUUIDs.forEach(uuid -> map.put(uuid.toString(), "")); + + saveMapToFile(playersFile, map); } public void backupStats(Map> statistics){ @@ -125,7 +145,7 @@ public class FileManager { } } - private Map loadFromFile(File file) { + private Map loadMapFromFile(File file) { Map map = new HashMap<>(); try{ @@ -136,7 +156,7 @@ public class FileManager { String line; while((line = reader.readLine()) != null){ String[] split = line.split("="); - map.put(split[0], split[1]); + map.put(split[0], split.length == 2 ? split[1] : ""); } } catch (NullPointerException ignore){} @@ -149,7 +169,7 @@ public class FileManager { return map; } - private void saveToFile(File file, Map content){ + private void saveMapToFile(File file, Map content){ try{ FileWriter stream = new FileWriter(file); BufferedWriter out = new BufferedWriter(stream); diff --git a/src/main/java/com/benjocraeft/sharehealth/FoodRegeneration.java b/src/main/java/com/benjocraeft/sharehealth/FoodRegeneration.java index cf10f47..72d9999 100644 --- a/src/main/java/com/benjocraeft/sharehealth/FoodRegeneration.java +++ b/src/main/java/com/benjocraeft/sharehealth/FoodRegeneration.java @@ -11,12 +11,12 @@ public class FoodRegeneration extends BukkitRunnable { @Override public void run(){ - int allPlayersCount = Sharehealth.GetAlivePlayers().size(); + int allPlayersCount = Sharehealth.GetPlayers().size(); if (allPlayersCount == 0) return; int allFoodPoints = 0; - for (Player p : Sharehealth.GetAlivePlayers()){ + for (Player p : Sharehealth.GetPlayers()){ allFoodPoints += p.getFoodLevel(); } diff --git a/src/main/java/com/benjocraeft/sharehealth/HealthManager.java b/src/main/java/com/benjocraeft/sharehealth/HealthManager.java index 5f7da75..24ae4ef 100644 --- a/src/main/java/com/benjocraeft/sharehealth/HealthManager.java +++ b/src/main/java/com/benjocraeft/sharehealth/HealthManager.java @@ -1,6 +1,5 @@ package com.benjocraeft.sharehealth; -import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.entity.Player; @@ -51,7 +50,7 @@ public class HealthManager { void reset(){ health = 20; - Bukkit.getOnlinePlayers().forEach(p -> p.setHealth(health)); + Sharehealth.GetPlayers().forEach(p -> p.setHealth(health)); } boolean onPlayerGotDamage(Player player, double damage, double absorptionDamage){ @@ -68,7 +67,7 @@ public class HealthManager { } void setHealthByPlayer(Player player){ - for (Player p : Sharehealth.GetAlivePlayers()){ + for (Player p : Sharehealth.GetPlayers()){ if (p.equals(player)) continue; p.setHealth(health); diff --git a/src/main/java/com/benjocraeft/sharehealth/Messenger.java b/src/main/java/com/benjocraeft/sharehealth/Messenger.java index e742712..45985f9 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Messenger.java +++ b/src/main/java/com/benjocraeft/sharehealth/Messenger.java @@ -12,10 +12,10 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; import org.bukkit.projectiles.ProjectileSource; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.logging.Logger; @@ -28,7 +28,7 @@ public class Messenger { } private List playersToSendLogs(){ - List players = new ArrayList<>(Bukkit.getOnlinePlayers()); + List players = Sharehealth.GetPlayers(); players.removeIf(p -> !Sharehealth.Instance.getLogging(p)); return players; } @@ -43,7 +43,7 @@ public class Messenger { void sendFailedMessage(Player cause){ String playerName = getPlayerName(cause); String message = "Mission failed, go next! CAUSE: " + ChatColor.RED + playerName; - Bukkit.getOnlinePlayers().forEach(p -> p.sendMessage(message)); + Sharehealth.GetPlayers().forEach(p -> p.sendMessage(message)); } void onPlayerGotDamageMessage(Player player, double damage, DamageCause cause){ @@ -131,7 +131,7 @@ public class Messenger { return stats.toString(); } - String helpMessage(Map, Pair, String>> commands){ + String helpMessage(Map, Pair, String>> commands){ StringBuilder helpMessage = new StringBuilder("Usage:"); commands.forEach((nameList, pair) -> { StringBuilder name = new StringBuilder(); diff --git a/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java b/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java index 2f9a661..275208a 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java +++ b/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java @@ -17,6 +17,7 @@ public class Sharehealth extends JavaPlugin { static Sharehealth Instance; private FileManager fileManager; + public FileManager getFileManager(){ return fileManager; } @@ -66,9 +67,12 @@ public class Sharehealth extends JavaPlugin { statistics = new Statistics(fileManager.loadStatistics(), fileManager.loadSettings()); getLogger().info("Statistics and Settings loaded"); + //Load status (current health, absorption, etc) loadStatus(); getLogger().info("Status loaded"); + //Load players + ActiveUUIDs = fileManager.loadPlayers(); //Starts custom health regeneration new FoodRegeneration(); @@ -171,7 +175,7 @@ public class Sharehealth extends JavaPlugin { return; isFailed = true; messenger.sendFailedMessage(cause); - Bukkit.getOnlinePlayers().forEach(p -> p.setGameMode(GameMode.SPECTATOR)); + GetPlayers().forEach(p -> p.setGameMode(GameMode.SPECTATOR)); saveStatus(); } @@ -182,7 +186,7 @@ public class Sharehealth extends JavaPlugin { statistics.reset(); fileManager.saveStatistics(statistics.getStatistics()); healthManager.reset(); - Bukkit.getOnlinePlayers().forEach(p -> p.setGameMode(GameMode.SURVIVAL)); + Sharehealth.GetPlayers().forEach(p -> p.setGameMode(GameMode.SURVIVAL)); saveStatus(); } @@ -195,10 +199,21 @@ public class Sharehealth extends JavaPlugin { } } - static List GetAlivePlayers(){ - List list = new ArrayList<>(Bukkit.getOnlinePlayers()); - list.removeIf(Entity::isDead); - return list; + private static List ActiveUUIDs = new ArrayList<>(); + static List GetPlayers(){ + List players = new ArrayList<>(Bukkit.getOnlinePlayers()); + players.removeIf(p -> !ActiveUUIDs.contains(p.getUniqueId())); + return players; + } + + public void addPlayer(UUID uuid){ + ActiveUUIDs.add(uuid); + fileManager.savePlayers(ActiveUUIDs); + } + + public void removePlayer(UUID uuid){ + ActiveUUIDs.remove(uuid); + fileManager.savePlayers(ActiveUUIDs); } void saveStatus(){ diff --git a/src/main/java/com/benjocraeft/sharehealth/Statistics.java b/src/main/java/com/benjocraeft/sharehealth/Statistics.java index e790099..748061d 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Statistics.java +++ b/src/main/java/com/benjocraeft/sharehealth/Statistics.java @@ -1,6 +1,5 @@ package com.benjocraeft.sharehealth; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.HashMap; @@ -59,7 +58,7 @@ public class Statistics { void reset(){ statistics.clear(); - Bukkit.getOnlinePlayers().forEach(this::putIfAbsent); + Sharehealth.GetPlayers().forEach(this::putIfAbsent); } }