diff --git a/.idea/compiler.xml b/.idea/compiler.xml index ae3c66c..cc6cb9d 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -9,7 +9,7 @@ - + \ 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 da31415..cf80b36 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Commands.java +++ b/src/main/java/com/benjocraeft/sharehealth/Commands.java @@ -44,11 +44,17 @@ public class Commands implements TabExecutor { "Totem of Undying: All players need to hold it." ); putTotemCommand.apply("fraction").apply((sender, arg) -> commandSetTotemMode(sender, TotemManager.Mode.Fraction)).accept( - "Totem of Undying: At least fraction * player-count needs to hold it." + "Totem of Undying: At least fraction * player-count need to hold it." ); putTotemCommand.apply("disabled").apply((sender, arg) -> commandSetTotemMode(sender, TotemManager.Mode.Disabled)).accept( "Totem of Undying: Disabled" ); + putTotemCommand.apply("setfraction").apply(this::commandSetTotemFraction).accept( + "Totem of Undying: Set amount for mode: fraction." + ); + putTotemCommand.apply("getfraction").apply((sender, arg) -> commandGetTotemFraction(sender)).accept( + "Totem of Undying: Get amount for mode: fraction." + ); commands.put( Arrays.asList("log", "on"), Pair.pair((sender, arg) -> commandSetLogging(sender, true), "Enables Logging.") @@ -117,18 +123,28 @@ public class Commands implements TabExecutor { @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){ - List argList = Arrays.asList(args); - 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((cmdSender, arg) -> unknownCommand(cmdSender), ""); + Pair, String> command = getCommand(args); + command.first.accept(sender, args.length > 0 ? args[args.length - 1] : ""); return true; } + private Pair, String> getCommand(String[] args){ + List argList = Arrays.asList(args); + + if (commands.containsKey(argList)) + return commands.get(argList); + + if (args.length > 1){ + List argListWithoutLast = argList.subList(0, args.length - 1); + if (commands.containsKey(argListWithoutLast)) + return commands.get(argListWithoutLast); + } + + return Pair.pair((cmdSender, arg) -> unknownCommand(cmdSender), ""); + } + private void commandReset(CommandSender sender){ if (!sender.hasPermission("sharehealth.reset")){ sender.sendMessage("You don't have permissions for this command!"); @@ -166,6 +182,27 @@ public class Commands implements TabExecutor { sender.sendMessage("Set Totem mode to " + mode.name()); } + private void commandSetTotemFraction(CommandSender sender, String amountStr){ + if (!sender.hasPermission("sharehealth.totem")){ + sender.sendMessage("You don't have permissions for this command!"); + return; + } + + try { + double fraction = Double.parseDouble(amountStr); + Sharehealth.Instance.getTotemManager().setFractionNeeded(fraction); + double newValue = Sharehealth.Instance.getTotemManager().getFractionNeeded(); + sender.sendMessage("Set totem fraction value to " + newValue); + } catch (NumberFormatException e){ + sender.sendMessage("Provided value was not a number between 0.0 and 1.0!"); + } + } + + private void commandGetTotemFraction(CommandSender sender){ + double value = Sharehealth.Instance.getTotemManager().getFractionNeeded(); + sender.sendMessage("Totem fraction value: " + value); + } + private void commandSetLogging(CommandSender sender, boolean hasLogging){ if (sender instanceof Player){ if (!Sharehealth.GetPlayers().contains(sender)) @@ -184,7 +221,6 @@ public class Commands implements TabExecutor { String message = "Logging enabled: " + Sharehealth.Instance.getLogging((Player) sender); sender.sendMessage(message); } - } private void commandSendStats(CommandSender sender){ diff --git a/src/main/java/com/benjocraeft/sharehealth/Messenger.java b/src/main/java/com/benjocraeft/sharehealth/Messenger.java index 45985f9..6a514ff 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Messenger.java +++ b/src/main/java/com/benjocraeft/sharehealth/Messenger.java @@ -4,19 +4,19 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; -import org.bukkit.projectiles.BlockProjectileSource; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; +import org.bukkit.projectiles.BlockProjectileSource; 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; public class Messenger { @@ -132,17 +132,22 @@ public class Messenger { } String helpMessage(Map, Pair, String>> commands){ - StringBuilder helpMessage = new StringBuilder("Usage:"); + List lines = new ArrayList<>(); 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); + String message = "\n" + + ChatColor.AQUA + name + + ChatColor.WHITE + "-> " + description; + lines.add(message); }); - return helpMessage.toString(); + StringBuilder completeMessage = new StringBuilder("Usage:"); + for (String line : lines.stream().sorted().toList()) + completeMessage.append(line); + + return completeMessage.toString(); } private String getPlayerName(Player player){ diff --git a/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java b/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java index 8e6d014..e5a584f 100644 --- a/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java +++ b/src/main/java/com/benjocraeft/sharehealth/Sharehealth.java @@ -52,6 +52,8 @@ public class Sharehealth extends JavaPlugin { defaultStatus.put("isFailed", false); defaultStatus.put("absorptionAmount", 0.); defaultStatus.put("absorptionDuration", 0); + defaultStatus.put("totemMode", 0); + defaultStatus.put("totemFraction", 0.5); } @Override @@ -207,7 +209,7 @@ public class Sharehealth extends JavaPlugin { statistics.reset(); fileManager.saveStatistics(statistics.getStatistics()); healthManager.reset(); - Sharehealth.GetPlayers().forEach(p -> p.setGameMode(GameMode.SURVIVAL)); + GetPlayers().forEach(p -> p.setGameMode(GameMode.SURVIVAL)); saveStatus(); } @@ -244,6 +246,8 @@ public class Sharehealth extends JavaPlugin { map.put("isFailed", isFailed); map.put("absorptionAmount", healthManager.absorptionManager.amount); map.put("absorptionDuration", healthManager.absorptionManager.duration); + map.put("totemMode", totemManager.getMode().ordinal()); + map.put("totemFraction", totemManager.getFractionNeeded()); fileManager.saveStatus(map); } @@ -260,6 +264,8 @@ public class Sharehealth extends JavaPlugin { (int)map.get("absorptionDuration"), (Double)map.get("absorptionAmount") ); + totemManager.setMode(TotemManager.Mode.values()[(int)map.get("totemMode")]); + totemManager.setFractionNeeded((Double)map.get("totemFraction")); } void onLoggingUpdated(Player player, boolean hasLogging){ diff --git a/src/main/java/com/benjocraeft/sharehealth/TotemManager.java b/src/main/java/com/benjocraeft/sharehealth/TotemManager.java index 0131f4c..edcb521 100644 --- a/src/main/java/com/benjocraeft/sharehealth/TotemManager.java +++ b/src/main/java/com/benjocraeft/sharehealth/TotemManager.java @@ -17,12 +17,22 @@ public class TotemManager { public void setMode(Mode mode){ this.mode = mode; } + public Mode getMode(){ + return mode; + } //between 0 and 1 private double fractionNeeded; public void setFractionNeeded(double value){ + if (value < 0) + value = 0; + if (value > 1) + value = 1; fractionNeeded = value; } + public double getFractionNeeded() { + return fractionNeeded; + } //Determine if enough players hold a totem of undying public boolean totemCanBeUsed(){