WENOPAL

Ítems y recetas en mods de Project Zomboid B42

Comida, bebidas, armas, modelos 3D, recetas de crafteo y reparación, con ejemplos sacados de mods publicados.

Nivel intermedio · Actualizada el

Todo lo "declarativo" de un mod (lo que no es código) va en archivos .txt dentro de media/scripts/. Siempre con la misma forma:

text
module MiModulo
{
    imports { Base, }

    item ...        { ... }
    model ...       { ... }
    craftRecipe ... { ... }
    fixing ...      { ... }
}

Puedes repartirlo en varios archivos (items/, models/, recipes/) mientras todos usen el mismo module.

Comida

Ejemplo real: la vienesa de Completos Chilenos.

text
item Vienesa
{
    DisplayCategory = Food,
    ItemType = base:food,
    Icon = Vienesa,
    FoodType = Meat,
    Weight = 0.1,
    DaysFresh = 5,
    DaysTotallyRotten = 9,
    HungerChange = -8,
    Calories = 150,
    Carbohydrates = 2,
    Lipids = 13,
    Proteins = 6,
    IsCookable = true,
    GoodHot = true,
    MinutesToCook = 10,
    MinutesToBurn = 30,
    CookingSound = FryingFood,
    EvolvedRecipe = Pizza:8;Stew:8;Pie:8;Stir fry:8;Pasta:8;Rice:8,
}
  • IsCookable, MinutesToCook y MinutesToBurn la hacen cocinable, y se quema si la dejas mucho rato.
  • GoodHot = true: da más ánimo si se come caliente.
  • EvolvedRecipe permite usarla como ingrediente en las recetas "evolutivas" del juego (pizza, guiso...). El número es cuánto aporta.

Bebidas y "lo que queda después"

Melón con Vino es un trago que, al terminarlo, deja la cáscara:

text
item MelonConVino
{
    ItemType = base:food,
    Tags = base:alcoholicbeverage,
    ThirstChange = -40,
    Alcoholic = TRUE,
    AlcoholPower = 0.3,
    EatType = Candrink,
    CustomContextMenu = Drink,
    CustomEatSound = DrinkingFromCan,
    ReplaceOnUse = Melvin42.MelonCascara,
    ...
}
  • CustomContextMenu = Drink cambia "Comer" por "Beber" en el menú.
  • ReplaceOnUse entrega otro ítem cuando se acaba: la cáscara.

Armas cuerpo a cuerpo

Un resumen del Sable de Luz. Los campos más importantes:

text
item SableLuz
{
    ItemType = base:weapon,
    DisplayCategory = Weapon,
    Categories = LongBlade,
    SubCategory = Swinging,
    TwoHandWeapon = true,
    MinDamage = 8,
    MaxDamage = 14,
    MaxRange = 2.0,
    MaxHitCount = 10,
    CriticalChance = 35.0,
    ConditionMax = 30,
    ConditionLowerChanceOneIn = 30,
    SwingAnim = Bat,
    SwingSound = SableLuzSwing,
    HitSound = SableLuzHit,
    ...
}

Modelos 3D (en el suelo y en la mano)

Un ítem puede tener un modelo para cuando está en la mano (StaticModel) y otro para cuando está en el suelo (WorldStaticModel). Se declaran con bloques model:

text
model MelonConVinoGround
{
    mesh = WorldItems/MelonConVino,     <- models_X/WorldItems/MelonConVino.x
    texture = MelonConVino,             <- textures/MelonConVino.png
    scale = 1.0,
}

Y en el ítem, con el módulo adelante:

text
StaticModel = Melvin42.MelonConVino,
WorldStaticModel = Melvin42.MelonConVinoGround,

Recetas (craftRecipe)

Ejemplo real: armar un completo italiano.

text
craftRecipe MakeCompletoItaliano
{
    timedAction = Making,
    time = 60,
    Tags = InHandCraft;Cooking,
    category = Cooking,
    xpAward = Cooking:3,
    inputs
    {
        item 1 [CompleteItaliano.PanCompleto;Base.BunsHotdog_single] flags[InheritFoodAge;ItemCount],
        item 1 [CompleteItaliano.Vienesa;Base.Hotdog_single] flags[InheritFoodAge;ItemCount],
        item 1 [CompleteItaliano.Palta;Base.Avocado] flags[InheritFoodAge;ItemCount],
        item 1 [Base.Tomato] flags[InheritFoodAge;ItemCount],
        item 2 [Base.MayonnaiseFull],
    }
    outputs
    {
        item 1 CompleteItaliano.CompletoItaliano,
    }
}
  • [A;B] acepta cualquiera de los dos: el pan del mod o el pan de hot dog del juego. Así el jugador no queda atrapado buscando un ítem exacto.
  • flags[InheritFoodAge]: el completo sale tan fresco (o tan viejo) como sus ingredientes.
  • Tags = InHandCraft permite hacerlo con los ítems en la mano, sin mesa.

Y una receta con herramienta que no se gasta:

text
craftRecipe SLEnsamblarSable
{
    timedAction = MakingElectrical,
    time = 400,
    Tags = AnySurfaceCraft,
    category = Electrical,
    SkillRequired = Electricity:3,
    xpAward = Electricity:30,
    inputs
    {
        item 1 tags[base:screwdriver] mode:keep,
        item 1 [SL.EmpunaduraSable],
        item 1 [SL.CristalKyber],
        item 2 [Base.Battery] mode:destroy,
    }
    outputs
    {
        item 1 SL.SableLuz,
    }
}
  • tags[base:screwdriver] acepta cualquier destornillador. Todos los tags están en la referencia de tags, y los IDs de los ítems vanilla (Base.X) en la referencia de ítems.
  • mode:keep devuelve la herramienta; mode:destroy consume el ítem.
  • SkillRequired pide nivel de habilidad y xpAward da experiencia.

El nombre visible de la receta va en Translate/<IDIOMA>/Recipes.json, con la clave igual al nombre de la receta ("SLEnsamblarSable": "Ensamblar sable de luz").

Reparación (fixing)

text
fixing Fix Sable de Luz
{
    Require : SableLuz,
    Fixer : Battery; Electricity=2,
    Fixer : ElectronicsScrap=2; Electricity=3,
}

Cada Fixer es una forma alternativa de reparar: qué material, cuánto, y qué habilidad pide.

Dónde buscar más

La fuente más confiable son los scripts del propio juego: en la carpeta de instalación, media/scripts/. Si quieres saber cómo se hace algo, busca un ítem vanilla parecido. Las guías viejas de internet suelen ser de Build 41 y muchas ya no funcionan.