XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEServerManager

【Java】我的世界XFE服务器管理器

公开
关注 0 Fork 0 Star 0
UTF-8
package com.xfestudio.xfeservermanager.core.trigger;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

/** Maintained starter programs for common workflows; every node id is stable across restarts. */
public final class TriggerTemplateCatalog {
    public static final List<Template> TEMPLATES = templates();

    private TriggerTemplateCatalog() { }

    public record Template(String id, String name, String description,
                           Set<String> integrations, TriggerProgramV2 program) {
        public Template { integrations = Set.copyOf(integrations); }
    }

    private static List<Template> templates() {
        List<Template> values = new ArrayList<>();
        values.add(template("welcome", "Welcome message", "Greets every joining player.", Set.of(),
                event("welcome", "player.join", Map.of()), List.of(), List.of(
                        action("welcome", "message", "send_player", Map.of(
                                "message", literal("welcome/message", "string", "Welcome, adventurer!"))))));

        TriggerProgramV2.VariableDeclaration progress = variable("region-task", "progress", "integer", 0L,
                "trigger", "player", TriggerProgramV2.Lifetime.PERSISTENT, null);
        values.add(template("region-task", "Region task", "Advances durable player progress on region entry.",
                Set.of(), event("region-task", "region.enter", Map.ofEntries(
                        Map.entry("regionId", "example.spawn"), Map.entry("shape", "cuboid"),
                        Map.entry("dimension", "minecraft:overworld"), Map.entry("minX", "-16"),
                        Map.entry("minY", "0"), Map.entry("minZ", "-16"), Map.entry("maxX", "16"),
                        Map.entry("maxY", "320"), Map.entry("maxZ", "16"),
                        Map.entry("frequencyTicks", "20"))),
                List.of(progress), List.of(
                        set("region-task", "advance", "progress", binary("region-task/add", "integer", "add",
                                reference("region-task/current", "integer", "var.progress"),
                                literal("region-task/one", "integer", 1L))),
                        action("region-task", "notice", "send_player", Map.of("message",
                                literal("region-task/text", "string", "Region task progress updated."))))));

        TriggerProgramV2.VariableDeclaration kills = variable("kill-counter", "kills", "integer", 0L,
                "trigger", "player", TriggerProgramV2.Lifetime.PERSISTENT, null);
        values.add(template("kill-counter", "Kill counter", "Counts player-attributed entity deaths.", Set.of(),
                event("kill-counter", "entity.death", Map.of()), List.of(kills), List.of(
                        set("kill-counter", "increment", "kills", binary("kill-counter/add", "integer", "add",
                                reference("kill-counter/current", "integer", "var.kills"),
                                literal("kill-counter/one", "integer", 1L))))));

        values.add(template("timed-boss", "Timed boss", "Spawns a named boss on an interval.", Set.of(),
                event("timed-boss", "schedule.interval", Map.of("seconds", "3600")), List.of(), List.of(
                        action("timed-boss", "spawn", "spawn_entity", Map.of(
                                "entityType", literal("timed-boss/type", "resource_location", "minecraft:wither"),
                                "position", literal("timed-boss/position", "string", "0 100 0"))))));

        values.add(template("economy-reward", "Economy reward", "Rewards an advancement with currency.",
                Set.of("economy"), event("economy-reward", "player.advancement", Map.of()), List.of(), List.of(
                        action("economy-reward", "deposit", "economy_deposit", Map.of(
                                "currency", literal("economy-reward/currency", "string", "coin"),
                                "amount", literal("economy-reward/amount", "string", "100"),
                                "reason", literal("economy-reward/reason", "string", "Advancement reward"))))));

        values.add(template("menu-interaction", "Menu interaction", "Opens a configured menu from a control event.",
                Set.of("menus"), event("menu-interaction", "menu.control", Map.of()), List.of(), List.of(
                        action("menu-interaction", "open", "open_menu", Map.of(
                                "menuId", reference("menu-interaction/id", "string", "event.menu.id"))))));

        values.add(template("performance-alert", "Performance alert", "Broadcasts sustained slow-tick alerts.",
                Set.of(), event("performance-alert", "protection.slow_tick", Map.of(
                        "threshold", "100", "consecutive", "5", "cooldownSeconds", "60")),
                List.of(), List.of(action("performance-alert", "broadcast", "broadcast", Map.of(
                        "message", literal("performance-alert/message", "string",
                                "Server performance warning: sustained slow ticks."))))));
        return List.copyOf(values);
    }

    private static Template template(String id, String name, String description, Set<String> integrations,
                                     TriggerProgramV2.EventBinding event,
                                     List<TriggerProgramV2.VariableDeclaration> declarations,
                                     List<TriggerProgramV2.Statement> statements) {
        return new Template(id, name, description, integrations, new TriggerProgramV2(2,
                List.of(event), declarations, List.of(), statements));
    }

    private static TriggerProgramV2.EventBinding event(String owner, String type, Map<String, String> config) {
        return new TriggerProgramV2.EventBinding(id(owner + "/event"), type, config);
    }

    private static TriggerProgramV2.VariableDeclaration variable(
            String owner, String name, String type, Object initial, String visibility, String storage,
            TriggerProgramV2.Lifetime lifetime, Long ttl) {
        return new TriggerProgramV2.VariableDeclaration(id(owner + "/variable/" + name), name, type,
                literal(owner + "/variable/" + name + "/initial", type, initial),
                visibility, storage, lifetime, ttl);
    }

    private static TriggerProgramV2.Statement action(
            String owner, String name, String type, Map<String, TriggerExpression> inputs) {
        return new TriggerProgramV2.Statement(id(owner + "/action/" + name),
                TriggerProgramV2.StatementKind.ACTION, type, inputs, null, List.of(), List.of(), List.of());
    }

    private static TriggerProgramV2.Statement set(
            String owner, String name, String variable, TriggerExpression value) {
        return new TriggerProgramV2.Statement(id(owner + "/set/" + name),
                TriggerProgramV2.StatementKind.SET, variable, Map.of(), value,
                List.of(), List.of(), List.of());
    }

    private static TriggerExpression literal(String path, String type, Object value) {
        return new TriggerExpression(id(path), TriggerExpression.Kind.LITERAL, type, value, "", List.of());
    }

    private static TriggerExpression reference(String path, String type, String name) {
        return new TriggerExpression(id(path), TriggerExpression.Kind.REFERENCE, type, null, name, List.of());
    }

    private static TriggerExpression binary(
            String path, String type, String operator, TriggerExpression left, TriggerExpression right) {
        return new TriggerExpression(id(path), TriggerExpression.Kind.BINARY, type, null,
                operator, List.of(left, right));
    }

    private static UUID id(String path) {
        return UUID.nameUUIDFromBytes(("xfesm-template:" + path).getBytes(StandardCharsets.UTF_8));
    }
}