Mon Nov 20 2023
Bukkit 可配置提示信息
#92
/
samyyc
/
共 2281 字
/
928日 前更新
INFO_GEM_ENCHANT: "· %s &b%s"
采用常量命名方法来命名key,同时使用 ERR_ 和 INFO_ 等前缀来标记是个不错的选择,方便我们辨别和后续的颜色处理格式化
%s可以方便我们直接使用Java的 String.format 进行插值
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Set;
import static org.bukkit.Bukkit.getLogger;
public final class Messages {
private static String ERR_UNKNOWN_ITEM;
private static String ERR_UNKNOWN_COMMAND;
private static String ERR_NO_PERMISSION;
private static String ERR_PLAYER_NOT_FOUND;
private static String ERR_PLAYER_NOT_ONLINE;
// 略...
private static String INFO_GEM_ENCHANT;
private static String INFO_UNKNOWN_ITEM;
private static String INFO_UNKNOWN_COMMAND;
private static String INFO_NO_PERMISSION;
private static String INFO_PLAYER_NOT_FOUND;
private static String INFO_PLAYER_NOT_ONLINE;
// 略...
public static void reload(ConfigurationSection config) {
Field[] fields = Messages.class.getDeclaredFields(); // 反射获取对象
for (Field field : fields) {
if (Modifier.isStatic(field.getModifiers())) {
String key = field.getName().toLowerCase();
if (config.contains(key)) {
String message = config.getString(key);
if (key.startsWith("err_")) { // 错误信息自动添加颜色
message = ChatColor.RED + message;
} else if (key.startsWith("info_")) {
message = ChatColor.GREEN + message;
}
try {
field.set(null, message);
} catch (IllegalAccessException e) {
e.printStackTrace(); // 略
}
}
}
}
}
public static void sendToConsole(String message, Object... args) { /* ... */ }
public static void sendToPlayer(Player player, String message, Object... args) { /* ... */ }
}
这段代码中读取了YML中Messages这个section中所有的配置,并把他们通过反射赋给static变量,并自动添加了ERR_和INFO_等消息的颜色代码
还提供了两个方法,将消息发送给后台或是指定玩家
这段代码也可以通过枚举的方式进行改进
reload方法应该在主类的onEnable方法中被调用:
public void onEnable() {
// ...
Messages.reload(getConfig().getConfigurationSection("Messages"));
// ...
}
在插件重载时也可以再调用一次
需要使用这些消息的时候只需要这样:
Messages.sendToConsole(Messages.ERR_UNKNOWN_ITEM, itemName);
还是比较美观的
