Eclipse 中的 Minecraft 插件错误(颜色,全部替换)

Minecraft plugin error in Eclipse (color, replaceall)

我正在编辑一个所有者很长时间没有更新的插件,但我收到此错误:

The method replaceAll(String, String) in the type String is not applicable for the arguments (String, ChatColor)

public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    if (!(sender instanceof Player)) {
        return false;
    }

    String prefixResult = getConfig().getString("prefix");

    prefixResult = prefixResult.replaceAll("&f", ChatColor.WHITE);
    prefixResult = prefixResult.replaceAll("&e", ChatColor.YELLOW);
    prefixResult = prefixResult.replaceAll("&d", ChatColor.LIGHT_PURPLE);
    prefixResult = prefixResult.replaceAll("&c", ChatColor.RED);
    prefixResult = prefixResult.replaceAll("&b", ChatColor.AQUA);
    prefixResult = prefixResult.replaceAll("&a", ChatColor.GREEN);
    prefixResult = prefixResult.replaceAll("&9", ChatColor.BLUE);
    prefixResult = prefixResult.replaceAll("&8", ChatColor.DARK_GRAY);
    prefixResult = prefixResult.replaceAll("&7", ChatColor.GRAY);
    prefixResult = prefixResult.replaceAll("&6", ChatColor.GOLD);
    prefixResult = prefixResult.replaceAll("&5", ChatColor.DARK_PURPLE);
    prefixResult = prefixResult.replaceAll("&4", ChatColor.DARK_RED);
    prefixResult = prefixResult.replaceAll("&3", ChatColor.DARK_AQUA);
    prefixResult = prefixResult.replaceAll("&2", ChatColor.DARK_GREEN);
    prefixResult = prefixResult.replaceAll("&1", ChatColor.DARK_BLUE);
    prefixResult = prefixResult.replaceAll("&0", ChatColor.BLACK);

    Player player = (Player) sender;
}

你知道是什么原因造成的吗?

我的猜测是您正在使用的作者来源的导入设置不正确。

显然,prefixResult 是一个字符串,replaceAll() 是一个已知的字符串正则表达式替换方法。 Eclipse 只是看到您正在引用 ChatColor 中的某些内容,它可能不存在,因此它解析为该类型。

要解决此问题,请修复该导入,让您知道您指定的类型无法解析为字符串。

然而,我碰巧知道 Minecraft 只是将颜色字符 &e&b&c 等转换为 Unicode color characters。这些都有据可查。

所以:

prefixResult.replaceAll("&e", ChatColor.YELLOW);
...
prefixResult.replaceAll("&b", ChatColor.AQUA);

实际上是同一个东西:

prefixResult.replaceAll("&e","3[32m");
...
prefixResult.replaceAll("&b", "3[36m");

如果您找不到 ChatColor(这可能是最简单的解决方案),您可以简单地查找值并直接替换它们。

希望对您有所帮助!

更新:

原来,ChatColorclass其实在Bukkit source里面。确保你有导入:

import org.bukkit.ChatColor;

文件中的某处。但是如果你仍然有问题,并且你确定项目配置是正确的,你可以直接用那个文件补充你的代码。 (另外,颜色列表在里面,你只需要弄清楚它使用的图案就可以了。)

更新:

终于仔细看了source,发现只要调用toString()方法就可以了。这应该 return 一个 String 类型,因为 ChatColor.COLOR 是一个枚举的 ChatColor 类型。抱歉,我没有早点注意到这一点。

所以,我认为您的代码应该如下所示:

prefixResult.replaceAll("&e", ChatColor.YELLOW.toString());
...
prefixResult.replaceAll("&b", ChatColor.AQUA.toString());

很明显,ChatColorclass在toString()方法returns实例化枚举类型时定义了变量here:

this.toString = new String(new char[] {COLOR_CHAR, code});