From e792dd6f98e84b77fdbc208c12c82985a340590e Mon Sep 17 00:00:00 2001 From: wizjany Date: Sun, 6 Oct 2019 11:20:36 -0400 Subject: [PATCH] Workaround colors on newlines of string flags issue in text lib. Also fix newline lookbehind replacement, and only replace color macros in string flags. --- .../java/com/sk89q/worldguard/commands/CommandUtils.java | 9 ++++++++- .../sk89q/worldguard/commands/region/RegionCommands.java | 7 +------ .../worldguard/commands/region/RegionCommandsBase.java | 6 ++++-- .../sk89q/worldguard/protection/flags/StringFlag.java | 7 ++++++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/CommandUtils.java b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/CommandUtils.java index 6254b3ce..b8343fa8 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/CommandUtils.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/CommandUtils.java @@ -24,7 +24,9 @@ import com.sk89q.worldedit.util.formatting.text.serializer.legacy.LegacyComponentSerializer; import javax.annotation.Nullable; +import java.util.Arrays; import java.util.function.Function; +import java.util.stream.Collectors; /** * Command-related utility methods. @@ -76,7 +78,12 @@ public static String replaceColorMacros(String str) { str = str.replace("`x", "&r"); // MC classic - str = LegacyComponentSerializer.INSTANCE.serialize(LegacyComponentSerializer.INSTANCE.deserialize(str, '&')); + // FIXME: workaround for https://github.com/KyoriPowered/text/issues/50 + // remove when fixed upstream and updated in WorldEdit + str = Arrays.stream(str.split("\n")).map(line -> { + TextComponent comp = LegacyComponentSerializer.INSTANCE.deserialize(line, '&'); + return LegacyComponentSerializer.INSTANCE.serialize(comp); + }).collect(Collectors.joining("\n")); return str; } diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java index 16330c03..2c85fa31 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommands.java @@ -500,11 +500,6 @@ public void flag(CommandContext args, Actor sender) throws CommandException { value = ""; } - // Add color codes - if (value != null) { - value = CommandUtils.replaceColorMacros(value); - } - // Lookup the existing region RegionManager manager = checkRegionManager(world); ProtectedRegion existing = checkExistingRegion(manager, args.getString(0), true); @@ -572,7 +567,7 @@ public void flag(CommandContext args, Actor sender) throws CommandException { if (value != null) { // Set the flag if [value] was given even if [-g group] was given as well try { - setFlag(existing, foundFlag, sender, value); + value = setFlag(existing, foundFlag, sender, value).toString(); } catch (InvalidFlagFormat e) { throw new CommandException(e.getMessage()); } diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommandsBase.java b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommandsBase.java index aef58637..c062ef87 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommandsBase.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/commands/region/RegionCommandsBase.java @@ -392,8 +392,10 @@ protected static void setPlayerSelection(LocalPlayer player, ProtectedRegion reg * @param value the value * @throws InvalidFlagFormat thrown if the value is invalid */ - protected static void setFlag(ProtectedRegion region, Flag flag, Actor sender, String value) throws InvalidFlagFormat { - region.setFlag(flag, flag.parseInput(FlagContext.create().setSender(sender).setInput(value).setObject("region", region).build())); + protected static V setFlag(ProtectedRegion region, Flag flag, Actor sender, String value) throws InvalidFlagFormat { + V val = flag.parseInput(FlagContext.create().setSender(sender).setInput(value).setObject("region", region).build()); + region.setFlag(flag, val); + return val; } } diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/StringFlag.java b/worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/StringFlag.java index f3c6c6d1..080e2571 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/StringFlag.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/StringFlag.java @@ -19,6 +19,8 @@ package com.sk89q.worldguard.protection.flags; +import com.sk89q.worldguard.commands.CommandUtils; + import javax.annotation.Nullable; /** @@ -56,7 +58,10 @@ public String getDefault() { @Override public String parseInput(FlagContext context) throws InvalidFlagFormat { - return context.getUserInput().replaceAll("(?!<\\\\)\\\\n", "\n").replaceAll("\\\\\\\\n", "\\n"); + String lines = context.getUserInput().replaceAll("(?