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