Autores de modpacks
6 TOP-LEVEL ITEMSCrear generadores personalizados del Asistente de recetas
Personalizar el Asistente de recetas consiste, en esencia, en añadir nuevas reglas que respondan a esta pregunta: “cuando el jugador hace clic derecho sobre este bloque objetivo, ¿cómo debe generarse un archivo a partir del contexto actual del mundo?”
Es muy parecido al Sistema de generación de datos en tiempo de ejecución:
- la coincidencia del bloque objetivo actúa como “cuándo se activa”
pathdecide dónde se escribe el archivo generadotemplatedecide qué aspecto tiene el contenido del archivo- los placeholders extraen valores del contexto del clic actual
La diferencia principal frente a un generador de datos normal es que aquí la entrada no es un conjunto de entradas estático, sino el UseOnContext del clic derecho actual del jugador.
Ubicación
Los archivos de generadores del Asistente de recetas se guardan en:
<filePath>/recipe_wizard/generatorsAquí, filePath es la raíz de archivos personalizados definida en Configuración y comandos.
Esta ruta está fijada directamente en el código fuente. Ten en cuenta que el nombre del directorio es generators, no generator.
Cuando el Asistente de recetas lee este directorio por primera vez, también exporta allí plantillas integradas como punto de partida editable.
Formatos de archivo
RecipeWizardGenerator.read(...) termina leyendo los archivos mediante DgReader, así que admite los mismos formatos que los generadores normales:
tomljsoncdg
Las plantillas integradas usan actualmente toml, y ese también es el formato más adecuado para escribir a mano.
Ejemplo mínimo:
block = "croparia:infusor"
path = "example/infusor_${datetime}.json"
extensions = "croparia:infusor"
template = """
{
"type": "croparia:infusor",
"element": "${infusor_element}",
"ingredient": ${item._qis},
"result": ${off_hand._qis}
}
"""Lista completa de campos
Los campos de RecipeWizardGenerator proceden del CODEC del código fuente:
enabled: booleandependencies: Dependenciesblock: BlockInputpath: Templateextensions: ResourceLocation | ResourceLocation[]template: Template
Las secciones siguientes los explican uno por uno.
enabled
- Tipo:
boolean - Opcional; por defecto es
true
Controla si este generador del Asistente de recetas está habilitado. Si se desactiva, el archivo sigue leyéndose, pero no entra en la lista de plantillas disponibles.
dependencies
- Tipo: objeto de dependencias
- Opcional; por defecto está vacío
Se comporta igual que las comprobaciones de dependencias en otras partes de la documentación: el archivo del generador solo se carga cuando sus dependencias están satisfechas.
Si las dependencias no se cumplen, el código fuente omite el archivo directamente en lugar de mostrar un error y seguir usándolo.
block
- Tipo: BlockInput
- Obligatorio
Determina sobre qué bloques objetivo funciona este generador.
El generador solo se activa cuando el estado del bloque sobre el que el jugador hace clic derecho coincide con block.
Ejemplo:
block = "croparia:infusor"
block = "#croparia:ritual_stands"path
- Tipo:
Template - Obligatorio
Ruta relativa de salida bajo el directorio de exportación recipeWizard.
Por ejemplo:
path = "croparia/ritual_${datetime}.json"Si el directorio recipeWizard configurado es D:/packs/croparia/recipe_wizard/output, el resultado final será:
D:/packs/croparia/recipe_wizard/output/croparia/ritual_2026-04-06_12.30.00.jsonpath es en sí misma una plantilla, así que puede usar cualquiera de los placeholders presentados más abajo en esta página.
extensions
- Tipo:
stringostring[] - Opcional; por defecto es una lista vacía
No son textos normales, sino IDs de grupos de placeholders de extensión. El código fuente registra actualmente:
croparia:infusorcroparia:ritualcroparia:soakminecraft:furnace
El grupo default siempre está habilitado automáticamente y no hace falta escribirlo a mano.
Si quieres usar placeholders proporcionados por uno de estos grupos, debes incluirlo en extensions. Por ejemplo:
extensions = "croparia:ritual"o:
extensions = [
"croparia:ritual",
"minecraft:furnace"
]template
- Tipo:
Template - Obligatorio
Es el contenido final del archivo que se va a escribir, normalmente una plantilla JSON.
Sus placeholders se resuelven en el momento del clic y el resultado se escribe después en disco.
Ejemplo:
template = """
{
"type": "croparia:soak",
"element": "${soak_element}",
"input": ${neighbor._qis},
"output": ${below._qis},
"probability": 1.0
}
"""La sintaxis de la plantilla en sí coincide con la de Analizadores de placeholders.
Placeholders por defecto
Independientemente de si escribes algo en extensions, el grupo de placeholders default siempre está habilitado.
Todos estos placeholders proceden del UseOnContext del clic.
${datetime}- marca temporal actual, con formato
yyyy-MM-dd_HH.mm.ss
- marca temporal actual, con formato
${main_hand}- objeto de la mano principal, con un tipo equivalente a
ItemOutput
- objeto de la mano principal, con un tipo equivalente a
${off_hand}- objeto de la mano secundaria, con un tipo equivalente a
ItemOutput
- objeto de la mano secundaria, con un tipo equivalente a
${item}- objeto dropeado en la posición clicada, con un tipo equivalente a
ItemOutput
- objeto dropeado en la posición clicada, con un tipo equivalente a
${block}- bloque actualmente clicado, con un tipo equivalente a
BlockOutput
- bloque actualmente clicado, con un tipo equivalente a
${neighbor}- cualquier bloque vecino que no sea aire, con un tipo equivalente a
BlockOutput
- cualquier bloque vecino que no sea aire, con un tipo equivalente a
${below}- bloque situado debajo, con un tipo equivalente a
BlockOutput
- bloque situado debajo, con un tipo equivalente a
Además, block tiene varias subrutas habituales:
${block.facing}: el bloque situado delante de la cara clicada${block.opposite}: el bloque situado detrás de la cara clicada${block.left}: el bloque al lado horario de la cara clicada${block.right}: el bloque al lado antihorario de la cara clicada${block.offset(x,y,z)}: un bloque desplazado respecto a la posición clicada
La mayoría de estos valores son tipos estructurados, así que en la práctica suelen usarse con _qis, igual que en las plantillas integradas:
${item._qis}
${block._qis}
${neighbor._qis}Si falta el contexto requerido, por ejemplo si no hay objeto en la mano principal o no hay un objeto dropeado en la posición de destino, el código fuente muestra directamente un aviso superpuesto y cancela la generación.
Placeholders de extensión
extensions decide qué placeholders extra de dominio específico se habilitan.
croparia:infusor
${infusor_element}
Requiere que el objetivo clicado sea un Infusor ya infundido. Si el elemento está vacío, se mostrará al jugador un aviso para que infunda primero el Infusor.
croparia:ritual
${ritual_input}
Requiere que el objetivo clicado sea un Atril ritual, y que la estructura actual identifique correctamente las posiciones de bloques de entrada. Este placeholder devuelve el bloque de entrada ubicado en las posiciones $ de la estructura ritual.
croparia:soak
${soak_element}
Requiere que el objetivo clicado sea una Piedra elemental con un Infusor infundido encima. El valor devuelto es el nombre del elemento usado en el remojo actual.
minecraft:furnace
${furnace_input}${furnace_time}
Este grupo está pensado para bloques del tipo horno:
furnace_inputlee el objeto de la ranura de entradafurnace_timelee el tiempo total de combustión del combustible actual
Si el objetivo no es un horno, o si la ranura de entrada o la de combustible están vacías, el objeto también mostrará un aviso y cancelará la generación.
Ejemplos de plantillas integradas
Las plantillas integradas de 1.1.0a incluyen tres archivos, que además reflejan los patrones de escritura más típicos.
Receta de Infusor
path = "croparia/infusor_${datetime}.json"
extensions = "croparia:infusor"
block = "croparia:infusor"
template = """
{
"type": "croparia:infusor",
"element": "${infusor_element}",
"ingredient": ${item._qis},
"result": ${off_hand._qis}
}
"""Receta ritual
path = "croparia/ritual_${datetime}.json"
extensions = "croparia:ritual"
block = "#croparia:ritual_stands"
template = """
{
"type": "croparia:ritual",
"ritual": ${block._qis},
"ingredient": ${item._qis},
"block": ${ritual_input._qis},
"result": ${off_hand._qis}
}
"""Receta de remojo
path = "croparia/soak_${datetime}.json"
extensions = "croparia:soak"
block = "croparia:elemental_stone"
template = """
{
"type": "croparia:soak",
"element": "${soak_element}",
"input": ${neighbor._qis},
"output": ${below._qis},
"probability": 1.0
}
"""Aquí conviene fijarse sobre todo en dos detalles:
blockdecide “cuándo se activa”, no qué bloque de entrada aparecerá en el resultado generado- al escribir JSON, los valores estructurados como
ItemOutputoBlockOutputsuelen necesitar_qispara convertirse en texto que pueda incrustarse directamente en el JSON
Recomendaciones
- La primera vez que personalices uno, copiar y modificar una plantilla integrada es más fiable que empezar desde cero.
- Conviene que
pathincluya${datetime}para que varios clics seguidos no sobrescriban archivos anteriores. - Si una plantilla depende de varios contextos especiales, asegúrate de que todos los grupos correspondientes estén listados en
extensions. - La coincidencia del bloque objetivo depende solo de
block, no de los placeholders que aparezcan dentro de la plantilla. - El contenido generado normalmente sigue siendo un archivo JSON de receta, así que después de generarlo puedes seguir validando sus campos con Recetas y estructuras.