diff --git a/plugin.yml b/plugin.yml index 5f6807a..8c035d3 100644 --- a/plugin.yml +++ b/plugin.yml @@ -8,6 +8,5 @@ website: https://mc.benjocraeft.com commands: sharehealth: - usage: / aliases: [sh] description: Commands to control the Sharehealth System added by the Plugin \ No newline at end of file diff --git a/src/main/java/com/benjocraeft/sharehealth/Commands.java b/src/main/java/com/benjocraeft/sharehealth/Commands.java index 04a99ea..51e45be 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Commands.java +++ b/src/main/java/com/benjocraeft/sharehealth/Commands.java @@ -1,6 +1,6 @@ package com.benjocraeft.sharehealth; -import org.apache.commons.lang3.math.NumberUtils; +import io.netty.util.concurrent.ImmediateEventExecutor; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; @@ -9,31 +9,53 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; +import java.util.function.Consumer; public class Commands implements TabExecutor { final private String[] mainSchema = { - "get", "set", "reset", "log" + "get", "reset", "log", "stats", "help" }; final private String[] hasSecondSchema = { - "log", - "get" + "log" }; final private String[][] secondSchema = { { "on", "off" - }, - { - "max" } }; + final private Map, Pair, String>> commands = new HashMap<>(); + { + commands.put( + Arrays.asList("get"), + Pair.pair(this::commandGetHealth, "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.") + ); + commands.put( + Arrays.asList("log", "on"), + Pair.pair(sender -> this.commandSetLogging(sender, true), "Activates permanent player Logging about Damage and Healing.") + ); + commands.put( + Arrays.asList("log", "off"), + Pair.pair(sender -> this.commandSetLogging(sender, false), "Deactivates permanent player Logging about Damage and Healing.") + ); + commands.put( + Arrays.asList("stats"), + Pair.pair(this::commandSendStats, "Displays statistics about every player.") + ); + commands.put( + Arrays.asList("help"), + Pair.pair(this::commandGetHelp, "Displays help message for command usage.") + ); + } + @Override public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) { List list = new ArrayList<>(); @@ -50,127 +72,47 @@ public class Commands implements TabExecutor { } } - return list; } @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){ - if (args.length != 0){ - if (args[0].equalsIgnoreCase("reset")){ - commandSetHealth(20, true); - } - else if (args[0].equalsIgnoreCase("set")){ - if (args.length > 1){ - if (NumberUtils.isNumber(args[1])){ - double num = NumberUtils.createDouble(args[1]); - commandSetHealth(num); - } else if (args[1].equalsIgnoreCase("max")){ - if (args.length > 2){ - if (NumberUtils.isNumber(args[2])){ - double num = NumberUtils.createDouble(args[2]); - commandSetMaxHealth(num); - } - } - } - } - } - else if (args[0].equalsIgnoreCase("get")){ - if (args.length > 1){ - if (args[1].equalsIgnoreCase("max")){ - if (args.length > 2){ - if (args[2].equalsIgnoreCase("raw")){ - commandGetMaxHealth(sender, true); - } - } else { - commandGetMaxHealth(sender, false); - } - } - } else { - commandGetHealth(sender); - } - - } - else if (args[0].equalsIgnoreCase("log")){ - if (args.length > 1){ - if (args[1].equalsIgnoreCase("off")){ - commandSetLogging(false); - } - if (args[1].equalsIgnoreCase("on")){ - commandSetLogging(true); - } - } - } - else if(args[0].equalsIgnoreCase("stats")){ - commandSendStats(); - } - else if (args[0].equalsIgnoreCase("help")){ - commandGetHelp(sender); - } else { - unknownCommand(sender); - } - } else { - commandGetHelp(sender); - } + List argList = Arrays.asList(args); + Pair, String> command = commands.get(argList); + if (command == null) + command = Pair.pair(this::unknownCommand, ""); + command.first.accept(sender); return true; } - private void commandSetMaxHealth(double health){ - - } - - private void commandSetHealth(double health, boolean reset){ - Sharehealth.Instance.getHealthManager().setHealth(health); - if (reset){ - Sharehealth.Instance.reset(); - } - } - - private void commandSetHealth(double health){ - commandSetHealth(health, false); + private void commandReset(CommandSender sender){ + Sharehealth.Instance.reset(); } private void commandGetHealth(CommandSender sender){ - sender.sendMessage("Current health: " + Sharehealth.Instance.getHealthManager().getHealthString()); + String message = "Current health: " + Sharehealth.Instance.getHealthManager().getHealthString(); + sender.sendMessage(message); } - private void commandGetMaxHealth(CommandSender sender, boolean raw){ - - } - - private void commandSetLogging(boolean log){ + private void commandSetLogging(CommandSender sender, boolean log){ Sharehealth.Instance.getMessenger().setLogging(log); + //TODO Set by user } - private void commandSendStats(){ - StringBuilder stats = new StringBuilder("Statistics:\n"); - Sharehealth.Instance.getStatistics().getStatistics().forEach(((uuid, values) -> { - Player player = Bukkit.getPlayer(uuid); - if (player != null){ - String playerName = player.getDisplayName(); - String stat = ChatColor.AQUA + playerName + ChatColor.WHITE + - ": Damage caused: " + ChatColor.RED + String.format("%.2f", values.first) + ChatColor.WHITE + - " Healing done: " + ChatColor.GREEN + String.format("%.2f", values.second) + "\n"; - stats.append(stat); - } - })); - Bukkit.getOnlinePlayers().forEach((Player p) -> p.sendMessage(stats.toString())); + private void commandSendStats(CommandSender sender){ + String message = Sharehealth.Instance.getMessenger().statisticsMessage(); + sender.sendMessage(message); } private void commandGetHelp(CommandSender sender){ - String help = "Usage:\n" + - "get -> returns current globally shared health\n" + - "set [number] -> sets new globally shared health\n" + - "reset -> heals every player and resets 'isFailed' to false\n" + - "log [on/off] -> activates/deactivates player log messages about damage and healings" + - "stats -> sends everyone statistics for every player"; - sender.sendMessage(help); + String message = Sharehealth.Instance.getMessenger().helpMessage(commands); + sender.sendMessage(message); } private void unknownCommand(CommandSender sender){ - String msg = "Unknown command, use help."; - sender.sendMessage(msg); + String message = "Unknown command. Type \"/sh help\" for help."; + sender.sendMessage(message); } } diff --git a/src/main/java/com/benjocraeft/sharehealth/Messenger.java b/src/main/java/com/benjocraeft/sharehealth/Messenger.java index c03f5a7..01f5de3 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Messenger.java +++ b/src/main/java/com/benjocraeft/sharehealth/Messenger.java @@ -2,17 +2,18 @@ package com.benjocraeft.sharehealth; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.GameMode; import org.bukkit.block.Block; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; -import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; +import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Consumer; import java.util.logging.Logger; public class Messenger { @@ -36,10 +37,8 @@ public class Messenger { } void sendFailedMessage(Player cause){ - Bukkit.getOnlinePlayers().forEach(p -> { - String message = "Mission failed, go next! CAUSE: " + ChatColor.RED + cause.getDisplayName(); - p.sendMessage(message); - }); + String message = "Mission failed, go next! CAUSE: " + ChatColor.RED + cause.getDisplayName(); + Bukkit.getOnlinePlayers().forEach(p -> p.sendMessage(message)); } void onPlayerGotDamageMessage(Player player, double damage, DamageCause cause){ @@ -63,15 +62,6 @@ public class Messenger { Bukkit.getOnlinePlayers().forEach(p -> p.sendMessage(message)); } - private String damageMessage(Player player, double damage){ - String playerS = player.getDisplayName(); - String damageS = String.format("%.2f", damage / 2); - return ChatColor.AQUA + playerS - + ChatColor.WHITE + " shared " - + ChatColor.RED + damageS - + ChatColor.WHITE + " hearts damage!"; - } - private String damageMessage(Player player, double damage, DamageCause cause){ return damageMessage(player, damage) + ChatColor.YELLOW + " Cause: " + cause; } @@ -96,15 +86,55 @@ public class Messenger { return damageMessage(player, damage) + ChatColor.YELLOW + " Block: " + name; } + private String damageMessage(Player player, double damage){ + String playerS = player.getDisplayName(); + String damageS = String.format("%.2f", damage / 2); + return ChatColor.BLUE + playerS + + ChatColor.WHITE + " shared " + + ChatColor.RED + damageS + + ChatColor.WHITE + " hearts damage!"; + } + private String healMessage(Player player, double regainedHealth, RegainReason reason){ String playerS = player.getDisplayName(); - String healingS = Double.toString(regainedHealth / 2); + String healingS = String.format("%.2f", regainedHealth / 2); String causeS = reason.toString(); - return ChatColor.AQUA + playerS + return ChatColor.BLUE + playerS + ChatColor.WHITE + " shared " + ChatColor.GREEN + healingS + ChatColor.WHITE + " hearts healing!" + ChatColor.YELLOW + " Cause: " + causeS; } + String statisticsMessage(){ + StringBuilder stats = new StringBuilder("Statistics:"); + Sharehealth.Instance.getStatistics().getStatistics().forEach(((uuid, values) -> { + Player currentPlayer = Bukkit.getPlayer(uuid); + if (currentPlayer != null){ + String playerName = currentPlayer.getDisplayName(); + String stat = "\n" + ChatColor.BLUE + playerName + + ChatColor.WHITE + ": Damage caused: " + + ChatColor.RED + String.format("%.2f", values.first / 2) + + ChatColor.WHITE + " || Healing done: " + + ChatColor.GREEN + String.format("%.2f", values.second / 2); + stats.append(stat); + } + })); + return stats.toString(); + } + + String helpMessage(Map, Pair, String>> commands){ + StringBuilder helpMessage = new StringBuilder("Usage:"); + commands.forEach((nameList, pair) -> { + StringBuilder name = new StringBuilder(); + nameList.forEach(str -> name.append(str).append(" ")); + + String description = pair.second; + helpMessage.append("\n"). + append(ChatColor.AQUA).append(name). + append(ChatColor.WHITE).append("-> ").append(description); + }); + return helpMessage.toString(); + } + }