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