注册自定义 Flag
文档/dominion-api/注册自定义 Flag

注册自定义 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 来代替最终权限判断。