新增自定义规则
791 字约 3 分钟
相关信息
从 NoBuildPlus 1.5.50 开始,你可以在 NoBuildPlus 中通过新类注册规则,或者在 你自己的插件类中 注册规则。
Flag 接口
在创建类之前,你需要了解以下方法:
public interface Flag {
/**
* @return 规则名称
*/
String getName();
/**
* 可引用你自己的规则配置文件
* @return 规则类型
*/
String getType();
/**
* 可引用你自己的规则配置文件
* @return 规则列表
*/
List<String> getList();
/**
* 建议在构造函数中初始化
* @return 默认规则类型
*/
String getDefaultType();
/**
* 建议在构造函数中初始化
* @return 默认规则列表
*/
List<String> getDefaultList();
/**
* True 表示插件正在保护
* @param world 世界名称
* @return 布尔值
*/
default boolean isEnabled(String world) {
if (!Settings.canExecute(world, getName())) {
return false;
}
return !Worlds.getFlag(world, getName());
}
/**
* 是否将规则保存在 flags.yml 中
* 否则,你可以让规则配置保存在你自己的文件中
* @return 布尔值
*/
boolean inLocalFile();
/**
* 刷新列表映射
*/
void refreshMap();
// 用于菜单
/**
* 菜单中的物品
* @return material.toString()
*/
String getShowItem();
/**
* 获取 NoBuildPlus 的语言,参见 NBPAPI.getLang()
* @param language 配置语言
* @return 规则描述
*/
String getDescription(String language);
}在 NoBuildPlus 的 FlagRegistry 中,你可以让规则配置保存在你自己的文件中,而不是 NoBuildPlus 文件夹下的 flags.yml! 请查看下面方法中的注释,了解如何启用该功能。
创建类
你可以在你的插件中创建这个类, 或者在你建立的NoBuildPlus分支下的 p1xel.nobuildplus.flag 包。
ExampleFlags.java
public enum ExampleFlags implements Flag {
custom_flag_one("custom-flag-one", "TNT", null, null),
custom_flag_two("custom-flag-two", "GRASS_BLOCK", null, null);
private final String flag_name;
private final String show_item;
private final String type;
private final List<String> list;
private final HashMap<ExampleFlags, List<String>> LISTMAP = new HashMap<>();
ExampleFlags(String flag_name, String show_item, String type, List<String> list) {
this.flag_name = flag_name;
this.show_item = show_item;
this.type = type;
this.list = list;
}
@Override
public String getName() {
return flag_name;
}
@Override
public String getType() {
// 如果使用 NoBuildPlus 的 flags.yml 文件配置,不要修改
// 否则,改为你自己的方法
return FlagsManager.getFlagsType(getName());
}
@Override
public List<String> getList() {
// 如果使用 NoBuildPlus 的 flags.yml 文件配置,不要修改
// 否则,改为你自己的方法
return FlagsManager.getFlagsList(flag_name);
}
@Override
public String getDefaultType() {
return type;
}
@Override
public List<String> getDefaultList() {
return list;
}
@Override
public boolean inLocalFile() {
// 如果你希望规则配置保存在你自己的文件中,
// 将返回值设置为 FALSE
return true;
}
@Override
public void refreshMap() {
for (ExampleFlags flag : values()) {
List<String> list = new ArrayList<>();
// 如果使用 NoBuildPlus 的 flags.yml 文件配置,不要修改
// 否则,改为你自己的方法
if (FlagsManager.yaml.isSet("flags." + flag + ".list")) {
list = FlagsManager.getFlagsList(flag.flag_name);
}
LISTMAP.put(flag, list);
}
}
@Override
public String getShowItem() {
return show_item;
}
@Override
public String getDescription(String language) {
// 如果使用 NoBuildPlus 的语言文件,不要修改
// 否则,改为你自己的方法
return Locale.getMessage("flag.description." + flag_name);
}
}注册规则枚举
在设置好枚举后,请确保将其注册,让 NoBuildPlus 能识别!
FlagRegistrationLoader.java
public class FlagRegistrationLoader {
private static final Map<String, Flag[]> FLAG_REGISTRATION_HOOKS = new HashMap<String, Flag[]>() {{
put("ItemsAdder", ItemsAdderFlags.values());
// 在这加入你的插件
}};
private static final Map<String, List<Listener>> LISTENER_REGISTRATION = new HashMap<String, List<Listener>>() {{
put("ItemsAdder", Collections.singletonList(new ItemsAdderListener()));
// 在这加入你的插件
}};
}添加到 NoBuildPlus
如果你想将新提交合并到 NoBuildPlus 仓库,
请确保新创建的规则描述已被添加至所有语言文件:
zh_CN.yml
flag:
description:
custom_flag: '它保护的内容'