From 4079f56a90b30e02ec0b79ea31a98bbe5c5e48c2 Mon Sep 17 00:00:00 2001 From: BlueFox Date: Tue, 21 May 2024 00:01:20 +0200 Subject: [PATCH] Added a new option to change the display color; also, removed legacy color codes where needed! --- README.md | 6 + pom.xml | 2 +- .../chatbeautifier/ChatBeautifier.java | 7 +- .../chatbeautifier/ChatListener.java | 8 +- .../chatbeautifier/JoinQuitListener.java | 18 +- .../commands/ChatColorCommand.java | 26 --- .../displaynamecolor/ChatColorCommand.java | 154 ++++++++++++++++++ .../displaynamecolor/ChatColorUtils.java | 75 +++++++++ .../displaynamecolor/ChooseChatColorGUI.java | 63 +++++++ .../ChooseChatColorListener.java | 71 ++++++++ .../chatbeautifier/guis/ChooseChatColor.java | 5 - src/main/resources/plugin.yml | 2 +- target/ChatBeautifier-0.2.2.jar | Bin 0 -> 15703 bytes target/original-ChatBeautifier-0.2.2.jar | Bin 0 -> 15659 bytes 14 files changed, 393 insertions(+), 44 deletions(-) delete mode 100644 src/main/java/de/privacynerd/chatbeautifier/commands/ChatColorCommand.java create mode 100644 src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChatColorCommand.java create mode 100644 src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChatColorUtils.java create mode 100644 src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChooseChatColorGUI.java create mode 100644 src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChooseChatColorListener.java delete mode 100644 src/main/java/de/privacynerd/chatbeautifier/guis/ChooseChatColor.java create mode 100644 target/ChatBeautifier-0.2.2.jar create mode 100644 target/original-ChatBeautifier-0.2.2.jar diff --git a/README.md b/README.md index 82d75af..6ca919d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,12 @@ Listeners that are implemented by this plugin: - PlayerQuitEvent (print a beautified quit message "<< PlayerName") - PlayerChatEvent (deprecated, but beautify chat messages "PlayerName: message") + +Commands implemented: + +- set-chat-color: lets you set your name's color in the chat over a nice gui (or as a cmd!) + - currently only temporary, static colors (staying the same after quit/join) coming soon! + And all that in beautiful colors! diff --git a/pom.xml b/pom.xml index 43d0627..b2e2bfd 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ de.privacynerd ChatBeautifier - 0.2.1 + 0.2.2 jar ChatBeautifier diff --git a/src/main/java/de/privacynerd/chatbeautifier/ChatBeautifier.java b/src/main/java/de/privacynerd/chatbeautifier/ChatBeautifier.java index 02537a9..ed92353 100644 --- a/src/main/java/de/privacynerd/chatbeautifier/ChatBeautifier.java +++ b/src/main/java/de/privacynerd/chatbeautifier/ChatBeautifier.java @@ -1,10 +1,10 @@ package de.privacynerd.chatbeautifier; +import de.privacynerd.chatbeautifier.displaynamecolor.ChatColorCommand; +import de.privacynerd.chatbeautifier.displaynamecolor.ChooseChatColorListener; import org.bukkit.Bukkit; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import de.privacynerd.chatbeautifier.commands.*; -import de.privacynerd.chatbeautifier.guis.*; public final class ChatBeautifier extends JavaPlugin { @@ -27,8 +27,11 @@ public final class ChatBeautifier extends JavaPlugin { log("JoinQuitListener has been registered."); pluginManager.registerEvents(new ChatListener(), this); log("ChatListener has been registered."); + pluginManager.registerEvents(new ChooseChatColorListener(), this); + log("ChooseChatColorListener has been registered."); Bukkit.getPluginCommand("set-chat-color").setExecutor(new ChatColorCommand()); + log("ChatColorCommand has been set as executor for the command 'set-chat-color'."); log("Plugin enabled."); } diff --git a/src/main/java/de/privacynerd/chatbeautifier/ChatListener.java b/src/main/java/de/privacynerd/chatbeautifier/ChatListener.java index 375bea7..11e07c6 100644 --- a/src/main/java/de/privacynerd/chatbeautifier/ChatListener.java +++ b/src/main/java/de/privacynerd/chatbeautifier/ChatListener.java @@ -1,6 +1,7 @@ package de.privacynerd.chatbeautifier; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -15,11 +16,12 @@ public class ChatListener implements Listener { event.setCancelled(true); - //player.getDisplayName() + ": " + event.getMessage() - Server server = Bukkit.getServer(); - Component message = Component.text(player.getDisplayName() + ": " + event.getMessage()); + Component message = player.displayName().append(Component.text(": " + event.getMessage(), NamedTextColor.WHITE)); + if(player.isOp()) { + message = player.displayName().append(Component.text(": " + event.getMessage(), NamedTextColor.YELLOW)); + } server.broadcast(message); } } \ No newline at end of file diff --git a/src/main/java/de/privacynerd/chatbeautifier/JoinQuitListener.java b/src/main/java/de/privacynerd/chatbeautifier/JoinQuitListener.java index 6d54630..16a204c 100644 --- a/src/main/java/de/privacynerd/chatbeautifier/JoinQuitListener.java +++ b/src/main/java/de/privacynerd/chatbeautifier/JoinQuitListener.java @@ -1,5 +1,7 @@ package de.privacynerd.chatbeautifier; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -7,21 +9,25 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; + public class JoinQuitListener implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); + Component newName; if(player.isOp()) { - player.setDisplayName("§4[OP] "+player.getName()+"§e"); - player.setPlayerListName(player.getDisplayName()); + newName = Component.text("[OP] "+player.getName(), NamedTextColor.RED); + player.displayName(newName); + player.playerListName(newName); } else { - player.setDisplayName("§7"+player.getName()+"§7"); - player.setPlayerListName(player.getDisplayName()); + newName = Component.text(player.getName(), NamedTextColor.GRAY); + player.displayName(Component.text(player.getName())); + player.playerListName(newName); } - event.setJoinMessage("§a§l>> §7"+ player.getDisplayName()); + event.joinMessage(Component.text(">> ", NamedTextColor.GREEN).append(player.displayName())); player.playSound(player.getLocation(), Sound.AMBIENT_CRIMSON_FOREST_MOOD, 0.5f, 0.4f); } @@ -30,6 +36,6 @@ public class JoinQuitListener implements Listener { public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); - event.setQuitMessage("§c§l<< §7"+ player.getDisplayName()); + event.quitMessage(Component.text("<< ", NamedTextColor.RED).append(player.displayName())); } } diff --git a/src/main/java/de/privacynerd/chatbeautifier/commands/ChatColorCommand.java b/src/main/java/de/privacynerd/chatbeautifier/commands/ChatColorCommand.java deleted file mode 100644 index 798244a..0000000 --- a/src/main/java/de/privacynerd/chatbeautifier/commands/ChatColorCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.privacynerd.chatbeautifier.commands; - -import de.privacynerd.chatbeautifier.ChatBeautifier; -import net.kyori.adventure.text.Component; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class ChatColorCommand implements CommandExecutor { - @Override - public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { - ChatBeautifier.INSTANCE.log("Command /set-chat-name executed"); - - if(!(commandSender instanceof Player)) { - ChatBeautifier.INSTANCE.log("Du bist kein Spieler."); - return true; - } - Player player = (Player) commandSender; - - player.sendMessage(Component.text("Dieses Kommando befindet sich noch in der Mache!")); - - return true; - } -} diff --git a/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChatColorCommand.java b/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChatColorCommand.java new file mode 100644 index 0000000..a7b7c22 --- /dev/null +++ b/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChatColorCommand.java @@ -0,0 +1,154 @@ +package de.privacynerd.chatbeautifier.displaynamecolor; + +import de.privacynerd.chatbeautifier.ChatBeautifier; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + +public class ChatColorCommand implements CommandExecutor { + @Override + public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { + ChatBeautifier.INSTANCE.log("Command /set-chat-name executed."); + + if(!(commandSender instanceof Player)) { + ChatBeautifier.INSTANCE.log("This command was not executed by a player. Not doing anything."); + return false; + } + Player player = (Player) commandSender; + String validArgument = ""; + Component newDisplayName; + + // check for the right args + if(args.length == 1) { + switch (args[0]) { + case "black": + validArgument = "black"; + newDisplayName = Component.text("", ChatColorUtils.getChooseColorCodes().get(1)).append(player.displayName()); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "gray": + validArgument = "gray"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(1)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "light-gray": + validArgument = "light-gray"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(2)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "white": + validArgument = "white"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(3)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "brown": + validArgument = "brown"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(4)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "red": + validArgument = "red"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(5)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "orange": + validArgument = "orange"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(6)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "yellow": + validArgument = "yellow"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(7)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "light-green": + validArgument = "light-green"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(8)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "dark-green": + validArgument = "dark-green"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(9)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "cyan": + validArgument = "cyan"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(10)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "blue": + validArgument = "blue"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(11)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "purple": + validArgument = "purple"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(12)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "magenta": + validArgument = "magenta"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(13)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "pink": + validArgument = "pink"; + newDisplayName = player.displayName().color(ChatColorUtils.getChooseColorCodes().get(14)); + player.displayName(newDisplayName); + player.playerListName(newDisplayName); + break; + case "list": + ChatBeautifier.INSTANCE.log("Got valid argument 'list', printing list of valid colors..."); + ArrayList colorNames = ChatColorUtils.getChooseColorStrings(); + + // now compose the message containing all possible color args + StringBuilder message = new StringBuilder(ChatBeautifier.PREFIX + "§r§lMögliche Farben: §r§o"); + message.append(colorNames.get(0).toLowerCase().replace(" ", "-")).append(", "); + for (int i=1; i, list, gui]"); + return true; + } + ChatBeautifier.INSTANCE.log("Got valid color " + validArgument); + player.sendMessage(ChatBeautifier.PREFIX + "Name temporär " + validArgument + " gefärbt. Dieses Feature ist aktuell noch in der Mache, dauerhaft coming soon."); + return true; + } else if (args.length > 1) { // print a help string if more than one argument is given + player.sendMessage(ChatBeautifier.PREFIX + "Verwendung: /" + alias + " [, list, gui]"); + return true; + } else { + player.openInventory(new ChooseChatColorGUI().getGUI(player)); + return true; + } + } +} diff --git a/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChatColorUtils.java b/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChatColorUtils.java new file mode 100644 index 0000000..f67d75a --- /dev/null +++ b/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChatColorUtils.java @@ -0,0 +1,75 @@ +package de.privacynerd.chatbeautifier.displaynamecolor; + +import de.privacynerd.chatbeautifier.ChatBeautifier; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; + + +// Class containing functions returning arrays for gui creation + +public final class ChatColorUtils { + public static @NotNull ArrayList getChooseColorItems() { + ArrayList chooseColors = new ArrayList<>(); + chooseColors.add(new ItemStack(Material.BLACK_WOOL)); + chooseColors.add(new ItemStack(Material.GRAY_WOOL)); + chooseColors.add(new ItemStack(Material.LIGHT_GRAY_WOOL)); + chooseColors.add(new ItemStack(Material.WHITE_WOOL)); + chooseColors.add(new ItemStack(Material.BROWN_WOOL)); + chooseColors.add(new ItemStack(Material.RED_WOOL)); + chooseColors.add(new ItemStack(Material.ORANGE_WOOL)); + chooseColors.add(new ItemStack(Material.YELLOW_WOOL)); + chooseColors.add(new ItemStack(Material.LIME_WOOL)); + chooseColors.add(new ItemStack(Material.GREEN_WOOL)); + chooseColors.add(new ItemStack(Material.CYAN_WOOL)); + chooseColors.add(new ItemStack(Material.BLUE_WOOL)); + chooseColors.add(new ItemStack(Material.PURPLE_WOOL)); + chooseColors.add(new ItemStack(Material.MAGENTA_WOOL)); + chooseColors.add(new ItemStack(Material.PINK_WOOL)); + return chooseColors; + } + public static @NotNull ArrayList getChooseColorStrings() { + ArrayList chooseColorNames = new ArrayList<>(); + chooseColorNames.add("Black"); + chooseColorNames.add("Gray"); + chooseColorNames.add("Light gray"); + chooseColorNames.add("White"); + chooseColorNames.add("Brown"); + chooseColorNames.add("Red"); + chooseColorNames.add("Orange"); + chooseColorNames.add("Yellow"); + chooseColorNames.add("Light green"); + chooseColorNames.add("Dark green"); + chooseColorNames.add("Cyan"); + chooseColorNames.add("Blue"); + chooseColorNames.add("Purple"); + chooseColorNames.add("Magenta"); + chooseColorNames.add("Pink"); + return chooseColorNames; + } + public static @NotNull ArrayList getChooseColorCodes() { + ArrayList getChooseColorCodes = new ArrayList<>(); + + getChooseColorCodes.add(NamedTextColor.BLACK); + getChooseColorCodes.add(NamedTextColor.DARK_GRAY); + getChooseColorCodes.add(NamedTextColor.GRAY); + getChooseColorCodes.add(NamedTextColor.WHITE); + getChooseColorCodes.add(TextColor.color(135, 72, 0)); + getChooseColorCodes.add(TextColor.color(255, 0, 0)); + getChooseColorCodes.add(TextColor.color(255, 112, 0)); + getChooseColorCodes.add(NamedTextColor.YELLOW); + getChooseColorCodes.add(TextColor.color(103, 255, 0)); + getChooseColorCodes.add(TextColor.color(38, 157, 0)); + getChooseColorCodes.add(TextColor.color(0, 252, 255)); + getChooseColorCodes.add(TextColor.color(0, 92, 255)); + getChooseColorCodes.add(TextColor.color(157, 0, 255)); + getChooseColorCodes.add(TextColor.color(255, 0, 179)); + getChooseColorCodes.add(TextColor.color(255, 87, 228)); + + return getChooseColorCodes; + } +} diff --git a/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChooseChatColorGUI.java b/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChooseChatColorGUI.java new file mode 100644 index 0000000..354119b --- /dev/null +++ b/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChooseChatColorGUI.java @@ -0,0 +1,63 @@ +package de.privacynerd.chatbeautifier.displaynamecolor; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import de.privacynerd.chatbeautifier.displaynamecolor.ChatColorUtils; + +import java.util.ArrayList; + +public class ChooseChatColorGUI { + + public Inventory getGUI(Player player) { + Inventory gui = Bukkit.createInventory(player, 45, Component.text("Set chat color (0x01)", NamedTextColor.DARK_GRAY)); + + // create item stacks to be filled into the gui later + ItemStack nothing = new ItemStack(Material.LIGHT_BLUE_STAINED_GLASS_PANE); // for filling the gaps + + ArrayList chooseColorItems = ChatColorUtils.getChooseColorItems(); + ArrayList chooseColorNames = ChatColorUtils.getChooseColorStrings(); + ArrayList chooseColorCodes = ChatColorUtils.getChooseColorCodes(); + + for (int i=0; i<15; i++) { + ItemMeta color_meta = nothing.getItemMeta(); + if(i==0) { // make it the black text readable + color_meta.displayName(Component.text(chooseColorNames.get(i), NamedTextColor.WHITE)); + } else { + color_meta.displayName(Component.text(chooseColorNames.get(i), chooseColorCodes.get(i))); + } + chooseColorItems.get(i).setItemMeta(color_meta); + } + + // set item metas (so that a listener can correctly identify the items) + ItemMeta nothing_meta = nothing.getItemMeta(); + nothing_meta.displayName(Component.text(" ")); + nothing.setItemMeta(nothing_meta); + + // fill the glass panes + for (int i=0; i<11; i++) { gui.setItem(i, nothing); } + for (int i=0; i<3; i++) { + gui.setItem(16 + (8 * i) + i, nothing); + gui.setItem(16 + (8 * i) + i + 1, nothing); + gui.setItem(16 + (8 * i) + i + 2, nothing); + gui.setItem(16 + (8 * i) + i + 3, nothing); + } + for (int i=38; i<45; i++) { gui.setItem(i, nothing); } + + for(int i=0; i<3; i++) { + gui.setItem(11 + (8 * i) + i, chooseColorItems.get((4 * i) + i)); + gui.setItem(11 + (8 * i) + i +1, chooseColorItems.get((4 * i) + i +1)); + gui.setItem(11 + (8 * i) + i +2, chooseColorItems.get((4 * i) + i +2)); + gui.setItem(11 + (8 * i) + i +3, chooseColorItems.get((4 * i) + i +3)); + gui.setItem(11 + (8 * i) + i +4, chooseColorItems.get((4 * i) + i +4)); + } + + return gui; + } +} \ No newline at end of file diff --git a/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChooseChatColorListener.java b/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChooseChatColorListener.java new file mode 100644 index 0000000..c586ed7 --- /dev/null +++ b/src/main/java/de/privacynerd/chatbeautifier/displaynamecolor/ChooseChatColorListener.java @@ -0,0 +1,71 @@ +package de.privacynerd.chatbeautifier.displaynamecolor; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class ChooseChatColorListener implements Listener { + @EventHandler + public void onClickOnItem(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + + if (event.getView().title().equals(Component.text("Set chat color (0x01)", NamedTextColor.DARK_GRAY))) { + switch (event.getCurrentItem().getType()) { + case BLACK_WOOL: + player.performCommand("scc black"); + break; + case GRAY_WOOL: + player.performCommand("scc gray"); + break; + case LIGHT_GRAY_WOOL: + player.performCommand("scc light-gray"); + break; + case WHITE_WOOL: + player.performCommand("scc white"); + break; + case BROWN_WOOL: + player.performCommand("scc brown"); + break; + case RED_WOOL: + player.performCommand("scc red"); + break; + case ORANGE_WOOL: + player.performCommand("scc orange"); + break; + case YELLOW_WOOL: + player.performCommand("scc yellow"); + break; + case LIME_WOOL: + player.performCommand("scc light-green"); + break; + case GREEN_WOOL: + player.performCommand("scc dark-green"); + break; + case CYAN_WOOL: + player.performCommand("scc cyan"); + break; + case BLUE_WOOL: + player.performCommand("scc blue"); + break; + case PURPLE_WOOL: + player.performCommand("scc purple"); + break; + case MAGENTA_WOOL: + player.performCommand("scc magenta"); + break; + case PINK_WOOL: + player.performCommand("scc pink"); + break; + default: + event.setCancelled(true); + return; + } + + player.openInventory(new ChooseChatColorGUI().getGUI(player)); + event.setCancelled(true); + } + } +} diff --git a/src/main/java/de/privacynerd/chatbeautifier/guis/ChooseChatColor.java b/src/main/java/de/privacynerd/chatbeautifier/guis/ChooseChatColor.java deleted file mode 100644 index e9b9ca1..0000000 --- a/src/main/java/de/privacynerd/chatbeautifier/guis/ChooseChatColor.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.privacynerd.chatbeautifier.guis; - -public class ChooseChatColor { - -} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 07477c3..b11e1b5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -7,4 +7,4 @@ commands: set-chat-color: description: Mit diesem Befehl kannst du die Farbe deines Namens setzen. aliases: ["scc"] - usage: /set-chat-color \ No newline at end of file + usage: /set-chat-color [, list, gui] \ No newline at end of file diff --git a/target/ChatBeautifier-0.2.2.jar b/target/ChatBeautifier-0.2.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..5442ebb1630be4188a47eae8c5dbc90353e997a5 GIT binary patch literal 15703 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 literal 0 HcmV?d00001 diff --git a/target/original-ChatBeautifier-0.2.2.jar b/target/original-ChatBeautifier-0.2.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..76d590f3b166f0983dca94a144018ee8db147227 GIT binary patch literal 15659 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 literal 0 HcmV?d00001