К концу руководства — рабочий мод, который:
- подключается к платформе по BOM;
- реализует
VidaModс подпиской наLatidoPulso; - регистрирует пример блока через
RegistroBloques; - читает настройку из
Ajustesтипизированно.
Нужно: dev-окружение (JDK 21, Gradle).
Опора — templates/starter-mod: скопируйте каталог, задайте vida.platform.version / vida.plugin.version в gradle.properties (как в шаблоне) и при необходимости переименуйте id мода, пакет и класс entrypoint.
Альтернатива: свой Gradle-проект с плагином id("dev.vida.mod") — см. dev-environment, вариант B и modder-toolkit.
src/main/java/com/ejemplo/miaventura/MiAventura.java:
package com.ejemplo.miaventura;
import dev.vida.base.ModContext;
import dev.vida.base.VidaMod;
import dev.vida.base.latidos.Prioridad;
import dev.vida.base.latidos.eventos.LatidoPulso;
public final class MiAventura implements VidaMod {
@Override
public void iniciar(ModContext ctx) {
ctx.log().info("¡Hola, {} v{}!", ctx.metadata().nombre(), ctx.version());
ctx.latidos().suscribir(LatidoPulso.TIPO, Prioridad.NORMAL, pulso -> {
if (pulso.tickActual() % 20L == 0L) {
ctx.log().debug("tick de un segundo: {}", pulso.tickActual());
}
});
}
}VidaMod.iniciar вызывается один раз после загрузки классов мода. Подписки на Latidos и регистрация в Catalogo — обычно здесь. См. VidaMod.
Плагин dev.vida.mod генерирует vida.mod.json в ресурсы; при injectDefaultVidaDependency в зависимости подставляется vida (диапазон — см. modder-toolkit). Пример vida { mod { ... } } (идентично идее шаблона):
vida {
injectDefaultVidaDependency.set(true)
mod {
id.set("miaventura")
displayName.set("Mi Aventura")
description.set("Ejemplo")
authors.add("Ana")
license.set("Apache-2.0")
entrypoint.set("com.ejemplo.miaventura.MiAventura")
}
}./gradlew vidaGenerateManifest vidaValidateManifest buildИтоговый фрагмент (точные поля зависят от версии плагина — детали в схеме vida.mod.json):
{
"schema": 1,
"id": "miaventura",
"version": "0.1.0",
"name": "Mi Aventura",
"authors": [{ "name": "Ana" }],
"entrypoints": { "main": "com.ejemplo.miaventura.MiAventura" },
"dependencies": {
"required": { "vida": "^1.0.0" }
},
"vifada": { "morphs": [] }
}Реестр блоков — RegistroBloques поверх Catalogo, не сырой Catalogo без обёртки.
import dev.vida.bloque.Bloque;
import dev.vida.bloque.MaterialBloque;
import dev.vida.bloque.PropiedadesBloque;
import dev.vida.bloque.registro.RegistroBloques;
import dev.vida.core.Identifier;
// dentro de iniciar:
RegistroBloques registro = RegistroBloques.conectar(ctx.catalogos(), "miaventura");
Bloque roca = new Bloque(
Identifier.of("miaventura", "piedra_santa"),
PropiedadesBloque.con(MaterialBloque.PIEDRA).dureza(2.0f).construir());
registro.registrarOExigir(roca);В build.gradle.kts к зависимостям добавьте (через тот же BOM, что и base):
compileOnly("dev.vida:bloque")import dev.vida.base.ajustes.Ajuste;
int distancia = ctx.ajustes().valor(
Ajuste.entero("render.distance", 32).min(2).max(64)
);run/config/miaventura.toml (путь к профилю может отличаться в зависимости от лаунчера):
[render]
distance = 48Подробнее: guides/ajustes.md.
./gradlew vidaRunvidaRun — задача плагина: клиент/агент и mods настраиваются в DSL (см. gradle-plugin). В логе должна появиться строка инициализации мода.
- Latidos — приоритеты,
Ejecutor, аннотации. - Catalogo —
CatalogoClave, freeze. - Ajustes — профили, синхронизация.
- Vifada — Vifada-морфы.
- API stability —
@Stable/@Preview/@Internal.
Шаблон с исходниками: templates/starter-mod.