samyyc.dev

点击登入

.. (UTC+8)

-- BPM

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);

还是比较美观的