From d11d6640205ea92faa35638b3ca78342663319b9 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Sat, 8 Aug 2026 23:34:11 +0800 Subject: [PATCH] Fix unable to select worlds with underscore in placeholders --- .../core/PlaceholderExpansionHook.java | 3 ++- .../multiverse/core/utils/StringFormatter.java | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/core/PlaceholderExpansionHook.java b/src/main/java/org/mvplugins/multiverse/core/PlaceholderExpansionHook.java index 8b1de9362..cd0400713 100644 --- a/src/main/java/org/mvplugins/multiverse/core/PlaceholderExpansionHook.java +++ b/src/main/java/org/mvplugins/multiverse/core/PlaceholderExpansionHook.java @@ -87,7 +87,8 @@ public boolean persist() { @Override public @Nullable String onRequest(OfflinePlayer offlinePlayer, @NotNull String params) { // Split string in to an Array with underscores - List paramsArray = Lists.newArrayList(REPatterns.UNDERSCORE.split(params)); + List paramsArray = Lists.newArrayList( + StringFormatter.parseQuotesInArgs(REPatterns.UNDERSCORE.split(params), "_")); // No placeholder defined if (paramsArray.isEmpty()) { diff --git a/src/main/java/org/mvplugins/multiverse/core/utils/StringFormatter.java b/src/main/java/org/mvplugins/multiverse/core/utils/StringFormatter.java index acfe5da65..4f7fa18e0 100644 --- a/src/main/java/org/mvplugins/multiverse/core/utils/StringFormatter.java +++ b/src/main/java/org/mvplugins/multiverse/core/utils/StringFormatter.java @@ -118,6 +118,20 @@ public static Collection addOnToCommaSeparated(@Nullable String input, @ * @return The parsed args */ public static @NotNull Collection parseQuotesInArgs(@NotNull String[] args) { + return parseQuotesInArgs(args, " "); + } + + /** + * Parse quotes in args into a single string. E.g. ["\"my", "string\""] -> ["my string"] + * + * @param args The args to parse + * @param separator The separator to use between args when joining them + * @return The parsed args + * + * @since 5.8 + */ + @ApiStatus.AvailableSince("5.8") + public static @NotNull Collection parseQuotesInArgs(@NotNull String[] args, @NotNull String separator) { List result = new ArrayList<>(args.length); StringBuilder current = new StringBuilder(); boolean inQuotes = false; @@ -131,13 +145,13 @@ public static Collection addOnToCommaSeparated(@Nullable String input, @ quoteStartIndex = i; current.append(arg.substring(1)); } else if (inQuotes && arg.endsWith("\"")) { - current.append(" ").append(arg, 0, arg.length() - 1); + current.append(separator).append(arg, 0, arg.length() - 1); result.add(current.toString()); current.setLength(0); inQuotes = false; quoteStartIndex = -1; } else if (inQuotes) { - current.append(" ").append(arg); + current.append(separator).append(arg); } else if (arg.startsWith("\"") && arg.endsWith("\"") && arg.length() > 1) { // Fully quoted in one token result.add(arg.substring(1, arg.length() - 1));