WENOPAL

Como passar um mod de Project Zomboid da B41 para a B42

Lista de tudo o que mudou para os modders entre a Build 41 e a Build 42 (pastas, itens, receitas, traduções, Lua) e como atualizar seu mod passo a passo.

Nível intermediário · Atualizado em

Milhares de mods da Build 41 não funcionam na Build 42, e muitos autores os abandonaram. A boa notícia é que a maioria das mudanças é mecânica: dá para resolver com localizar e substituir, se você souber o que procurar. Este guia reúne tudo o que tivemos que mudar nos nossos mods, conferido nos arquivos do próprio jogo (B42.21).

1. A estrutura de pastas

Na B41 os arquivos ficavam direto na pasta do mod. Na B42 eles vão dentro de uma pasta com a versão:

text
B41                                   B42
Contents/mods/MiMod/                  Contents/mods/MiMod/
├── mod.info                          ├── 42/
├── poster.png                        │   ├── mod.info
└── media/                            │   ├── poster.png
                                      │   └── media/
                                      └── common/        (opcional)
  • Mova o mod.info, as imagens e a media/ para dentro de 42/.
  • common/ é para arquivos que servem em qualquer versão. Não é obrigatória.
  • No mod.info, adicione versionMin=42.0.0, ou a versão de que você realmente precisa.

2. Itens: Type vira ItemType

Na B42 nenhum item vanilla usa Type =: todos usam ItemType com o prefixo base:.

B41B42
Type = Food,ItemType = base:food,
Type = Weapon,ItemType = base:weapon,
Type = Clothing,ItemType = base:clothing,
Type = Normal,ItemType = base:normal,
Type = Drainable,ItemType = base:drainable,

Os 15 tipos que existem na B42 são: base:normal, base:food, base:weapon, base:clothing, base:drainable, base:container, base:literature, base:moveable, base:radio, base:key, base:map, base:weaponpart, base:alarmclock, base:alarmclockclothing e base:animal. Para ver exemplos de cada um, procure um item parecido na referência de itens.

3. Tags, BodyLocations e categorias levam base:

O quêB41B42
TagsTags = Hammer,Tags = base:hammer,
Onde a roupa é vestidaBodyLocation = Shoes,BodyLocation = base:shoes,
Categoria de armaCategories = SmallBlunt,Categories = base:smallblunt,

Os valores exatos estão na referência de tags e na de BodyLocations. Atenção: alguns nomes não são só "adicionar base:" (por exemplo, existem base:tshirt, base:shortsleeveshirt, base:zeddmg). Copie da referência.

4. Receitas: recipe vira craftRecipe

A B42 não tem nenhuma receita no formato antigo: são quase mil craftRecipe e zero recipe. O formato é completamente diferente:

text
craftRecipe MakeCompletoItaliano
{
    timedAction = Making,
    time = 60,
    Tags = InHandCraft;Cooking,
    category = Cooking,
    inputs
    {
        item 1 [CompleteItaliano.PanCompleto;Base.BunsHotdog_single] flags[InheritFoodAge],
        item 1 tags[base:screwdriver] mode:keep,
    }
    outputs
    {
        item 1 CompleteItaliano.CompletoItaliano,
    }
}
  • As receitas antigas não se convertem sozinhas: é preciso reescrevê-las. Veja o guia de itens e receitas.
  • Todos os itens do seu mod levam o módulo na frente (MiMod.Item). Se faltar, o jogo não carrega o save ("World loading could not proceed, there are script load errors").
  • O nome visível da receita vai no Recipes.json (veja o item 5).

5. Traduções: só JSON

A B42 só lê arquivos .json. Os .txt da B41 são ignorados sem dar erro: na tela aparece a chave em vez do texto.

text
B41: media/lua/shared/Translate/ES/ItemName_ES.txt
     ItemName_ES = {
         ItemName_MiMod.Sopaipilla = "Sopaipilla",
     }

B42: media/lua/shared/Translate/ES/ItemName.json
     {
         "MiMod.Sopaipilla": "Sopaipilla"
     }
  • Repare que a chave muda: na B42 é Modulo.Item, sem o ItemName_ na frente.
  • O mesmo vale para Tooltip, Recipes, IG_UI, Sandbox: um .json por tipo e por idioma. Detalhes em Traduções.

6. Loot: quase igual, mas confira os nomes

O sistema continua sendo ProceduralDistributions com Events.OnPostDistributionMerge, então o código de loot da B41 costuma funcionar. Mas muitas listas mudaram ou ficaram vazias: por exemplo, GunStoreShelf existe, mas está marcada como obsoleta e não tem itens. Se o seu item "não aparece", confira cada nome na referência de listas de loot.

Use sempre o padrão que verifica se a lista existe, explicado em Loot.

7. Mudanças no Lua que quebram mods

AntesNa B42
getProperties():Is(IsoFlagType.water)getProperties():has(IsoFlagType.water), em minúscula. O jogo não usa :Is( em lugar nenhum.
getCell():getVehicles():get(i)getVehicles() agora é um Set, sem :get(i). Para percorrer objetos, use getCell():getObjectListForLua().
HaloTextHelper.addText(player, texto, color)Use addGoodText (verde), addBadText (vermelho) ou addText(player, texto).
table.insert(PrintMediaDefinitions.Fliers, ...)Essa tabela não existe mais: os panfletos são um registro (Registries.FLIER).
BodyLocations com texto: getOrCreateLocation("Hat")O jogo usa a enumeração ItemBodyLocation.HAT. Confira media/lua/shared/NPCs/BodyLocations.lua.
Timed actions em client/Coloque em shared/: no multiplayer da B42 o servidor também as cria pelo nome.

O sintoma típico dessas mudanças é o erro tried to call nil, que aparece ao carregar o save. A lista completa de eventos da B42 está na referência de eventos de Lua.

8. Servidores: Mods= leva barra invertida

Se o seu mod é usado em servidores, avise na página que na B42 a linha é Mods=\MiMod (com \ na frente de cada ID). Mais no guia do servidor dedicado.

Checklist

  • Arquivos movidos para 42/ e versionMin no mod.info.
  • Todos os Type = trocados por ItemType = base:....
  • Tags, BodyLocations e categorias com base:, copiados da referência.
  • Receitas reescritas como craftRecipe, com os itens do mod com módulo.
  • Traduções passadas para .json, com as chaves novas.
  • Listas de loot conferidas uma por uma.
  • Nenhum :Is(, getVehicles():get( nem PrintMediaDefinitions.Fliers no Lua.
  • Testado com -debug em um save novo: sem erros no console.txt. Veja Erros comuns.