From 508f872ba076f4e767ff2c374656bc47637eb229 Mon Sep 17 00:00:00 2001 From: Cow Date: Tue, 3 Mar 2020 00:26:40 +0100 Subject: Replaced best friend add and remove commands with a config gui --- README.md | 16 +++--- .../eu/olli/cowmoonication/Cowmoonication.java | 1 + src/main/java/eu/olli/cowmoonication/Friends.java | 27 ---------- src/main/java/eu/olli/cowmoonication/Utils.java | 57 --------------------- .../eu/olli/cowmoonication/command/MooCommand.java | 43 ++-------------- .../eu/olli/cowmoonication/config/MooConfig.java | 2 +- .../eu/olli/cowmoonication/util/TickDelay.java | 29 +++++++++++ .../java/eu/olli/cowmoonication/util/Utils.java | 58 ++++++++++++++++++++++ 8 files changed, 103 insertions(+), 130 deletions(-) delete mode 100644 src/main/java/eu/olli/cowmoonication/Utils.java create mode 100644 src/main/java/eu/olli/cowmoonication/util/TickDelay.java create mode 100644 src/main/java/eu/olli/cowmoonication/util/Utils.java diff --git a/README.md b/README.md index e279e57..b033172 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # Cowmoonication A client-side only Forge mod by [Cow](https://namemc.com/profile/Cow) providing various things related to communication. -Completed features: -*Base command is `/moo`* -* Toggle to hide all join/leave notifications -* 'Best friends' list to limit the amount of join and leave notifications -* Auto-replace `/r` with `/msg ` -* Copy chat components via ALT + right click -* Change guiScale to any value +**Current features:** + +| Feature | Command/Usage | +|-------------------------------------------------------------------------|-----------------------------------------| +| Toggle to hide all join/leave notifications | `/moo toggle` | +| 'Best friends' list to limit the amount of join and leave notifications | `/moo friends` | +| Change guiScale to any value | `/moo guiscale [newValue]` | +| Auto-replace `/r` with `/msg ` | `/r ` | +| Copy chat components | ALT + right click | diff --git a/src/main/java/eu/olli/cowmoonication/Cowmoonication.java b/src/main/java/eu/olli/cowmoonication/Cowmoonication.java index d07876c..3a93fe6 100644 --- a/src/main/java/eu/olli/cowmoonication/Cowmoonication.java +++ b/src/main/java/eu/olli/cowmoonication/Cowmoonication.java @@ -3,6 +3,7 @@ package eu.olli.cowmoonication; import eu.olli.cowmoonication.command.MooCommand; import eu.olli.cowmoonication.config.MooConfig; import eu.olli.cowmoonication.listener.ChatListener; +import eu.olli.cowmoonication.util.Utils; import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; diff --git a/src/main/java/eu/olli/cowmoonication/Friends.java b/src/main/java/eu/olli/cowmoonication/Friends.java index 0cbe517..2becc74 100644 --- a/src/main/java/eu/olli/cowmoonication/Friends.java +++ b/src/main/java/eu/olli/cowmoonication/Friends.java @@ -13,37 +13,10 @@ public class Friends { this.main = main; } - public boolean addBestFriend(String name, boolean save) { - if (name.isEmpty()) { - return false; - } - boolean added = bestFriends.add(name); - if (added && save) { - saveBestFriends(); - } - return added; - } - - public boolean addBestFriend(String name) { - return addBestFriend(name, false); - } - - public boolean removeBestFriend(String name) { - boolean removed = bestFriends.remove(name); - if (removed) { - saveBestFriends(); - } - return removed; - } - public boolean isBestFriend(String playerName) { return bestFriends.contains(playerName); } - private void saveBestFriends() { - - } - public Set getBestFriends() { return new TreeSet<>(bestFriends); } diff --git a/src/main/java/eu/olli/cowmoonication/Utils.java b/src/main/java/eu/olli/cowmoonication/Utils.java deleted file mode 100644 index ac3167c..0000000 --- a/src/main/java/eu/olli/cowmoonication/Utils.java +++ /dev/null @@ -1,57 +0,0 @@ -package eu.olli.cowmoonication; - -import net.minecraft.client.Minecraft; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.IChatComponent; -import net.minecraftforge.client.event.ClientChatReceivedEvent; -import net.minecraftforge.common.MinecraftForge; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Utils { - public static final Pattern VALID_USERNAME = Pattern.compile("^[\\w]{1,16}$"); - private static final Pattern USELESS_JSON_CONTENT_PATTERN = Pattern.compile("\"[A-Za-z]+\":false,?"); - private final Cowmoonication main; - private String[] aboveChatMessage; - private long aboveChatMessageExpiration; - - public Utils(Cowmoonication main) { - this.main = main; - } - - public void sendMessage(String text) { - sendMessage(new ChatComponentText(text)); - } - - public void sendMessage(IChatComponent chatComponent) { - ClientChatReceivedEvent event = new ClientChatReceivedEvent((byte) 1, chatComponent); - MinecraftForge.EVENT_BUS.post(event); - if (!event.isCanceled()) { - Minecraft.getMinecraft().thePlayer.addChatMessage(event.message); - } - } - - public void sendAboveChatMessage(String... text) { - aboveChatMessage = text; - aboveChatMessageExpiration = Minecraft.getSystemTime() + 5000; - } - - public String[] getAboveChatMessage() { - if (aboveChatMessageExpiration < Minecraft.getSystemTime()) { - // message expired - aboveChatMessage = null; - } - return aboveChatMessage; - } - - public boolean isValidMcName(String username) { - return VALID_USERNAME.matcher(username).matches(); - } - - public String cleanChatComponent(IChatComponent chatComponent) { - String component = IChatComponent.Serializer.componentToJson(chatComponent); - Matcher jsonMatcher = USELESS_JSON_CONTENT_PATTERN.matcher(component); - return jsonMatcher.replaceAll(""); - } -} diff --git a/src/main/java/eu/olli/cowmoonication/command/MooCommand.java b/src/main/java/eu/olli/cowmoonication/command/MooCommand.java index ca4722c..f3d234b 100644 --- a/src/main/java/eu/olli/cowmoonication/command/MooCommand.java +++ b/src/main/java/eu/olli/cowmoonication/command/MooCommand.java @@ -2,6 +2,8 @@ package eu.olli.cowmoonication.command; import eu.olli.cowmoonication.Cowmoonication; import eu.olli.cowmoonication.config.MooConfig; +import eu.olli.cowmoonication.config.MooGuiConfig; +import eu.olli.cowmoonication.util.TickDelay; import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; @@ -27,14 +29,8 @@ public class MooCommand extends CommandBase { main.getUtils().sendMessage(new ChatComponentTranslation(getCommandUsage(sender))); return; } - if (args.length == 2 && args[0].equalsIgnoreCase("add")) { - main.getUtils().sendMessage(EnumChatFormatting.RED + "Edit the best friends list via ESC > Mod Options > Cowmoonication > Config > bestFriends."); - // TODO replace with a proper command - // handleBestFriendAdd(args[1]); - } else if (args.length == 2 && args[0].equalsIgnoreCase("remove") && main.getUtils().isValidMcName(args[1])) { - main.getUtils().sendMessage(EnumChatFormatting.RED + "Edit the best friends list via ESC > Mod Options > Cowmoonication > Config > bestFriends."); - // TODO replace with a proper command - // handleBestFriendRemove(args[1]); + if (args[0].equalsIgnoreCase("friends") || args[0].equalsIgnoreCase("f")) { + new TickDelay(() -> Minecraft.getMinecraft().displayGuiScreen(new MooGuiConfig(null)), 1); // delay by 1 tick, because the chat closing would close the new gui instantly as well. } else if (args[0].equalsIgnoreCase("list")) { handleListBestFriends(); } else if (args[0].equalsIgnoreCase("toggle")) { @@ -54,35 +50,6 @@ public class MooCommand extends CommandBase { } } - private void handleBestFriendAdd(String username) { - if (!main.getUtils().isValidMcName(username)) { - main.getUtils().sendMessage(EnumChatFormatting.DARK_RED + username + EnumChatFormatting.RED + "? This... doesn't look like a valid username."); - return; - } - - // TODO Add check if 'best friend' is on normal friend list - boolean added = main.getFriends().addBestFriend(username, true); - if (added) { - main.getUtils().sendMessage(EnumChatFormatting.GREEN + "Added " + EnumChatFormatting.DARK_GREEN + username + EnumChatFormatting.GREEN + " as best friend."); - } else { - main.getUtils().sendMessage(EnumChatFormatting.DARK_RED + username + EnumChatFormatting.RED + " is a best friend already."); - } - } - - private void handleBestFriendRemove(String username) { - if (!main.getUtils().isValidMcName(username)) { - main.getUtils().sendMessage(EnumChatFormatting.DARK_RED + username + EnumChatFormatting.RED + "? This... doesn't look like a valid username."); - return; - } - - boolean removed = main.getFriends().removeBestFriend(username); - if (removed) { - main.getUtils().sendMessage(EnumChatFormatting.GREEN + "Removed " + EnumChatFormatting.DARK_GREEN + username + EnumChatFormatting.GREEN + " from best friends list."); - } else { - main.getUtils().sendMessage(EnumChatFormatting.DARK_RED + username + EnumChatFormatting.RED + " isn't a best friend."); - } - } - private void handleListBestFriends() { Set bestFriends = main.getFriends().getBestFriends(); @@ -108,7 +75,7 @@ public class MooCommand extends CommandBase { @Override public List addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) { if (args.length == 1) { - return getListOfStringsMatchingLastWord(args, "add", "remove", "list", "toggle", "guiscale"); + return getListOfStringsMatchingLastWord(args, "friends", "list", "toggle", "guiscale"); } return null; } diff --git a/src/main/java/eu/olli/cowmoonication/config/MooConfig.java b/src/main/java/eu/olli/cowmoonication/config/MooConfig.java index 6165e54..97cea9b 100644 --- a/src/main/java/eu/olli/cowmoonication/config/MooConfig.java +++ b/src/main/java/eu/olli/cowmoonication/config/MooConfig.java @@ -1,7 +1,7 @@ package eu.olli.cowmoonication.config; import eu.olli.cowmoonication.Cowmoonication; -import eu.olli.cowmoonication.Utils; +import eu.olli.cowmoonication.util.Utils; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.common.config.Property; diff --git a/src/main/java/eu/olli/cowmoonication/util/TickDelay.java b/src/main/java/eu/olli/cowmoonication/util/TickDelay.java new file mode 100644 index 0000000..d5d164a --- /dev/null +++ b/src/main/java/eu/olli/cowmoonication/util/TickDelay.java @@ -0,0 +1,29 @@ +package eu.olli.cowmoonication.util; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +public class TickDelay { + private Runnable task; + private int waitingTicks; + + public TickDelay(Runnable task, int ticks) { + this.task = task; + this.waitingTicks = ticks; + + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + public void onTick(TickEvent.ClientTickEvent e) { + if (e.phase == TickEvent.Phase.START) { + if (waitingTicks < 1) { + // we're done waiting! Do stuff and exit. + task.run(); + MinecraftForge.EVENT_BUS.unregister(this); + } + waitingTicks--; + } + } +} diff --git a/src/main/java/eu/olli/cowmoonication/util/Utils.java b/src/main/java/eu/olli/cowmoonication/util/Utils.java new file mode 100644 index 0000000..d10c2ed --- /dev/null +++ b/src/main/java/eu/olli/cowmoonication/util/Utils.java @@ -0,0 +1,58 @@ +package eu.olli.cowmoonication.util; + +import eu.olli.cowmoonication.Cowmoonication; +import net.minecraft.client.Minecraft; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.common.MinecraftForge; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Utils { + public static final Pattern VALID_USERNAME = Pattern.compile("^[\\w]{1,16}$"); + private static final Pattern USELESS_JSON_CONTENT_PATTERN = Pattern.compile("\"[A-Za-z]+\":false,?"); + private final Cowmoonication main; + private String[] aboveChatMessage; + private long aboveChatMessageExpiration; + + public Utils(Cowmoonication main) { + this.main = main; + } + + public void sendMessage(String text) { + sendMessage(new ChatComponentText(text)); + } + + public void sendMessage(IChatComponent chatComponent) { + ClientChatReceivedEvent event = new ClientChatReceivedEvent((byte) 1, chatComponent); + MinecraftForge.EVENT_BUS.post(event); + if (!event.isCanceled()) { + Minecraft.getMinecraft().thePlayer.addChatMessage(event.message); + } + } + + public void sendAboveChatMessage(String... text) { + aboveChatMessage = text; + aboveChatMessageExpiration = Minecraft.getSystemTime() + 5000; + } + + public String[] getAboveChatMessage() { + if (aboveChatMessageExpiration < Minecraft.getSystemTime()) { + // message expired + aboveChatMessage = null; + } + return aboveChatMessage; + } + + public boolean isValidMcName(String username) { + return VALID_USERNAME.matcher(username).matches(); + } + + public String cleanChatComponent(IChatComponent chatComponent) { + String component = IChatComponent.Serializer.componentToJson(chatComponent); + Matcher jsonMatcher = USELESS_JSON_CONTENT_PATTERN.matcher(component); + return jsonMatcher.replaceAll(""); + } +} -- cgit