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:
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 amedia/para dentro de42/. common/é para arquivos que servem em qualquer versão. Não é obrigatória.- No
mod.info, adicioneversionMin=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:.
| B41 | B42 |
|---|---|
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ê | B41 | B42 |
|---|---|---|
| Tags | Tags = Hammer, | Tags = base:hammer, |
| Onde a roupa é vestida | BodyLocation = Shoes, | BodyLocation = base:shoes, |
| Categoria de arma | Categories = 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:
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.
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 oItemName_na frente. - O mesmo vale para
Tooltip,Recipes,IG_UI,Sandbox: um.jsonpor 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
| Antes | Na 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/eversionMinnomod.info. - Todos os
Type =trocados porItemType = 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(nemPrintMediaDefinitions.Fliersno Lua. - Testado com
-debugem um save novo: sem erros noconsole.txt. Veja Erros comuns.