如何使用'&'指定的颜色代码制作用户输入的消息?在游戏中显示彩色?

时间:2016-05-06 17:31:30

标签: java minecraft bukkit

我不确定如何允许我的插件用户输入&的颜色代码并正确显示。我知道我可以使用ChatColor中的常量在插件发送的邮件中添加各种颜色,但我不知道如何允许用户输入自己的彩色邮件。

这是我的代码:

package me.avy.simplemotd;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class motd extends JavaPlugin implements Listener {

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent e) {
            Player p = e.getPlayer();
            p.sendMessage(ChatColor.AQUA + getConfig().getString("message"));
    }

    public void onEnable()
    {
      Bukkit.getServer().getLogger().info(" SimpleMotd enabled correctly!");
      saveDefaultConfig();
      Bukkit.getServer().getPluginManager().registerEvents(this, this);
    }

    public void onDisable()
    {
      Bukkit.getServer().getLogger().info(" SimpleMotd disabled correctly!");
    }

    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
            if (cmd.getName().equalsIgnoreCase("motd")) {
                    sender.sendMessage(ChatColor.AQUA + "MOTD: " + getConfig().getString("message"));
                    return true;
            }
            if (cmd.getName().equalsIgnoreCase("setmotd")) {
                    if (!sender.hasPermission("motd.set")) {
                            sender.sendMessage(ChatColor.RED + "You are not permitted to do this!");
                            return true;
                    }
                    if (args.length == 0) {
                            sender.sendMessage(ChatColor.RED + "Please specify a message!");
                            return true;
                    }
                    StringBuilder str = new StringBuilder();
                    for (int i = 0; i < args.length; i++) {
                            str.append(args[i] + " ");
                    }
                    String motd = str.toString();
                    getConfig().set("message", motd);
                    saveConfig();
                    sender.sendMessage(ChatColor.GREEN + "MOTD set to: " + motd);
                    return true;
            }
            return true;
    }
}

我希望玩家能够使用/setmotd &cRed &aGreen &9Blue并使用Minecraft color code format以适当的颜色向他们显示MOTD。有几个其他插件能够显示以这种方式设置的消息,所以它必须是可能的。

如何将&cRed &aGreen &9Blue之类的邮件转换为在游戏中正确显示的邮件?

1 个答案:

答案 0 :(得分:2)

您可以使用the Tupelo library&的颜色代码转换为ChatColor使用的格式。 (在内部,那是§)。

translateAlternateColorCodes接受替换字符然后替换文本。对于替换字符,您可能希望使用'&'(请注意单引号而不是双引号)。 translateAlternateColorCodes具有仅替换有效代码的特殊逻辑,因此&eWelcome变为§eWelcome(在游戏中,#34;欢迎&#34;在黄色文本中),但是I like cats & dogs 1}}无法转换并在游戏中显示为I like cats & dogs

您可能希望在消息显示的所有情况下进行替换,但在设置时则不行。这样,如果有人手动编辑配置,也可以在那里使用&。因此,您需要编辑代码以替换以下每一行:

p.sendMessage(ChatColor.AQUA + getConfig().getString("message"));
sender.sendMessage(ChatColor.AQUA + "MOTD: " + getConfig().getString("message"));
sender.sendMessage(ChatColor.GREEN + "MOTD set to: " + motd);

有了这些:

p.sendMessage(ChatColor.AQUA + ChatColor.translateAlternateColorCodes('&', getConfig().getString("message")));
sender.sendMessage(ChatColor.AQUA + "MOTD: " + ChatColor.translateAlternateColorCodes('&', getConfig().getString("message")));
sender.sendMessage(ChatColor.GREEN + "MOTD set to: " + ChatColor.translateAlternateColorCodes('&', motd));

更好的是,你可以编写一个getMotd方法,用正确的格式从配置中检索MOTD,然后使用它:

/**
 * Gets the MOTD from the configuration with formatting that can be used in chat.
 */
private String getMotd()
{
    String rawMessage = getConfig().getString("message");
    return ChatColor.translateAlternateColorCodes('&', rawMessage);
}

您可以在所有想要显示MOTD的地方使用getMotd(),而不是直接从配置中检索它。