Bukkit 可配置提示信息

Bukkit 可配置提示信息

Bukkit 可配置提示信息 鉴于高度自定义化的原则,可完全自定义的提示信息对于Bukkit插件来说是一个不错的选择,在开发过程中我们也不需要花费太多心思在编写提示信息上,而是等到优化配置阶段再来完成它 先从配置文件 config.yml 入手: Messages: PREFIX: "&a[你的

Bukkit 可配置提示信息

鉴于高度自定义化的原则,可完全自定义的提示信息对于Bukkit插件来说是一个不错的选择,在开发过程中我们也不需要花费太多心思在编写提示信息上,而是等到优化配置阶段再来完成它

先从配置文件 config.yml 入手:

Messages:
  PREFIX: "&a[你的插件名] "
  ERR_UNKNOWN_ITEM: "未知物品: %s"
  ERR_UNKNOWN_ENCHANTMENT: "未知附魔: %s"
  ERR_UNKNOWN_PLAYER: "未知的玩家: %s"
  ERR_UNKNOWN_GEM: "未知的宝石ID: %s"

  INFO_GEM_ENCHANT_START: "效果: "
  # 第一个%s是附魔名称 第二个%s是等级
  INFO_GEM_ENCHANT: "· %s &b%s"

采用常量命名方法来命名key,同时使用 ERR_INFO_ 等前缀来标记是个不错的选择,方便我们辨别和后续的颜色处理格式化

%s可以方便我们直接使用Java的 String.format 进行插值

然后是程序方面的读取

import org.bukkit.configuration.ConfigurationSection;

import java.lang.reflect.Field;

public class Messages {

    public static String PREFIX;

    public static String ERR_UNKNOWN_ITEM;

    public static String ERR_UNKNOWN_ENCHANTMENT;

    public static String ERR_UNKNOWN_PLAYER;

    public static String ERR_UNKNOWN_GEM;

    public static String INFO_GEM_ENCHANT_START;
    public static String INFO_GEM_ENCHANT;

    public static void reload(ConfigurationSection section) {
        for (String name : section.getKeys(false)) {
            String value = section.getString(name);
            if (name.startsWith("ERR_")) {
                value = "&c"+value;
            } else if (name.startsWith("INFO_"): {
                value = "&a"+value;
            }
            value = ChatColor.translateAlternateColorCodes('&', value);

            try {
                Field field = Messages.class.getDeclaredField(name);
                field.setAccessible(true);
                field.set(null, value);
            } catch (NoSuchFieldException | IllegalAccessException e) {
                System.out.println("未知的消息名: "+name);
            }
        }
    }

    public static void sendToConsole(String message, Object... args) {
        Bukkit.getConsoleSender().sendMessage(String.format(PREFIX+message, args));
    }

    public static void sendToPlayer(Player player, String message, Object... args) {
        player.sendMessage(String.format(PREFIX+message, args));
    }


}

这段代码中读取了YML中Messages这个section中所有的配置,并把他们通过反射赋给static变量,并自动添加了ERR_和INFO_等消息的颜色代码

还提供了两个方法,将消息发送给后台或是指定玩家

这段代码也可以通过枚举的方式进行改进

reload方法应该在主类的onEnable方法中被调用:

public void onEnable() {
  // ...
  Messages.reload(getConfig().getConfigurationSection("Messages"));
  // ...
}

在插件重载时也可以再调用一次

需要使用这些消息的时候只需要这样:

Messages.sendToConsole(Messages.ERR_UNKNOWN_ITEM, itemName);

还是比较美观的

LICENSED UNDER CC BY-NC-SA 4.0
Comment