xFoods Core
Comidas con mordiscos múltiples, caducidad en tiempo real, nutrición y máquinas de cocina con recetas de varios ingredientes y minijuego de precisión.
Introducción
xFoods convierte la comida en una cadena de producción. Cada comida es un fichero YAML con su nombre, material, saciedad, nutrición, efectos y caducidad. Las máquinas son bloques que registras en el mundo y que transforman unos ítems en otros siguiendo recetas de varios ingredientes.
Lo que lo separa de un plugin de ítems personalizados normal es que la comida se estropea con el tiempo real, que las recetas pueden exigir un minijuego de precisión, y que el sistema está pensado para que cada ítem tenga una forma de conseguirse y un sitio donde gastarse.
Información
xFoods funciona solo. xCrops es un addon opcional que añade el cultivo de los ingredientes y el mercado, y necesita xFoods instalado.
Instalación
- Requiere xLib, que debe cargarse antes (la 'x' inicial garantiza el orden alfabético).
- Paper 1.21 o superior. Java 21.
- Coloca xLib.jar y xFoods.jar en /plugins/ y reinicia.
- En el primer arranque se extraen las comidas, máquinas e idiomas por defecto. Nunca se sobrescribe lo que ya exista.
Dependencias opcionales
- ItemsAdder — para modelos y texturas propias. Sin él, las comidas usan su material de respaldo.
- WorldGuard — se respeta automáticamente: las máquinas no responden donde el jugador no puede construir.
Comandos y permisos
| Comando | Permiso | Descripción |
|---|---|---|
| /xfoods recipes | xfoods.use | Recetario: máquinas y sus recetas. Para jugadores. |
| /xfoods menu | xfoods.admin | Editor visual de comidas dentro del juego. |
| /xfoods give <id> [cantidad] | xfoods.admin | Entrega una comida personalizada. |
| /xfoods give item <id> | xfoods.admin | Entrega un ítem 100% en YAML (papeles de receta y similares, ver items/*.yml). |
| /xfoods machine create <tipo> | xfoods.admin | Convierte el bloque que miras en una máquina. |
| /xfoods machine remove | xfoods.admin | Quita la máquina y te devuelve su contenido. |
| /xfoods reload | xfoods.admin | Recarga comidas, máquinas, ítems e idiomas. |
El alias /foods hace lo mismo que /xfoods. El permiso xfoods.admin incluye xfoods.use, así que a un administrador le basta con el primero.
Atención
Las máquinas de cocina no son ítems que se coloquen: se registran sobre un bloque ya existente con /xfoods machine create. Los maceteros y las máquinas de automatización de xCrops sí son ítems.
Consejo
xfoods.use viene activado por defecto para todos. Si no quieres que los jugadores abran el recetario, quítaselo explícitamente en LuckPerms.
Configuración YAML
Un fichero por comida dentro de foods/. Puedes usar subcarpetas para organizarte: el plugin las recorre todas.
Importante
El id de la comida es el nombre del fichero SIN la carpeta y sin la extensión. foods/consumibles/hamburguesa.yml tiene el id 'hamburguesa', no 'consumibles/hamburguesa'. Es el id que usan las recetas y el que necesita ItemsAdder, que no admite barras.
# foods/hamburguesa.yml — el id es el nombre del fichero
display-name: "Hamburguesa Premium"
lore:
- "&7Con queso, lechuga y tomate."
item:
material: BREAD
custom-model-data: 101
itemsadder-id: "" # opcional, tiene prioridad sobre material
max-stack: 16
stats:
food-level: 10
saturation: 5.0
bites: 4 # mordiscos por unidad
consumable: true # false = ingrediente, no se puede comer
consumption-ticks: 20
expiry-minutes: 60 # 0 = no caduca nunca
expired-id: "hamburguesa_podrida"
nutrition:
proteins: 20
carbs: 15
sugars: 3
vitamins: 5
effects:
sound: ENTITY_GENERIC_EAT
particle: HAPPY_VILLAGER # ojo: NO VILLAGER_HAPPY, se renombró en 1.20.5
potion:
high-duration: 30 # segundos hasta el bajón (0 = sin bajón)
on-eat:
- { type: SPEED, amplifier: 0, duration: 20 } # duration en SEGUNDOS
on-crash:
- { type: SLOWNESS, amplifier: 0, duration: 10 }
leftovers:
material: AIR # lo que queda al terminarlaAtención
consumable: false es obligatorio en los ingredientes (carne cruda, queso, lechuga...). Si se deja en true, el jugador se los come de un click en vez de usarlos en una máquina.
Un fichero = una comida. No se admiten varios documentos YAML separados por --- en el mismo fichero. Los ids de las recetas y de las cosechas admiten el prefijo xfoods: o van sin él, indistintamente.
Consejo
Si prefieres no escribir YAML, /xfoods menu abre un editor dentro del juego que genera el fichero por ti. Para configuraciones grandes está el Studio del portal.
Mordiscos y nutrición
Una comida con varios bites no desaparece al primer uso: los mordiscos restantes se guardan en el NBT de ese ítem concreto y se avisa al jugador de cuántos le quedan. Al agotarlos aparece lo que hayas puesto en leftovers (un cuenco vacío, una botella, o AIR si no queda nada).
Las cuatro estadísticas nutricionales (proteínas, carbohidratos, azúcares y vitaminas) se guardan por comida y las lee el módulo RPX Health si lo tienes instalado. Sin él quedan como información y no afectan al juego.
Caducidad y nevera
Una comida con expiry-minutes lleva grabada la hora en que se creó. Al cumplirse ese tiempo se convierte en expired-id, esté donde esté: en el inventario, en un cofre o en el suelo. El reloj corre también con el servidor apagado, porque se compara con la hora real y no con ticks jugados.
La nevera es un tipo de máquina que congela ese reloj. Lo que metes dentro deja de caducar y vuelve a hacerlo en cuanto lo sacas.
Atención
Si una comida caduca en un id que no existe ni como comida de xFoods ni como Material de Minecraft, se entrega ROTTEN_FLESH y se avisa por consola.
Máquinas y recetas
Una máquina son dos cosas separadas: el tipo, que es un fichero en machines/ con sus recetas, y la máquina colocada, que es un bloque concreto del mundo que registras apuntando a ese tipo.
- Coloca el bloque que quieras usar (un horno, un barril, lo que sea).
- Míralo y ejecuta /xfoods machine create <tipo>.
- Click derecho mete ingredientes; agacharse y click derecho los recupera.
# machines/plancha_hamburguesas.yml
display-name: "&6&lPlancha de Hamburguesas"
recipes:
cocinar_cerdo:
inputs:
carne: { id: "xfoods:carne_cerdo_cruda", amount: 1 }
output: { id: "xfoods:carne_cerdo_cocinada", amount: 1 }
time: 200 # en TICKS: 200 = 10 s
use-minigame: true
burnt-id: "xfoods:carne_quemada"
sounds:
start: "BLOCK_FIRE_AMBIENT"
finish: "ENTITY_PLAYER_BURP"
required-permission: "xfoods.recipe.cachopo" # opcional, ver la sección "Recetas bloqueadas"Importante
La sección se llama 'inputs' en plural, aunque la receta tenga un solo ingrediente. Con 'input:' en singular la receta se ignora y se avisa por consola: sin ingredientes nunca se podría cocinar.
El minijuego
Con use-minigame activado aparece una barra que se mueve y hay que pulsar cuando esté en verde. Si se falla o se agota el tiempo sale el burnt-id en lugar del resultado. Solo se puede intentar una vez por cocinado.
Consejo
Define siempre burnt-id en las recetas con minijuego. Sin él, fallar no cuesta nada y el minijuego deja de tener sentido.
Recetas bloqueadas
Cualquier receta de máquina puede exigir un permiso con required-permission (vacío u omitido = abierta para todos). La forma normal de dárselo a un jugador es un "papel de receta": un ítem 100% en YAML (items/*.yml) cuya acción de click derecho es grant-permission, que se lo da vía LuckPerms.
# items/receta_cachopo.yml
display-name: "&e&lReceta: Cachopo"
material: PAPER
lore:
- "&7Clic derecho para aprender la receta."
actions:
right-click-air:
- grant-permission: "xfoods.recipe.cachopo"
- commands:
- "console: tell %player% Has desbloqueado la receta del Cachopo."Entrega el papel con /xfoods give item receta_cachopo. grant-permission es un paso genérico del framework de acciones de xLib (org.aifusp.dev.xLib.actions), no algo propio de xFoods: cualquier ítem de cualquier plugin puede usarlo.
Consejo
grant-permission solo da el permiso, no manda ningún mensaje ni consume el papel — para el aviso al jugador añade un paso de commands justo después, como en el ejemplo.
Atención
Requiere LuckPerms instalado. Sin él, grant-permission no hace nada (se ignora en silencio) y ninguna receta con required-permission llegará a desbloquearse.
Idiomas
Todos los mensajes al jugador salen de lang/<código>.yml. Vienen incluidos inglés (por defecto) y español.
# config.yml
language: en # 'es' para españolPara traducir a otro idioma, copia lang/en.yml con otro nombre (por ejemplo lang/fr.yml) y pon ese código. Si borras una clave de tu fichero se usa la de en.yml, así que puedes dejar solo las líneas que quieras cambiar, y una actualización que añada mensajes nuevos no rompe tu traducción.
Los textos admiten códigos & (&a, &c, &l) y también MiniMessage (<gray>, <gradient:red:gold>). Lo que va entre llaves son marcadores que rellena el plugin: puedes moverlos de sitio, pero si borras uno se pierde ese dato.
Información
Los mensajes de consola están siempre en inglés y no se traducen: es donde se diagnostican los problemas, y no conviene que un fallo de traducción oculte un aviso.
Consejo
/xfoods reload recarga también los idiomas, así que cambiar 'language' no exige reiniciar el servidor.
Drops de mobs
Las recetas piden los ingredientes por id de xFoods, y un ítem de vanilla no lleva ese id: una chuleta normal nunca encajaría como ingrediente. Por eso xFoods puede sustituir los drops de vanilla por sus equivalentes personalizados.
# config.yml
mob-drops:
enabled: true
reemplazos:
PIG:
PORKCHOP: "carne_cerdo_cruda"
COW:
BEEF: "carne_vaca_cruda"Integración con ItemsAdder
Cualquier comida, semilla o máquina puede apuntar a un ítem de ItemsAdder con itemsadder-id. Cuando ItemsAdder está activo y el id existe, manda su modelo; si no, se usa el material configurado y se avisa por consola una sola vez.
- Los assets se extraen a plugins/ItemsAdder/, que es la única carpeta que ese plugin lee.
- Después de añadir contenido hay que ejecutar /iazip y luego /ia reload.
- Hasta que no lo hagas, las comidas se ven con su material de respaldo.
Contenido incluido
El plugin viene con una cadena de producción cerrada para que se entienda cómo encaja todo. Es todo editable o borrable.
5 máquinas de cocina
- Plancha de Hamburguesas — cuece la carne cruda de cerdo y de vaca. Con minijuego.
- Quesera Artesanal — cubo de leche en queso, 30 s.
- Destilador de Agua — cubo de agua en Esencia de Agua, que es lo que consume la regadera de xCrops.
- Cafetera Todo en Uno — muele 3 semillas de café y prepara las dos bebidas. La molienda y el Café Solo llevan minijuego.
- Mesa de Ensamblado — monta las dos hamburguesas a partir de sus 4 ingredientes.
17 comidas
Tres crudos, cinco procesados, dos hamburguesas, dos cafés, la esencia de agua y los desechos de fallar los minijuegos. Cada ingrediente tiene una forma de conseguirse y una receta que lo consume: el ciclo cierra sin cabos sueltos.
Los dos cafés
Parten del mismo café molido y están pensados como una elección, no como una escalera. Es el ejemplo de referencia de lo que se puede montar con el sistema de efectos en dos fases.
- Café Solo — 1 molido, con minijuego. Un solo trago: Rapidez II y Prisa II durante 45 s, y después un bajón de Lentitud y Fatiga. Fallar el minijuego lo convierte en café quemado.
- Café Americano — 1 molido + 1 Esencia de Agua, sin minijuego, y salen 2 tazas. Rapidez I durante 120 s y sin bajón.
El Solo pide puntería y puede salir quemado, pero da el efecto fuerte. El Americano gasta una Esencia de Agua de más y a cambio no tiene riesgo y saca el doble de unidades. En el mercado ambas rutas dejan un margen parecido, así que ninguna gana sola.
Consejo
El Café Solo es el único contenido por defecto que usa effects.potion.high-duration y on-crash. Cópialo si quieres una comida con subidón y bajón.
Atención
Las dos hamburguesas vienen con expiry-minutes: 3, que es un valor de prueba para ver la caducidad funcionando. Súbelo a 60 o más antes de abrir el servidor a jugadores.
Problemas frecuentes
La comida no se puede comer
Comprueba que stats.consumable esté a true y que el material exista como ítem. Un material que solo existe como bloque no se puede sostener ni comer.
La máquina no responde al click derecho
Si estás en una región de WorldGuard donde no puedes construir, la máquina no responde a propósito. Fuera de eso, revisa que el bloque siga registrado: al romperlo se pierde el registro.
La receta no se dispara
Los ingredientes deben coincidir en id y cantidad exactas. Si metes de más, la máquina avisa y hay que agacharse y hacer click derecho para recuperarlos. Revisa también que la sección se llame 'inputs' en plural.
Sale un ítem genérico en vez del mío
Cuando una receta produce un id que no es ni comida de xFoods ni Material válido se entrega COAL como sustituto y se avisa por consola. Casi siempre es una errata en output.id.
No se ven las partículas
Comprueba el nombre de la partícula: varios se renombraron en 1.20.5. HAPPY_VILLAGER es correcto, VILLAGER_HAPPY ya no existe. Un nombre inválido se ignora y se avisa por consola una sola vez.
Consejo
Casi todos estos casos dejan un aviso claro en la consola al arrancar o al recargar. Mira el log antes de nada.