diff --git a/.gitignore b/.gitignore index 4788b4b..3851cbc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # User-specific stuff -.idea/ +.idea/* +!*/.idea/libraries/spigot.xml *.iml *.ipr @@ -110,4 +111,4 @@ buildNumber.properties .flattened-pom.xml # Common working directory -run/ +run/ \ No newline at end of file diff --git a/.idea/libraries/spigot.xml b/.idea/libraries/spigot.xml new file mode 100644 index 0000000..183b9fb --- /dev/null +++ b/.idea/libraries/spigot.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/deploy.bat b/deploy.bat index 60eeadd..661b3b9 100644 --- a/deploy.bat +++ b/deploy.bat @@ -1 +1 @@ -xcopy IntelliJ_IDEA\Sharehealth\target\Sharehealth.jar Minecraft_Servers\Server_1.16.4\plugins\ /Y \ No newline at end of file +xcopy IntelliJ_IDEA\Sharehealth\target\Sharehealth.jar Minecraft_Servers\Server_1.16.1\plugins\ /Y \ No newline at end of file diff --git a/deploy.sh b/deploy.sh index a5b65b5..459f1b6 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1 +1 @@ -cp IntelliJ_IDEA/Sharehealth_1.16.4/target/sharehealth-1.0-SNAPSHOT.jar Minecraft_Servers/Server_1.16.4/plugins/ +cp IntelliJ_IDEA/Sharehealth_1.16.1/target/Sharehealth.jar Minecraft_Servers/Server_1.16.1/plugins/ diff --git a/plugin.yml b/plugin.yml index 16d6899..8c035d3 100644 --- a/plugin.yml +++ b/plugin.yml @@ -8,6 +8,5 @@ website: https://mc.benjocraeft.com commands: sharehealth: - usage: / aliases: [sh] - description: Defined by ShareHealth plugin \ No newline at end of file + 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 ca48f2a..51e45be 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Commands.java +++ b/src/main/java/com/benjocraeft/sharehealth/Commands.java @@ -1,133 +1,118 @@ package com.benjocraeft.sharehealth; -import org.bukkit.command.CommandExecutor; -import org.apache.commons.lang.math.NumberUtils; +import io.netty.util.concurrent.ImmediateEventExecutor; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; -public class Commands implements CommandExecutor { +import java.util.*; +import java.util.function.Consumer; - @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){ +public class Commands implements TabExecutor { - 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); - } + final private String[] mainSchema = { + "get", "reset", "log", "stats", "help" + }; + final private String[] hasSecondSchema = { + "log" + }; + + final private String[][] secondSchema = { + { + "on", "off" } - 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); + }; + + 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<>(); + + if (strings.length == 1){ + StringUtil.copyPartialMatches(strings[0], Arrays.asList(mainSchema), list); + } + if (strings.length == 2){ + List hasSecondSchemaList = Arrays.asList(hasSecondSchema); + if (hasSecondSchemaList.contains(strings[0])){ + int index = hasSecondSchemaList.indexOf(strings[0]); + List checkList = Arrays.asList(secondSchema[index]); + StringUtil.copyPartialMatches(strings[1], checkList, list); + } } - return true; + return list; } - private void commandSetMaxHealth(double health){ + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){ - } + List argList = Arrays.asList(args); + Pair, String> command = commands.get(argList); + if (command == null) + command = Pair.pair(this::unknownCommand, ""); + command.first.accept(sender); - private void commandSetHealth(double health, boolean reset){ - Sharehealth.Instance.getHealthManager().setHealth(health); - if (reset){ - Sharehealth.Instance.reset(); - } + return true; } - 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()); - } - - private void commandGetMaxHealth(CommandSender sender, boolean raw){ - + String message = "Current health: " + Sharehealth.Instance.getHealthManager().getHealthString(); + sender.sendMessage(message); } - 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(); + } + } diff --git a/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java b/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java index a22ae22..fe8d572 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java +++ b/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java @@ -2,6 +2,7 @@ package com.benjocraeft.sharehealth; import org.bukkit.*; import org.bukkit.block.Block; +import org.bukkit.command.PluginCommand; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; @@ -60,7 +61,10 @@ public class Sharehealth extends JavaPlugin { //Register Events and Commands Bukkit.getPluginManager().registerEvents(new PlayerListeners(), this); - Objects.requireNonNull(getCommand("sharehealth")).setExecutor(new Commands()); + Commands commands = new Commands(); + PluginCommand pluginCommand = Objects.requireNonNull(getCommand("sharehealth")); + pluginCommand.setExecutor(commands); + pluginCommand.setTabCompleter(commands); //Ready to go getLogger().info("ShareHealth has been enabled!"); diff --git a/start_server.bat b/start_server.bat new file mode 100644 index 0000000..16a4d5f --- /dev/null +++ b/start_server.bat @@ -0,0 +1,2 @@ +cd Server_1.16.1 +call start.bat \ No newline at end of file