Guia Rápido
O objetivo desta página é permitir que desenvolvedores documentem funções úteis para uso futuro. Se você tiver qualquer código JavaScript ou Java que valha a pena compartilhar, coloque-o aqui.
JavaScript:
Tag para array
Aqui está um exemplo de como transformar uma tag de item em um array; você pode omitir qualquer parte conforme necessário.
const tag_array = Ingredient.of('#forge:tag').itemIds.toArray().map(String);- .itemIds Isso acessa a lista de IDs de itens dessa tag de ingrediente. O resultado é um Java Set.
- .toArray() Isso converte a lista (que é um Java Set) em um array JavaScript.
- .map(String) Isso converte cada ID de item no array para string. Necessário para a maioria das funções JS, mas não para todas.
Subtração de Tag
Aqui está um exemplo de usar um array em uma receita para produzir o mesmo array, exceto pelo item original. Útil para cortadores de pedra, tingimento, etc.
const tag_array = Ingredient.of('#forge:tag').itemIds.toArray().map(String);
tag_array.forEach(item => {
event.stonecutting(item,
Ingredient.of('#forge:tag').subtract(item)
).id(`tfg:stonecutter/${item.replace(/:/g, "/")}`)
})Observação: se você estiver usando múltiplas entradas ou múltiplas subtrações, terá de formatar assim:
let example = Ingredient.of('#forge:tag').subtract('item:1').subtract('item:2').withCount(8)JavaScript para JSON
O exemplo abaixo é usado no builder de trim de armadura.
materials.forEach(material => {
const trimfilepaths = [
`kubejs/data/minecraft/trim_material/${material.materialName}.json`,
`kubejs/data/tfc/trim_material/${material.materialName}.json`
];
const newtrimdata = {
asset_name: material.materialName,
description: {
color: material.nameColor,
translate: `trim_material.tfc.${material.materialName}`
},
ingredient: material.itemName,
item_model_index: material.indexNumber
};
trimfilepaths.forEach(trimfilepaths => {
const existingData = JsonIO.read(trimfilepaths);
// Only write if the file is missing or contents are different
if (JSON.stringify(existingData) !== JSON.stringify(newtrimdata)) {
JsonIO.write(trimfilepaths, newtrimdata);
}
});
});- Declare os caminhos dos arquivos. (exemplo acima:
trimfilepaths) - Crie uma versão const das informações do JSON. (exemplo acima:
newtrimdata) - Para cada caminho de arquivo, leia seu conteúdo e escreva novos dados se estiver faltando. (exemplo acima:
existingData)
Imprimindo JSONs de Receita no Log
Útil para ver como os JSONs de receita estão sendo escritos atualmente, para que você possa editá-los.
event.forEachRecipe({ id: string }, (recipe) => {
console.log(recipe.json.toString());
});- Você pode substituir
{id: string}por qualquer método de receita do KubeJS; como{type: string}ou{mod: string}, por exemplo.
Adicionando Circuitos a Receitas Já Existentes
O script utilitário pronto pode ser encontrado em: gtceu/utility.js
E o array global em: gtceu/constants.js
Você pode adicionar números de circuito ao GTCEu sobrescrevendo o JSON assim:
event.findRecipes({ id: string }).forEach(recipe => {
// Obtém o JsonObject "inputs" existente
const inputs = recipe.json.get("inputs");
// Obtém o array de itens atual ou cria um novo
const itemArray = inputs.has("item") ? Java.from(inputs.get("item")) : [];
// Adiciona o JSON de entrada do circuito
itemArray.push({
content: {
type: "gtceu:circuit",
configuration: 1
},
chance: 0,
maxChance: 10000,
tierChanceBoost: 0
});
// Define o array de itens atualizado de volta em inputs
inputs.add("item", itemArray);
// Reaplica os inputs modificados no JSON da receita
recipe.json.add("inputs", inputs);
});Você também pode sobrescrever os inputs diretamente; isso removerá quaisquer outros inputs existentes:
event.findRecipes({ id: string }).forEach(recipe => {
recipe.json.add("inputs",
{
item: [
{
content: {
type: "gtceu:circuit",
configuration: 1
},
chance: 0,
maxChance: 10000,
tierChanceBoost: 0
}
]
}
)
})* Você pode substituir `{id: string}` por qualquer método de receita do KubeJS; como `{type: string}` ou `{mod: string}`, por exemplo.
## Entrada/Saída com Chance
Como escrever ingredientes de entrada/saída com chance para receitas do GTCEu.
.chancedOutput('minecraft:dirt', 100, 0)
.chancedInput('minecraft:dirt', 100, 0)
.chancedFluidInput(Fluid.of('minecraft:water', 100), 1000, 0)
.chancedFluidOutput('minecraft:water 1000', 100, 0)- O primeiro número é a chance, sendo 1 igual a 0,01% e 10000 igual a 100%
- O segundo número é o aumento a cada tier de energia (este recurso foi removido no GTm 7.0)
Se você quiser uma lógica de chance diferente, como XOR:
const $ChanceLogic = Java.loadClass('com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic')
event.recipes.gtceu.chemical_reactor("test_and")
.itemInputs('1x minecraft:stone')
.chancedItemOutputLogic($ChanceLogic.AND)
.chancedOutput('2x minecraft:dirt', 5000, 100)
.chancedOutput('4x minecraft:dirt', 2500, 600)
.duration(400)
.EUt(25)
event.recipes.gtceu.chemical_reactor("test_xor")
.itemInputs('1x minecraft:stone')
.chancedFluidOutputLogic($ChanceLogic.XOR)
.chancedFluidOutput('gtceu:oxygen 500', 5000, 0)
.chancedFluidOutput('gtceu:fluorine 500', 2500, 0)
.duration(400)
.EUt(25)Saída em faixa:
.itemOutputsRanged('#forge:crushed_ores/bauxite',1,10)Java:
Forge Registries: Obter Tipo de Partícula
Para usar tipos de partículas de outros mods sem torná-los dependências, você pode usar ForgeRegistries.PARTICLE_TYPES.getValue(). Aqui está um exemplo usando ae2:lightning_fx. Se o mod não estiver presente, ele usará minecraft:end_rod como fallback.
@Override
public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) {
for (int i = 0; i < 4; i++) {
if (level.isClientSide) {
ParticleType<?> pt = ForgeRegistries.PARTICLE_TYPES.getValue(new ResourceLocation("ae2", "lightning_fx"));
if (pt instanceof SimpleParticleType) {
level.addAlwaysVisibleParticle((SimpleParticleType) pt, true,
pos.getX() + 0.5 + (random.nextFloat() - 0.5) * 0.5,
pos.getY() + random.nextDouble(),
pos.getZ() + 0.5 + (random.nextFloat() - 0.5) * 0.5,
0.1, 0.1, 0.1);
} else {
// Fallback with vanilla particle
level.addAlwaysVisibleParticle(ParticleTypes.END_ROD, true,
pos.getX() + 0.5,
pos.getY() + 0.5,
pos.getZ() + 0.5,
0.1, 0.1, 0.1);
}
}
}
}Extra Mixins
Se o seu mixin sobrescreve algo no Minecraft ou injeta em um método herdado de algo do Minecraft, seu mixin precisa de remap = true. Todo o resto deve usar remap = false.
Para obter o caminho de remap de um mixin, clique com o botão direito no método no IntelliJ e use Copy Special > Mixin Target Reference.
Fancy Mixin Tools
"Anotar a classe Mixin com @Pseudo nos permite atingir classes que podem não estar presentes em tempo de compilação, mas estão em tempo de execução; para isso, usamos o nome totalmente qualificado da classe para apontar para ela." -Kolja
Um bom exemplo disso está no Wormsignhandlermixin. Essa ferramenta só deve ser usada quando necessário, devido a mods/Maven serem problemáticos.
Depuração
Você pode converter um objeto inteiro em string com ReflectionStringBuilder.toString().
JSON:
Greate:
Impedir Geração Automática
Se você quiser gerar uma receita para uma máquina do GregTech sem que o Greate gere uma receita (por exemplo, uma receita de bender que você não quer na mech press), coloque _electric_only ou _manual_only no final do ID da receita. (_manual_only é inspirado no Create base, onde esse sufixo impede o Create de gerar uma receita de bulk blasting a partir de uma receita de fundição, etc.)
Firmalife
Você pode fazer planters crescerem instantaneamente clicando com o botão direito neles com um bloco de bedrock.
GregTech
Fórmulas Químicas Personalizadas
Se você tiver um material personalizado com uma fórmula química mais complexa, mas precisar informar ao GregTech que ele "é composto por X oxigênio, Y hidrogênio, Z qualquer coisa" para gerar receitas de decomposição, você pode usar:
material.setFormula("Al2Si2O5(OH)4", true)para mudar o tooltip da fórmula química para o que você quiser! Acho que o true transforma os números em subscritos.
Balanceando Fórmulas Químicas
O Discord do GregTech tem um bot para verificar se suas fórmulas químicas estão balanceadas. Aqui está um exemplo.
Para itens sólidos, 1 mol = a quantidade de átomos presentes na molécula daquele item; então 1 mol de Al2O3 é 5 pós de safira.
Para itens líquidos, é o contrário: 1 mol = 1 balde. Então 1 mol de H2O é um balde.