diff --git a/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java b/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java index 2dd81f5..5c0bb37 100644 --- a/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java +++ b/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java @@ -1,8 +1,11 @@ package dev.zxq5.fantasysmp; +import dev.zxq5.fantasysmp.events.Chat; import dev.zxq5.fantasysmp.events.HereticWarner; import dev.zxq5.fantasysmp.events.StevenKillCheck; import dev.zxq5.fantasysmp.events.XrayDetector; +import dev.zxq5.fantasysmp.groups.Commands; +import dev.zxq5.fantasysmp.groups.Team; import dev.zxq5.fantasysmp.items.*; import dev.zxq5.fantasysmp.warps.Warp; import dev.zxq5.fantasysmp.warps.Warper; @@ -19,6 +22,7 @@ public final class Fantasysmp extends JavaPlugin { try { Warp.loadWarps(); + Team.loadTeams(); } catch (Exception e) { e.printStackTrace(); } @@ -30,6 +34,9 @@ public final class Fantasysmp extends JavaPlugin { getCommand("warp").setExecutor(new Warper()); getCommand("rewarps").setExecutor(new Warper()); getCommand("warps").setExecutor(new Warper()); + getCommand("team").setExecutor(new Commands()); + + getServer().getPluginManager().registerEvents(new Chat(), this); getServer().getPluginManager().registerEvents(new StevenKillCheck(), this); @@ -42,6 +49,11 @@ public final class Fantasysmp extends JavaPlugin { @Override public void onDisable() { - // Plugin shutdown logic + try { + Warp.saveWarps(); + Team.saveTeams(); + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/dev/zxq5/fantasysmp/events/Chat.java b/src/main/java/dev/zxq5/fantasysmp/events/Chat.java new file mode 100644 index 0000000..c4be163 --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/events/Chat.java @@ -0,0 +1,16 @@ +package dev.zxq5.fantasysmp.events; + +import dev.zxq5.fantasysmp.groups.Team; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class Chat implements Listener { + @EventHandler + public void onChat(org.bukkit.event.player.AsyncPlayerChatEvent event) { + Team team = Team.fromMember(event.getPlayer()); + if (team != null) { + event.setFormat(ChatColor.WHITE + "[" + team.getTag() + ChatColor.WHITE + "]" + ChatColor.RESET + " <%s> %s"); + } + } +} diff --git a/src/main/java/dev/zxq5/fantasysmp/groups/Commands.java b/src/main/java/dev/zxq5/fantasysmp/groups/Commands.java index 4b86534..cec0523 100644 --- a/src/main/java/dev/zxq5/fantasysmp/groups/Commands.java +++ b/src/main/java/dev/zxq5/fantasysmp/groups/Commands.java @@ -62,6 +62,7 @@ public class Commands implements CommandExecutor { case "disband" -> this.handleDisband(player, args); case "setwarp" -> this.handleSetWarp(player, args); case "delwarp" -> this.handleDelWarp(player, args); + case "colour" -> this.handleSetColour(player, args); case "warp" -> this.handleWarp(player, args); case "kick" -> this.handleKick(player, args); case "log" -> this.handleLog(player, args); @@ -99,6 +100,18 @@ public class Commands implements CommandExecutor { Team.createTeam(player, args[1]); } + public void handleSetColour(Player player, String[] args) { + if (args.length != 2) { + Chat.error(player, "Usage: /team colour "); + return; + } + + Team team = Team.fromMember(player); + if (team == null) return; + + team.setColour(player, args[1]); + } + public void handleRename(Player player, String[] args) { if (args.length != 2) { Chat.error(player, "Usage: /team rename "); @@ -110,7 +123,10 @@ public class Commands implements CommandExecutor { return; } - Team.renameTeam(player, args[1]); + Team team = Team.fromMember(player); + if (team == null) return; + + team.renameTeam(player, args[1]); } public void handleSetTag(Player player, String[] args) { @@ -119,10 +135,16 @@ public class Commands implements CommandExecutor { return; } - if (args[1].length < 3 || args[1].contains(" ") || args[1].contains("\t") || args.length > 8) { + if (args[1].length() < 3 || args[1].contains(" ") || args[1].contains("\t") || args[1].length() > 8) { Chat.error(player, "Invalid tag!"); Chat.error(player, "tags should be 3-8 chars, alphanumeric and have no spaces"); + return; } + + Team team = Team.fromMember(player); + if (team == null) return; + + team.changeTeamTag(player, args[1]); } public void handleTransfer(Player player, String[] args) { @@ -151,8 +173,10 @@ public class Commands implements CommandExecutor { Chat.error(player, "Usage: /team leave"); return; } + Team team = Team.fromMember(player); + if (team == null) return; - Team.leaveTeam(player); + team.leaveTeam(player); } public void handleDisband(Player player, String[] args) { @@ -160,8 +184,10 @@ public class Commands implements CommandExecutor { Chat.error(player, "Usage: /team disband"); return; } + Team team = Team.fromMember(player); + if (team == null) return; - Team.disbandTeam(player); + team.disbandTeam(player); } public void handleSetWarp(Player player, String[] args) { @@ -183,6 +209,8 @@ public class Commands implements CommandExecutor { return; } Team team = Team.fromMember(player); + if (team == null) return; + Warp warp = Warp.getTeamWarp(team, args[1]); } @@ -191,8 +219,10 @@ public class Commands implements CommandExecutor { Chat.error(player, "Usage: /team kick "); return; } + Team team = Team.fromMember(player); + if (team == null) return; - Team.removePlayer(player, args[1]); + team.removePlayer(player, args[1]); } public void handleLog(Player player, String[] args) { @@ -201,7 +231,10 @@ public class Commands implements CommandExecutor { return; } - ArrayList logs = Team.getLogs(player); + Team team = Team.fromMember(player); + if (team == null) return; + + ArrayList logs = team.getLogs(player); String result = "Logs: [\n " + String.join("\n ", logs) + "\n]"; Chat.info(player, result); } diff --git a/src/main/java/dev/zxq5/fantasysmp/groups/Team.java b/src/main/java/dev/zxq5/fantasysmp/groups/Team.java index 620b395..2db1658 100644 --- a/src/main/java/dev/zxq5/fantasysmp/groups/Team.java +++ b/src/main/java/dev/zxq5/fantasysmp/groups/Team.java @@ -3,16 +3,19 @@ package dev.zxq5.fantasysmp.groups; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import dev.zxq5.fantasysmp.chatutils.Chat; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; import java.io.*; import java.util.ArrayList; import java.util.UUID; +import static org.bukkit.Bukkit.broadcastMessage; import static org.bukkit.Bukkit.getServer; public class Team { private static ArrayList teams; + private final static String FILENAME = "teams.json"; private String name; private String ownerUUID; @@ -27,12 +30,21 @@ public class Team { this.teamUUID = UUID.randomUUID().toString(); this.ownerUUID = creator.getUniqueId().toString(); this.members = new ArrayList<>(); + this.logs = new ArrayList<>(); members.add(creator.getUniqueId().toString()); } public static Team createTeam(Player creator, String name) { + if (Team.fromMember(creator) != null) { + Team.error(creator, Error.SELF_IN_TEAM); + return null; + } + Team team = new Team(creator, name, name); + team.logs.add(creator.getName() + " created the team."); teams.add(team); + + Chat.success(creator, "You created " + team.name + "."); return team; } @@ -40,6 +52,8 @@ public class Team { for (Team team : teams) { if (team.members.contains(member.getUniqueId().toString())) return team; } + + Team.error(member, Error.TEAM_NOT_FOUND); return null; } @@ -51,111 +65,166 @@ public class Team { return names; } - public static void renameTeam(Player player, String newName) { - for (Team team : teams) { - if (!team.ownerUUID.equals(player.getUniqueId().toString())) continue; - - team.name = newName; - team.log(player.getName() + " renamed the team to " + newName + "."); + public void renameTeam(Player player, String newName) { + if (!this.ownerUUID.equals(player.getUniqueId().toString())) { + Team.error(player, Error.NO_PERMISSION); return; } + + String oldName = this.name; + this.name = newName; + this.log(player.getName() + " renamed the team to " + newName + "."); + + Chat.success(player, "You renamed " + oldName + " to " + newName + "."); } - public static void transferTeam(Player player, String playerName) { + public void changeTeamTag(Player player, String newTag) { + if (!this.ownerUUID.equals(player.getUniqueId().toString())) { + Team.error(player, Error.NO_PERMISSION); + return; + } + + this.tag = newTag; + this.log(player.getName() + " changed the team tag to " + newTag + "."); + + Chat.success(player, "You changed the tag of " + this.name + " to " + newTag + "."); + } + + public void setColour (Player player, String colour) { + if (!this.ownerUUID.equals(player.getUniqueId().toString())) { + Team.error(player, Error.NO_PERMISSION); + return; + } + + switch (colour) { + case "red" -> this.tag = ChatColor.RED + this.tag; + case "green" -> this.tag = ChatColor.GREEN + this.tag; + case "blue" -> this.tag = ChatColor.BLUE + this.tag; + case "yellow" -> this.tag = ChatColor.YELLOW + this.tag; + case "aqua" -> this.tag = ChatColor.AQUA + this.tag; + case "dark_aqua" -> this.tag = ChatColor.DARK_AQUA + this.tag; + case "dark_blue" -> this.tag = ChatColor.DARK_BLUE + this.tag; + case "dark_gray" -> this.tag = ChatColor.DARK_GRAY + this.tag; + case "dark_green" -> this.tag = ChatColor.DARK_GREEN + this.tag; + case "dark_purple" -> this.tag = ChatColor.DARK_PURPLE + this.tag; + case "gold" -> this.tag = ChatColor.GOLD + this.tag; + case "gray" -> this.tag = ChatColor.GRAY + this.tag; + case "light_purple" -> this.tag = ChatColor.LIGHT_PURPLE + this.tag; + case "white" -> this.tag = ChatColor.WHITE + this.tag; + case "black" -> this.tag = ChatColor.BLACK + this.tag; + } + + this.log(player.getName() + " changed the team colour to " + colour + "."); + Chat.success(player, "You changed the colour of " + this.name + " to " + colour + "."); + } + + public void transferTeam(Player player, String playerName) { + if (!this.ownerUUID.equals(player.getUniqueId().toString())) { + Team.error(player, Error.NO_PERMISSION); + return; + } + Player newOwner = getServer().getPlayer(playerName); - for (Team team : teams) { - if (!team.ownerUUID.equals(player.getUniqueId().toString())) continue; - - team.ownerUUID = newOwner.getUniqueId().toString(); - team.log(player.getName() + " transferred ownership to " + newOwner.getName() + "."); + if (newOwner == null) { + Team.error(player, Error.PLAYER_NOT_FOUND); return; } + + String newUUID = newOwner.getUniqueId().toString(); + if (!this.members.contains(newUUID)) { + Team.error(player, Error.PLAYER_NOT_FOUND); + return; + } + + this.ownerUUID = newUUID; + this.log(player.getName() + " transferred ownership to " + newOwner.getName() + "."); + + Chat.success(player, "You transferred ownership of " + this.name + " to " + newOwner.getName() + "."); } - public static void removePlayer(Player remover, String playerName) { + public void removePlayer(Player remover, String playerName) { Player removedPlayer = getServer().getPlayer(playerName); if (removedPlayer == null) { - Chat.error(remover, "Player not found!"); + Team.error(remover, Error.PLAYER_NOT_FOUND); return; } String removerUUID = remover.getUniqueId().toString(); String removedPlayerUUID = removedPlayer.getUniqueId().toString(); - for (Team team : teams) { - if (!team.members.contains(removerUUID)) continue; - - if (!team.ownerUUID.equals(removerUUID)) { - Chat.error(remover, "You do not have permission to remove players from this team."); - return; - } - - if (!team.members.contains(removedPlayerUUID)) { - Chat.error(remover, "This player is not in your team."); - return; - } - - if (removedPlayerUUID.equals(team.ownerUUID)) { - Chat.error(remover, "You cannot remove yourself!"); - return; - } - - team.members.remove(removedPlayerUUID); - team.log(remover.getName() + " removed " + removedPlayer.getName() + " from the team."); + if (removedPlayerUUID.equals(this.ownerUUID)) { + Team.error(remover, Error.TEAM_OWNER); return; } - } - public static void leaveTeam(Player player) { - for (Team team : teams) { - if (!team.members.contains(player.getUniqueId().toString())) continue; - if (team.ownerUUID.equals(player.getUniqueId().toString())) { - player.sendMessage("You cannot leave a team that you own!"); - } - - team.members.remove(player.getUniqueId().toString()); - team.log(player.getName() + " left the team."); + if (!this.ownerUUID.equals(removerUUID)) { + Team.error(remover, Error.NO_PERMISSION); return; } - } - public static void disbandTeam(Player player) { - for (Team team : teams) { - if (!team.ownerUUID.equals(player.getUniqueId().toString())) continue; - - teams.remove(team); - team.log(player.getName() + " disbanded the team."); + if (!this.members.contains(removedPlayerUUID)) { + Team.error(remover, Error.PLAYER_NOT_FOUND); return; } + + this.members.remove(removedPlayerUUID); + this.log(remover.getName() + " removed " + removedPlayer.getName() + " from the team."); + + Chat.success(remover, "You removed " + removedPlayer.getName() + " from " + this.name + "."); } - public static void addMember(Player player) { - for (Team team : teams) { - if (!team.ownerUUID.equals(player.getUniqueId().toString())) continue; - - team.members.add(player.getUniqueId().toString()); - team.log(player.getName() + " joined the team."); + public void leaveTeam(Player member) { + if (this.ownerUUID.equals(member.getUniqueId().toString())) { + Team.error(member, Error.TEAM_OWNER); return; } + + this.members.remove(member.getUniqueId().toString()); + this.log(member.getName() + " left the team."); + + Chat.success(member, "You left " + this.name + "."); } - public static ArrayList getLogs(Player player) { - for (Team team : teams) { - if (team.ownerUUID.equals(player.getUniqueId().toString())) { - return team.logs; - } + public void disbandTeam(Player member) { + if (!this.ownerUUID.equals(member.getUniqueId().toString())) { + Team.error(member, Error.NO_PERMISSION); + return; } + + teams.remove(this); + this.log(member.getName() + " disbanded the team."); + + Chat.success(member, "You disbanded " + this.name + "."); + } + + public void addMember(Player member) { + if (!this.ownerUUID.equals(member.getUniqueId().toString())) { + Team.error(member, Error.NO_PERMISSION); + return; + } + + this.members.add(member.getUniqueId().toString()); + this.log(member.getName() + " joined the team."); + + Chat.success(member, "You joined " + this.name + "."); + } + + public ArrayList getLogs(Player member) { + if (this.ownerUUID.equals(member.getUniqueId().toString())) return this.logs; + + Team.error(member, Error.NO_PERMISSION); return null; } public void log(String message) { this.logs.add(message); + Team.saveTeams(); } public static void loadTeams() throws Exception { File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); - File file = new File(dataFolder, "warps.json"); + File file = new File(dataFolder, FILENAME); if (!file.exists()) { createTeamsFile(); @@ -170,20 +239,26 @@ public class Team { reader.close(); } - public static void saveTeams() throws Exception { + public static void saveTeams() { File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); - File file = new File(dataFolder, "teams.json"); + File file = new File(dataFolder, FILENAME); Gson gson = new Gson(); String json = gson.toJson(teams); - Writer writer = new FileWriter(file); - writer.write(json); - writer.close(); + + try { + Writer writer = new FileWriter(file); + writer.write(json); + writer.close(); + } catch (Exception e) { + broadcastMessage("Error saving teams. Please contact an admin."); + e.printStackTrace(); + } } public static void createTeamsFile() { File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); - File file = new File(dataFolder, "teams.json"); + File file = new File(dataFolder, FILENAME); if (!file.exists()) { try { @@ -202,4 +277,32 @@ public class Team { public String getUUID() { return this.teamUUID; } + + public String getTag() { + return this.tag; + } + + public static void error(Player player, Error error) { + Chat.error(player, switch (error) { + case NO_PERMISSION -> "You do not have permission to do that!"; + case SELF_IN_TEAM -> "You are already in a team!"; + case NOT_IN_TEAM -> "You are not in a team!"; + case TEAM_NOT_FOUND -> "Team not found!"; + case PLAYER_NOT_FOUND -> "Player not found!"; + case ALREADY_TAKEN -> "That name is already taken!"; + case PLAYER_IN_TEAM -> "That player is already in a team!"; + case TEAM_OWNER -> "You cannot do this to/as the owner!"; + }); + } } + +enum Error { + NO_PERMISSION, + TEAM_OWNER, + SELF_IN_TEAM, + NOT_IN_TEAM, + TEAM_NOT_FOUND, + PLAYER_NOT_FOUND, + ALREADY_TAKEN, + PLAYER_IN_TEAM, +} \ No newline at end of file diff --git a/src/main/java/dev/zxq5/fantasysmp/warps/Warp.java b/src/main/java/dev/zxq5/fantasysmp/warps/Warp.java index 3f4b6e3..c131eeb 100644 --- a/src/main/java/dev/zxq5/fantasysmp/warps/Warp.java +++ b/src/main/java/dev/zxq5/fantasysmp/warps/Warp.java @@ -17,11 +17,13 @@ import static org.bukkit.Bukkit.getServer; public class Warp { + private static final String FILENAME = "warps.json"; private static Warp[] warps; private String name; private String setby; private String world; + private String teamUUID; private WarpType type; private int x; private int y; @@ -37,7 +39,7 @@ public class Warp { public static void loadWarps() throws Exception { File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); - File file = new File(dataFolder, "warps.json"); + File file = new File(dataFolder, FILENAME); if (!file.exists()) { createWarpFile(); @@ -54,7 +56,7 @@ public class Warp { public static void saveWarps() throws Exception { File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); - File file = new File(dataFolder, "warps.json"); + File file = new File(dataFolder, FILENAME); Gson gson = new Gson(); String json = gson.toJson(warps); @@ -65,7 +67,7 @@ public class Warp { public static void createWarpFile() { File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); - File file = new File(dataFolder, "warps.json"); + File file = new File(dataFolder, FILENAME); if (!file.exists()) { try { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d7cb75d..8ffc50d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -47,12 +47,21 @@ commands: usage: /warp permission: fantasysmp.warps + team: + description: team commands + usage: /team + permission: fantasysmp.teams + permissions: fantasysmp.items: description: create custom items from plugin default: false + fantasysmp.teams: + description: team commands + default: true + fantasysmp.warps: description: teleport to custom warps default: true @@ -73,4 +82,5 @@ permissions: fantasysmp.manage_warps: true fantasysmp.home: true fantasysmp.warps: true + fantasysmp.teams: true