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);
还是比较美观的