From 4eeacb2090c02a7c27249cad16eee888a7a37384 Mon Sep 17 00:00:00 2001 From: cewko Date: Tue, 21 Jul 2026 12:03:01 +0200 Subject: [PATCH 1/9] feat: separate message & command queue --- .../extendedmessages/ExtendedMessages.java | 36 ++++-- .../ExtendedMessagesCommand.java | 91 ++++++++++---- .../cewko/extendedmessages/Reference.java | 5 +- .../config/ExtendedMessagesConfig.java | 33 ++++- .../messaging/MessageQueue.java | 116 +++++++++++------- .../messaging/OutgoingMessageProcessor.java | 54 ++++++-- 6 files changed, 242 insertions(+), 93 deletions(-) diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java index cbb7e2c..bd9665c 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java @@ -24,6 +24,7 @@ public class ExtendedMessages { public static boolean enabled = Reference.DEFAULT_ENABLED; private static boolean splitEnabled = Reference.DEFAULT_SPLIT_ENABLED; private static int messageDelaySeconds = Reference.DEFAULT_MESSAGE_DELAY_SECONDS; + private static int commandDelaySeconds = Reference.DEFAULT_COMMAND_DELAY_SECONDS; private static boolean messagePrefixEnabled = Reference.DEFAULT_MESSAGE_PREFIX_ENABLED; private static String messagePrefix = Reference.DEFAULT_MESSAGE_PREFIX; @@ -59,26 +60,40 @@ public static boolean toggleEnabled() { return enabled; } - public static int getMessageDelaySeconds() { - return messageDelaySeconds; - } - - public static void setMessageDelaySeconds(int seconds) { - if (seconds < Reference.MIN_MESSAGE_DELAY_SECONDS - || seconds > Reference.MAX_MESSAGE_DELAY_SECONDS) { + private static void validateDelaySeconds(int seconds) { + if (seconds < Reference.MIN_DELAY_SECONDS + || seconds > Reference.MAX_DELAY_SECONDS) { throw new IllegalArgumentException( - "Message delay must be between " - + Reference.MIN_MESSAGE_DELAY_SECONDS + "Delay must be between " + + Reference.MIN_DELAY_SECONDS + " and " - + Reference.MAX_MESSAGE_DELAY_SECONDS + + Reference.MAX_DELAY_SECONDS + " secs" ); } + } + + public static int getMessageDelaySeconds() { + return messageDelaySeconds; + } + + public static void setMessageDelaySeconds(int seconds) { + validateDelaySeconds(seconds); messageDelaySeconds = seconds; ExtendedMessagesConfig.saveMessageDelaySeconds(seconds); } + public static int getCommandDelaySeconds() { + return commandDelaySeconds; + } + + public static void setCommandDelaySeconds(int seconds) { + validateDelaySeconds(seconds); + commandDelaySeconds = seconds; + ExtendedMessagesConfig.saveCommandDelaySeconds(seconds); + } + public static boolean isMessagePrefixEnabled() { return messagePrefixEnabled; } @@ -188,6 +203,7 @@ public void preInit(FMLPreInitializationEvent event) { enabled = ExtendedMessagesConfig.getEnabled(); splitEnabled = ExtendedMessagesConfig.getSplitEnabled(); messageDelaySeconds = ExtendedMessagesConfig.getMessageDelaySeconds(); + commandDelaySeconds = ExtendedMessagesConfig.getCommandDelaySeconds(); messagePrefixEnabled = ExtendedMessagesConfig.getMessagePrefixEnabled(); messagePrefix = ExtendedMessagesConfig.getMessagePrefix(); diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java index 39804c5..a5ce2de 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java @@ -14,21 +14,21 @@ public final class ExtendedMessagesCommand extends CommandBase { @Override public String getCommandName() { - return "extendedmessages"; + return Reference.COMMAND_NAME; } @Override public List getCommandAliases() { - return Collections.singletonList("em"); + return Collections.singletonList(Reference.COMMAND_ALIAS); } @Override public String getCommandUsage(ICommandSender sender) { return "/em [toggle|split|delay <" - + Reference.MIN_MESSAGE_DELAY_SECONDS + + Reference.MIN_DELAY_SECONDS + "-" - + Reference.MAX_MESSAGE_DELAY_SECONDS - + ">|prefix |party ]"; + + Reference.MAX_DELAY_SECONDS + + ">|prefix |command |delay >]"; } @Override @@ -66,8 +66,8 @@ public void processCommand(ICommandSender sender, String[] args) int seconds = parseInt( args[1], - Reference.MIN_MESSAGE_DELAY_SECONDS, - Reference.MAX_MESSAGE_DELAY_SECONDS + Reference.MIN_DELAY_SECONDS, + Reference.MAX_DELAY_SECONDS ); ExtendedMessages.setMessageDelaySeconds(seconds); @@ -76,9 +76,7 @@ public void processCommand(ICommandSender sender, String[] args) sender, "Message delay: " + EnumChatFormatting.AQUA - + seconds - + EnumChatFormatting.GRAY - + (seconds == 1 ? " second" : " seconds") + + formatSeconds(seconds) ); return; @@ -89,8 +87,8 @@ public void processCommand(ICommandSender sender, String[] args) return; } - if ("party".equalsIgnoreCase(args[0])) { - handlePartyCommand(sender, args); + if ("command".equalsIgnoreCase(args[0])) { + handleCommandSettings(sender, args); return; } @@ -142,17 +140,17 @@ private void handlePrefixCommand( ); } - private void handlePartyCommand( + private void handleCommandSettings( ICommandSender sender, String[] args) throws CommandException { if (args.length == 1) { - showPartyStatus(sender); + showConfiguredCommandStatus(sender); return; } if (args.length == 2 && "toggle".equalsIgnoreCase(args[1])) { boolean enabled = ExtendedMessages.toggleCommandPrefixEnabled(); - sendLine(sender, "Party command: " + formatState(enabled)); + sendLine(sender, "Configured command: " + formatState(enabled)); return; } @@ -168,13 +166,34 @@ private void handlePartyCommand( } sendLine(sender, - "Party command set to " + formatValue( + "Configured command set to " + formatValue( ExtendedMessages.getCommandPrefix())); return; } - throw new WrongUsageException("/em party [toggle|set ]"); + if (args.length == 3 && "delay".equalsIgnoreCase(args[1])) { + int seconds = parseInt( + args[2], + Reference.MIN_DELAY_SECONDS, + Reference.MAX_DELAY_SECONDS + ); + + ExtendedMessages.setCommandDelaySeconds(seconds); + + sendLine( + sender, + "Command delay: " + + EnumChatFormatting.AQUA + + formatSeconds(seconds) + ); + + return; + } + + throw new WrongUsageException( + "/em command [toggle|set |delay ]" + ); } private String joinArgs(String[] args, int startIndex) { @@ -211,14 +230,20 @@ private void showStatus(ICommandSender sender) { )); int delay = ExtendedMessages.getMessageDelaySeconds(); + int commandDelay = ExtendedMessages.getCommandDelaySeconds(); sender.addChatMessage(new ChatComponentText( EnumChatFormatting.GRAY + "Message delay: " + EnumChatFormatting.AQUA - + delay - + EnumChatFormatting.GRAY - + (delay == 1 ? " second" : " seconds") + + formatSeconds(delay) + )); + + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.GRAY + + "Command delay: " + + EnumChatFormatting.AQUA + + formatSeconds(commandDelay) )); sender.addChatMessage(new ChatComponentText( @@ -236,6 +261,11 @@ private void showStatus(ICommandSender sender) { + "/em delay " )); + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.DARK_GRAY + + "/em command delay " + )); + sender.addChatMessage(new ChatComponentText( EnumChatFormatting.GRAY + "Message prefix: " + formatState(ExtendedMessages.isMessagePrefixEnabled()) @@ -245,7 +275,7 @@ private void showStatus(ICommandSender sender) { )); sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GRAY + "Party command: " + EnumChatFormatting.GRAY + "Configured command: " + formatState(ExtendedMessages.isCommandPrefixEnabled()) + EnumChatFormatting.GRAY + " " @@ -267,18 +297,25 @@ private void showPrefixStatus(ICommandSender sender) { ); } - private void showPartyStatus(ICommandSender sender) { - sendLine(sender, "Party command: " + private void showConfiguredCommandStatus(ICommandSender sender) { + sendLine(sender, "Configured command: " + formatState( ExtendedMessages.isCommandPrefixEnabled() ) ); - sendLine(sender, "Party command value: " + sendLine(sender, "Configured command value: " + formatValue( ExtendedMessages.getCommandPrefix() ) ); + + sendLine(sender, "Command delay: " + + EnumChatFormatting.AQUA + + formatSeconds( + ExtendedMessages.getCommandDelaySeconds() + ) + ); } private void sendLine(ICommandSender sender, String message) { @@ -302,6 +339,12 @@ private String formatSplitRisk(boolean splitEnabled) { + " (unsafe; servers might kick you)"; } + private String formatSeconds(int seconds) { + return String.valueOf(seconds) + + EnumChatFormatting.GRAY + + (seconds == 1 ? " second" : " seconds"); + } + private String formatValue(String value) { if (value.isEmpty()) { return EnumChatFormatting.DARK_GRAY + ""; diff --git a/src/main/java/com/github/cewko/extendedmessages/Reference.java b/src/main/java/com/github/cewko/extendedmessages/Reference.java index 3e01757..5043af5 100644 --- a/src/main/java/com/github/cewko/extendedmessages/Reference.java +++ b/src/main/java/com/github/cewko/extendedmessages/Reference.java @@ -14,9 +14,10 @@ public final class Reference { public static final int DEFAULT_MESSAGE_LIMIT = 100; public static final int EXTENDED_MESSAGE_LIMIT = 256; - public static final int MIN_MESSAGE_DELAY_SECONDS = 1; - public static final int MAX_MESSAGE_DELAY_SECONDS = 30; + public static final int MIN_DELAY_SECONDS = 0; + public static final int MAX_DELAY_SECONDS = 30; public static final int DEFAULT_MESSAGE_DELAY_SECONDS = 3; + public static final int DEFAULT_COMMAND_DELAY_SECONDS = 1; public static final boolean DEFAULT_ENABLED = false; public static final boolean DEFAULT_SPLIT_ENABLED = true; diff --git a/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java b/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java index 32fbb6b..dc1ddd6 100644 --- a/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java +++ b/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java @@ -12,6 +12,7 @@ public final class ExtendedMessagesConfig { private static final String KEY_ENABLED = "enabled"; private static final String KEY_SPLIT_ENABLED = "splitLongMessages"; private static final String KEY_MESSAGE_DELAY = "messageDelaySeconds"; + private static final String KEY_COMMAND_DELAY = "commandDelaySeconds"; private static final String KEY_MESSAGE_PREFIX_ENABLED = "messagePrefixEnabled"; private static final String KEY_MESSAGE_PREFIX = "messagePrefix"; @@ -24,6 +25,7 @@ public final class ExtendedMessagesConfig { private static Property enabledProperty; private static Property splitEnabledProperty; private static Property messageDelayProperty; + private static Property commandDelayProperty; private static Property messagePrefixEnabledProperty; private static Property messagePrefixProperty; @@ -59,7 +61,14 @@ public static void load(File file) { Configuration.CATEGORY_GENERAL, KEY_MESSAGE_DELAY, Reference.DEFAULT_MESSAGE_DELAY_SECONDS, - "Delay in seconds between message chunks." + "Delay in seconds between regular message chunks." + ); + + commandDelayProperty = configuration.get( + Configuration.CATEGORY_GENERAL, + KEY_COMMAND_DELAY, + Reference.DEFAULT_COMMAND_DELAY_SECONDS, + "Delay in seconds between configured command message chunks." ); messagePrefixEnabledProperty = configuration.get( @@ -110,8 +119,20 @@ public static int getMessageDelaySeconds() { Reference.DEFAULT_MESSAGE_DELAY_SECONDS ); return Math.max( - Reference.MIN_MESSAGE_DELAY_SECONDS, - Math.min(Reference.MAX_MESSAGE_DELAY_SECONDS, value) + Reference.MIN_DELAY_SECONDS, + Math.min(Reference.MAX_DELAY_SECONDS, value) + ); + } + + public static int getCommandDelaySeconds() { + ensureLoaded(); + + int value = commandDelayProperty.getInt( + Reference.DEFAULT_COMMAND_DELAY_SECONDS + ); + return Math.max( + Reference.MIN_DELAY_SECONDS, + Math.min(Reference.MAX_DELAY_SECONDS, value) ); } @@ -165,6 +186,12 @@ public static void saveMessageDelaySeconds(int seconds) { saveIfChanged(); } + public static void saveCommandDelaySeconds(int seconds) { + ensureLoaded(); + commandDelayProperty.set(seconds); + saveIfChanged(); + } + public static void saveMessagePrefixEnabled(boolean enabled) { ensureLoaded(); messagePrefixEnabledProperty.set(enabled); diff --git a/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java b/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java index 2d1a531..51504e3 100644 --- a/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java +++ b/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java @@ -13,10 +13,19 @@ public final class MessageQueue { private static final MessageQueue INSTANCE = new MessageQueue(); - private final Deque chunks = new ArrayDeque(); + + public enum Lane { + REGULAR, + CONFIGURED_COMMAND + } + + private final Deque regularLines = new ArrayDeque(); + private final Deque commandLines = new ArrayDeque(); + + private long nextRegularSendAtMillis; + private long nextCommandSendAtMillis; private World queuedWorld; - private long nextSendAtMillis; private boolean sendingQueuedMessage; private MessageQueue() { @@ -26,7 +35,7 @@ public static MessageQueue getInstance() { return INSTANCE; } - public void enqueueLines(List lines) { + public void enqueueLines(List lines, Lane lane) { Minecraft minecraft = Minecraft.getMinecraft(); if (lines.isEmpty() || minecraft.thePlayer == null || minecraft.theWorld == null) { @@ -37,72 +46,95 @@ public void enqueueLines(List lines) { clear(); } - boolean sendImmediately = chunks.isEmpty() - && System.currentTimeMillis() >= nextSendAtMillis; - queuedWorld = minecraft.theWorld; - chunks.addAll(lines); + getQueue(lane).addAll(lines); - if (sendImmediately) { - sendNext(minecraft); - } + trySendReady(minecraft); } - @SubscribeEvent - public void onClientTick(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.END || chunks.isEmpty()) { - return; - } - - Minecraft minecraft = Minecraft.getMinecraft(); + private Deque getQueue(Lane lane) { + return lane == Lane.REGULAR ? regularLines : commandLines; + } - if (minecraft.thePlayer == null || minecraft.theWorld == null - || minecraft.theWorld != queuedWorld || !ExtendedMessages.isEnabled()) { - clear(); - return; - } + private void trySendReady(Minecraft minecraft) { + trySendLane(minecraft, Lane.REGULAR); + trySendLane(minecraft, Lane.CONFIGURED_COMMAND); - if (System.currentTimeMillis() >= nextSendAtMillis) { - sendNext(minecraft); + if (isEmpty()) { + queuedWorld = null; } } - public void clear() { - chunks.clear(); - queuedWorld = null; - nextSendAtMillis = 0L; - } - - private void sendNext(Minecraft minecraft) { - String chunk = chunks.pollFirst(); + private void trySendLane(Minecraft minecraft, Lane lane) { + Deque queue = getQueue(lane); - if (chunk == null) { - clear(); + if (queue.isEmpty() || System.currentTimeMillis() < getNextSendAt(lane)) { return; } + String line = queue.pollFirst(); + sendingQueuedMessage = true; try { - minecraft.thePlayer.sendChatMessage(chunk); + minecraft.thePlayer.sendChatMessage(line); } finally { sendingQueuedMessage = false; } - nextSendAtMillis = System.currentTimeMillis() + ExtendedMessages.getMessageDelaySeconds() * 1000L; + setNextSendAt( + lane, System.currentTimeMillis() + getDelaySeconds(lane) * 1000L + ); + } + + private long getNextSendAt(Lane lane) { + return lane == Lane.REGULAR ? nextRegularSendAtMillis : nextCommandSendAtMillis; + } + + private void setNextSendAt(Lane lane, long value) { + if (lane == Lane.REGULAR) { + nextRegularSendAtMillis = value; + } else { + nextCommandSendAtMillis = value; + } + } + + private int getDelaySeconds(Lane lane) { + return lane == Lane.REGULAR + ? ExtendedMessages.getMessageDelaySeconds() + : ExtendedMessages.getCommandDelaySeconds(); + } - if (chunks.isEmpty()) { - queuedWorld = null; + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END || isEmpty()) { + return; + } + + Minecraft minecraft = Minecraft.getMinecraft(); + + if (minecraft.thePlayer == null || minecraft.theWorld == null + || minecraft.theWorld != queuedWorld || !ExtendedMessages.isEnabled()) { + clear(); return; } + trySendReady(minecraft); } - public boolean isSendingQueuedMessage() { - return sendingQueuedMessage; + private boolean isEmpty() { + return regularLines.isEmpty() && commandLines.isEmpty(); } - public boolean shouldQueueNewMessages() { - return !chunks.isEmpty() || System.currentTimeMillis() < nextSendAtMillis; + public void clear() { + regularLines.clear(); + commandLines.clear(); + queuedWorld = null; + nextRegularSendAtMillis = 0L; + nextCommandSendAtMillis = 0L; + } + + public boolean isSendingQueuedMessage() { + return sendingQueuedMessage; } } diff --git a/src/main/java/com/github/cewko/extendedmessages/messaging/OutgoingMessageProcessor.java b/src/main/java/com/github/cewko/extendedmessages/messaging/OutgoingMessageProcessor.java index 6081978..f961ead 100644 --- a/src/main/java/com/github/cewko/extendedmessages/messaging/OutgoingMessageProcessor.java +++ b/src/main/java/com/github/cewko/extendedmessages/messaging/OutgoingMessageProcessor.java @@ -13,7 +13,16 @@ public final class OutgoingMessageProcessor { private OutgoingMessageProcessor() { + } + + private static final class ProcessedMessage { + private final List lines; + private final MessageQueue.Lane lane; + private ProcessedMessage(List lines, MessageQueue.Lane lane) { + this.lines = lines; + this.lane = lane; + } } public static boolean shouldBypass(String message) { @@ -60,30 +69,53 @@ private static String withTrailingSpace(String prefix) { } public static void handle(Minecraft minecraft, String message) { - List lines = buildLines(minecraft, message); + ProcessedMessage processed = process(minecraft, message); - if (!lines.isEmpty()) { - MessageQueue.getInstance().enqueueLines(lines); + if (processed.lines.isEmpty()) { + return; } + + MessageQueue.getInstance().enqueueLines(processed.lines, processed.lane); } - private static List buildLines(Minecraft minecraft, String message) { + private static ProcessedMessage process(Minecraft minecraft, String message) { if (isConfiguredCommandMessage(message)) { - String commandPrefix = withTrailingSpace(ExtendedMessages.getCommandPrefix()); - String body = message.substring((commandPrefix.length())); - return buildSendableLines(minecraft, commandPrefix, body); + return processConfiguredCommand(minecraft, message); } if (message.startsWith("/")) { warn(minecraft, "long commands cannot be split safely"); - return Collections.emptyList(); + return new ProcessedMessage( + Collections.emptyList(), + MessageQueue.Lane.REGULAR + ); } + return processRegularMessage(minecraft, message); + } + + private static ProcessedMessage processRegularMessage(Minecraft minecraft, String message) { String messagePrefix = ExtendedMessages.isMessagePrefixEnabled() ? withTrailingSpace(ExtendedMessages.getMessagePrefix()) : ""; - return buildSendableLines(minecraft, messagePrefix, message); + return new ProcessedMessage( + buildSendableLines(minecraft, messagePrefix, message), + MessageQueue.Lane.REGULAR + ); + } + + private static ProcessedMessage processConfiguredCommand( + Minecraft minecraft, + String message + ) { + String commandPrefix = withTrailingSpace(ExtendedMessages.getCommandPrefix()); + String body = message.substring(commandPrefix.length()); + + return new ProcessedMessage( + buildSendableLines(minecraft, commandPrefix, body), + MessageQueue.Lane.CONFIGURED_COMMAND + ); } private static void warn(Minecraft minecraft, String message) { @@ -110,7 +142,7 @@ private static List buildSendableLines( + " chars" ); return Collections.emptyList(); - } + } return Collections.singletonList(line); } @@ -139,6 +171,4 @@ private static List splitWithPrefix( return lines; } - - } From eff082925771c74b52e182db4ded3659b50cc51d Mon Sep 17 00:00:00 2001 From: cewko Date: Tue, 21 Jul 2026 13:13:46 +0200 Subject: [PATCH 2/9] feat: change message history length --- .../extendedmessages/ExtendedMessages.java | 31 +++++++++++++++ .../ExtendedMessagesCommand.java | 39 +++++++++++++++++++ .../cewko/extendedmessages/Reference.java | 5 +++ .../config/ExtendedMessagesConfig.java | 30 ++++++++++++++ .../mixin/MixinGuiNewChat.java | 21 ++++++++++ 5 files changed, 126 insertions(+) create mode 100644 src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiNewChat.java diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java index bd9665c..f7812ab 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java @@ -32,6 +32,8 @@ public class ExtendedMessages { private static boolean commandPrefixEnabled = Reference.DEFAULT_COMMAND_PREFIX_ENABLED; private static String commandPrefix = Reference.DEFAULT_COMMAND_PREFIX; + private static int messageHistoryLength = Reference.DEFAULT_MESSAGE_HISTORY_LENGTH; + public static boolean isEnabled() { return enabled; } @@ -194,6 +196,33 @@ public static int getCurrentPacketMessageLimit() { : Reference.EXTENDED_MESSAGE_LIMIT; } + public static int getMessageHistoryLength() { + return messageHistoryLength; + } + + public static void setMessageHistoryLength(int length) { + validateHistoryLength(length); + messageHistoryLength = length; + ExtendedMessagesConfig.saveMessageHistoryLength(length); + } + + public static int getCurrentMessageHistoryLength() { + return enabled ? messageHistoryLength : Reference.VANILLA_MESSAGE_HISTORY_LENGTH; + } + + private static void validateHistoryLength(int length) { + if (length < Reference.MIN_MESSAGE_HISTORY_LENGTH + || length > Reference.MAX_MESSAGE_HISTORY_LENGTH) { + throw new IllegalArgumentException( + "history length must be between " + + Reference.MIN_MESSAGE_HISTORY_LENGTH + + " and " + + Reference.MAX_MESSAGE_HISTORY_LENGTH + + " lines" + ); + } + } + @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { ExtendedMessagesConfig.load( @@ -210,6 +239,8 @@ public void preInit(FMLPreInitializationEvent event) { commandPrefixEnabled = ExtendedMessagesConfig.getCommandPrefixEnabled(); commandPrefix = ExtendedMessagesConfig.getCommandPrefix(); + + messageHistoryLength = ExtendedMessagesConfig.getMessageHistoryLength(); } @Mod.EventHandler diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java index a5ce2de..8066711 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java @@ -28,6 +28,10 @@ public String getCommandUsage(ICommandSender sender) { + Reference.MIN_DELAY_SECONDS + "-" + Reference.MAX_DELAY_SECONDS + + ">|history <" + + Reference.MIN_MESSAGE_HISTORY_LENGTH + + "-" + + Reference.MAX_MESSAGE_HISTORY_LENGTH + ">|prefix |command |delay >]"; } @@ -82,6 +86,27 @@ public void processCommand(ICommandSender sender, String[] args) return; } + if (args.length == 2 && "history".equalsIgnoreCase(args[0])) { + int length = parseInt( + args[1], + Reference.MIN_MESSAGE_HISTORY_LENGTH, + Reference.MAX_MESSAGE_HISTORY_LENGTH + ); + + ExtendedMessages.setMessageHistoryLength(length); + + sendLine( + sender, + "message history length: " + + EnumChatFormatting.AQUA + + length + + EnumChatFormatting.GRAY + + " lines" + ); + + return; + } + if ("prefix".equalsIgnoreCase(args[0])) { handlePrefixCommand(sender, args); return; @@ -266,6 +291,11 @@ private void showStatus(ICommandSender sender) { + "/em command delay " )); + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.DARK_GRAY + + "/em history " + )); + sender.addChatMessage(new ChatComponentText( EnumChatFormatting.GRAY + "Message prefix: " + formatState(ExtendedMessages.isMessagePrefixEnabled()) @@ -281,6 +311,15 @@ private void showStatus(ICommandSender sender) { + " " + formatValue(ExtendedMessages.getCommandPrefix()) )); + + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.GRAY + + "Message history length: " + + EnumChatFormatting.AQUA + + ExtendedMessages.getMessageHistoryLength() + + EnumChatFormatting.GRAY + + " lines" + )); } private void showPrefixStatus(ICommandSender sender) { diff --git a/src/main/java/com/github/cewko/extendedmessages/Reference.java b/src/main/java/com/github/cewko/extendedmessages/Reference.java index 5043af5..05e735c 100644 --- a/src/main/java/com/github/cewko/extendedmessages/Reference.java +++ b/src/main/java/com/github/cewko/extendedmessages/Reference.java @@ -28,6 +28,11 @@ public final class Reference { public static final boolean DEFAULT_COMMAND_PREFIX_ENABLED = true; public static final String DEFAULT_COMMAND_PREFIX = "/pc"; + public static final int VANILLA_MESSAGE_HISTORY_LENGTH = 100; + public static final int MIN_MESSAGE_HISTORY_LENGTH = 100; + public static final int MAX_MESSAGE_HISTORY_LENGTH = 5000; + public static final int DEFAULT_MESSAGE_HISTORY_LENGTH = 1000; + private Reference() { // prevent creating instances } diff --git a/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java b/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java index dc1ddd6..aad30d6 100644 --- a/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java +++ b/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java @@ -20,6 +20,8 @@ public final class ExtendedMessagesConfig { private static final String KEY_COMMAND_PREFIX_ENABLED = "commandPrefixEnabled"; private static final String KEY_COMMAND_PREFIX = "commandPrefix"; + private static final String KEY_MESSAGE_HISTORY_LENGTH = "messageHistoryLength"; + private static Configuration configuration; private static Property enabledProperty; @@ -33,6 +35,8 @@ public final class ExtendedMessagesConfig { private static Property commandPrefixEnabledProperty; private static Property commandPrefixProperty; + private static Property messageHistoryLengthProperty; + private ExtendedMessagesConfig() { // prevent creating instances } @@ -99,6 +103,13 @@ public static void load(File file) { "Message command repeated before every command message chunk" ); + messageHistoryLengthProperty = configuration.get( + Configuration.CATEGORY_GENERAL, + KEY_MESSAGE_HISTORY_LENGTH, + Reference.DEFAULT_MESSAGE_HISTORY_LENGTH, + "maximum number of message history length" + ); + saveIfChanged(); } @@ -160,6 +171,19 @@ public static String getCommandPrefix() { return commandPrefixProperty.getString(); } + public static int getMessageHistoryLength() { + ensureLoaded(); + + int value = messageHistoryLengthProperty.getInt( + Reference.DEFAULT_MESSAGE_HISTORY_LENGTH + ); + + return Math.max( + Reference.MIN_MESSAGE_HISTORY_LENGTH, + Math.min(Reference.MAX_MESSAGE_HISTORY_LENGTH, value) + ); + } + public static void ensureLoaded() { if (configuration == null) { throw new IllegalStateException( @@ -216,6 +240,12 @@ public static void saveCommandPrefix(String prefix) { saveIfChanged(); } + public static void saveMessageHistoryLength(int length) { + ensureLoaded(); + messageHistoryLengthProperty.set(length); + saveIfChanged(); + } + public static void saveIfChanged() { if (configuration.hasChanged()) { configuration.save(); diff --git a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiNewChat.java b/src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiNewChat.java new file mode 100644 index 0000000..c715b3d --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiNewChat.java @@ -0,0 +1,21 @@ +package com.github.cewko.extendedmessages.mixin; + +import com.github.cewko.extendedmessages.ExtendedMessages; +import com.github.cewko.extendedmessages.Reference; +import net.minecraft.client.gui.GuiNewChat; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +@Mixin(GuiNewChat.class) +public abstract class MixinGuiNewChat { + @ModifyConstant( + method = "setChatLine", + constant = @Constant(intValue = Reference.VANILLA_MESSAGE_HISTORY_LENGTH), + require = 2 + ) + private int extendedmessages$replaceMessageHistoryLength(int vanillaLimit) { + return ExtendedMessages.getCurrentMessageHistoryLength(); + } +} \ No newline at end of file From c0daf01459bd22da89102b3dea7a8fbb68e1c126 Mon Sep 17 00:00:00 2001 From: cewko Date: Thu, 23 Jul 2026 23:02:37 +0200 Subject: [PATCH 3/9] feat: gui --- README.md | 30 +- .../extendedmessages/ExtendedMessages.java | 24 +- .../ExtendedMessagesCommand.java | 14 +- .../cewko/extendedmessages/Reference.java | 7 +- .../gui/ExtendedMessagesGui.java | 315 ++++++++++++++++++ .../cewko/extendedmessages/gui/GuiColors.java | 10 + .../cewko/extendedmessages/gui/GuiLayout.java | 29 ++ .../cewko/extendedmessages/gui/GuiOpener.java | 39 +++ .../gui/control/StyledIntegerSlider.java | 132 ++++++++ .../gui/control/StyledTextField.java | 59 ++++ .../gui/control/StyledToggleButton.java | 56 ++++ .../gui/setting/GuiErrorLabel.java | 16 + .../gui/setting/GuiSetting.java | 36 ++ .../gui/setting/GuiValidationError.java | 38 +++ .../gui/setting/IntegerSetting.java | 123 +++++++ .../gui/setting/SliderSetting.java | 66 ++++ .../gui/setting/TextSetting.java | 109 ++++++ .../gui/setting/ToggleSetting.java | 60 ++++ 18 files changed, 1155 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/GuiColors.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/GuiLayout.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/GuiOpener.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/control/StyledTextField.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiErrorLabel.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiValidationError.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java diff --git a/README.md b/README.md index d99924b..8c8088f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,29 @@ -# Extended Messages +# name -Minecraft Forge 1.8.9 mod that extends message length limit to 256 characters \ No newline at end of file +extends 100-character message limit of 1.8.9 up to 256 characters; queues regular messages & commands; adds long message splitting; increases default message history length; adds support for command & regular prefixes + + +[IMAGE] + + +## installation + +you can either install the `.jar` from the releases or build the mod yourself by cloning the repository and running: + +### windows + +```bat +.\gradlew.bat build +``` + +### linux + +```bash +./gradlew build +``` + +the built `.jar` will be inside `./build/libs` directory in both cases + +## contributions + +welcome \ No newline at end of file diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java index f7812ab..730cf38 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java @@ -2,6 +2,7 @@ import com.github.cewko.extendedmessages.config.ExtendedMessagesConfig; import com.github.cewko.extendedmessages.messaging.MessageQueue; +import com.github.cewko.extendedmessages.gui.GuiOpener; import net.minecraftforge.common.MinecraftForge; @@ -123,6 +124,16 @@ public static boolean toggleMessagePrefixEnabled() { } public static void setMessagePrefix(String prefix) { + if (prefix == null) { + throw new IllegalArgumentException("Message prefix cannot be null"); + } + + prefix = prefix.trim(); + + if (prefix.isEmpty() && messagePrefixEnabled) { + throw new IllegalArgumentException("Message prefix is required"); + } + validatePrefix(prefix, "Message prefix"); messagePrefix = prefix; @@ -149,7 +160,13 @@ public static void setCommandPrefix(String prefix) { prefix = prefix.trim(); if (prefix.isEmpty()) { - throw new IllegalArgumentException("Command prefix cannot be empty"); + if (commandPrefixEnabled) { + throw new IllegalArgumentException("Command prefix is required"); + } + + commandPrefix = ""; + ExtendedMessagesConfig.saveCommandPrefix(commandPrefix); + return; } if (!prefix.startsWith("/")) { @@ -174,9 +191,9 @@ private static void validatePrefix(String prefix, String displayName) { throw new IllegalArgumentException(displayName + " cannot contain new lines"); } - if (prefix.length() >= Reference.DEFAULT_MESSAGE_LIMIT) { + if (prefix.length() > Reference.MAX_PREFIX_LENGTH ) { throw new IllegalArgumentException( - displayName + " must be shorter than " + Reference.DEFAULT_MESSAGE_LIMIT); + displayName + " must be at most " + Reference.MAX_PREFIX_LENGTH + " characters"); } } @@ -250,6 +267,7 @@ public void init(FMLInitializationEvent event) { ); MinecraftForge.EVENT_BUS.register(MessageQueue.getInstance()); + MinecraftForge.EVENT_BUS.register(GuiOpener.getInstance()); System.out.println("[" + Reference.NAME + "] Mod has loaded :3"); } diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java index 8066711..0d4baa2 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java @@ -1,5 +1,7 @@ package com.github.cewko.extendedmessages; +import com.github.cewko.extendedmessages.gui.GuiOpener; + import java.util.Collections; import java.util.List; @@ -24,7 +26,7 @@ public List getCommandAliases() { @Override public String getCommandUsage(ICommandSender sender) { - return "/em [toggle|split|delay <" + return "/em [gui|toggle|split|delay <" + Reference.MIN_DELAY_SECONDS + "-" + Reference.MAX_DELAY_SECONDS @@ -49,6 +51,11 @@ public void processCommand(ICommandSender sender, String[] args) return; } + if (args.length == 1 && "gui".equalsIgnoreCase(args[0])) { + GuiOpener.getInstance().requestOpen(); + return; + } + if (args.length == 1 && "toggle".equalsIgnoreCase(args[0])) { boolean enabled = ExtendedMessages.toggleEnabled(); sendLine(sender, "Remove 100-character limit: " + formatState(enabled)); @@ -320,6 +327,11 @@ private void showStatus(ICommandSender sender) { + EnumChatFormatting.GRAY + " lines" )); + + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.DARK_GRAY + + "/em gui" + )); } private void showPrefixStatus(ICommandSender sender) { diff --git a/src/main/java/com/github/cewko/extendedmessages/Reference.java b/src/main/java/com/github/cewko/extendedmessages/Reference.java index 05e735c..6697fb4 100644 --- a/src/main/java/com/github/cewko/extendedmessages/Reference.java +++ b/src/main/java/com/github/cewko/extendedmessages/Reference.java @@ -15,7 +15,7 @@ public final class Reference { public static final int EXTENDED_MESSAGE_LIMIT = 256; public static final int MIN_DELAY_SECONDS = 0; - public static final int MAX_DELAY_SECONDS = 30; + public static final int MAX_DELAY_SECONDS = 120; public static final int DEFAULT_MESSAGE_DELAY_SECONDS = 3; public static final int DEFAULT_COMMAND_DELAY_SECONDS = 1; @@ -30,9 +30,12 @@ public final class Reference { public static final int VANILLA_MESSAGE_HISTORY_LENGTH = 100; public static final int MIN_MESSAGE_HISTORY_LENGTH = 100; - public static final int MAX_MESSAGE_HISTORY_LENGTH = 5000; + public static final int MAX_MESSAGE_HISTORY_LENGTH = 65536; public static final int DEFAULT_MESSAGE_HISTORY_LENGTH = 1000; + public static final int MAX_PREFIX_LENGTH = DEFAULT_MESSAGE_LIMIT - 2; + public static final int GUI_PREFIX_INPUT_LIMIT = MAX_PREFIX_LENGTH + 1; + private Reference() { // prevent creating instances } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java b/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java new file mode 100644 index 0000000..920c732 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java @@ -0,0 +1,315 @@ +package com.github.cewko.extendedmessages.gui; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.github.cewko.extendedmessages.ExtendedMessages; +import com.github.cewko.extendedmessages.Reference; +import com.github.cewko.extendedmessages.gui.setting.GuiSetting; +import com.github.cewko.extendedmessages.gui.setting.IntegerSetting; +import com.github.cewko.extendedmessages.gui.setting.SliderSetting; +import com.github.cewko.extendedmessages.gui.setting.TextSetting; +import com.github.cewko.extendedmessages.gui.setting.ToggleSetting; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; + +public final class ExtendedMessagesGui extends GuiScreen { + private static final int DONE_BUTTON_ID = 0; + + private final List settings = new ArrayList(); + private final List regularSettings = new ArrayList(); + private final List commandSettings = new ArrayList(); + + private GuiSetting mainSetting; + + private int nextControlId; + + @Override + public void initGui() { + buttonList.clear(); + settings.clear(); + regularSettings.clear(); + commandSettings.clear(); + nextControlId = 1; + + addSettings(); + + int panelX = width / 2 - GuiLayout.PANEL_WIDTH / 2; + int topY = GuiLayout.FIRST_ROW_Y; + int leftX = panelX; + int rightX = panelX + GuiLayout.COLUMN_WIDTH + GuiLayout.COLUMN_GAP; + int leftY = topY + GuiLayout.CONTROL_HEIGHT + GuiLayout.SECTION_GAP; + int rightY = topY + GuiLayout.CONTROL_HEIGHT + GuiLayout.SECTION_GAP; + + initSetting(mainSetting, panelX, topY, GuiLayout.PANEL_WIDTH); + + for (GuiSetting setting : regularSettings) { + initSetting(setting, leftX, leftY, GuiLayout.COLUMN_WIDTH); + leftY += setting.getHeight() + GuiLayout.ROW_SPACING; + } + + for (GuiSetting setting : commandSettings) { + initSetting(setting, rightX, rightY, GuiLayout.COLUMN_WIDTH); + rightY += setting.getHeight() + GuiLayout.ROW_SPACING; + } + + buttonList.add(new GuiButton( + DONE_BUTTON_ID, + width / 2 - GuiLayout.COLUMN_WIDTH / 2, + Math.max(leftY, rightY) + GuiLayout.SECTION_GAP, + GuiLayout.COLUMN_WIDTH, + GuiLayout.CONTROL_HEIGHT, + "Done" + )); + } + + private void initSetting(GuiSetting setting, int x, int y, int width) { + setting.init(buttonList, fontRendererObj, nextControlId++, x, y, width); + } + + private void addSettings() { + addMainSettings(); + addRegularSettings(); + addCommandSettings(); + } + + private void addMainSettings() { + mainSetting = new ToggleSetting( + "Remove 100-character limit", + new ToggleSetting.Value() { + @Override + public boolean get() { + return ExtendedMessages.isEnabled(); + } + + @Override + public void toggle() { + ExtendedMessages.toggleEnabled(); + } + } + ); + + settings.add(mainSetting); + } + + private void addRegularSettings() { + addRegularSetting( + new ToggleSetting("Split long messages", + new ToggleSetting.Value() { + @Override + public boolean get() { + return ExtendedMessages.isSplitEnabled(); + } + + @Override + public void toggle() { + ExtendedMessages.toggleSplitEnabled(); + } + } + )); + + addRegularSetting( + new SliderSetting( + "Message cooldown", + Reference.MIN_DELAY_SECONDS, + Reference.MAX_DELAY_SECONDS, + new SliderSetting.Value() { + @Override + public int get() { + return ExtendedMessages.getMessageDelaySeconds(); + } + + @Override + public void set(int value) { + ExtendedMessages.setMessageDelaySeconds(value); + } + } + ) + ); + + addRegularSetting( + new ToggleSetting("Message prefix", + new ToggleSetting.Value() { + @Override + public boolean get() { + return ExtendedMessages.isMessagePrefixEnabled(); + } + + @Override + public void toggle() { + ExtendedMessages.toggleMessagePrefixEnabled(); + } + } + )); + + addRegularSetting( + new TextSetting( + "Message prefix", + Reference.GUI_PREFIX_INPUT_LIMIT, + new TextSetting.Value() { + @Override + public String get() { + return ExtendedMessages.getMessagePrefix(); + } + + @Override + public void set(String value) { + ExtendedMessages.setMessagePrefix(value); + } + } + ) + ); + + addRegularSetting( + new IntegerSetting( + "History length", + Reference.MIN_MESSAGE_HISTORY_LENGTH, + Reference.MAX_MESSAGE_HISTORY_LENGTH, + new IntegerSetting.Value() { + @Override + public int get() { + return ExtendedMessages.getMessageHistoryLength(); + } + + @Override + public void set(int value) { + ExtendedMessages.setMessageHistoryLength(value); + } + } + ) + ); + } + + private void addCommandSettings() { + addCommandSetting( + new ToggleSetting( + "Configured command", + new ToggleSetting.Value() { + @Override + public boolean get() { + return ExtendedMessages.isCommandPrefixEnabled(); + } + + @Override + public void toggle() { + ExtendedMessages.toggleCommandPrefixEnabled(); + } + } + ) + ); + + addCommandSetting( + new SliderSetting( + "Command cooldown", + Reference.MIN_DELAY_SECONDS, + Reference.MAX_DELAY_SECONDS, + new SliderSetting.Value() { + @Override + public int get() { + return ExtendedMessages.getCommandDelaySeconds(); + } + + @Override + public void set(int value) { + ExtendedMessages.setCommandDelaySeconds(value); + } + } + ) + ); + + addCommandSetting(new TextSetting( + "Command prefix", + Reference.GUI_PREFIX_INPUT_LIMIT, + new TextSetting.Value() { + @Override + public String get() { + return ExtendedMessages.getCommandPrefix(); + } + + @Override + public void set(String value) { + ExtendedMessages.setCommandPrefix(value); + } + } + )); + } + + private void addRegularSetting(GuiSetting setting) { + regularSettings.add(setting); + settings.add(setting); + } + + private void addCommandSetting(GuiSetting setting) { + commandSettings.add(setting); + settings.add(setting); + } + + @Override + protected void actionPerformed(GuiButton button) throws IOException { + if (button.id == DONE_BUTTON_ID) { + mc.displayGuiScreen(null); + return; + } + + validateSettings(); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + super.mouseClicked(mouseX, mouseY, mouseButton); + + for (GuiSetting setting : settings) { + setting.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + @Override + protected void keyTyped(char typedChar, int keyCode) throws IOException { + for (GuiSetting setting : settings) { + setting.keyTyped(typedChar, keyCode); + } + + super.keyTyped(typedChar, keyCode); + } + + private void validateSettings() { + for (GuiSetting setting : settings) { + setting.validate(); + } + } + + @Override + public void updateScreen() { + super.updateScreen(); + + for (GuiSetting setting : settings) { + setting.update(); + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + drawDefaultBackground(); + + drawCenteredString( + fontRendererObj, + Reference.NAME + " - v" + Reference.VERSION, + width / 2, + GuiLayout.TITLE_Y, + GuiColors.TEXT_PRIMARY + ); + + for (GuiSetting setting : settings) { + setting.draw(mc, mouseX, mouseY); + } + + super.drawScreen(mouseX, mouseY, partialTicks); + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/GuiColors.java b/src/main/java/com/github/cewko/extendedmessages/gui/GuiColors.java new file mode 100644 index 0000000..d839392 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/GuiColors.java @@ -0,0 +1,10 @@ +package com.github.cewko.extendedmessages.gui; + +public final class GuiColors { + public static final int TEXT_PRIMARY = 0xFFFFFFFF; + public static final int TEXT_MUTED = 0xFFB0B0B0; + public static final int TEXT_ERROR = 0xFFFF5555; + + private GuiColors() { + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/GuiLayout.java b/src/main/java/com/github/cewko/extendedmessages/gui/GuiLayout.java new file mode 100644 index 0000000..fad721d --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/GuiLayout.java @@ -0,0 +1,29 @@ +package com.github.cewko.extendedmessages.gui; + +public final class GuiLayout { + public static final int PANEL_WIDTH = 394; + public static final int COLUMN_WIDTH = 190; + public static final int COLUMN_GAP = 14; + + public static final int TITLE_Y = 20; + public static final int FIRST_ROW_Y = 44; + + public static final int CONTROL_HEIGHT = 20; + public static final int TOGGLE_ROW_HEIGHT = 22; + public static final int INPUT_ROW_HEIGHT = 42; + + public static final int ROW_SPACING = 6; + public static final int SECTION_GAP = 8; + + public static final int SETTING_LABEL_PADDING = 0; + public static final int SETTING_LABEL_Y_OFFSET = 0; + public static final int INPUT_FIELD_Y_OFFSET = 12; + + public static final int SLIDER_HANDLE_WIDTH = 8; + + public static final int TEXT_FIELD_PADDING = 4; + public static final int FONT_HEIGHT = 8; + + private GuiLayout() { + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/GuiOpener.java b/src/main/java/com/github/cewko/extendedmessages/gui/GuiOpener.java new file mode 100644 index 0000000..5db5106 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/GuiOpener.java @@ -0,0 +1,39 @@ +package com.github.cewko.extendedmessages.gui; + +import net.minecraft.client.Minecraft; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +public final class GuiOpener { + private static final GuiOpener INSTANCE = new GuiOpener(); + + private boolean openRequested; + + private GuiOpener() { + } + + public static GuiOpener getInstance() { + return INSTANCE; + } + + public void requestOpen() { + openRequested = true; + } + + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END || !openRequested) { + return; + } + + openRequested = false; + + Minecraft minecraft = Minecraft.getMinecraft(); + + if (minecraft.thePlayer == null || minecraft.theWorld == null) { + return; + } + + minecraft.displayGuiScreen(new ExtendedMessagesGui()); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java new file mode 100644 index 0000000..76f5460 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java @@ -0,0 +1,132 @@ +package com.github.cewko.extendedmessages.gui.control; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.GlStateManager; + +import com.github.cewko.extendedmessages.gui.GuiLayout; + +public final class StyledIntegerSlider extends GuiButton { + public interface Value { + int get(); + + void set(int value); + } + + private final String label; + private final int min; + private final int max; + private final Value value; + + private boolean dragging; + + public StyledIntegerSlider( + int id, + int x, + int y, + int width, + int height, + String label, + int min, + int max, + Value value + ) { + super(id, x, y, width, height, ""); + this.label = label; + this.min = min; + this.max = max; + this.value = value; + updateText(); + } + + @Override + public boolean mousePressed(Minecraft minecraft, int mouseX, int mouseY) { + boolean pressed = super.mousePressed(minecraft, mouseX, mouseY); + + if (pressed) { + dragging = true; + updateValueFromMouse(mouseX); + } + + return pressed; + } + + @Override + public void mouseReleased(int mouseX, int mouseY) { + dragging = false; + } + + @Override + protected void mouseDragged(Minecraft minecraft, int mouseX, int mouseY) { + if (!visible) { + return; + } + + if (dragging) { + updateValueFromMouse(mouseX); + } + + minecraft.getTextureManager().bindTexture(buttonTextures); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + + int handleX = xPosition + Math.round( + getPercent() * (width - GuiLayout.SLIDER_HANDLE_WIDTH) + ); + + drawTexturedModalRect( + handleX, + yPosition, + 0, + 66, + GuiLayout.SLIDER_HANDLE_WIDTH / 2, + height + ); + + drawTexturedModalRect( + handleX + GuiLayout.SLIDER_HANDLE_WIDTH / 2, + yPosition, + 196, + 66, + GuiLayout.SLIDER_HANDLE_WIDTH / 2, + height + ); + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY) { + updateText(); + super.drawButton(minecraft, mouseX, mouseY); + } + + @Override + protected int getHoverState(boolean mouseOver) { + return 0; + } + + private void updateValueFromMouse(int mouseX) { + float percent = ( + mouseX - xPosition - GuiLayout.SLIDER_HANDLE_WIDTH / 2.0F + ) / (float) (width - GuiLayout.SLIDER_HANDLE_WIDTH); + + percent = Math.max(0.0F, Math.min(1.0F, percent)); + + int newValue = Math.round(min + percent * (max - min)); + + if (newValue != value.get()) { + value.set(newValue); + updateText(); + } + } + + private float getPercent() { + if (max == min) { + return 0.0F; + } + + return (float) (value.get() - min) / (float) (max - min); + } + + private void updateText() { + displayString = label + ": " + value.get() + "s"; + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledTextField.java b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledTextField.java new file mode 100644 index 0000000..e302997 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledTextField.java @@ -0,0 +1,59 @@ +package com.github.cewko.extendedmessages.gui.control; + +import com.github.cewko.extendedmessages.gui.GuiColors; +import com.github.cewko.extendedmessages.gui.GuiLayout; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiTextField; + +public final class StyledTextField extends GuiTextField { + private final FontRenderer fontRenderer; + private final int x; + private final int y; + private final int height; + + private String placeholder = ""; + + public StyledTextField( + int id, + FontRenderer fontRenderer, + int x, + int y, + int width, + int height + ) { + super(id, fontRenderer, x, y, width, height); + + this.fontRenderer = fontRenderer; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + + setEnableBackgroundDrawing(true); + setTextColor(GuiColors.TEXT_PRIMARY); + setDisabledTextColour(GuiColors.TEXT_MUTED); + } + + public void setPlaceholder(String placeholder) { + this.placeholder = placeholder; + } + + @Override + public void drawTextBox() { + if (!getVisible()) { + return; + } + + super.drawTextBox(); + + if (getText().isEmpty() && !placeholder.isEmpty() && !isFocused()) { + fontRenderer.drawStringWithShadow( + placeholder, + x + GuiLayout.TEXT_FIELD_PADDING, + y + (height - GuiLayout.FONT_HEIGHT) / 2, + GuiColors.TEXT_MUTED + ); + } + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java new file mode 100644 index 0000000..cf27820 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java @@ -0,0 +1,56 @@ +package com.github.cewko.extendedmessages.gui.control; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; + +public final class StyledToggleButton extends GuiButton { + public interface Value { + boolean get(); + + void toggle(); + } + + private final String label; + private final Value value; + + public StyledToggleButton( + int id, + int x, + int y, + int width, + int height, + String label, + Value value + ) { + super(id, x, y, width, height, ""); + this.label = label; + this.value = value; + updateText(); + } + + @Override + public boolean mousePressed(Minecraft minecraft, int mouseX, int mouseY) { + boolean pressed = super.mousePressed(minecraft, mouseX, mouseY); + + if (pressed) { + value.toggle(); + updateText(); + } + + return pressed; + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY) { + updateText(); + super.drawButton(minecraft, mouseX, mouseY); + } + + private void updateText() { + displayString = label + + ": " + + (value.get() + ? "\u00a7aON" + : "\u00a7cOFF"); + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiErrorLabel.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiErrorLabel.java new file mode 100644 index 0000000..dde48bc --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiErrorLabel.java @@ -0,0 +1,16 @@ +package com.github.cewko.extendedmessages.gui.setting; + +import com.github.cewko.extendedmessages.gui.GuiColors; + +public final class GuiErrorLabel { + private GuiErrorLabel() { + } + + public static String text(String label, GuiValidationError error) { + return error == null ? label : label + " (" + error.getLabel() + ")"; + } + + public static int color(GuiValidationError error) { + return error == null ? GuiColors.TEXT_PRIMARY : GuiColors.TEXT_ERROR; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java new file mode 100644 index 0000000..5dbd951 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java @@ -0,0 +1,36 @@ +package com.github.cewko.extendedmessages.gui.setting; + +import java.io.IOException; +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; + +public interface GuiSetting { + int getHeight(); + + void init( + List buttons, + FontRenderer fontRenderer, + int id, + int x, + int y, + int width + ); + + default void draw(Minecraft minecraft, int mouseX, int mouseY) { + } + + default void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + } + + default void keyTyped(char typedChar, int keyCode) throws IOException { + } + + default void update() { + } + + default void validate() { + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiValidationError.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiValidationError.java new file mode 100644 index 0000000..1af283f --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiValidationError.java @@ -0,0 +1,38 @@ +package com.github.cewko.extendedmessages.gui.setting; + +public enum GuiValidationError { + REQUIRED("required"), + NUMBERS_ONLY("numbers only"), + OUT_OF_RANGE("out of range"), + TOO_LONG("too long"), + NO_NEW_LINES("no new lines"), + INVALID("invalid"); + + private final String label; + + GuiValidationError(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } + + public static GuiValidationError fromException(IllegalArgumentException exception) { + String message = exception.getMessage().toLowerCase(); + + if (message.contains("required")) { + return REQUIRED; + } + + if (message.contains("at most")) { + return TOO_LONG; + } + + if (message.contains("new line")) { + return NO_NEW_LINES; + } + + return INVALID; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java new file mode 100644 index 0000000..6a058e2 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java @@ -0,0 +1,123 @@ +package com.github.cewko.extendedmessages.gui.setting; + +import java.io.IOException; +import java.util.List; + +import com.github.cewko.extendedmessages.gui.GuiLayout; +import com.github.cewko.extendedmessages.gui.control.StyledTextField; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; + +public final class IntegerSetting implements GuiSetting { + public interface Value { + int get(); + + void set(int value); + } + + private final String label; + private final int min; + private final int max; + private final Value value; + + private FontRenderer fontRenderer; + private StyledTextField textField; + private GuiValidationError error; + private int x; + private int y; + + public IntegerSetting(String label, int min, int max, Value value) { + this.label = label; + this.min = min; + this.max = max; + this.value = value; + } + + @Override + public int getHeight() { + return GuiLayout.INPUT_ROW_HEIGHT; + } + + @Override + public void init( + List buttons, + FontRenderer fontRenderer, + int id, + int x, + int y, + int width + ) { + this.fontRenderer = fontRenderer; + this.x = x; + this.y = y; + + textField = new StyledTextField( + id, + fontRenderer, + x, + y + GuiLayout.INPUT_FIELD_Y_OFFSET, + width, + GuiLayout.CONTROL_HEIGHT + ); + + textField.setMaxStringLength(String.valueOf(max).length()); + textField.setText(String.valueOf(value.get())); + textField.setPlaceholder(min + "-" + max); + } + + @Override + public void draw(Minecraft minecraft, int mouseX, int mouseY) { + fontRenderer.drawString( + GuiErrorLabel.text(label, error), + x + GuiLayout.SETTING_LABEL_PADDING, + y + GuiLayout.SETTING_LABEL_Y_OFFSET, + GuiErrorLabel.color(error) + ); + + textField.drawTextBox(); + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + textField.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + public void keyTyped(char typedChar, int keyCode) throws IOException { + if (textField.textboxKeyTyped(typedChar, keyCode)) { + saveIfValid(); + } + } + + @Override + public void update() { + textField.updateCursorCounter(); + } + + private void saveIfValid() { + String text = textField.getText().trim(); + + if (text.isEmpty()) { + error = GuiValidationError.REQUIRED; + return; + } + + try { + int parsed = Integer.parseInt(text); + + if (parsed < min || parsed > max) { + error = GuiValidationError.OUT_OF_RANGE; + return; + } + + value.set(parsed); + error = null; + } catch (NumberFormatException exception) { + error = GuiValidationError.NUMBERS_ONLY; + } catch (IllegalArgumentException exception) { + error = GuiValidationError.fromException(exception); + } + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java new file mode 100644 index 0000000..7391f30 --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java @@ -0,0 +1,66 @@ +package com.github.cewko.extendedmessages.gui.setting; + +import java.util.List; + +import com.github.cewko.extendedmessages.gui.GuiLayout; +import com.github.cewko.extendedmessages.gui.control.StyledIntegerSlider; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; + +public final class SliderSetting implements GuiSetting { + public interface Value { + int get(); + + void set(int value); + } + + private final String label; + private final int min; + private final int max; + private final Value value; + + public SliderSetting(String label, int min, int max, Value value) { + this.label = label; + this.min = min; + this.max = max; + this.value = value; + } + + @Override + public int getHeight() { + return GuiLayout.TOGGLE_ROW_HEIGHT; + } + + @Override + public void init( + List buttons, + FontRenderer fontRenderer, + int id, + int x, + int y, + int width + ) { + buttons.add(new StyledIntegerSlider( + id, + x, + y, + width, + GuiLayout.CONTROL_HEIGHT, + label, + min, + max, + new StyledIntegerSlider.Value() { + @Override + public int get() { + return value.get(); + } + + @Override + public void set(int newValue) { + value.set(newValue); + } + } + )); + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java new file mode 100644 index 0000000..3d369bb --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java @@ -0,0 +1,109 @@ +package com.github.cewko.extendedmessages.gui.setting; + +import java.io.IOException; +import java.util.List; + +import com.github.cewko.extendedmessages.gui.GuiLayout; +import com.github.cewko.extendedmessages.gui.control.StyledTextField; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; + +public final class TextSetting implements GuiSetting { + public interface Value { + String get(); + + void set(String value); + } + + private final String label; + private final int maxLength; + private final Value value; + + private FontRenderer fontRenderer; + private StyledTextField textField; + private GuiValidationError error; + private int x; + private int y; + + public TextSetting(String label, int maxLength, Value value) { + this.label = label; + this.maxLength = maxLength; + this.value = value; + } + + @Override + public int getHeight() { + return GuiLayout.INPUT_ROW_HEIGHT; + } + + @Override + public void init( + List buttons, + FontRenderer fontRenderer, + int id, + int x, + int y, + int width + ) { + this.fontRenderer = fontRenderer; + this.x = x; + this.y = y; + + textField = new StyledTextField( + id, + fontRenderer, + x, + y + GuiLayout.INPUT_FIELD_Y_OFFSET, + width, + GuiLayout.CONTROL_HEIGHT + ); + + textField.setMaxStringLength(maxLength); + textField.setText(value.get()); + } + + @Override + public void draw(Minecraft minecraft, int mouseX, int mouseY) { + fontRenderer.drawString( + GuiErrorLabel.text(label, error), + x + GuiLayout.SETTING_LABEL_PADDING, + y + GuiLayout.SETTING_LABEL_Y_OFFSET, + GuiErrorLabel.color(error) + ); + + textField.drawTextBox(); + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + textField.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + public void keyTyped(char typedChar, int keyCode) throws IOException { + if (textField.textboxKeyTyped(typedChar, keyCode)) { + saveIfValid(); + } + } + + @Override + public void update() { + textField.updateCursorCounter(); + } + + private void saveIfValid() { + try { + value.set(textField.getText()); + error = null; + } catch (IllegalArgumentException exception) { + error = GuiValidationError.fromException(exception); + } + } + + @Override + public void validate() { + saveIfValid(); + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java new file mode 100644 index 0000000..b987d4b --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java @@ -0,0 +1,60 @@ +package com.github.cewko.extendedmessages.gui.setting; + +import java.util.List; + +import com.github.cewko.extendedmessages.gui.GuiLayout; +import com.github.cewko.extendedmessages.gui.control.StyledToggleButton; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; + +public final class ToggleSetting implements GuiSetting { + public interface Value { + boolean get(); + + void toggle(); + } + + private final String label; + private final Value value; + + public ToggleSetting(String label, Value value) { + this.label = label; + this.value = value; + } + + @Override + public int getHeight() { + return GuiLayout.TOGGLE_ROW_HEIGHT; + } + + @Override + public void init( + List buttons, + FontRenderer fontRenderer, + int id, + int x, + int y, + int width + ) { + buttons.add(new StyledToggleButton( + id, + x, + y, + width, + GuiLayout.CONTROL_HEIGHT, + label, + new StyledToggleButton.Value() { + @Override + public boolean get() { + return value.get(); + } + + @Override + public void toggle() { + value.toggle(); + } + } + )); + } +} From 52e74b03512172b70e5a3e1356efa7c19f4e2f90 Mon Sep 17 00:00:00 2001 From: cewko Date: Fri, 24 Jul 2026 03:19:54 +0200 Subject: [PATCH 4/9] feat: simplify commands --- .../extendedmessages/ExtendedMessages.java | 2 +- .../ExtendedMessagesCommand.java | 514 +++++++----------- 2 files changed, 212 insertions(+), 304 deletions(-) diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java index 730cf38..c483f5e 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java @@ -193,7 +193,7 @@ private static void validatePrefix(String prefix, String displayName) { if (prefix.length() > Reference.MAX_PREFIX_LENGTH ) { throw new IllegalArgumentException( - displayName + " must be at most " + Reference.MAX_PREFIX_LENGTH + " characters"); + displayName + " must be at most " + Reference.MAX_PREFIX_LENGTH + " characters"); } } diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java index 0d4baa2..d00c59f 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java @@ -13,6 +13,46 @@ import net.minecraft.util.EnumChatFormatting; public final class ExtendedMessagesCommand extends CommandBase { + private interface BooleanToggle { + boolean toggle(); + } + + private interface StringSetter { + String set(String value); + } + + private interface IntSetter { + void set(int value); + } + + private interface IntFormatter { + String format(int value); + } + + private void handleIntSet( + ICommandSender sender, + String[] args, + String usage, + String displayName, + int min, + int max, + IntSetter setter, + IntFormatter formatter + ) throws CommandException { + if (args.length != 3 || !"set".equalsIgnoreCase(args[1])) { + throw new WrongUsageException(usage); + } + + int value = parseInt(args[2], min, max); + + try { + setter.set(value); + } catch (IllegalArgumentException exception) { + throw new CommandException(exception.getMessage()); + } + + sendLine(sender, displayName + ": " + formatter.format(value)); + } @Override public String getCommandName() { @@ -26,15 +66,11 @@ public List getCommandAliases() { @Override public String getCommandUsage(ICommandSender sender) { - return "/em [gui|toggle|split|delay <" - + Reference.MIN_DELAY_SECONDS - + "-" - + Reference.MAX_DELAY_SECONDS - + ">|history <" - + Reference.MIN_MESSAGE_HISTORY_LENGTH - + "-" - + Reference.MAX_MESSAGE_HISTORY_LENGTH - + ">|prefix |command |delay >]"; + return "/em | /em toggle | /em mp >" + + " | /em cp >" + + " | /em mc set " + + " | /em cc set " + + " | /em h set "; } @Override @@ -43,190 +79,198 @@ public int getRequiredPermissionLevel() { } @Override - public void processCommand(ICommandSender sender, String[] args) + public void processCommand(ICommandSender sender, String[] args) throws CommandException { - - if (args.length == 0) { - showStatus(sender); - return; - } - if (args.length == 1 && "gui".equalsIgnoreCase(args[0])) { + if (args.length == 0) { GuiOpener.getInstance().requestOpen(); return; } - if (args.length == 1 && "toggle".equalsIgnoreCase(args[0])) { - boolean enabled = ExtendedMessages.toggleEnabled(); - sendLine(sender, "Remove 100-character limit: " + formatState(enabled)); - - return; - } - - if (args.length == 1 && "split".equalsIgnoreCase(args[0])) { - boolean enabled = ExtendedMessages.toggleSplitEnabled(); - - sendLine(sender, "Split long messages: " + formatState(enabled) - + formatSplitRisk(enabled) - ); - - return; - } - - if (args.length == 2 && "delay".equalsIgnoreCase(args[0])) { - - int seconds = parseInt( - args[1], - Reference.MIN_DELAY_SECONDS, - Reference.MAX_DELAY_SECONDS - ); - - ExtendedMessages.setMessageDelaySeconds(seconds); - - sendLine( - sender, - "Message delay: " - + EnumChatFormatting.AQUA - + formatSeconds(seconds) - ); - - return; - } - - if (args.length == 2 && "history".equalsIgnoreCase(args[0])) { - int length = parseInt( - args[1], - Reference.MIN_MESSAGE_HISTORY_LENGTH, - Reference.MAX_MESSAGE_HISTORY_LENGTH - ); - - ExtendedMessages.setMessageHistoryLength(length); - - sendLine( - sender, - "message history length: " - + EnumChatFormatting.AQUA - + length - + EnumChatFormatting.GRAY - + " lines" - ); - - return; - } - - if ("prefix".equalsIgnoreCase(args[0])) { - handlePrefixCommand(sender, args); - return; - } - - if ("command".equalsIgnoreCase(args[0])) { - handleCommandSettings(sender, args); - return; - } - - throw new WrongUsageException(getCommandUsage(sender)); - } - - private void handlePrefixCommand( - ICommandSender sender, String[] args) throws CommandException { - - if (args.length == 1) { - showPrefixStatus(sender); + switch (args[0].toLowerCase()) { + case "toggle": + handleMainToggle(sender, args); return; - } - - if (args.length == 2 && "toggle".equalsIgnoreCase(args[1])) { - boolean enabled = ExtendedMessages.toggleMessagePrefixEnabled(); - - sendLine(sender, "Message prefix: " + formatState(enabled)); - + case "mp": + handlePrefixSetting( + sender, + args, + "/em mp >", + "Message prefix", + new BooleanToggle() { + @Override + public boolean toggle() { + return ExtendedMessages.toggleMessagePrefixEnabled(); + } + }, + new StringSetter() { + @Override + public String set(String value) { + ExtendedMessages.setMessagePrefix(value); + return ExtendedMessages.getMessagePrefix(); + } + } + ); return; - } - - if (args.length == 2 && "remove".equalsIgnoreCase(args[1])) { - ExtendedMessages.setMessagePrefix(""); - sendLine(sender, "Message prefix removed"); + case "cp": + handlePrefixSetting( + sender, + args, + "/em cp >", + "Command prefix", + new BooleanToggle() { + @Override + public boolean toggle() { + return ExtendedMessages.toggleCommandPrefixEnabled(); + } + }, + new StringSetter() { + @Override + public String set(String value) { + ExtendedMessages.setCommandPrefix(value); + return ExtendedMessages.getCommandPrefix(); + } + } + ); return; - } - - if (args.length >= 3 && "set".equalsIgnoreCase(args[1])) { - String prefix = joinArgs(args, 2); - - try { - ExtendedMessages.setMessagePrefix(prefix); - } catch (IllegalArgumentException exception) { - throw new CommandException( - exception.getMessage() - ); - } - - sendLine(sender, - "Message prefix set to " + formatValue(ExtendedMessages.getMessagePrefix()) + case "mc": + handleIntSet( + sender, + args, + "/em mc set ", + "Message cooldown", + Reference.MIN_DELAY_SECONDS, + Reference.MAX_DELAY_SECONDS, + new IntSetter() { + @Override + public void set(int value) { + ExtendedMessages.setMessageDelaySeconds(value); + } + }, + new IntFormatter() { + @Override + public String format(int value) { + return EnumChatFormatting.AQUA + formatSeconds(value); + } + } + ); + return; + case "cc": + handleIntSet( + sender, + args, + "/em cc set ", + "Command cooldown", + Reference.MIN_DELAY_SECONDS, + Reference.MAX_DELAY_SECONDS, + new IntSetter() { + @Override + public void set(int value) { + ExtendedMessages.setCommandDelaySeconds(value); + } + }, + new IntFormatter() { + @Override + public String format(int value) { + return EnumChatFormatting.AQUA + formatSeconds(value); + } + } + ); + return; + case "h": + handleIntSet( + sender, + args, + "/em h set ", + "History length", + Reference.MIN_MESSAGE_HISTORY_LENGTH, + Reference.MAX_MESSAGE_HISTORY_LENGTH, + new IntSetter() { + @Override + public void set(int value) { + ExtendedMessages.setMessageHistoryLength(value); + } + }, + new IntFormatter() { + @Override + public String format(int value) { + return EnumChatFormatting.AQUA + + String.valueOf(value) + + EnumChatFormatting.GRAY + + " lines"; + } + } ); - return; - } - throw new WrongUsageException( - "/em prefix [toggle|set |remove]" - ); + default: + throw new WrongUsageException(getCommandUsage(sender)); } + } - private void handleCommandSettings( - ICommandSender sender, String[] args) throws CommandException { + private void handleMainToggle(ICommandSender sender, String[] args) + throws CommandException { - if (args.length == 1) { - showConfiguredCommandStatus(sender); - return; - } + if (args.length != 1) { + throw new WrongUsageException("/em toggle"); + } - if (args.length == 2 && "toggle".equalsIgnoreCase(args[1])) { - boolean enabled = ExtendedMessages.toggleCommandPrefixEnabled(); - sendLine(sender, "Configured command: " + formatState(enabled)); - return; - } + boolean enabled = ExtendedMessages.toggleEnabled(); + sendLine(sender, "Remove 100-character limit: " + formatState(enabled)); + } - if (args.length >= 3 && "set".equalsIgnoreCase(args[1])) { - String commandPrefix = joinArgs(args, 2); + private void handlePrefixSetting( + ICommandSender sender, + String[] args, + String usage, + String displayName, + BooleanToggle toggle, + StringSetter setter + ) throws CommandException { + if (args.length < 2) { + throw new WrongUsageException(usage); + } - try { - ExtendedMessages.setCommandPrefix(commandPrefix); - } catch (IllegalArgumentException exception) { - throw new CommandException( - exception.getMessage() - ); + switch (args[1].toLowerCase()) { + case "toggle": + if (args.length != 2) { + throw new WrongUsageException(usage); } - sendLine(sender, - "Configured command set to " + formatValue( - ExtendedMessages.getCommandPrefix())); - + boolean enabled = toggle.toggle(); + sendLine(sender, displayName + ": " + formatState(enabled)); return; - } - - if (args.length == 3 && "delay".equalsIgnoreCase(args[1])) { - int seconds = parseInt( - args[2], - Reference.MIN_DELAY_SECONDS, - Reference.MAX_DELAY_SECONDS - ); - - ExtendedMessages.setCommandDelaySeconds(seconds); - sendLine( - sender, - "Command delay: " - + EnumChatFormatting.AQUA - + formatSeconds(seconds) - ); + case "set": + if (args.length < 3) { + throw new WrongUsageException(usage); + } + handleTextSet(sender, args, displayName, setter); return; - } - throw new WrongUsageException( - "/em command [toggle|set |delay ]" - ); + default: + throw new WrongUsageException(usage); } + } + + private void handleTextSet( + ICommandSender sender, + String[] args, + String displayName, + StringSetter setter + ) throws CommandException { + String value = joinArgs(args, 2); + String storedValue; + + try { + storedValue = setter.set(value); + } catch (IllegalArgumentException exception) { + throw new CommandException(exception.getMessage()); + } + + sendLine(sender, displayName + " set to " + formatValue(storedValue)); + } private String joinArgs(String[] args, int startIndex) { StringBuilder result = new StringBuilder(); @@ -242,133 +286,6 @@ private String joinArgs(String[] args, int startIndex) { return result.toString(); } - private void showStatus(ICommandSender sender) { - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.AQUA - + "[" + Reference.NAME + "]" - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GRAY - + "Remove 100-character limit: " - + formatState(ExtendedMessages.isEnabled()) - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GRAY - + "Split long messages: " - + formatState(ExtendedMessages.isSplitEnabled()) - + formatSplitRisk(ExtendedMessages.isSplitEnabled()) - )); - - int delay = ExtendedMessages.getMessageDelaySeconds(); - int commandDelay = ExtendedMessages.getCommandDelaySeconds(); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GRAY - + "Message delay: " - + EnumChatFormatting.AQUA - + formatSeconds(delay) - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GRAY - + "Command delay: " - + EnumChatFormatting.AQUA - + formatSeconds(commandDelay) - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.DARK_GRAY - + "/em toggle" - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.DARK_GRAY - + "/em split" - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.DARK_GRAY - + "/em delay " - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.DARK_GRAY - + "/em command delay " - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.DARK_GRAY - + "/em history " - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GRAY + "Message prefix: " - + formatState(ExtendedMessages.isMessagePrefixEnabled()) - + EnumChatFormatting.GRAY - + " " - + formatValue(ExtendedMessages.getMessagePrefix()) - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GRAY + "Configured command: " - + formatState(ExtendedMessages.isCommandPrefixEnabled()) - + EnumChatFormatting.GRAY - + " " - + formatValue(ExtendedMessages.getCommandPrefix()) - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GRAY - + "Message history length: " - + EnumChatFormatting.AQUA - + ExtendedMessages.getMessageHistoryLength() - + EnumChatFormatting.GRAY - + " lines" - )); - - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.DARK_GRAY - + "/em gui" - )); - } - - private void showPrefixStatus(ICommandSender sender) { - sendLine(sender, "Message prefix: " - + formatState( - ExtendedMessages.isMessagePrefixEnabled() - ) - ); - - sendLine(sender, "Message prefix value: " - + formatValue( - ExtendedMessages.getMessagePrefix() - ) - ); - } - - private void showConfiguredCommandStatus(ICommandSender sender) { - sendLine(sender, "Configured command: " - + formatState( - ExtendedMessages.isCommandPrefixEnabled() - ) - ); - - sendLine(sender, "Configured command value: " - + formatValue( - ExtendedMessages.getCommandPrefix() - ) - ); - - sendLine(sender, "Command delay: " - + EnumChatFormatting.AQUA - + formatSeconds( - ExtendedMessages.getCommandDelaySeconds() - ) - ); - } - private void sendLine(ICommandSender sender, String message) { sender.addChatMessage(new ChatComponentText( EnumChatFormatting.GRAY @@ -381,15 +298,6 @@ private String formatState(boolean enabled) { return enabled ? EnumChatFormatting.GREEN + "ON" : EnumChatFormatting.RED + "OFF"; } - private String formatSplitRisk(boolean splitEnabled) { - if (splitEnabled) { - return ""; - } - - return EnumChatFormatting.RED - + " (unsafe; servers might kick you)"; - } - private String formatSeconds(int seconds) { return String.valueOf(seconds) + EnumChatFormatting.GRAY From 0f6707a96686d023ce9aad920bc4c869731a0d44 Mon Sep 17 00:00:00 2001 From: cewko Date: Fri, 24 Jul 2026 11:41:59 +0200 Subject: [PATCH 5/9] fix: reject empty prefixes always --- .../extendedmessages/ExtendedMessages.java | 79 +++++++++++-------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java index c483f5e..191b069 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java @@ -115,44 +115,42 @@ public static String getCommandPrefix() { public static boolean toggleMessagePrefixEnabled() { messagePrefixEnabled = !messagePrefixEnabled; - - ExtendedMessagesConfig.saveMessagePrefixEnabled( - messagePrefixEnabled - ); - + ExtendedMessagesConfig.saveMessagePrefixEnabled(messagePrefixEnabled); return messagePrefixEnabled; } - public static void setMessagePrefix(String prefix) { + private static String normalizeMessagePrefix(String prefix) { if (prefix == null) { throw new IllegalArgumentException("Message prefix cannot be null"); } prefix = prefix.trim(); - if (prefix.isEmpty() && messagePrefixEnabled) { + if (prefix.isEmpty()) { throw new IllegalArgumentException("Message prefix is required"); } validatePrefix(prefix, "Message prefix"); - messagePrefix = prefix; + return prefix; + } - ExtendedMessagesConfig.saveMessagePrefix( - messagePrefix - ); + public static void setMessagePrefix(String prefix) { + messagePrefix = normalizeMessagePrefix(prefix); + ExtendedMessagesConfig.saveMessagePrefix(messagePrefix); } public static boolean toggleCommandPrefixEnabled() { commandPrefixEnabled = !commandPrefixEnabled; - - ExtendedMessagesConfig.saveCommandPrefixEnabled( - commandPrefixEnabled - ); - + ExtendedMessagesConfig.saveCommandPrefixEnabled(commandPrefixEnabled); return commandPrefixEnabled; } public static void setCommandPrefix(String prefix) { + commandPrefix = normalizeCommandPrefix(prefix); + ExtendedMessagesConfig.saveCommandPrefix(commandPrefix); + } + + private static String normalizeCommandPrefix(String prefix) { if (prefix == null) { throw new IllegalArgumentException("Command prefix cannot be null"); } @@ -160,13 +158,7 @@ public static void setCommandPrefix(String prefix) { prefix = prefix.trim(); if (prefix.isEmpty()) { - if (commandPrefixEnabled) { - throw new IllegalArgumentException("Command prefix is required"); - } - - commandPrefix = ""; - ExtendedMessagesConfig.saveCommandPrefix(commandPrefix); - return; + throw new IllegalArgumentException("Command prefix is required"); } if (!prefix.startsWith("/")) { @@ -174,12 +166,7 @@ public static void setCommandPrefix(String prefix) { } validatePrefix(prefix, "Command prefix"); - - commandPrefix = prefix; - - ExtendedMessagesConfig.saveCommandPrefix( - commandPrefix - ); + return prefix; } private static void validatePrefix(String prefix, String displayName) { @@ -240,22 +227,44 @@ private static void validateHistoryLength(int length) { } } + private static String loadMessagePrefix() { + try { + return normalizeMessagePrefix( + ExtendedMessagesConfig.getMessagePrefix() + ); + } catch (IllegalArgumentException exception) { + return Reference.DEFAULT_MESSAGE_PREFIX; + } + } + + private static String loadCommandPrefix() { + try { + return normalizeCommandPrefix( + ExtendedMessagesConfig.getCommandPrefix() + ); + } catch (IllegalArgumentException exception) { + return Reference.DEFAULT_COMMAND_PREFIX; + } + } + @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { - ExtendedMessagesConfig.load( - event.getSuggestedConfigurationFile() - ); + ExtendedMessagesConfig.load(event.getSuggestedConfigurationFile()); enabled = ExtendedMessagesConfig.getEnabled(); splitEnabled = ExtendedMessagesConfig.getSplitEnabled(); + messageDelaySeconds = ExtendedMessagesConfig.getMessageDelaySeconds(); commandDelaySeconds = ExtendedMessagesConfig.getCommandDelaySeconds(); messagePrefixEnabled = ExtendedMessagesConfig.getMessagePrefixEnabled(); - messagePrefix = ExtendedMessagesConfig.getMessagePrefix(); - commandPrefixEnabled = ExtendedMessagesConfig.getCommandPrefixEnabled(); - commandPrefix = ExtendedMessagesConfig.getCommandPrefix(); + + messagePrefix = loadMessagePrefix(); + commandPrefix = loadCommandPrefix(); + + ExtendedMessagesConfig.saveMessagePrefix(messagePrefix); + ExtendedMessagesConfig.saveCommandPrefix(commandPrefix); messageHistoryLength = ExtendedMessagesConfig.getMessageHistoryLength(); } From 52b00ed787261bdfc92bed031ed850e69c5f684a Mon Sep 17 00:00:00 2001 From: cewko Date: Fri, 24 Jul 2026 12:12:27 +0200 Subject: [PATCH 6/9] feat: settings draft --- .../extendedmessages/ExtendedMessages.java | 4 +- .../gui/ExtendedMessagesGui.java | 63 +++--- .../extendedmessages/gui/SettingsDraft.java | 201 ++++++++++++++++++ .../gui/setting/GuiSetting.java | 3 +- .../gui/setting/IntegerSetting.java | 14 +- .../gui/setting/TextSetting.java | 8 +- 6 files changed, 260 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java index 191b069..602b9cc 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java @@ -119,7 +119,7 @@ public static boolean toggleMessagePrefixEnabled() { return messagePrefixEnabled; } - private static String normalizeMessagePrefix(String prefix) { + public static String normalizeMessagePrefix(String prefix) { if (prefix == null) { throw new IllegalArgumentException("Message prefix cannot be null"); } @@ -150,7 +150,7 @@ public static void setCommandPrefix(String prefix) { ExtendedMessagesConfig.saveCommandPrefix(commandPrefix); } - private static String normalizeCommandPrefix(String prefix) { + public static String normalizeCommandPrefix(String prefix) { if (prefix == null) { throw new IllegalArgumentException("Command prefix cannot be null"); } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java b/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java index 920c732..a830368 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; -import com.github.cewko.extendedmessages.ExtendedMessages; import com.github.cewko.extendedmessages.Reference; import com.github.cewko.extendedmessages.gui.setting.GuiSetting; import com.github.cewko.extendedmessages.gui.setting.IntegerSetting; @@ -22,10 +21,16 @@ public final class ExtendedMessagesGui extends GuiScreen { private final List regularSettings = new ArrayList(); private final List commandSettings = new ArrayList(); + private final SettingsDraft draft; + private GuiSetting mainSetting; private int nextControlId; + public ExtendedMessagesGui() { + draft = SettingsDraft.fromCurrentSettings(); + } + @Override public void initGui() { buttonList.clear(); @@ -81,12 +86,12 @@ private void addMainSettings() { new ToggleSetting.Value() { @Override public boolean get() { - return ExtendedMessages.isEnabled(); + return draft.isEnabled(); } @Override public void toggle() { - ExtendedMessages.toggleEnabled(); + draft.toggleEnabled(); } } ); @@ -100,12 +105,12 @@ private void addRegularSettings() { new ToggleSetting.Value() { @Override public boolean get() { - return ExtendedMessages.isSplitEnabled(); + return draft.isSplitEnabled(); } @Override public void toggle() { - ExtendedMessages.toggleSplitEnabled(); + draft.toggleSplitEnabled(); } } )); @@ -118,12 +123,12 @@ public void toggle() { new SliderSetting.Value() { @Override public int get() { - return ExtendedMessages.getMessageDelaySeconds(); + return draft.getMessageDelaySeconds(); } @Override public void set(int value) { - ExtendedMessages.setMessageDelaySeconds(value); + draft.setMessageDelaySeconds(value); } } ) @@ -134,12 +139,12 @@ public void set(int value) { new ToggleSetting.Value() { @Override public boolean get() { - return ExtendedMessages.isMessagePrefixEnabled(); + return draft.isMessagePrefixEnabled(); } @Override public void toggle() { - ExtendedMessages.toggleMessagePrefixEnabled(); + draft.toggleMessagePrefixEnabled(); } } )); @@ -151,12 +156,12 @@ public void toggle() { new TextSetting.Value() { @Override public String get() { - return ExtendedMessages.getMessagePrefix(); + return draft.getMessagePrefix(); } @Override public void set(String value) { - ExtendedMessages.setMessagePrefix(value); + draft.setMessagePrefix(value); } } ) @@ -170,12 +175,12 @@ public void set(String value) { new IntegerSetting.Value() { @Override public int get() { - return ExtendedMessages.getMessageHistoryLength(); + return draft.getMessageHistoryLength(); } @Override public void set(int value) { - ExtendedMessages.setMessageHistoryLength(value); + draft.setMessageHistoryLength(value); } } ) @@ -189,12 +194,12 @@ private void addCommandSettings() { new ToggleSetting.Value() { @Override public boolean get() { - return ExtendedMessages.isCommandPrefixEnabled(); + return draft.isCommandPrefixEnabled(); } @Override public void toggle() { - ExtendedMessages.toggleCommandPrefixEnabled(); + draft.toggleCommandPrefixEnabled(); } } ) @@ -208,12 +213,12 @@ public void toggle() { new SliderSetting.Value() { @Override public int get() { - return ExtendedMessages.getCommandDelaySeconds(); + return draft.getCommandDelaySeconds(); } @Override public void set(int value) { - ExtendedMessages.setCommandDelaySeconds(value); + draft.setCommandDelaySeconds(value); } } ) @@ -225,12 +230,12 @@ public void set(int value) { new TextSetting.Value() { @Override public String get() { - return ExtendedMessages.getCommandPrefix(); + return draft.getCommandPrefix(); } @Override public void set(String value) { - ExtendedMessages.setCommandPrefix(value); + draft.setCommandPrefix(value); } } )); @@ -248,12 +253,16 @@ private void addCommandSetting(GuiSetting setting) { @Override protected void actionPerformed(GuiButton button) throws IOException { - if (button.id == DONE_BUTTON_ID) { - mc.displayGuiScreen(null); + if (button.id != DONE_BUTTON_ID) { return; } - validateSettings(); + if (!validateSettings()) { + return; + } + + draft.apply(); + mc.displayGuiScreen(null); } @Override @@ -274,10 +283,16 @@ protected void keyTyped(char typedChar, int keyCode) throws IOException { super.keyTyped(typedChar, keyCode); } - private void validateSettings() { + private boolean validateSettings() { + boolean valid = true; + for (GuiSetting setting : settings) { - setting.validate(); + if (!setting.validate()) { + valid = false; + } } + + return valid; } @Override diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java b/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java new file mode 100644 index 0000000..a41060a --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java @@ -0,0 +1,201 @@ +package com.github.cewko.extendedmessages.gui; + +import com.github.cewko.extendedmessages.ExtendedMessages; +import com.github.cewko.extendedmessages.Reference; + +public final class SettingsDraft { + private boolean enabled; + private boolean splitEnabled; + + private int messageDelaySeconds; + private int commandDelaySeconds; + + private boolean messagePrefixEnabled; + private String messagePrefix; + + private boolean commandPrefixEnabled; + private String commandPrefix; + + private int messageHistoryLength; + + private SettingsDraft() { + } + + public static SettingsDraft fromCurrentSettings() { + SettingsDraft draft = new SettingsDraft(); + + draft.enabled = ExtendedMessages.isEnabled(); + draft.splitEnabled = ExtendedMessages.isSplitEnabled(); + + draft.messageDelaySeconds = ExtendedMessages.getMessageDelaySeconds(); + draft.commandDelaySeconds = ExtendedMessages.getCommandDelaySeconds(); + + draft.messagePrefixEnabled = ExtendedMessages.isMessagePrefixEnabled(); + draft.messagePrefix = ExtendedMessages.getMessagePrefix(); + + draft.commandPrefixEnabled = ExtendedMessages.isCommandPrefixEnabled(); + draft.commandPrefix = ExtendedMessages.getCommandPrefix(); + + draft.messageHistoryLength = ExtendedMessages.getMessageHistoryLength(); + + return draft; + } + + public boolean isEnabled() { + return enabled; + } + + public void toggleEnabled() { + enabled = !enabled; + } + + public boolean isSplitEnabled() { + return splitEnabled; + } + + public void toggleSplitEnabled() { + splitEnabled = !splitEnabled; + } + + public int getMessageDelaySeconds() { + return messageDelaySeconds; + } + + public void setMessageDelaySeconds(int seconds) { + messageDelaySeconds = seconds; + } + + public int getCommandDelaySeconds() { + return commandDelaySeconds; + } + + public void setCommandDelaySeconds(int seconds) { + commandDelaySeconds = seconds; + } + + public boolean isMessagePrefixEnabled() { + return messagePrefixEnabled; + } + + public void toggleMessagePrefixEnabled() { + messagePrefixEnabled = !messagePrefixEnabled; + } + + public String getMessagePrefix() { + return messagePrefix; + } + + public void setMessagePrefix(String prefix) { + messagePrefix = prefix; + ExtendedMessages.normalizeMessagePrefix(prefix); + } + + public boolean isCommandPrefixEnabled() { + return commandPrefixEnabled; + } + + public void toggleCommandPrefixEnabled() { + commandPrefixEnabled = !commandPrefixEnabled; + } + + public String getCommandPrefix() { + return commandPrefix; + } + + public void setCommandPrefix(String prefix) { + commandPrefix = prefix; + ExtendedMessages.normalizeCommandPrefix(prefix); + } + + public int getMessageHistoryLength() { + return messageHistoryLength; + } + + public void setMessageHistoryLength(int length) { + messageHistoryLength = length; + } + + public void validate() { + ExtendedMessages.normalizeMessagePrefix(messagePrefix); + ExtendedMessages.normalizeCommandPrefix(commandPrefix); + + if (messageDelaySeconds < Reference.MIN_DELAY_SECONDS + || messageDelaySeconds > Reference.MAX_DELAY_SECONDS) { + throw new IllegalArgumentException( + "Message cooldown must be between " + + Reference.MIN_DELAY_SECONDS + + " and " + + Reference.MAX_DELAY_SECONDS + + " seconds" + ); + } + + if (commandDelaySeconds < Reference.MIN_DELAY_SECONDS + || commandDelaySeconds > Reference.MAX_DELAY_SECONDS) { + throw new IllegalArgumentException( + "Command cooldown must be between " + + Reference.MIN_DELAY_SECONDS + + " and " + + Reference.MAX_DELAY_SECONDS + + " seconds" + ); + } + + if (messageHistoryLength < Reference.MIN_MESSAGE_HISTORY_LENGTH + || messageHistoryLength > Reference.MAX_MESSAGE_HISTORY_LENGTH) { + throw new IllegalArgumentException( + "History length must be between " + + Reference.MIN_MESSAGE_HISTORY_LENGTH + + " and " + + Reference.MAX_MESSAGE_HISTORY_LENGTH + + " lines" + ); + } + } + + public void apply() { + validate(); + + String normalizedMessagePrefix = + ExtendedMessages.normalizeMessagePrefix(messagePrefix); + + String normalizedCommandPrefix = + ExtendedMessages.normalizeCommandPrefix(commandPrefix); + + if (!normalizedMessagePrefix.equals(ExtendedMessages.getMessagePrefix())) { + ExtendedMessages.setMessagePrefix(normalizedMessagePrefix); + } + + if (!normalizedCommandPrefix.equals(ExtendedMessages.getCommandPrefix())) { + ExtendedMessages.setCommandPrefix(normalizedCommandPrefix); + } + + if (messageDelaySeconds != ExtendedMessages.getMessageDelaySeconds()) { + ExtendedMessages.setMessageDelaySeconds(messageDelaySeconds); + } + + if (commandDelaySeconds != ExtendedMessages.getCommandDelaySeconds()) { + ExtendedMessages.setCommandDelaySeconds(commandDelaySeconds); + } + + if (messageHistoryLength != ExtendedMessages.getMessageHistoryLength()) { + ExtendedMessages.setMessageHistoryLength(messageHistoryLength); + } + + if (messagePrefixEnabled != ExtendedMessages.isMessagePrefixEnabled()) { + ExtendedMessages.toggleMessagePrefixEnabled(); + } + + if (commandPrefixEnabled != ExtendedMessages.isCommandPrefixEnabled()) { + ExtendedMessages.toggleCommandPrefixEnabled(); + } + + if (splitEnabled != ExtendedMessages.isSplitEnabled()) { + ExtendedMessages.toggleSplitEnabled(); + } + + if (enabled != ExtendedMessages.isEnabled()) { + ExtendedMessages.toggleEnabled(); + } + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java index 5dbd951..e0196fd 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java @@ -31,6 +31,7 @@ default void keyTyped(char typedChar, int keyCode) throws IOException { default void update() { } - default void validate() { + default boolean validate() { + return true; } } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java index 6a058e2..204a6e2 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java @@ -96,12 +96,12 @@ public void update() { textField.updateCursorCounter(); } - private void saveIfValid() { + private boolean saveIfValid() { String text = textField.getText().trim(); if (text.isEmpty()) { error = GuiValidationError.REQUIRED; - return; + return false; } try { @@ -109,15 +109,23 @@ private void saveIfValid() { if (parsed < min || parsed > max) { error = GuiValidationError.OUT_OF_RANGE; - return; + return false; } value.set(parsed); error = null; + return true; } catch (NumberFormatException exception) { error = GuiValidationError.NUMBERS_ONLY; + return false; } catch (IllegalArgumentException exception) { error = GuiValidationError.fromException(exception); + return false; } } + + @Override + public boolean validate() { + return saveIfValid(); + } } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java index 3d369bb..279afb9 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java @@ -93,17 +93,19 @@ public void update() { textField.updateCursorCounter(); } - private void saveIfValid() { + private boolean saveIfValid() { try { value.set(textField.getText()); error = null; + return true; } catch (IllegalArgumentException exception) { error = GuiValidationError.fromException(exception); + return false; } } @Override - public void validate() { - saveIfValid(); + public boolean validate() { + return saveIfValid(); } } From ba4b75b60f60625c9ffa1eb2283525b1044144e6 Mon Sep 17 00:00:00 2001 From: cewko Date: Fri, 24 Jul 2026 13:29:33 +0200 Subject: [PATCH 7/9] refactor: meowing & enshittification --- build.gradle.kts | 15 -- .../extendedmessages/ExtendedMessages.java | 163 +++++++----------- .../ExtendedMessagesCommand.java | 124 ++++--------- .../cewko/extendedmessages/Reference.java | 3 +- .../extendedmessages/SettingsValidation.java | 74 ++++++++ .../config/ExtendedMessagesConfig.java | 69 ++++---- .../gui/ExtendedMessagesGui.java | 143 ++++----------- .../extendedmessages/gui/SettingsDraft.java | 96 +++-------- .../gui/control/StyledIntegerSlider.java | 26 +-- .../gui/control/StyledToggleButton.java | 21 ++- .../gui/setting/IntegerSetting.java | 26 +-- .../gui/setting/SliderSetting.java | 37 ++-- .../gui/setting/TextSetting.java | 25 +-- .../gui/setting/ToggleSetting.java | 32 ++-- .../messaging/MessageQueue.java | 58 +++++-- 15 files changed, 389 insertions(+), 523 deletions(-) create mode 100644 src/main/java/com/github/cewko/extendedmessages/SettingsValidation.java diff --git a/build.gradle.kts b/build.gradle.kts index 3d26f06..7b3faa5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,10 +12,7 @@ plugins { val baseGroup: String by project val mcVersion: String by project -val version: String by project -val mixinGroup = "$baseGroup.mixin" val modid: String by project -val transformerFile = file("src/main/resources/accesstransformer.cfg") // Toolchains: java { @@ -34,7 +31,6 @@ tasks.withType().configureEach { loom { launchConfigs { "client" { - // If you don't want mixins, remove these lines property("mixin.debug", "true") arg("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker") } @@ -52,10 +48,6 @@ loom { pack200Provider.set(dev.architectury.pack200.java.Pack200Adapter()) // If you don't want mixins, remove this lines mixinConfig("mixins.$modid.json") - if (transformerFile.exists()) { - println("Installing access transformer") - accessTransformer(transformerFile) - } } // If you don't want mixins, remove these lines mixin { @@ -111,8 +103,6 @@ tasks.withType(org.gradle.jvm.tasks.Jar::class) { // If you don't want mixins, remove these lines this["TweakClass"] = "org.spongepowered.asm.launch.MixinTweaker" this["MixinConfigs"] = "mixins.$modid.json" - if (transformerFile.exists()) - this["FMLAT"] = "${modid}_at.cfg" } } @@ -125,8 +115,6 @@ tasks.processResources { filesMatching(listOf("mcmod.info", "mixins.$modid.json")) { expand(inputs.properties) } - - rename("accesstransformer.cfg", "META-INF/${modid}_at.cfg") } @@ -150,9 +138,6 @@ tasks.shadowJar { println("Copying dependencies into mod: ${it.files}") } } - - // If you want to include other dependencies and shadow them, you can relocate them in here - fun relocate(name: String) = relocate(name, "$baseGroup.deps.$name") } tasks.assemble.get().dependsOn(tasks.remapJar) diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java index 602b9cc..63d7716 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java @@ -22,7 +22,7 @@ ) public class ExtendedMessages { - public static boolean enabled = Reference.DEFAULT_ENABLED; + private static boolean enabled = Reference.DEFAULT_ENABLED; private static boolean splitEnabled = Reference.DEFAULT_SPLIT_ENABLED; private static int messageDelaySeconds = Reference.DEFAULT_MESSAGE_DELAY_SECONDS; private static int commandDelaySeconds = Reference.DEFAULT_COMMAND_DELAY_SECONDS; @@ -43,37 +43,38 @@ public static boolean isSplitEnabled() { return splitEnabled; } - public static boolean toggleSplitEnabled() { - splitEnabled = !splitEnabled; - ExtendedMessagesConfig.saveSplitEnabled(splitEnabled); + public static void setSplitEnabled(boolean value) { + if (splitEnabled == value) { + return; + } + + splitEnabled = value; + ExtendedMessagesConfig.saveSplitEnabled(value); MessageQueue.getInstance().clear(); + } + public static boolean toggleSplitEnabled() { + setSplitEnabled(!splitEnabled); return splitEnabled; } - public static boolean toggleEnabled() { - enabled = !enabled; - ExtendedMessagesConfig.saveEnabled(enabled); + public static void setEnabled(boolean value) { + if (enabled == value) { + return; + } + + enabled = value; + ExtendedMessagesConfig.saveEnabled(value); if (!enabled) { MessageQueue.getInstance().clear(); } - - return enabled; } - private static void validateDelaySeconds(int seconds) { - if (seconds < Reference.MIN_DELAY_SECONDS - || seconds > Reference.MAX_DELAY_SECONDS) { - throw new IllegalArgumentException( - "Delay must be between " - + Reference.MIN_DELAY_SECONDS - + " and " - + Reference.MAX_DELAY_SECONDS - + " secs" - ); - } + public static boolean toggleEnabled() { + setEnabled(!enabled); + return enabled; } public static int getMessageDelaySeconds() { @@ -81,10 +82,12 @@ public static int getMessageDelaySeconds() { } public static void setMessageDelaySeconds(int seconds) { - validateDelaySeconds(seconds); + SettingsValidation.validateDelaySeconds(seconds); - messageDelaySeconds = seconds; - ExtendedMessagesConfig.saveMessageDelaySeconds(seconds); + if (messageDelaySeconds != seconds) { + messageDelaySeconds = seconds; + ExtendedMessagesConfig.saveMessageDelaySeconds(seconds); + } } public static int getCommandDelaySeconds() { @@ -92,9 +95,12 @@ public static int getCommandDelaySeconds() { } public static void setCommandDelaySeconds(int seconds) { - validateDelaySeconds(seconds); - commandDelaySeconds = seconds; - ExtendedMessagesConfig.saveCommandDelaySeconds(seconds); + SettingsValidation.validateDelaySeconds(seconds); + + if (commandDelaySeconds != seconds) { + commandDelaySeconds = seconds; + ExtendedMessagesConfig.saveCommandDelaySeconds(seconds); + } } public static boolean isMessagePrefixEnabled() { @@ -113,74 +119,49 @@ public static String getCommandPrefix() { return commandPrefix; } + public static void setMessagePrefixEnabled(boolean value) { + if (messagePrefixEnabled == value) { + return; + } + + messagePrefixEnabled = value; + ExtendedMessagesConfig.saveMessagePrefixEnabled(value); + } + public static boolean toggleMessagePrefixEnabled() { - messagePrefixEnabled = !messagePrefixEnabled; - ExtendedMessagesConfig.saveMessagePrefixEnabled(messagePrefixEnabled); + setMessagePrefixEnabled(!messagePrefixEnabled); return messagePrefixEnabled; } - public static String normalizeMessagePrefix(String prefix) { - if (prefix == null) { - throw new IllegalArgumentException("Message prefix cannot be null"); - } - - prefix = prefix.trim(); + public static void setMessagePrefix(String prefix) { + String normalized = SettingsValidation.normalizeMessagePrefix(prefix); - if (prefix.isEmpty()) { - throw new IllegalArgumentException("Message prefix is required"); + if (!messagePrefix.equals(normalized)) { + messagePrefix = normalized; + ExtendedMessagesConfig.saveMessagePrefix(normalized); } - - validatePrefix(prefix, "Message prefix"); - return prefix; } - public static void setMessagePrefix(String prefix) { - messagePrefix = normalizeMessagePrefix(prefix); - ExtendedMessagesConfig.saveMessagePrefix(messagePrefix); + public static void setCommandPrefixEnabled(boolean value) { + if (commandPrefixEnabled == value) { + return; + } + + commandPrefixEnabled = value; + ExtendedMessagesConfig.saveCommandPrefixEnabled(value); } public static boolean toggleCommandPrefixEnabled() { - commandPrefixEnabled = !commandPrefixEnabled; - ExtendedMessagesConfig.saveCommandPrefixEnabled(commandPrefixEnabled); + setCommandPrefixEnabled(!commandPrefixEnabled); return commandPrefixEnabled; } public static void setCommandPrefix(String prefix) { - commandPrefix = normalizeCommandPrefix(prefix); - ExtendedMessagesConfig.saveCommandPrefix(commandPrefix); - } + String normalized = SettingsValidation.normalizeCommandPrefix(prefix); - public static String normalizeCommandPrefix(String prefix) { - if (prefix == null) { - throw new IllegalArgumentException("Command prefix cannot be null"); - } - - prefix = prefix.trim(); - - if (prefix.isEmpty()) { - throw new IllegalArgumentException("Command prefix is required"); - } - - if (!prefix.startsWith("/")) { - prefix = "/" + prefix; - } - - validatePrefix(prefix, "Command prefix"); - return prefix; - } - - private static void validatePrefix(String prefix, String displayName) { - if (prefix == null) { - throw new IllegalArgumentException(displayName + " cannot be null"); - } - - if (prefix.indexOf("\n") >= 0 || prefix.indexOf("\r") >= 0) { - throw new IllegalArgumentException(displayName + " cannot contain new lines"); - } - - if (prefix.length() > Reference.MAX_PREFIX_LENGTH ) { - throw new IllegalArgumentException( - displayName + " must be at most " + Reference.MAX_PREFIX_LENGTH + " characters"); + if (!commandPrefix.equals(normalized)) { + commandPrefix = normalized; + ExtendedMessagesConfig.saveCommandPrefix(normalized); } } @@ -205,31 +186,21 @@ public static int getMessageHistoryLength() { } public static void setMessageHistoryLength(int length) { - validateHistoryLength(length); - messageHistoryLength = length; - ExtendedMessagesConfig.saveMessageHistoryLength(length); + SettingsValidation.validateHistoryLength(length); + + if (messageHistoryLength != length) { + messageHistoryLength = length; + ExtendedMessagesConfig.saveMessageHistoryLength(length); + } } public static int getCurrentMessageHistoryLength() { return enabled ? messageHistoryLength : Reference.VANILLA_MESSAGE_HISTORY_LENGTH; } - private static void validateHistoryLength(int length) { - if (length < Reference.MIN_MESSAGE_HISTORY_LENGTH - || length > Reference.MAX_MESSAGE_HISTORY_LENGTH) { - throw new IllegalArgumentException( - "history length must be between " - + Reference.MIN_MESSAGE_HISTORY_LENGTH - + " and " - + Reference.MAX_MESSAGE_HISTORY_LENGTH - + " lines" - ); - } - } - private static String loadMessagePrefix() { try { - return normalizeMessagePrefix( + return SettingsValidation.normalizeMessagePrefix( ExtendedMessagesConfig.getMessagePrefix() ); } catch (IllegalArgumentException exception) { @@ -239,7 +210,7 @@ private static String loadMessagePrefix() { private static String loadCommandPrefix() { try { - return normalizeCommandPrefix( + return SettingsValidation.normalizeCommandPrefix( ExtendedMessagesConfig.getCommandPrefix() ); } catch (IllegalArgumentException exception) { diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java index d00c59f..7c6116a 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java +++ b/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java @@ -4,6 +4,11 @@ import java.util.Collections; import java.util.List; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; +import java.util.function.IntConsumer; +import java.util.function.IntFunction; +import java.util.function.Supplier; import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; @@ -13,22 +18,6 @@ import net.minecraft.util.EnumChatFormatting; public final class ExtendedMessagesCommand extends CommandBase { - private interface BooleanToggle { - boolean toggle(); - } - - private interface StringSetter { - String set(String value); - } - - private interface IntSetter { - void set(int value); - } - - private interface IntFormatter { - String format(int value); - } - private void handleIntSet( ICommandSender sender, String[] args, @@ -36,8 +25,8 @@ private void handleIntSet( String displayName, int min, int max, - IntSetter setter, - IntFormatter formatter + IntConsumer setter, + IntFunction formatter ) throws CommandException { if (args.length != 3 || !"set".equalsIgnoreCase(args[1])) { throw new WrongUsageException(usage); @@ -46,12 +35,12 @@ private void handleIntSet( int value = parseInt(args[2], min, max); try { - setter.set(value); + setter.accept(value); } catch (IllegalArgumentException exception) { throw new CommandException(exception.getMessage()); } - sendLine(sender, displayName + ": " + formatter.format(value)); + sendLine(sender, displayName + ": " + formatter.apply(value)); } @Override @@ -97,19 +86,9 @@ public void processCommand(ICommandSender sender, String[] args) args, "/em mp >", "Message prefix", - new BooleanToggle() { - @Override - public boolean toggle() { - return ExtendedMessages.toggleMessagePrefixEnabled(); - } - }, - new StringSetter() { - @Override - public String set(String value) { - ExtendedMessages.setMessagePrefix(value); - return ExtendedMessages.getMessagePrefix(); - } - } + ExtendedMessages::toggleMessagePrefixEnabled, + ExtendedMessages::setMessagePrefix, + ExtendedMessages::getMessagePrefix ); return; case "cp": @@ -118,19 +97,9 @@ public String set(String value) { args, "/em cp >", "Command prefix", - new BooleanToggle() { - @Override - public boolean toggle() { - return ExtendedMessages.toggleCommandPrefixEnabled(); - } - }, - new StringSetter() { - @Override - public String set(String value) { - ExtendedMessages.setCommandPrefix(value); - return ExtendedMessages.getCommandPrefix(); - } - } + ExtendedMessages::toggleCommandPrefixEnabled, + ExtendedMessages::setCommandPrefix, + ExtendedMessages::getCommandPrefix ); return; case "mc": @@ -141,18 +110,8 @@ public String set(String value) { "Message cooldown", Reference.MIN_DELAY_SECONDS, Reference.MAX_DELAY_SECONDS, - new IntSetter() { - @Override - public void set(int value) { - ExtendedMessages.setMessageDelaySeconds(value); - } - }, - new IntFormatter() { - @Override - public String format(int value) { - return EnumChatFormatting.AQUA + formatSeconds(value); - } - } + ExtendedMessages::setMessageDelaySeconds, + value -> EnumChatFormatting.AQUA + formatSeconds(value) ); return; case "cc": @@ -163,18 +122,8 @@ public String format(int value) { "Command cooldown", Reference.MIN_DELAY_SECONDS, Reference.MAX_DELAY_SECONDS, - new IntSetter() { - @Override - public void set(int value) { - ExtendedMessages.setCommandDelaySeconds(value); - } - }, - new IntFormatter() { - @Override - public String format(int value) { - return EnumChatFormatting.AQUA + formatSeconds(value); - } - } + ExtendedMessages::setCommandDelaySeconds, + value -> EnumChatFormatting.AQUA + formatSeconds(value) ); return; case "h": @@ -185,21 +134,11 @@ public String format(int value) { "History length", Reference.MIN_MESSAGE_HISTORY_LENGTH, Reference.MAX_MESSAGE_HISTORY_LENGTH, - new IntSetter() { - @Override - public void set(int value) { - ExtendedMessages.setMessageHistoryLength(value); - } - }, - new IntFormatter() { - @Override - public String format(int value) { - return EnumChatFormatting.AQUA - + String.valueOf(value) - + EnumChatFormatting.GRAY - + " lines"; - } - } + ExtendedMessages::setMessageHistoryLength, + value -> EnumChatFormatting.AQUA + + String.valueOf(value) + + EnumChatFormatting.GRAY + + " lines" ); return; @@ -224,8 +163,9 @@ private void handlePrefixSetting( String[] args, String usage, String displayName, - BooleanToggle toggle, - StringSetter setter + BooleanSupplier toggler, + Consumer setter, + Supplier getter ) throws CommandException { if (args.length < 2) { throw new WrongUsageException(usage); @@ -237,7 +177,7 @@ private void handlePrefixSetting( throw new WrongUsageException(usage); } - boolean enabled = toggle.toggle(); + boolean enabled = toggler.getAsBoolean(); sendLine(sender, displayName + ": " + formatState(enabled)); return; @@ -246,7 +186,7 @@ private void handlePrefixSetting( throw new WrongUsageException(usage); } - handleTextSet(sender, args, displayName, setter); + handleTextSet(sender, args, displayName, setter, getter); return; default: @@ -258,13 +198,15 @@ private void handleTextSet( ICommandSender sender, String[] args, String displayName, - StringSetter setter + Consumer setter, + Supplier getter ) throws CommandException { String value = joinArgs(args, 2); String storedValue; try { - storedValue = setter.set(value); + setter.accept(value); + storedValue = getter.get(); } catch (IllegalArgumentException exception) { throw new CommandException(exception.getMessage()); } diff --git a/src/main/java/com/github/cewko/extendedmessages/Reference.java b/src/main/java/com/github/cewko/extendedmessages/Reference.java index 6697fb4..859881a 100644 --- a/src/main/java/com/github/cewko/extendedmessages/Reference.java +++ b/src/main/java/com/github/cewko/extendedmessages/Reference.java @@ -18,6 +18,7 @@ public final class Reference { public static final int MAX_DELAY_SECONDS = 120; public static final int DEFAULT_MESSAGE_DELAY_SECONDS = 3; public static final int DEFAULT_COMMAND_DELAY_SECONDS = 1; + public static final long SEND_SAFETY_MARGIN_MILLIS = 50L; public static final boolean DEFAULT_ENABLED = false; public static final boolean DEFAULT_SPLIT_ENABLED = true; @@ -39,4 +40,4 @@ public final class Reference { private Reference() { // prevent creating instances } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/cewko/extendedmessages/SettingsValidation.java b/src/main/java/com/github/cewko/extendedmessages/SettingsValidation.java new file mode 100644 index 0000000..48df86d --- /dev/null +++ b/src/main/java/com/github/cewko/extendedmessages/SettingsValidation.java @@ -0,0 +1,74 @@ +package com.github.cewko.extendedmessages; + +public final class SettingsValidation { + private SettingsValidation() { + } + + public static void validateDelaySeconds(int seconds) { + if (seconds < Reference.MIN_DELAY_SECONDS + || seconds > Reference.MAX_DELAY_SECONDS) { + throw new IllegalArgumentException( + "Delay must be between " + + Reference.MIN_DELAY_SECONDS + + " and " + + Reference.MAX_DELAY_SECONDS + + " secs" + ); + } + } + + public static void validateHistoryLength(int length) { + if (length < Reference.MIN_MESSAGE_HISTORY_LENGTH + || length > Reference.MAX_MESSAGE_HISTORY_LENGTH) { + throw new IllegalArgumentException( + "History length must be between " + + Reference.MIN_MESSAGE_HISTORY_LENGTH + + " and " + + Reference.MAX_MESSAGE_HISTORY_LENGTH + + " lines" + ); + } + } + + public static String normalizeMessagePrefix(String prefix) { + return normalizePrefix(prefix, "Message prefix", false); + } + + public static String normalizeCommandPrefix(String prefix) { + return normalizePrefix(prefix, "Command prefix", true); + } + + private static String normalizePrefix( + String prefix, + String displayName, + boolean command + ) { + if (prefix == null) { + throw new IllegalArgumentException(displayName + " cannot be null"); + } + + prefix = prefix.trim(); + + if (prefix.isEmpty()) { + throw new IllegalArgumentException(displayName + " is required"); + } + + if (command && !prefix.startsWith("/")) { + prefix = "/" + prefix; + } + + if (prefix.indexOf("\n") >= 0 || prefix.indexOf("\r") >= 0) { + throw new IllegalArgumentException(displayName + " cannot contain new lines"); + } + + if (prefix.length() > Reference.MAX_PREFIX_LENGTH) { + throw new IllegalArgumentException( + displayName + " must be at most " + + Reference.MAX_PREFIX_LENGTH + + " characters" + ); + } + + return prefix; + } +} diff --git a/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java b/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java index aad30d6..640d217 100644 --- a/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java +++ b/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java @@ -41,6 +41,10 @@ private ExtendedMessagesConfig() { // prevent creating instances } + private static int clamp(int value, int min, int max) { + return Math.max(min, Math.min(max, value)); + } + public static void load(File file) { configuration = new Configuration(file); configuration.load(); @@ -129,9 +133,10 @@ public static int getMessageDelaySeconds() { int value = messageDelayProperty.getInt( Reference.DEFAULT_MESSAGE_DELAY_SECONDS ); - return Math.max( + return clamp( + value, Reference.MIN_DELAY_SECONDS, - Math.min(Reference.MAX_DELAY_SECONDS, value) + Reference.MAX_DELAY_SECONDS ); } @@ -141,9 +146,10 @@ public static int getCommandDelaySeconds() { int value = commandDelayProperty.getInt( Reference.DEFAULT_COMMAND_DELAY_SECONDS ); - return Math.max( + return clamp( + value, Reference.MIN_DELAY_SECONDS, - Math.min(Reference.MAX_DELAY_SECONDS, value) + Reference.MAX_DELAY_SECONDS ); } @@ -178,13 +184,14 @@ public static int getMessageHistoryLength() { Reference.DEFAULT_MESSAGE_HISTORY_LENGTH ); - return Math.max( + return clamp( + value, Reference.MIN_MESSAGE_HISTORY_LENGTH, - Math.min(Reference.MAX_MESSAGE_HISTORY_LENGTH, value) + Reference.MAX_MESSAGE_HISTORY_LENGTH ); } - public static void ensureLoaded() { + private static void ensureLoaded() { if (configuration == null) { throw new IllegalStateException( Reference.NAME + " config has not been loaded" @@ -193,60 +200,60 @@ public static void ensureLoaded() { } public static void saveEnabled(boolean enabled) { - ensureLoaded(); - enabledProperty.set(enabled); - saveIfChanged(); + save(enabledProperty, enabled); } public static void saveSplitEnabled(boolean enabled) { - ensureLoaded(); - splitEnabledProperty.set(enabled); - saveIfChanged(); + save(splitEnabledProperty, enabled); } public static void saveMessageDelaySeconds(int seconds) { - ensureLoaded(); - messageDelayProperty.set(seconds); - saveIfChanged(); + save(messageDelayProperty, seconds); } public static void saveCommandDelaySeconds(int seconds) { - ensureLoaded(); - commandDelayProperty.set(seconds); - saveIfChanged(); + save(commandDelayProperty, seconds); } public static void saveMessagePrefixEnabled(boolean enabled) { - ensureLoaded(); - messagePrefixEnabledProperty.set(enabled); - saveIfChanged(); + save(messagePrefixEnabledProperty, enabled); } public static void saveMessagePrefix(String prefix) { - ensureLoaded(); - messagePrefixProperty.set(prefix); - saveIfChanged(); + save(messagePrefixProperty, prefix); } public static void saveCommandPrefixEnabled(boolean enabled) { + save(commandPrefixEnabledProperty, enabled); + } + + public static void saveCommandPrefix(String prefix) { + save(commandPrefixProperty, prefix); + } + + public static void saveMessageHistoryLength(int length) { + save(messageHistoryLengthProperty, length); + } + + private static void save(Property property, boolean value) { ensureLoaded(); - commandPrefixEnabledProperty.set(enabled); + property.set(value); saveIfChanged(); } - public static void saveCommandPrefix(String prefix) { + private static void save(Property property, int value) { ensureLoaded(); - commandPrefixProperty.set(prefix); + property.set(value); saveIfChanged(); } - public static void saveMessageHistoryLength(int length) { + private static void save(Property property, String value) { ensureLoaded(); - messageHistoryLengthProperty.set(length); + property.set(value); saveIfChanged(); } - public static void saveIfChanged() { + private static void saveIfChanged() { if (configuration.hasChanged()) { configuration.save(); } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java b/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java index a830368..58b11f1 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java @@ -82,18 +82,9 @@ private void addSettings() { private void addMainSettings() { mainSetting = new ToggleSetting( - "Remove 100-character limit", - new ToggleSetting.Value() { - @Override - public boolean get() { - return draft.isEnabled(); - } - - @Override - public void toggle() { - draft.toggleEnabled(); - } - } + "Remove 100-character limit", + draft::isEnabled, + draft::toggleEnabled ); settings.add(mainSetting); @@ -101,69 +92,37 @@ public void toggle() { private void addRegularSettings() { addRegularSetting( - new ToggleSetting("Split long messages", - new ToggleSetting.Value() { - @Override - public boolean get() { - return draft.isSplitEnabled(); - } - - @Override - public void toggle() { - draft.toggleSplitEnabled(); - } - } - )); + new ToggleSetting( + "Split long messages", + draft::isSplitEnabled, + draft::toggleSplitEnabled + ) + ); addRegularSetting( new SliderSetting( "Message cooldown", Reference.MIN_DELAY_SECONDS, Reference.MAX_DELAY_SECONDS, - new SliderSetting.Value() { - @Override - public int get() { - return draft.getMessageDelaySeconds(); - } - - @Override - public void set(int value) { - draft.setMessageDelaySeconds(value); - } - } + draft::getMessageDelaySeconds, + draft::setMessageDelaySeconds ) ); addRegularSetting( - new ToggleSetting("Message prefix", - new ToggleSetting.Value() { - @Override - public boolean get() { - return draft.isMessagePrefixEnabled(); - } - - @Override - public void toggle() { - draft.toggleMessagePrefixEnabled(); - } - } - )); + new ToggleSetting( + "Message prefix", + draft::isMessagePrefixEnabled, + draft::toggleMessagePrefixEnabled + ) + ); addRegularSetting( new TextSetting( "Message prefix", Reference.GUI_PREFIX_INPUT_LIMIT, - new TextSetting.Value() { - @Override - public String get() { - return draft.getMessagePrefix(); - } - - @Override - public void set(String value) { - draft.setMessagePrefix(value); - } - } + draft::getMessagePrefix, + draft::setMessagePrefix ) ); @@ -172,17 +131,8 @@ public void set(String value) { "History length", Reference.MIN_MESSAGE_HISTORY_LENGTH, Reference.MAX_MESSAGE_HISTORY_LENGTH, - new IntegerSetting.Value() { - @Override - public int get() { - return draft.getMessageHistoryLength(); - } - - @Override - public void set(int value) { - draft.setMessageHistoryLength(value); - } - } + draft::getMessageHistoryLength, + draft::setMessageHistoryLength ) ); } @@ -190,18 +140,9 @@ public void set(int value) { private void addCommandSettings() { addCommandSetting( new ToggleSetting( - "Configured command", - new ToggleSetting.Value() { - @Override - public boolean get() { - return draft.isCommandPrefixEnabled(); - } - - @Override - public void toggle() { - draft.toggleCommandPrefixEnabled(); - } - } + "Configured command", + draft::isCommandPrefixEnabled, + draft::toggleCommandPrefixEnabled ) ); @@ -210,35 +151,19 @@ public void toggle() { "Command cooldown", Reference.MIN_DELAY_SECONDS, Reference.MAX_DELAY_SECONDS, - new SliderSetting.Value() { - @Override - public int get() { - return draft.getCommandDelaySeconds(); - } - - @Override - public void set(int value) { - draft.setCommandDelaySeconds(value); - } - } + draft::getCommandDelaySeconds, + draft::setCommandDelaySeconds ) ); - addCommandSetting(new TextSetting( - "Command prefix", - Reference.GUI_PREFIX_INPUT_LIMIT, - new TextSetting.Value() { - @Override - public String get() { - return draft.getCommandPrefix(); - } - - @Override - public void set(String value) { - draft.setCommandPrefix(value); - } - } - )); + addCommandSetting( + new TextSetting( + "Command prefix", + Reference.GUI_PREFIX_INPUT_LIMIT, + draft::getCommandPrefix, + draft::setCommandPrefix + ) + ); } private void addRegularSetting(GuiSetting setting) { diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java b/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java index a41060a..02747cd 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java @@ -1,7 +1,7 @@ package com.github.cewko.extendedmessages.gui; import com.github.cewko.extendedmessages.ExtendedMessages; -import com.github.cewko.extendedmessages.Reference; +import com.github.cewko.extendedmessages.SettingsValidation; public final class SettingsDraft { private boolean enabled; @@ -87,7 +87,7 @@ public String getMessagePrefix() { public void setMessagePrefix(String prefix) { messagePrefix = prefix; - ExtendedMessages.normalizeMessagePrefix(prefix); + SettingsValidation.normalizeMessagePrefix(prefix); } public boolean isCommandPrefixEnabled() { @@ -104,7 +104,7 @@ public String getCommandPrefix() { public void setCommandPrefix(String prefix) { commandPrefix = prefix; - ExtendedMessages.normalizeCommandPrefix(prefix); + SettingsValidation.normalizeCommandPrefix(prefix); } public int getMessageHistoryLength() { @@ -116,86 +116,30 @@ public void setMessageHistoryLength(int length) { } public void validate() { - ExtendedMessages.normalizeMessagePrefix(messagePrefix); - ExtendedMessages.normalizeCommandPrefix(commandPrefix); - - if (messageDelaySeconds < Reference.MIN_DELAY_SECONDS - || messageDelaySeconds > Reference.MAX_DELAY_SECONDS) { - throw new IllegalArgumentException( - "Message cooldown must be between " - + Reference.MIN_DELAY_SECONDS - + " and " - + Reference.MAX_DELAY_SECONDS - + " seconds" - ); - } - - if (commandDelaySeconds < Reference.MIN_DELAY_SECONDS - || commandDelaySeconds > Reference.MAX_DELAY_SECONDS) { - throw new IllegalArgumentException( - "Command cooldown must be between " - + Reference.MIN_DELAY_SECONDS - + " and " - + Reference.MAX_DELAY_SECONDS - + " seconds" - ); - } - - if (messageHistoryLength < Reference.MIN_MESSAGE_HISTORY_LENGTH - || messageHistoryLength > Reference.MAX_MESSAGE_HISTORY_LENGTH) { - throw new IllegalArgumentException( - "History length must be between " - + Reference.MIN_MESSAGE_HISTORY_LENGTH - + " and " - + Reference.MAX_MESSAGE_HISTORY_LENGTH - + " lines" - ); - } + SettingsValidation.normalizeMessagePrefix(messagePrefix); + SettingsValidation.normalizeCommandPrefix(commandPrefix); + SettingsValidation.validateDelaySeconds(messageDelaySeconds); + SettingsValidation.validateDelaySeconds(commandDelaySeconds); + SettingsValidation.validateHistoryLength(messageHistoryLength); } public void apply() { validate(); String normalizedMessagePrefix = - ExtendedMessages.normalizeMessagePrefix(messagePrefix); + SettingsValidation.normalizeMessagePrefix(messagePrefix); String normalizedCommandPrefix = - ExtendedMessages.normalizeCommandPrefix(commandPrefix); - - if (!normalizedMessagePrefix.equals(ExtendedMessages.getMessagePrefix())) { - ExtendedMessages.setMessagePrefix(normalizedMessagePrefix); - } - - if (!normalizedCommandPrefix.equals(ExtendedMessages.getCommandPrefix())) { - ExtendedMessages.setCommandPrefix(normalizedCommandPrefix); - } - - if (messageDelaySeconds != ExtendedMessages.getMessageDelaySeconds()) { - ExtendedMessages.setMessageDelaySeconds(messageDelaySeconds); - } - - if (commandDelaySeconds != ExtendedMessages.getCommandDelaySeconds()) { - ExtendedMessages.setCommandDelaySeconds(commandDelaySeconds); - } - - if (messageHistoryLength != ExtendedMessages.getMessageHistoryLength()) { - ExtendedMessages.setMessageHistoryLength(messageHistoryLength); - } - - if (messagePrefixEnabled != ExtendedMessages.isMessagePrefixEnabled()) { - ExtendedMessages.toggleMessagePrefixEnabled(); - } - - if (commandPrefixEnabled != ExtendedMessages.isCommandPrefixEnabled()) { - ExtendedMessages.toggleCommandPrefixEnabled(); - } - - if (splitEnabled != ExtendedMessages.isSplitEnabled()) { - ExtendedMessages.toggleSplitEnabled(); - } - - if (enabled != ExtendedMessages.isEnabled()) { - ExtendedMessages.toggleEnabled(); - } + SettingsValidation.normalizeCommandPrefix(commandPrefix); + + ExtendedMessages.setMessagePrefix(normalizedMessagePrefix); + ExtendedMessages.setCommandPrefix(normalizedCommandPrefix); + ExtendedMessages.setMessageDelaySeconds(messageDelaySeconds); + ExtendedMessages.setCommandDelaySeconds(commandDelaySeconds); + ExtendedMessages.setMessageHistoryLength(messageHistoryLength); + ExtendedMessages.setMessagePrefixEnabled(messagePrefixEnabled); + ExtendedMessages.setCommandPrefixEnabled(commandPrefixEnabled); + ExtendedMessages.setSplitEnabled(splitEnabled); + ExtendedMessages.setEnabled(enabled); } } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java index 76f5460..3d0a8a8 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java @@ -1,5 +1,8 @@ package com.github.cewko.extendedmessages.gui.control; +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.renderer.GlStateManager; @@ -7,16 +10,11 @@ import com.github.cewko.extendedmessages.gui.GuiLayout; public final class StyledIntegerSlider extends GuiButton { - public interface Value { - int get(); - - void set(int value); - } - private final String label; private final int min; private final int max; - private final Value value; + private final IntSupplier getter; + private final IntConsumer setter; private boolean dragging; @@ -29,13 +27,15 @@ public StyledIntegerSlider( String label, int min, int max, - Value value + IntSupplier getter, + IntConsumer setter ) { super(id, x, y, width, height, ""); this.label = label; this.min = min; this.max = max; - this.value = value; + this.getter = getter; + this.setter = setter; updateText(); } @@ -112,8 +112,8 @@ private void updateValueFromMouse(int mouseX) { int newValue = Math.round(min + percent * (max - min)); - if (newValue != value.get()) { - value.set(newValue); + if (newValue != getter.getAsInt()) { + setter.accept(newValue); updateText(); } } @@ -123,10 +123,10 @@ private float getPercent() { return 0.0F; } - return (float) (value.get() - min) / (float) (max - min); + return (float) (getter.getAsInt() - min) / (float) (max - min); } private void updateText() { - displayString = label + ": " + value.get() + "s"; + displayString = label + ": " + getter.getAsInt() + "s"; } } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java index cf27820..1c0649a 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java @@ -1,17 +1,14 @@ package com.github.cewko.extendedmessages.gui.control; +import java.util.function.BooleanSupplier; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; public final class StyledToggleButton extends GuiButton { - public interface Value { - boolean get(); - - void toggle(); - } - private final String label; - private final Value value; + private final BooleanSupplier getter; + private final Runnable toggler; public StyledToggleButton( int id, @@ -20,11 +17,13 @@ public StyledToggleButton( int width, int height, String label, - Value value + BooleanSupplier getter, + Runnable toggler ) { super(id, x, y, width, height, ""); this.label = label; - this.value = value; + this.getter = getter; + this.toggler = toggler; updateText(); } @@ -33,7 +32,7 @@ public boolean mousePressed(Minecraft minecraft, int mouseX, int mouseY) { boolean pressed = super.mousePressed(minecraft, mouseX, mouseY); if (pressed) { - value.toggle(); + toggler.run(); updateText(); } @@ -49,7 +48,7 @@ public void drawButton(Minecraft minecraft, int mouseX, int mouseY) { private void updateText() { displayString = label + ": " - + (value.get() + + (getter.getAsBoolean() ? "\u00a7aON" : "\u00a7cOFF"); } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java index 204a6e2..b84cf88 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.util.List; +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; import com.github.cewko.extendedmessages.gui.GuiLayout; import com.github.cewko.extendedmessages.gui.control.StyledTextField; @@ -11,16 +13,11 @@ import net.minecraft.client.gui.GuiButton; public final class IntegerSetting implements GuiSetting { - public interface Value { - int get(); - - void set(int value); - } - private final String label; private final int min; private final int max; - private final Value value; + private final IntSupplier getter; + private final IntConsumer setter; private FontRenderer fontRenderer; private StyledTextField textField; @@ -28,11 +25,18 @@ public interface Value { private int x; private int y; - public IntegerSetting(String label, int min, int max, Value value) { + public IntegerSetting( + String label, + int min, + int max, + IntSupplier getter, + IntConsumer setter + ) { this.label = label; this.min = min; this.max = max; - this.value = value; + this.getter = getter; + this.setter = setter; } @Override @@ -63,7 +67,7 @@ public void init( ); textField.setMaxStringLength(String.valueOf(max).length()); - textField.setText(String.valueOf(value.get())); + textField.setText(String.valueOf(getter.getAsInt())); textField.setPlaceholder(min + "-" + max); } @@ -112,7 +116,7 @@ private boolean saveIfValid() { return false; } - value.set(parsed); + setter.accept(parsed); error = null; return true; } catch (NumberFormatException exception) { diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java index 7391f30..7f298c1 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java @@ -1,6 +1,8 @@ package com.github.cewko.extendedmessages.gui.setting; import java.util.List; +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; import com.github.cewko.extendedmessages.gui.GuiLayout; import com.github.cewko.extendedmessages.gui.control.StyledIntegerSlider; @@ -9,22 +11,24 @@ import net.minecraft.client.gui.GuiButton; public final class SliderSetting implements GuiSetting { - public interface Value { - int get(); - - void set(int value); - } - private final String label; private final int min; private final int max; - private final Value value; - - public SliderSetting(String label, int min, int max, Value value) { + private final IntSupplier getter; + private final IntConsumer setter; + + public SliderSetting( + String label, + int min, + int max, + IntSupplier getter, + IntConsumer setter + ) { this.label = label; this.min = min; this.max = max; - this.value = value; + this.getter = getter; + this.setter = setter; } @Override @@ -50,17 +54,8 @@ public void init( label, min, max, - new StyledIntegerSlider.Value() { - @Override - public int get() { - return value.get(); - } - - @Override - public void set(int newValue) { - value.set(newValue); - } - } + getter, + setter )); } } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java index 279afb9..ec13243 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; import com.github.cewko.extendedmessages.gui.GuiLayout; import com.github.cewko.extendedmessages.gui.control.StyledTextField; @@ -11,15 +13,10 @@ import net.minecraft.client.gui.GuiButton; public final class TextSetting implements GuiSetting { - public interface Value { - String get(); - - void set(String value); - } - private final String label; private final int maxLength; - private final Value value; + private final Supplier getter; + private final Consumer setter; private FontRenderer fontRenderer; private StyledTextField textField; @@ -27,10 +24,16 @@ public interface Value { private int x; private int y; - public TextSetting(String label, int maxLength, Value value) { + public TextSetting( + String label, + int maxLength, + Supplier getter, + Consumer setter + ) { this.label = label; this.maxLength = maxLength; - this.value = value; + this.getter = getter; + this.setter = setter; } @Override @@ -61,7 +64,7 @@ public void init( ); textField.setMaxStringLength(maxLength); - textField.setText(value.get()); + textField.setText(getter.get()); } @Override @@ -95,7 +98,7 @@ public void update() { private boolean saveIfValid() { try { - value.set(textField.getText()); + setter.accept(textField.getText()); error = null; return true; } catch (IllegalArgumentException exception) { diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java b/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java index b987d4b..6171d82 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java +++ b/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java @@ -1,6 +1,7 @@ package com.github.cewko.extendedmessages.gui.setting; import java.util.List; +import java.util.function.BooleanSupplier; import com.github.cewko.extendedmessages.gui.GuiLayout; import com.github.cewko.extendedmessages.gui.control.StyledToggleButton; @@ -9,18 +10,18 @@ import net.minecraft.client.gui.GuiButton; public final class ToggleSetting implements GuiSetting { - public interface Value { - boolean get(); - - void toggle(); - } - private final String label; - private final Value value; + private final BooleanSupplier getter; + private final Runnable toggler; - public ToggleSetting(String label, Value value) { + public ToggleSetting( + String label, + BooleanSupplier getter, + Runnable toggler + ) { this.label = label; - this.value = value; + this.getter = getter; + this.toggler = toggler; } @Override @@ -44,17 +45,8 @@ public void init( width, GuiLayout.CONTROL_HEIGHT, label, - new StyledToggleButton.Value() { - @Override - public boolean get() { - return value.get(); - } - - @Override - public void toggle() { - value.toggle(); - } - } + getter, + toggler )); } } diff --git a/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java b/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java index 51504e3..5365346 100644 --- a/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java +++ b/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java @@ -1,10 +1,12 @@ package com.github.cewko.extendedmessages.messaging; import com.github.cewko.extendedmessages.ExtendedMessages; +import com.github.cewko.extendedmessages.Reference; import java.util.ArrayDeque; import java.util.Deque; import java.util.List; +import java.util.concurrent.TimeUnit; import net.minecraft.client.Minecraft; import net.minecraft.world.World; @@ -22,8 +24,8 @@ public enum Lane { private final Deque regularLines = new ArrayDeque(); private final Deque commandLines = new ArrayDeque(); - private long nextRegularSendAtMillis; - private long nextCommandSendAtMillis; + private long nextRegularSendAtNanos; + private long nextCommandSendAtNanos; private World queuedWorld; private boolean sendingQueuedMessage; @@ -59,16 +61,14 @@ private Deque getQueue(Lane lane) { private void trySendReady(Minecraft minecraft) { trySendLane(minecraft, Lane.REGULAR); trySendLane(minecraft, Lane.CONFIGURED_COMMAND); - - if (isEmpty()) { - queuedWorld = null; - } } private void trySendLane(Minecraft minecraft, Lane lane) { Deque queue = getQueue(lane); + long deadline = getNextSendAtNanos(lane); + long now = System.nanoTime(); - if (queue.isEmpty() || System.currentTimeMillis() < getNextSendAt(lane)) { + if (queue.isEmpty() || (deadline != 0L && now - deadline < 0L)) { return; } @@ -82,21 +82,37 @@ private void trySendLane(Minecraft minecraft, Lane lane) { sendingQueuedMessage = false; } - setNextSendAt( - lane, System.currentTimeMillis() + getDelaySeconds(lane) * 1000L + setNextSendAtNanos( + lane, + System.nanoTime() + getCooldownNanos(lane) ); } - private long getNextSendAt(Lane lane) { - return lane == Lane.REGULAR ? nextRegularSendAtMillis : nextCommandSendAtMillis; + private long getNextSendAtNanos(Lane lane) { + return lane == Lane.REGULAR + ? nextRegularSendAtNanos + : nextCommandSendAtNanos; } - private void setNextSendAt(Lane lane, long value) { + private void setNextSendAtNanos(Lane lane, long value) { if (lane == Lane.REGULAR) { - nextRegularSendAtMillis = value; + nextRegularSendAtNanos = value; } else { - nextCommandSendAtMillis = value; + nextCommandSendAtNanos = value; + } + } + + private long getCooldownNanos(Lane lane) { + int delaySeconds = getDelaySeconds(lane); + long cooldownNanos = TimeUnit.SECONDS.toNanos(delaySeconds); + + if (delaySeconds > 0) { + cooldownNanos += TimeUnit.MILLISECONDS.toNanos( + Reference.SEND_SAFETY_MARGIN_MILLIS + ); } + + return cooldownNanos; } private int getDelaySeconds(Lane lane) { @@ -107,12 +123,20 @@ private int getDelaySeconds(Lane lane) { @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.END || isEmpty()) { + if (event.phase != TickEvent.Phase.END) { return; } Minecraft minecraft = Minecraft.getMinecraft(); + if (queuedWorld != null && minecraft.theWorld != queuedWorld) { + clear(); + } + + if (isEmpty()) { + return; + } + if (minecraft.thePlayer == null || minecraft.theWorld == null || minecraft.theWorld != queuedWorld || !ExtendedMessages.isEnabled()) { clear(); @@ -130,8 +154,8 @@ public void clear() { regularLines.clear(); commandLines.clear(); queuedWorld = null; - nextRegularSendAtMillis = 0L; - nextCommandSendAtMillis = 0L; + nextRegularSendAtNanos = 0L; + nextCommandSendAtNanos = 0L; } public boolean isSendingQueuedMessage() { From 2af547936386763c07b7b1e5de421cc439c519ec Mon Sep 17 00:00:00 2001 From: cewko Date: Fri, 24 Jul 2026 13:45:10 +0200 Subject: [PATCH 8/9] chore: rename --- build.gradle.kts | 2 +- gradle.properties | 4 +- settings.gradle.kts | 2 +- .../EnhanMess.java} | 54 +++++++++---------- .../EnhanMessCommand.java} | 26 ++++----- .../Reference.java | 8 +-- .../SettingsValidation.java | 2 +- .../config/EnhanMessConfig.java} | 8 +-- .../gui/EnhanMessGui.java} | 18 +++---- .../gui/GuiColors.java | 2 +- .../gui/GuiLayout.java | 2 +- .../gui/GuiOpener.java | 4 +- .../gui/SettingsDraft.java | 42 +++++++-------- .../gui/control/StyledIntegerSlider.java | 4 +- .../gui/control/StyledTextField.java | 6 +-- .../gui/control/StyledToggleButton.java | 2 +- .../gui/setting/GuiErrorLabel.java | 4 +- .../gui/setting/GuiSetting.java | 2 +- .../gui/setting/GuiValidationError.java | 2 +- .../gui/setting/IntegerSetting.java | 6 +-- .../gui/setting/SliderSetting.java | 6 +-- .../gui/setting/TextSetting.java | 6 +-- .../gui/setting/ToggleSetting.java | 6 +-- .../init/AutoDiscoveryMixinPlugin.java | 2 +- .../messaging/MessageQueue.java | 12 ++--- .../messaging/OutgoingMessageProcessor.java | 20 +++---- .../mixin/MixinC01PacketChatMessage.java | 10 ++-- .../mixin/MixinEntityPlayerSP.java | 12 ++--- .../mixin/MixinGuiChat.java | 10 ++-- .../mixin/MixinGuiNewChat.java | 10 ++-- src/main/resources/mcmod.info | 6 +-- ...dedmessages.json => mixins.enhanmess.json} | 0 32 files changed, 150 insertions(+), 150 deletions(-) rename src/main/java/com/github/cewko/{extendedmessages/ExtendedMessages.java => enhanmess/EnhanMess.java} (78%) rename src/main/java/com/github/cewko/{extendedmessages/ExtendedMessagesCommand.java => enhanmess/EnhanMessCommand.java} (90%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/Reference.java (86%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/SettingsValidation.java (98%) rename src/main/java/com/github/cewko/{extendedmessages/config/ExtendedMessagesConfig.java => enhanmess/config/EnhanMessConfig.java} (97%) rename src/main/java/com/github/cewko/{extendedmessages/gui/ExtendedMessagesGui.java => enhanmess/gui/EnhanMessGui.java} (92%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/GuiColors.java (82%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/GuiLayout.java (94%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/GuiOpener.java (88%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/SettingsDraft.java (67%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/control/StyledIntegerSlider.java (96%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/control/StyledTextField.java (89%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/control/StyledToggleButton.java (95%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/setting/GuiErrorLabel.java (77%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/setting/GuiSetting.java (93%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/setting/GuiValidationError.java (93%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/setting/IntegerSetting.java (94%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/setting/SliderSetting.java (86%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/setting/TextSetting.java (93%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/gui/setting/ToggleSetting.java (84%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/init/AutoDiscoveryMixinPlugin.java (99%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/messaging/MessageQueue.java (91%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/messaging/OutgoingMessageProcessor.java (87%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/mixin/MixinC01PacketChatMessage.java (62%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/mixin/MixinEntityPlayerSP.java (73%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/mixin/MixinGuiChat.java (65%) rename src/main/java/com/github/cewko/{extendedmessages => enhanmess}/mixin/MixinGuiNewChat.java (58%) rename src/main/resources/{mixins.extendedmessages.json => mixins.enhanmess.json} (100%) diff --git a/build.gradle.kts b/build.gradle.kts index 7b3faa5..25cffad 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -95,7 +95,7 @@ tasks.withType(JavaCompile::class) { } tasks.withType(org.gradle.jvm.tasks.Jar::class) { - archiveBaseName.set(modid) + archiveBaseName.set("$modid-$mcVersion") manifest.attributes.run { this["FMLCorePluginContainsFMLMod"] = "true" this["ForceLoadAsMod"] = "true" diff --git a/gradle.properties b/gradle.properties index c50b9cc..22a15be 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ loom.platform=forge org.gradle.jvmargs=-Xmx2g -baseGroup = com.github.cewko.extendedmessages +baseGroup = com.github.cewko.enhanmess mcVersion = 1.8.9 -modid = extendedmessages +modid = enhanmess version = 1.0.0 diff --git a/settings.gradle.kts b/settings.gradle.kts index 5c52cd8..24d147f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -23,4 +23,4 @@ plugins { } -rootProject.name = "extendedMessages" +rootProject.name = "enhanmess" diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java b/src/main/java/com/github/cewko/enhanmess/EnhanMess.java similarity index 78% rename from src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java rename to src/main/java/com/github/cewko/enhanmess/EnhanMess.java index 63d7716..e62f3f1 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessages.java +++ b/src/main/java/com/github/cewko/enhanmess/EnhanMess.java @@ -1,8 +1,8 @@ -package com.github.cewko.extendedmessages; +package com.github.cewko.enhanmess; -import com.github.cewko.extendedmessages.config.ExtendedMessagesConfig; -import com.github.cewko.extendedmessages.messaging.MessageQueue; -import com.github.cewko.extendedmessages.gui.GuiOpener; +import com.github.cewko.enhanmess.config.EnhanMessConfig; +import com.github.cewko.enhanmess.messaging.MessageQueue; +import com.github.cewko.enhanmess.gui.GuiOpener; import net.minecraftforge.common.MinecraftForge; @@ -20,7 +20,7 @@ clientSideOnly = true, useMetadata = true ) -public class ExtendedMessages { +public class EnhanMess { private static boolean enabled = Reference.DEFAULT_ENABLED; private static boolean splitEnabled = Reference.DEFAULT_SPLIT_ENABLED; @@ -49,7 +49,7 @@ public static void setSplitEnabled(boolean value) { } splitEnabled = value; - ExtendedMessagesConfig.saveSplitEnabled(value); + EnhanMessConfig.saveSplitEnabled(value); MessageQueue.getInstance().clear(); } @@ -65,7 +65,7 @@ public static void setEnabled(boolean value) { } enabled = value; - ExtendedMessagesConfig.saveEnabled(value); + EnhanMessConfig.saveEnabled(value); if (!enabled) { MessageQueue.getInstance().clear(); @@ -86,7 +86,7 @@ public static void setMessageDelaySeconds(int seconds) { if (messageDelaySeconds != seconds) { messageDelaySeconds = seconds; - ExtendedMessagesConfig.saveMessageDelaySeconds(seconds); + EnhanMessConfig.saveMessageDelaySeconds(seconds); } } @@ -99,7 +99,7 @@ public static void setCommandDelaySeconds(int seconds) { if (commandDelaySeconds != seconds) { commandDelaySeconds = seconds; - ExtendedMessagesConfig.saveCommandDelaySeconds(seconds); + EnhanMessConfig.saveCommandDelaySeconds(seconds); } } @@ -125,7 +125,7 @@ public static void setMessagePrefixEnabled(boolean value) { } messagePrefixEnabled = value; - ExtendedMessagesConfig.saveMessagePrefixEnabled(value); + EnhanMessConfig.saveMessagePrefixEnabled(value); } public static boolean toggleMessagePrefixEnabled() { @@ -138,7 +138,7 @@ public static void setMessagePrefix(String prefix) { if (!messagePrefix.equals(normalized)) { messagePrefix = normalized; - ExtendedMessagesConfig.saveMessagePrefix(normalized); + EnhanMessConfig.saveMessagePrefix(normalized); } } @@ -148,7 +148,7 @@ public static void setCommandPrefixEnabled(boolean value) { } commandPrefixEnabled = value; - ExtendedMessagesConfig.saveCommandPrefixEnabled(value); + EnhanMessConfig.saveCommandPrefixEnabled(value); } public static boolean toggleCommandPrefixEnabled() { @@ -161,7 +161,7 @@ public static void setCommandPrefix(String prefix) { if (!commandPrefix.equals(normalized)) { commandPrefix = normalized; - ExtendedMessagesConfig.saveCommandPrefix(normalized); + EnhanMessConfig.saveCommandPrefix(normalized); } } @@ -190,7 +190,7 @@ public static void setMessageHistoryLength(int length) { if (messageHistoryLength != length) { messageHistoryLength = length; - ExtendedMessagesConfig.saveMessageHistoryLength(length); + EnhanMessConfig.saveMessageHistoryLength(length); } } @@ -201,7 +201,7 @@ public static int getCurrentMessageHistoryLength() { private static String loadMessagePrefix() { try { return SettingsValidation.normalizeMessagePrefix( - ExtendedMessagesConfig.getMessagePrefix() + EnhanMessConfig.getMessagePrefix() ); } catch (IllegalArgumentException exception) { return Reference.DEFAULT_MESSAGE_PREFIX; @@ -211,7 +211,7 @@ private static String loadMessagePrefix() { private static String loadCommandPrefix() { try { return SettingsValidation.normalizeCommandPrefix( - ExtendedMessagesConfig.getCommandPrefix() + EnhanMessConfig.getCommandPrefix() ); } catch (IllegalArgumentException exception) { return Reference.DEFAULT_COMMAND_PREFIX; @@ -220,30 +220,30 @@ private static String loadCommandPrefix() { @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { - ExtendedMessagesConfig.load(event.getSuggestedConfigurationFile()); + EnhanMessConfig.load(event.getSuggestedConfigurationFile()); - enabled = ExtendedMessagesConfig.getEnabled(); - splitEnabled = ExtendedMessagesConfig.getSplitEnabled(); + enabled = EnhanMessConfig.getEnabled(); + splitEnabled = EnhanMessConfig.getSplitEnabled(); - messageDelaySeconds = ExtendedMessagesConfig.getMessageDelaySeconds(); - commandDelaySeconds = ExtendedMessagesConfig.getCommandDelaySeconds(); + messageDelaySeconds = EnhanMessConfig.getMessageDelaySeconds(); + commandDelaySeconds = EnhanMessConfig.getCommandDelaySeconds(); - messagePrefixEnabled = ExtendedMessagesConfig.getMessagePrefixEnabled(); - commandPrefixEnabled = ExtendedMessagesConfig.getCommandPrefixEnabled(); + messagePrefixEnabled = EnhanMessConfig.getMessagePrefixEnabled(); + commandPrefixEnabled = EnhanMessConfig.getCommandPrefixEnabled(); messagePrefix = loadMessagePrefix(); commandPrefix = loadCommandPrefix(); - ExtendedMessagesConfig.saveMessagePrefix(messagePrefix); - ExtendedMessagesConfig.saveCommandPrefix(commandPrefix); + EnhanMessConfig.saveMessagePrefix(messagePrefix); + EnhanMessConfig.saveCommandPrefix(commandPrefix); - messageHistoryLength = ExtendedMessagesConfig.getMessageHistoryLength(); + messageHistoryLength = EnhanMessConfig.getMessageHistoryLength(); } @Mod.EventHandler public void init(FMLInitializationEvent event) { ClientCommandHandler.instance.registerCommand( - new ExtendedMessagesCommand() + new EnhanMessCommand() ); MinecraftForge.EVENT_BUS.register(MessageQueue.getInstance()); diff --git a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java b/src/main/java/com/github/cewko/enhanmess/EnhanMessCommand.java similarity index 90% rename from src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java rename to src/main/java/com/github/cewko/enhanmess/EnhanMessCommand.java index 7c6116a..3279a95 100644 --- a/src/main/java/com/github/cewko/extendedmessages/ExtendedMessagesCommand.java +++ b/src/main/java/com/github/cewko/enhanmess/EnhanMessCommand.java @@ -1,6 +1,6 @@ -package com.github.cewko.extendedmessages; +package com.github.cewko.enhanmess; -import com.github.cewko.extendedmessages.gui.GuiOpener; +import com.github.cewko.enhanmess.gui.GuiOpener; import java.util.Collections; import java.util.List; @@ -17,7 +17,7 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; -public final class ExtendedMessagesCommand extends CommandBase { +public final class EnhanMessCommand extends CommandBase { private void handleIntSet( ICommandSender sender, String[] args, @@ -86,9 +86,9 @@ public void processCommand(ICommandSender sender, String[] args) args, "/em mp >", "Message prefix", - ExtendedMessages::toggleMessagePrefixEnabled, - ExtendedMessages::setMessagePrefix, - ExtendedMessages::getMessagePrefix + EnhanMess::toggleMessagePrefixEnabled, + EnhanMess::setMessagePrefix, + EnhanMess::getMessagePrefix ); return; case "cp": @@ -97,9 +97,9 @@ public void processCommand(ICommandSender sender, String[] args) args, "/em cp >", "Command prefix", - ExtendedMessages::toggleCommandPrefixEnabled, - ExtendedMessages::setCommandPrefix, - ExtendedMessages::getCommandPrefix + EnhanMess::toggleCommandPrefixEnabled, + EnhanMess::setCommandPrefix, + EnhanMess::getCommandPrefix ); return; case "mc": @@ -110,7 +110,7 @@ public void processCommand(ICommandSender sender, String[] args) "Message cooldown", Reference.MIN_DELAY_SECONDS, Reference.MAX_DELAY_SECONDS, - ExtendedMessages::setMessageDelaySeconds, + EnhanMess::setMessageDelaySeconds, value -> EnumChatFormatting.AQUA + formatSeconds(value) ); return; @@ -122,7 +122,7 @@ public void processCommand(ICommandSender sender, String[] args) "Command cooldown", Reference.MIN_DELAY_SECONDS, Reference.MAX_DELAY_SECONDS, - ExtendedMessages::setCommandDelaySeconds, + EnhanMess::setCommandDelaySeconds, value -> EnumChatFormatting.AQUA + formatSeconds(value) ); return; @@ -134,7 +134,7 @@ public void processCommand(ICommandSender sender, String[] args) "History length", Reference.MIN_MESSAGE_HISTORY_LENGTH, Reference.MAX_MESSAGE_HISTORY_LENGTH, - ExtendedMessages::setMessageHistoryLength, + EnhanMess::setMessageHistoryLength, value -> EnumChatFormatting.AQUA + String.valueOf(value) + EnumChatFormatting.GRAY @@ -154,7 +154,7 @@ private void handleMainToggle(ICommandSender sender, String[] args) throw new WrongUsageException("/em toggle"); } - boolean enabled = ExtendedMessages.toggleEnabled(); + boolean enabled = EnhanMess.toggleEnabled(); sendLine(sender, "Remove 100-character limit: " + formatState(enabled)); } diff --git a/src/main/java/com/github/cewko/extendedmessages/Reference.java b/src/main/java/com/github/cewko/enhanmess/Reference.java similarity index 86% rename from src/main/java/com/github/cewko/extendedmessages/Reference.java rename to src/main/java/com/github/cewko/enhanmess/Reference.java index 859881a..d8c3f59 100644 --- a/src/main/java/com/github/cewko/extendedmessages/Reference.java +++ b/src/main/java/com/github/cewko/enhanmess/Reference.java @@ -1,14 +1,14 @@ -package com.github.cewko.extendedmessages; +package com.github.cewko.enhanmess; public final class Reference { - public static final String MOD_ID = "extendedmessages"; - public static final String NAME = "Extended Messages"; + public static final String MOD_ID = "enhanmess"; + public static final String NAME = "EnhanMess"; public static final String VERSION = "1.0.0"; public static final String ACCEPTED_VERSIONS = "[1.8.9]"; - public static final String COMMAND_NAME = "extendedmessages"; + public static final String COMMAND_NAME = "enhanmess"; public static final String COMMAND_ALIAS = "em"; public static final int DEFAULT_MESSAGE_LIMIT = 100; diff --git a/src/main/java/com/github/cewko/extendedmessages/SettingsValidation.java b/src/main/java/com/github/cewko/enhanmess/SettingsValidation.java similarity index 98% rename from src/main/java/com/github/cewko/extendedmessages/SettingsValidation.java rename to src/main/java/com/github/cewko/enhanmess/SettingsValidation.java index 48df86d..c5a2afb 100644 --- a/src/main/java/com/github/cewko/extendedmessages/SettingsValidation.java +++ b/src/main/java/com/github/cewko/enhanmess/SettingsValidation.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages; +package com.github.cewko.enhanmess; public final class SettingsValidation { private SettingsValidation() { diff --git a/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java b/src/main/java/com/github/cewko/enhanmess/config/EnhanMessConfig.java similarity index 97% rename from src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java rename to src/main/java/com/github/cewko/enhanmess/config/EnhanMessConfig.java index 640d217..c24aa77 100644 --- a/src/main/java/com/github/cewko/extendedmessages/config/ExtendedMessagesConfig.java +++ b/src/main/java/com/github/cewko/enhanmess/config/EnhanMessConfig.java @@ -1,13 +1,13 @@ -package com.github.cewko.extendedmessages.config; +package com.github.cewko.enhanmess.config; -import com.github.cewko.extendedmessages.Reference; +import com.github.cewko.enhanmess.Reference; import java.io.File; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.common.config.Property; -public final class ExtendedMessagesConfig { +public final class EnhanMessConfig { private static final String KEY_ENABLED = "enabled"; private static final String KEY_SPLIT_ENABLED = "splitLongMessages"; @@ -37,7 +37,7 @@ public final class ExtendedMessagesConfig { private static Property messageHistoryLengthProperty; - private ExtendedMessagesConfig() { + private EnhanMessConfig() { // prevent creating instances } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java b/src/main/java/com/github/cewko/enhanmess/gui/EnhanMessGui.java similarity index 92% rename from src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java rename to src/main/java/com/github/cewko/enhanmess/gui/EnhanMessGui.java index 58b11f1..df74780 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/ExtendedMessagesGui.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/EnhanMessGui.java @@ -1,20 +1,20 @@ -package com.github.cewko.extendedmessages.gui; +package com.github.cewko.enhanmess.gui; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import com.github.cewko.extendedmessages.Reference; -import com.github.cewko.extendedmessages.gui.setting.GuiSetting; -import com.github.cewko.extendedmessages.gui.setting.IntegerSetting; -import com.github.cewko.extendedmessages.gui.setting.SliderSetting; -import com.github.cewko.extendedmessages.gui.setting.TextSetting; -import com.github.cewko.extendedmessages.gui.setting.ToggleSetting; +import com.github.cewko.enhanmess.Reference; +import com.github.cewko.enhanmess.gui.setting.GuiSetting; +import com.github.cewko.enhanmess.gui.setting.IntegerSetting; +import com.github.cewko.enhanmess.gui.setting.SliderSetting; +import com.github.cewko.enhanmess.gui.setting.TextSetting; +import com.github.cewko.enhanmess.gui.setting.ToggleSetting; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; -public final class ExtendedMessagesGui extends GuiScreen { +public final class EnhanMessGui extends GuiScreen { private static final int DONE_BUTTON_ID = 0; private final List settings = new ArrayList(); @@ -27,7 +27,7 @@ public final class ExtendedMessagesGui extends GuiScreen { private int nextControlId; - public ExtendedMessagesGui() { + public EnhanMessGui() { draft = SettingsDraft.fromCurrentSettings(); } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/GuiColors.java b/src/main/java/com/github/cewko/enhanmess/gui/GuiColors.java similarity index 82% rename from src/main/java/com/github/cewko/extendedmessages/gui/GuiColors.java rename to src/main/java/com/github/cewko/enhanmess/gui/GuiColors.java index d839392..7b25f71 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/GuiColors.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/GuiColors.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages.gui; +package com.github.cewko.enhanmess.gui; public final class GuiColors { public static final int TEXT_PRIMARY = 0xFFFFFFFF; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/GuiLayout.java b/src/main/java/com/github/cewko/enhanmess/gui/GuiLayout.java similarity index 94% rename from src/main/java/com/github/cewko/extendedmessages/gui/GuiLayout.java rename to src/main/java/com/github/cewko/enhanmess/gui/GuiLayout.java index fad721d..0f9968f 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/GuiLayout.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/GuiLayout.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages.gui; +package com.github.cewko.enhanmess.gui; public final class GuiLayout { public static final int PANEL_WIDTH = 394; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/GuiOpener.java b/src/main/java/com/github/cewko/enhanmess/gui/GuiOpener.java similarity index 88% rename from src/main/java/com/github/cewko/extendedmessages/gui/GuiOpener.java rename to src/main/java/com/github/cewko/enhanmess/gui/GuiOpener.java index 5db5106..7e40982 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/GuiOpener.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/GuiOpener.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages.gui; +package com.github.cewko.enhanmess.gui; import net.minecraft.client.Minecraft; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -34,6 +34,6 @@ public void onClientTick(TickEvent.ClientTickEvent event) { return; } - minecraft.displayGuiScreen(new ExtendedMessagesGui()); + minecraft.displayGuiScreen(new EnhanMessGui()); } } \ No newline at end of file diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java b/src/main/java/com/github/cewko/enhanmess/gui/SettingsDraft.java similarity index 67% rename from src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java rename to src/main/java/com/github/cewko/enhanmess/gui/SettingsDraft.java index 02747cd..4dded64 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/SettingsDraft.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/SettingsDraft.java @@ -1,7 +1,7 @@ -package com.github.cewko.extendedmessages.gui; +package com.github.cewko.enhanmess.gui; -import com.github.cewko.extendedmessages.ExtendedMessages; -import com.github.cewko.extendedmessages.SettingsValidation; +import com.github.cewko.enhanmess.EnhanMess; +import com.github.cewko.enhanmess.SettingsValidation; public final class SettingsDraft { private boolean enabled; @@ -24,19 +24,19 @@ private SettingsDraft() { public static SettingsDraft fromCurrentSettings() { SettingsDraft draft = new SettingsDraft(); - draft.enabled = ExtendedMessages.isEnabled(); - draft.splitEnabled = ExtendedMessages.isSplitEnabled(); + draft.enabled = EnhanMess.isEnabled(); + draft.splitEnabled = EnhanMess.isSplitEnabled(); - draft.messageDelaySeconds = ExtendedMessages.getMessageDelaySeconds(); - draft.commandDelaySeconds = ExtendedMessages.getCommandDelaySeconds(); + draft.messageDelaySeconds = EnhanMess.getMessageDelaySeconds(); + draft.commandDelaySeconds = EnhanMess.getCommandDelaySeconds(); - draft.messagePrefixEnabled = ExtendedMessages.isMessagePrefixEnabled(); - draft.messagePrefix = ExtendedMessages.getMessagePrefix(); + draft.messagePrefixEnabled = EnhanMess.isMessagePrefixEnabled(); + draft.messagePrefix = EnhanMess.getMessagePrefix(); - draft.commandPrefixEnabled = ExtendedMessages.isCommandPrefixEnabled(); - draft.commandPrefix = ExtendedMessages.getCommandPrefix(); + draft.commandPrefixEnabled = EnhanMess.isCommandPrefixEnabled(); + draft.commandPrefix = EnhanMess.getCommandPrefix(); - draft.messageHistoryLength = ExtendedMessages.getMessageHistoryLength(); + draft.messageHistoryLength = EnhanMess.getMessageHistoryLength(); return draft; } @@ -132,14 +132,14 @@ public void apply() { String normalizedCommandPrefix = SettingsValidation.normalizeCommandPrefix(commandPrefix); - ExtendedMessages.setMessagePrefix(normalizedMessagePrefix); - ExtendedMessages.setCommandPrefix(normalizedCommandPrefix); - ExtendedMessages.setMessageDelaySeconds(messageDelaySeconds); - ExtendedMessages.setCommandDelaySeconds(commandDelaySeconds); - ExtendedMessages.setMessageHistoryLength(messageHistoryLength); - ExtendedMessages.setMessagePrefixEnabled(messagePrefixEnabled); - ExtendedMessages.setCommandPrefixEnabled(commandPrefixEnabled); - ExtendedMessages.setSplitEnabled(splitEnabled); - ExtendedMessages.setEnabled(enabled); + EnhanMess.setMessagePrefix(normalizedMessagePrefix); + EnhanMess.setCommandPrefix(normalizedCommandPrefix); + EnhanMess.setMessageDelaySeconds(messageDelaySeconds); + EnhanMess.setCommandDelaySeconds(commandDelaySeconds); + EnhanMess.setMessageHistoryLength(messageHistoryLength); + EnhanMess.setMessagePrefixEnabled(messagePrefixEnabled); + EnhanMess.setCommandPrefixEnabled(commandPrefixEnabled); + EnhanMess.setSplitEnabled(splitEnabled); + EnhanMess.setEnabled(enabled); } } diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java b/src/main/java/com/github/cewko/enhanmess/gui/control/StyledIntegerSlider.java similarity index 96% rename from src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java rename to src/main/java/com/github/cewko/enhanmess/gui/control/StyledIntegerSlider.java index 3d0a8a8..c95ed62 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledIntegerSlider.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/control/StyledIntegerSlider.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages.gui.control; +package com.github.cewko.enhanmess.gui.control; import java.util.function.IntConsumer; import java.util.function.IntSupplier; @@ -7,7 +7,7 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.client.renderer.GlStateManager; -import com.github.cewko.extendedmessages.gui.GuiLayout; +import com.github.cewko.enhanmess.gui.GuiLayout; public final class StyledIntegerSlider extends GuiButton { private final String label; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledTextField.java b/src/main/java/com/github/cewko/enhanmess/gui/control/StyledTextField.java similarity index 89% rename from src/main/java/com/github/cewko/extendedmessages/gui/control/StyledTextField.java rename to src/main/java/com/github/cewko/enhanmess/gui/control/StyledTextField.java index e302997..c422f57 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledTextField.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/control/StyledTextField.java @@ -1,7 +1,7 @@ -package com.github.cewko.extendedmessages.gui.control; +package com.github.cewko.enhanmess.gui.control; -import com.github.cewko.extendedmessages.gui.GuiColors; -import com.github.cewko.extendedmessages.gui.GuiLayout; +import com.github.cewko.enhanmess.gui.GuiColors; +import com.github.cewko.enhanmess.gui.GuiLayout; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiTextField; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java b/src/main/java/com/github/cewko/enhanmess/gui/control/StyledToggleButton.java similarity index 95% rename from src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java rename to src/main/java/com/github/cewko/enhanmess/gui/control/StyledToggleButton.java index 1c0649a..4806cdb 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/control/StyledToggleButton.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/control/StyledToggleButton.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages.gui.control; +package com.github.cewko.enhanmess.gui.control; import java.util.function.BooleanSupplier; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiErrorLabel.java b/src/main/java/com/github/cewko/enhanmess/gui/setting/GuiErrorLabel.java similarity index 77% rename from src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiErrorLabel.java rename to src/main/java/com/github/cewko/enhanmess/gui/setting/GuiErrorLabel.java index dde48bc..8be64b0 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiErrorLabel.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/setting/GuiErrorLabel.java @@ -1,6 +1,6 @@ -package com.github.cewko.extendedmessages.gui.setting; +package com.github.cewko.enhanmess.gui.setting; -import com.github.cewko.extendedmessages.gui.GuiColors; +import com.github.cewko.enhanmess.gui.GuiColors; public final class GuiErrorLabel { private GuiErrorLabel() { diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java b/src/main/java/com/github/cewko/enhanmess/gui/setting/GuiSetting.java similarity index 93% rename from src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java rename to src/main/java/com/github/cewko/enhanmess/gui/setting/GuiSetting.java index e0196fd..9f18e88 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiSetting.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/setting/GuiSetting.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages.gui.setting; +package com.github.cewko.enhanmess.gui.setting; import java.io.IOException; import java.util.List; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiValidationError.java b/src/main/java/com/github/cewko/enhanmess/gui/setting/GuiValidationError.java similarity index 93% rename from src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiValidationError.java rename to src/main/java/com/github/cewko/enhanmess/gui/setting/GuiValidationError.java index 1af283f..fa6a2bb 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/GuiValidationError.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/setting/GuiValidationError.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages.gui.setting; +package com.github.cewko.enhanmess.gui.setting; public enum GuiValidationError { REQUIRED("required"), diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java b/src/main/java/com/github/cewko/enhanmess/gui/setting/IntegerSetting.java similarity index 94% rename from src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java rename to src/main/java/com/github/cewko/enhanmess/gui/setting/IntegerSetting.java index b84cf88..eb2513d 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/IntegerSetting.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/setting/IntegerSetting.java @@ -1,12 +1,12 @@ -package com.github.cewko.extendedmessages.gui.setting; +package com.github.cewko.enhanmess.gui.setting; import java.io.IOException; import java.util.List; import java.util.function.IntConsumer; import java.util.function.IntSupplier; -import com.github.cewko.extendedmessages.gui.GuiLayout; -import com.github.cewko.extendedmessages.gui.control.StyledTextField; +import com.github.cewko.enhanmess.gui.GuiLayout; +import com.github.cewko.enhanmess.gui.control.StyledTextField; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java b/src/main/java/com/github/cewko/enhanmess/gui/setting/SliderSetting.java similarity index 86% rename from src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java rename to src/main/java/com/github/cewko/enhanmess/gui/setting/SliderSetting.java index 7f298c1..d8b16a3 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/SliderSetting.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/setting/SliderSetting.java @@ -1,11 +1,11 @@ -package com.github.cewko.extendedmessages.gui.setting; +package com.github.cewko.enhanmess.gui.setting; import java.util.List; import java.util.function.IntConsumer; import java.util.function.IntSupplier; -import com.github.cewko.extendedmessages.gui.GuiLayout; -import com.github.cewko.extendedmessages.gui.control.StyledIntegerSlider; +import com.github.cewko.enhanmess.gui.GuiLayout; +import com.github.cewko.enhanmess.gui.control.StyledIntegerSlider; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java b/src/main/java/com/github/cewko/enhanmess/gui/setting/TextSetting.java similarity index 93% rename from src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java rename to src/main/java/com/github/cewko/enhanmess/gui/setting/TextSetting.java index ec13243..43aafc8 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/TextSetting.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/setting/TextSetting.java @@ -1,12 +1,12 @@ -package com.github.cewko.extendedmessages.gui.setting; +package com.github.cewko.enhanmess.gui.setting; import java.io.IOException; import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; -import com.github.cewko.extendedmessages.gui.GuiLayout; -import com.github.cewko.extendedmessages.gui.control.StyledTextField; +import com.github.cewko.enhanmess.gui.GuiLayout; +import com.github.cewko.enhanmess.gui.control.StyledTextField; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; diff --git a/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java b/src/main/java/com/github/cewko/enhanmess/gui/setting/ToggleSetting.java similarity index 84% rename from src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java rename to src/main/java/com/github/cewko/enhanmess/gui/setting/ToggleSetting.java index 6171d82..f68023b 100644 --- a/src/main/java/com/github/cewko/extendedmessages/gui/setting/ToggleSetting.java +++ b/src/main/java/com/github/cewko/enhanmess/gui/setting/ToggleSetting.java @@ -1,10 +1,10 @@ -package com.github.cewko.extendedmessages.gui.setting; +package com.github.cewko.enhanmess.gui.setting; import java.util.List; import java.util.function.BooleanSupplier; -import com.github.cewko.extendedmessages.gui.GuiLayout; -import com.github.cewko.extendedmessages.gui.control.StyledToggleButton; +import com.github.cewko.enhanmess.gui.GuiLayout; +import com.github.cewko.enhanmess.gui.control.StyledToggleButton; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; diff --git a/src/main/java/com/github/cewko/extendedmessages/init/AutoDiscoveryMixinPlugin.java b/src/main/java/com/github/cewko/enhanmess/init/AutoDiscoveryMixinPlugin.java similarity index 99% rename from src/main/java/com/github/cewko/extendedmessages/init/AutoDiscoveryMixinPlugin.java rename to src/main/java/com/github/cewko/enhanmess/init/AutoDiscoveryMixinPlugin.java index c9e3b50..a9a9f17 100644 --- a/src/main/java/com/github/cewko/extendedmessages/init/AutoDiscoveryMixinPlugin.java +++ b/src/main/java/com/github/cewko/enhanmess/init/AutoDiscoveryMixinPlugin.java @@ -1,4 +1,4 @@ -package com.github.cewko.extendedmessages.init; +package com.github.cewko.enhanmess.init; import org.spongepowered.asm.lib.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; diff --git a/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java b/src/main/java/com/github/cewko/enhanmess/messaging/MessageQueue.java similarity index 91% rename from src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java rename to src/main/java/com/github/cewko/enhanmess/messaging/MessageQueue.java index 5365346..5e6a93f 100644 --- a/src/main/java/com/github/cewko/extendedmessages/messaging/MessageQueue.java +++ b/src/main/java/com/github/cewko/enhanmess/messaging/MessageQueue.java @@ -1,7 +1,7 @@ -package com.github.cewko.extendedmessages.messaging; +package com.github.cewko.enhanmess.messaging; -import com.github.cewko.extendedmessages.ExtendedMessages; -import com.github.cewko.extendedmessages.Reference; +import com.github.cewko.enhanmess.EnhanMess; +import com.github.cewko.enhanmess.Reference; import java.util.ArrayDeque; import java.util.Deque; @@ -117,8 +117,8 @@ private long getCooldownNanos(Lane lane) { private int getDelaySeconds(Lane lane) { return lane == Lane.REGULAR - ? ExtendedMessages.getMessageDelaySeconds() - : ExtendedMessages.getCommandDelaySeconds(); + ? EnhanMess.getMessageDelaySeconds() + : EnhanMess.getCommandDelaySeconds(); } @SubscribeEvent @@ -138,7 +138,7 @@ public void onClientTick(TickEvent.ClientTickEvent event) { } if (minecraft.thePlayer == null || minecraft.theWorld == null - || minecraft.theWorld != queuedWorld || !ExtendedMessages.isEnabled()) { + || minecraft.theWorld != queuedWorld || !EnhanMess.isEnabled()) { clear(); return; } diff --git a/src/main/java/com/github/cewko/extendedmessages/messaging/OutgoingMessageProcessor.java b/src/main/java/com/github/cewko/enhanmess/messaging/OutgoingMessageProcessor.java similarity index 87% rename from src/main/java/com/github/cewko/extendedmessages/messaging/OutgoingMessageProcessor.java rename to src/main/java/com/github/cewko/enhanmess/messaging/OutgoingMessageProcessor.java index f961ead..aec1759 100644 --- a/src/main/java/com/github/cewko/extendedmessages/messaging/OutgoingMessageProcessor.java +++ b/src/main/java/com/github/cewko/enhanmess/messaging/OutgoingMessageProcessor.java @@ -1,7 +1,7 @@ -package com.github.cewko.extendedmessages.messaging; +package com.github.cewko.enhanmess.messaging; -import com.github.cewko.extendedmessages.ExtendedMessages; -import com.github.cewko.extendedmessages.Reference; +import com.github.cewko.enhanmess.EnhanMess; +import com.github.cewko.enhanmess.Reference; import java.util.ArrayList; import java.util.Collections; @@ -42,7 +42,7 @@ public static boolean shouldBypass(String message) { return false; } - return message.length() <= ExtendedMessages.getCurrentPacketMessageLimit(); + return message.length() <= EnhanMess.getCurrentPacketMessageLimit(); } private static boolean startsWithCommand(String message, String command) { @@ -52,11 +52,11 @@ private static boolean startsWithCommand(String message, String command) { } private static boolean isConfiguredCommandMessage(String message) { - if (!ExtendedMessages.isCommandPrefixEnabled()) { + if (!EnhanMess.isCommandPrefixEnabled()) { return false; } - String commandPrefix = withTrailingSpace(ExtendedMessages.getCommandPrefix()); + String commandPrefix = withTrailingSpace(EnhanMess.getCommandPrefix()); return !commandPrefix.isEmpty() && message.regionMatches(true, 0, commandPrefix, 0, commandPrefix.length()) @@ -95,8 +95,8 @@ private static ProcessedMessage process(Minecraft minecraft, String message) { } private static ProcessedMessage processRegularMessage(Minecraft minecraft, String message) { - String messagePrefix = ExtendedMessages.isMessagePrefixEnabled() - ? withTrailingSpace(ExtendedMessages.getMessagePrefix()) + String messagePrefix = EnhanMess.isMessagePrefixEnabled() + ? withTrailingSpace(EnhanMess.getMessagePrefix()) : ""; return new ProcessedMessage( @@ -109,7 +109,7 @@ private static ProcessedMessage processConfiguredCommand( Minecraft minecraft, String message ) { - String commandPrefix = withTrailingSpace(ExtendedMessages.getCommandPrefix()); + String commandPrefix = withTrailingSpace(EnhanMess.getCommandPrefix()); String body = message.substring(commandPrefix.length()); return new ProcessedMessage( @@ -133,7 +133,7 @@ private static List buildSendableLines( String prefix, String body ) { - if (!ExtendedMessages.isSplitEnabled()) { + if (!EnhanMess.isSplitEnabled()) { String line = prefix + body; if (line.length() > Reference.EXTENDED_MESSAGE_LIMIT) { diff --git a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinC01PacketChatMessage.java b/src/main/java/com/github/cewko/enhanmess/mixin/MixinC01PacketChatMessage.java similarity index 62% rename from src/main/java/com/github/cewko/extendedmessages/mixin/MixinC01PacketChatMessage.java rename to src/main/java/com/github/cewko/enhanmess/mixin/MixinC01PacketChatMessage.java index 085f83a..45a4362 100644 --- a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinC01PacketChatMessage.java +++ b/src/main/java/com/github/cewko/enhanmess/mixin/MixinC01PacketChatMessage.java @@ -1,7 +1,7 @@ -package com.github.cewko.extendedmessages.mixin; +package com.github.cewko.enhanmess.mixin; -import com.github.cewko.extendedmessages.ExtendedMessages; -import com.github.cewko.extendedmessages.Reference; +import com.github.cewko.enhanmess.EnhanMess; +import com.github.cewko.enhanmess.Reference; import net.minecraft.network.play.client.C01PacketChatMessage; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; @@ -16,7 +16,7 @@ public abstract class MixinC01PacketChatMessage { require = 2 ) - private int extendedmessages$modifyOutgoingLimit(int defaultLimit) { - return ExtendedMessages.getCurrentPacketMessageLimit(); + private int enhanmess$modifyOutgoingLimit(int defaultLimit) { + return EnhanMess.getCurrentPacketMessageLimit(); } } diff --git a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinEntityPlayerSP.java b/src/main/java/com/github/cewko/enhanmess/mixin/MixinEntityPlayerSP.java similarity index 73% rename from src/main/java/com/github/cewko/extendedmessages/mixin/MixinEntityPlayerSP.java rename to src/main/java/com/github/cewko/enhanmess/mixin/MixinEntityPlayerSP.java index 8362608..436503f 100644 --- a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinEntityPlayerSP.java +++ b/src/main/java/com/github/cewko/enhanmess/mixin/MixinEntityPlayerSP.java @@ -1,8 +1,8 @@ -package com.github.cewko.extendedmessages.mixin; +package com.github.cewko.enhanmess.mixin; -import com.github.cewko.extendedmessages.ExtendedMessages; -import com.github.cewko.extendedmessages.messaging.OutgoingMessageProcessor; -import com.github.cewko.extendedmessages.messaging.MessageQueue; +import com.github.cewko.enhanmess.EnhanMess; +import com.github.cewko.enhanmess.messaging.OutgoingMessageProcessor; +import com.github.cewko.enhanmess.messaging.MessageQueue; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; @@ -21,7 +21,7 @@ public abstract class MixinEntityPlayerSP { cancellable = true, require = 1 ) - private void extendedmessages$interceptMessage( + private void enhanmess$interceptMessage( String message, CallbackInfo callback ) { @@ -31,7 +31,7 @@ public abstract class MixinEntityPlayerSP { return; } - if (!ExtendedMessages.isEnabled()) { + if (!EnhanMess.isEnabled()) { return; } diff --git a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiChat.java b/src/main/java/com/github/cewko/enhanmess/mixin/MixinGuiChat.java similarity index 65% rename from src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiChat.java rename to src/main/java/com/github/cewko/enhanmess/mixin/MixinGuiChat.java index 9714337..fb4a287 100644 --- a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiChat.java +++ b/src/main/java/com/github/cewko/enhanmess/mixin/MixinGuiChat.java @@ -1,7 +1,7 @@ -package com.github.cewko.extendedmessages.mixin; +package com.github.cewko.enhanmess.mixin; -import com.github.cewko.extendedmessages.ExtendedMessages; -import com.github.cewko.extendedmessages.Reference; +import com.github.cewko.enhanmess.EnhanMess; +import com.github.cewko.enhanmess.Reference; import net.minecraft.client.gui.GuiChat; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; @@ -13,9 +13,9 @@ public abstract class MixinGuiChat { method = "initGui", constant = @Constant(intValue = Reference.DEFAULT_MESSAGE_LIMIT) ) - private int extendedmessages$replaceVanillaChatLimit(int defaultLimit) { + private int enhanmess$replaceVanillaChatLimit(int defaultLimit) { // GuiChat.initGui creates chat input box with vanilla's 100 char limit // when mod is enabled we replace that limit with our extended one - return ExtendedMessages.getCurrentMessageLimit(); + return EnhanMess.getCurrentMessageLimit(); } } \ No newline at end of file diff --git a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiNewChat.java b/src/main/java/com/github/cewko/enhanmess/mixin/MixinGuiNewChat.java similarity index 58% rename from src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiNewChat.java rename to src/main/java/com/github/cewko/enhanmess/mixin/MixinGuiNewChat.java index c715b3d..1739ad7 100644 --- a/src/main/java/com/github/cewko/extendedmessages/mixin/MixinGuiNewChat.java +++ b/src/main/java/com/github/cewko/enhanmess/mixin/MixinGuiNewChat.java @@ -1,7 +1,7 @@ -package com.github.cewko.extendedmessages.mixin; +package com.github.cewko.enhanmess.mixin; -import com.github.cewko.extendedmessages.ExtendedMessages; -import com.github.cewko.extendedmessages.Reference; +import com.github.cewko.enhanmess.EnhanMess; +import com.github.cewko.enhanmess.Reference; import net.minecraft.client.gui.GuiNewChat; import org.spongepowered.asm.mixin.Mixin; @@ -15,7 +15,7 @@ public abstract class MixinGuiNewChat { constant = @Constant(intValue = Reference.VANILLA_MESSAGE_HISTORY_LENGTH), require = 2 ) - private int extendedmessages$replaceMessageHistoryLength(int vanillaLimit) { - return ExtendedMessages.getCurrentMessageHistoryLength(); + private int enhanmess$replaceMessageHistoryLength(int vanillaLimit) { + return EnhanMess.getCurrentMessageHistoryLength(); } } \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 07c6b39..d059306 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,11 +1,11 @@ [ { "modid": "${modid}", - "name": "Extended Messages", - "description": "extends Minecraft 1.8.9 message limit to 256 characters", + "name": "enhanmess", + "description": "adds 256-character message support, increased history length, configurable prefixes, cooldowns & message splitting", "version": "${version}", "mcversion": "${mcversion}", - "url": "", + "url": "https://github.com/cewko/enhanmess/", "updateUrl": "", "authorList": [ "cewko" diff --git a/src/main/resources/mixins.extendedmessages.json b/src/main/resources/mixins.enhanmess.json similarity index 100% rename from src/main/resources/mixins.extendedmessages.json rename to src/main/resources/mixins.enhanmess.json From ccabe9fb42241dd8543de0f9c6b913fbc97e8a2d Mon Sep 17 00:00:00 2001 From: cewko Date: Fri, 24 Jul 2026 14:01:45 +0200 Subject: [PATCH 9/9] docs: update readme --- README.md | 33 ++++++++++++++++++++++++++++++--- images/gui.png | Bin 0 -> 237038 bytes 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 images/gui.png diff --git a/README.md b/README.md index 8c8088f..7555116 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,37 @@ -# name +# enhanmess -extends 100-character message limit of 1.8.9 up to 256 characters; queues regular messages & commands; adds long message splitting; increases default message history length; adds support for command & regular prefixes +extends 100-character message limit of 1.8.9 up to 256 characters; queues regular messages & configured commands; adds long message splitting; increases default message history length; adds support for command & regular prefixes +## usage -[IMAGE] +to configure the mod execute `/em` (short for `/enhanmess`): +![enhanmess settings gui](images/gui.png) + +or use commands instead: + +``` +/em toggle + +# message prefix +/em mp toggle +/em mp set + +# command prefix +/em cp toggle +/em cp set + +# message cooldown +/em mc set + +# command cooldown +/em cc set + +# history +/em h set +``` + +P.S. sending more than 100 chars in a single packet works only in singleplayer or on servers that support it, so message splitting is preferred ## installation diff --git a/images/gui.png b/images/gui.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9ed9a89cd748ad3c5b3a9ffa20f7044468b8b4 GIT binary patch literal 237038 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
D%XuG%l8{kHqP8<+wsFm-CI# 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 PG5~?6tDnm{r-UW|99!K$ literal 0 HcmV?d00001