diff --git a/src/main/java/com/snowypeaksystems/mobactions/data/CommandData.java b/src/main/java/com/snowypeaksystems/mobactions/data/CommandData.java index b90e8ac..06e59d0 100644 --- a/src/main/java/com/snowypeaksystems/mobactions/data/CommandData.java +++ b/src/main/java/com/snowypeaksystems/mobactions/data/CommandData.java @@ -55,20 +55,22 @@ public String getCommand(String name) { StringBuilder newString = new StringBuilder(); for (int i = 0, j = 0; i < command.length(); i++) { - if (command.charAt(i) == tokenStr.charAt(j)) { + if (command.charAt(i) == tokenStr.charAt(j) && (i == 0 || command.charAt(i - 1) != '\\')) { positions[j] = i; j++; } if (j == positions.length) { - String segment = command.substring(last, positions[0]); + String segment = command.substring(last, positions[0]).replaceAll("\\\\\\{", "{") + .replaceAll("\\\\}", "}"); newString.append(segment).append(name); last = i + 1; j = 0; } } - newString.append(command, last, command.length()); + newString.append(command.substring(last).replaceAll("\\\\\\{", "{") + .replaceAll("\\\\}", "}")); return newString.toString(); } diff --git a/src/main/java/com/snowypeaksystems/mobactions/listener/CommandListener.java b/src/main/java/com/snowypeaksystems/mobactions/listener/CommandListener.java index 0d3b58b..ff39961 100644 --- a/src/main/java/com/snowypeaksystems/mobactions/listener/CommandListener.java +++ b/src/main/java/com/snowypeaksystems/mobactions/listener/CommandListener.java @@ -325,16 +325,16 @@ private List parseForStrings(String[] args) { for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); - if (sb == null && c == '"') { + if (sb == null && c == '"' && (i == 0 || text.charAt(i - 1) != '\\')) { sb = new StringBuilder(); } else if (sb != null) { - if (c == '"') { + if (c == '"' && text.charAt(i - 1) != '\\') { String str = sb.toString(); if (str.length() > 0) { strings.add(str); } sb = null; - } else { + } else if (i == text.length() - 1 || text.charAt(i) != '\\' || text.charAt(i + 1) != '"') { sb.append(c); } } diff --git a/src/main/java/com/snowypeaksystems/mobactions/util/Message.java b/src/main/java/com/snowypeaksystems/mobactions/util/Message.java index 79c7509..bede347 100644 --- a/src/main/java/com/snowypeaksystems/mobactions/util/Message.java +++ b/src/main/java/com/snowypeaksystems/mobactions/util/Message.java @@ -17,7 +17,7 @@ public class Message implements IMessage { int tokens = 0; for (int i = 0, j = 0; i < message.length(); i++) { - if (message.charAt(i) == tokenStr.charAt(j)) { + if (message.charAt(i) == tokenStr.charAt(j) && (i == 0 || message.charAt(i - 1) != '\\')) { j++; } @@ -47,7 +47,7 @@ private String replaceAndColorize(String... args) { StringBuilder newString = new StringBuilder(); StringBuilder formatCodes = new StringBuilder(); for (int i = 0, j = 0; i < message.length(); i++) { - if (message.charAt(i) == tokenStr.charAt(j)) { + if (message.charAt(i) == tokenStr.charAt(j) && (i == 0 || message.charAt(i - 1) != '\\')) { positions[j] = i; j++; } @@ -55,7 +55,8 @@ private String replaceAndColorize(String... args) { if (j == positions.length) { if (args.length > tokens) { String tokenFormat = message.substring(positions[0] + 1, positions[1]); - String segment = message.substring(last, positions[0]); + String segment = message.substring(last, positions[0]).replaceAll("\\\\\\{", "{") + .replaceAll("\\\\}", "}"); String previousFormat = ChatColor.getLastColors(segment); formatCodes.append(previousFormat); newString.append(segment); @@ -76,7 +77,8 @@ private String replaceAndColorize(String... args) { } } - newString.append(message, last, message.length()); + newString.append(message.substring(last).replaceAll("\\\\\\{", "{") + .replaceAll("\\\\}", "}")); return newString.toString(); } diff --git a/src/test/java/com/snowypeaksystems/mobactions/data/command/CommandDataTest.java b/src/test/java/com/snowypeaksystems/mobactions/data/command/CommandDataTest.java index ebe1eb5..b7b8ce8 100644 --- a/src/test/java/com/snowypeaksystems/mobactions/data/command/CommandDataTest.java +++ b/src/test/java/com/snowypeaksystems/mobactions/data/command/CommandDataTest.java @@ -18,6 +18,11 @@ void replace() { data = new CommandData("{}st {}st", ""); assertEquals("test test", data.getCommand("te")); - } + data = new CommandData("{} \\{\\} {}", ""); + assertEquals("test {} test", data.getCommand("test")); + + data = new CommandData("\\{\\} {} \\{\\}", ""); + assertEquals("{} test {}", data.getCommand("test")); + } } \ No newline at end of file diff --git a/src/test/java/com/snowypeaksystems/mobactions/util/MessageTest.java b/src/test/java/com/snowypeaksystems/mobactions/util/MessageTest.java index 51464ce..da75202 100644 --- a/src/test/java/com/snowypeaksystems/mobactions/util/MessageTest.java +++ b/src/test/java/com/snowypeaksystems/mobactions/util/MessageTest.java @@ -21,6 +21,13 @@ void replace() { assertThrows(IllegalArgumentException.class, message::replace); assertThrows(IllegalArgumentException.class, message::replace); + message = new Message("{} \\{\\} {}"); + assertEquals("test {} test", message.replace("test", "test")); + assertThrows(IllegalArgumentException.class, message::replace); + + message = new Message("\\{\\} {} \\{\\}"); + assertEquals("{} test {}", message.replace("test")); + message = new Message("&ctest {} test"); assertEquals( ChatColor.translateAlternateColorCodes('&', "&ctest test test"),