注册自定义 Flag
注册一个可由 Dominion 保存和展示的自定义规则,并在附属中实现其实际行为。
注册环境 Flag
public final class WeatherAddon extends JavaPlugin implements Listener {
private static final EnvFlag NO_RAIN = new EnvFlag(
"weather_addon_no_rain",
"No Rain",
"Whether rain is blocked in this dominion.",
false,
true,
Material.SUNFLOWER
);
@Override
public void onEnable() {
if (!Flags.registerEnvFlag(this, NO_RAIN)) {
getLogger().warning("Dominion rejected the custom flag.");
return;
}
EnvFlagGroup weather = new EnvFlagGroup(
"weather-addon",
"Weather Addon",
"Weather rules provided by this addon.",
Material.SUNFLOWER
);
weather.addFlag(NO_RAIN);
FlagGroups.registerEnvFlagGroup(this, weather);
Flags.applyChanges().thenRun(() ->
getLogger().info("NO_RAIN is ready."));
getServer().getPluginManager().registerEvents(this, this);
}
}
实现 Flag 行为
注册 flag 只会把它加入 Dominion 的 flag 数据、配置和 UI 系统。附属仍需在自己的事件监听器中读取它并执行行为:
@EventHandler
public void onWeatherChange(WeatherChangeEvent event) {
if (!event.toWeather()) return;
for (Player player : event.getWorld().getPlayers()) {
DominionDTO dominion = DominionAPI.getInstance()
.getDominion(player.getLocation());
if (dominion == null) continue;
if (dominion.getEnvFlagValue(NO_RAIN)) {
event.setCancelled(true);
return;
}
}
}
上例只是展示数据读取方式。天气是世界级事件,实际项目还需要设计多个领地同时存在时的优先级,不能简单把第一个玩家的结果当作整个世界的结论。
使用权限 Flag
PriFlag 的实现方式相同,但读取时需要玩家和位置:
if (!DominionAPI.getInstance().checkPrivilegeFlagSilence(
location,
USE_SPECIAL_TOOL,
player
)) {
return;
}
自定义权限 flag 的实际动作应由附属自己监听和取消对应 Bukkit 事件;不要仅仅读取 MemberDTO 的 flag Map 来代替最终权限判断。