Volver al índice
src/main/java/ar/com/companeros/runtime/BuiltinTools.java
package ar.com.companeros.runtime;
import ar.com.companeros.tools.*;
import com.google.gson.*;
import java.util.*;
/** Capacidades mecánicas del mod. Las recetas de planes futuros se proponen y prueban por separado. */
public final class BuiltinTools {
private static final UUID AUTHOR = new UUID(0, 1);
private BuiltinTools() { }
public static void install(ToolRegistry registry) {
add(registry, "move_to", ToolPermission.MOVE, "Caminar por terreno visible seguro. Entradas x,y,z.", 2400, "x", "y", "z");
add(registry, "mine_block", ToolPermission.MINE, "Romper un bloque al alcance con herramienta real. Entradas x,y,z.", 1200, "x", "y", "z");
add(registry, "place_block", ToolPermission.PLACE, "Colocar bloque desde inventario. Entradas x,y,z,item.", 40, "x", "y", "z", "item");
add(registry, "craft", ToolPermission.CRAFT, "Fabricar receta de crafting disponible, mesa próxima si hace falta. Entradas item,count.", 200, "item", "count");
add(registry, "eat", ToolPermission.EAT, "Consumir comida disponible cuando hay hambre.", 200);
add(registry, "attack", ToolPermission.COMBAT, "Atacar entidad visible a menos de tres bloques. Entrada target UUID.", 200, "target");
add(registry, "collect", ToolPermission.INVENTORY, "Recoger drops realmente cercanos. Entrada radius (máximo 1 para recogida física).", 40, "radius");
add(registry, "store", ToolPermission.INVENTORY, "Depositar en contenedor accesible. Entradas x,y,z,item,count.", 40, "x", "y", "z", "item", "count");
add(registry, "inspect", ToolPermission.WORLD_READ, "Volver a observar el entorno cargado y visible.", 40);
add(registry, "research_recipe", ToolPermission.WORLD_READ, "Consultar recetas reales del modpack para un item. No fabrica; máquinas y requisitos pueden necesitar verificación. Entrada item.", 40, "item");
add(registry, "research_web", ToolPermission.WORLD_READ, "Proponer consulta sobre un mod instalado, Minecraft 1.20.1 y su versión. Luna buscará si el operador habilitó web y hay presupuesto. Entrada query.", 40, "query");
add(registry, "choose_skin", ToolPermission.WORLD_READ, "Elegir skin propia de una cuenta Minecraft encontrada por nombre o UUID. Entrada profile; default restaura la apariencia vanilla por UUID. Sólo Mojang, un cambio por minuto, conserva tu identidad.", 600, "profile");
add(registry, "parasite_upgrade_propose", ToolPermission.WORLD_READ, "Proponer adaptación voluntaria. Entradas capacity,goal. capacity=HEALTH,SPEED,DAMAGE,PERCEPTION o effect:namespace:id o attribute:namespace:id registrado (consultá catalog). Ejemplo effect:minecraft:fire_resistance contra lava. Tasador Luna cotiza materiales, no aplica efectos.", 40, "capacity", "goal");
add(registry, "parasite_upgrade_status", ToolPermission.WORLD_READ, "Consultar cotización, niveles y resultados reales de combate del huésped. No implica alianza.", 40);
add(registry, "parasite_appearance_catalog", ToolPermission.WORLD_READ, "Consultar prefabs articulados y ranuras para cambiar el aspecto del huésped.", 40);
add(registry, "parasite_appearance", ToolPermission.PARASITE_UPGRADE, "Montar un prefab previamente FABRICADO mediante visual:iron|diamond|copper|obsidian y materiales reales. Args prefab=iron|diamond|copper|obsidian|none,slot=chest|arms|legs. Permite combinarlos; a6bloques del cuerpo, no otorga atributos gratis.", 40, "prefab", "slot");
add(registry, "parasite_upgrade_catalog", ToolPermission.WORLD_READ, "Buscar efectos y atributos realmente registrados en Minecraft/mods. Entrada query:fragmentoID,ejemplo fire_resistance,armor,water,regeneration. Elegí adaptación útil según experiencias; no presupongas ID existente.", 40, "query");
add(registry, "parasite_upgrade_apply", ToolPermission.PARASITE_UPGRADE, "Montar una mejora ya cotizada por el equipo. Entrada quote(UUID consultado con status). A6bloques del huésped, paga TODOS los materiales de TU inventario. Sin materiales no hay mejora. Nivel máximo3 por capacidad.", 40, "quote");
add(registry, "propose_tool", ToolPermission.WORLD_READ, "Crear composición reusable. Entrada manifest: JSON schema1,id,version,description,permissions,dependencies,limits(maxTicks<=600,maxSteps<=16),steps(primitive,args,timeoutTicks). Prueba propia con recursos reales; se comparte tras 3 éxitos. Sólo primitivas del catálogo, sin propose_tool/research_web.", 40, "manifest");
add(registry, "suggest_change", ToolPermission.SUGGESTION_WRITE, "Dejar un pedido para los desarrolladores en Suggestions. manifest=JSON con title,kind(capability|event|mod),description,language(none|java|json|python),source opcional,dependencies opcionales. Máximo4096bytes,un pedido/5min,16por autor. El servidor registra autor y contexto. Los borradores NO se ejecutan ni instalan; pedí revisión cuando falte una capacidad.", 40, "manifest");
add(registry, "sneak", ToolPermission.MOVE, "Agacharse o incorporarse como un jugador real. Entrada enabled(boolean). Componelo con move_to para esconderte en una posición que hayas observado segura; seguís siendo vulnerable, sin invisibilidad ni teletransporte.", 40, "enabled");
add(registry, "create_banner", ToolPermission.CRAFT, "Crear estandarte con6 lanas,1 palo,tintes,mesa y telar cercanos. Entradas baseColor,circleColor,symbol,symbolColor. Colores DyeColor. Símbolos:none,stripe_center,stripe_middle,stripe_downright,stripe_downleft,cross,straight_cross,triangle_bottom,triangle_top,rhombus_middle,border. Consume recursos.", 40, "baseColor", "circleColor", "symbol", "symbolColor");
add(registry, "place_banner", ToolPermission.PLACE, "Colocar estandarte propio del inventario en posición cercana con apoyo. Entradas x,y,z. Respeta protecciones.", 40, "x", "y", "z");
add(registry, "message_internal", ToolPermission.INTERNAL_CHAT, "Enviar informe privado. Entradas recipient (nombre, UUID o all),text.", 40, "recipient", "text");
add(registry, "message_global", ToolPermission.GLOBAL_CHAT, "Hablar en chat público, sin comandos. Entrada text.", 40, "text");
}
private static void add(ToolRegistry registry, String id, ToolPermission permission, String description, int ticks, String... arguments) {
JsonObject root = new JsonObject(); root.addProperty("schema", 1); root.addProperty("id", id); root.addProperty("version", 1); root.addProperty("description", description);
JsonArray permissions = new JsonArray(); permissions.add(permission.name()); root.add("permissions", permissions);
JsonObject limits = new JsonObject(); limits.addProperty("maxSteps", 1); limits.addProperty("maxTicks", ticks); root.add("limits", limits);
JsonObject step = new JsonObject(); step.addProperty("primitive", id); step.addProperty("timeoutTicks", ticks);
JsonObject args = new JsonObject();
for (String name : arguments) { JsonObject reference = new JsonObject(); reference.addProperty("input", name); args.add(name, reference); }
step.add("args", args); JsonArray steps = new JsonArray(); steps.add(step); root.add("steps", steps);
registry.registerCertified(ToolManifest.parse(root.toString(), AUTHOR));
}
}