🔌 PRD #4 — KubeJS Compatibility Layer
GregTech Nexus Addon — KubeJS Integration Requirements
Versão 1.0 | Bilíngue PT-BR / EN
1. Visão Geral / Overview
PT-BR: Este PRD define como expor as classes e mecânicas customizadas do GTNA para o KubeJS, permitindo que desenvolvedores de modpacks e jogadores avançados criem seus próprios multiblocos usando as hatches especiais do GTNA (Thread, Accelerate, Overclock, Advanced Parallel) e a classe WorkableElectricMultipleRecipesMachine sem precisar escrever código Java.
EN: This PRD defines how to expose GTNA's custom classes and mechanics to KubeJS, enabling modpack developers and advanced players to create their own multiblocks using GTNA's special hatches (Thread, Accelerate, Overclock, Advanced Parallel) and the WorkableElectricMultipleRecipesMachine class without writing Java code.
2. Objetivos / Goals
| Objetivo |
Descrição |
| Acessibilidade |
Qualquer dev de modpack deve conseguir criar um multiblock com hatches GTNA em <30 linhas de JS |
| Segurança |
Os scripts KubeJS não podem quebrar a lógica interna dos hatches |
| Compatibilidade |
Funcionar com GT Modern KubeJS bindings existentes |
| Documentação |
Cada API exposta deve ter exemplos copiáveis na wiki |
| Extensibilidade |
Devs devem poder criar novas combinações de hatches não previstas |
3. Dependências / Dependencies
| Mod |
Versão |
Papel |
| KubeJS |
6.x (1.20.1) |
Scripting engine |
| KubeJS GTCEu |
Latest |
GT Modern KubeJS bindings |
| GregTech CEu Modern |
7.4.x |
Base mod |
| GTNA |
0.2.0+ |
Our addon |
[!IMPORTANT]
A integração depende do KubeJS GTCEu já existente. O GTNA adiciona uma camada EM CIMA dele, não substitui.
4. Arquitetura Técnica / Technical Architecture
4.1 Classes Expostas ao KubeJS
GTNA Classes para KubeJS:
├── WorkableElectricMultipleRecipesMachine ← Multiblock base com threads
├── AccelerateHatchPartMachine ← Reduz duração
├── AdvancedParallelHatchPartMachine ← Paralelos customizáveis
├── OverclockHatchPartMachine ← Multiplicador de OC
├── ThreadPartMachine ← Receitas simultâneas diferentes
├── GTNAPartAbility ← THREAD_HATCH, ACCELERATE_HATCH, OVERCLOCK_HATCH
└── GTNAMultipleRecipesLogic ← Lógica multi-receita (trait)
4.2 Fluxo de Integração
graph LR
A["KubeJS Script<br/>(startup_scripts/)"] --> B["GTNAKubeJSPlugin<br/>(registra bindings)"]
B --> C["GTCEu KubeJS API<br/>(multiblock builder)"]
C --> D["GTNA Machine Factory<br/>(cria máquina com traits)"]
D --> E["Multiblock ingame<br/>com hatches GTNA"]
4.3 Implementação Java Necessária
4.3.1 KubeJS Plugin (Novo arquivo)
// com.raishxn.gtna.integration.kubejs.GTNAKubeJSPlugin.java
package com.raishxn.gtna.integration.kubejs;
import dev.latvian.mods.kubejs.KubeJSPlugin;
import dev.latvian.mods.kubejs.script.BindingsEvent;
import dev.latvian.mods.kubejs.script.ScriptType;
public class GTNAKubeJSPlugin extends KubeJSPlugin {
@Override
public void registerBindings(BindingsEvent event) {
// Expor constantes e builders
event.add("GTNAMachineType", GTNAMachineTypes.class);
event.add("GTNAPartAbility", GTNAPartAbilityWrapper.class);
event.add("GTNAHatchConfig", GTNAHatchConfigBuilder.class);
}
@Override
public void registerEvents(BindingsEvent event) {
// Eventos customizados GTNA
event.add("gtna.multiblock.formed", GTNAMultiblockFormedEvent.class);
event.add("gtna.thread.started", GTNAThreadStartedEvent.class);
}
}
4.3.2 Wrapper de Part Abilities (Novo arquivo)
// com.raishxn.gtna.integration.kubejs.GTNAPartAbilityWrapper.java
package com.raishxn.gtna.integration.kubejs;
import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility;
import com.raishxn.gtna.api.machine.multiblock.GTNAPartAbility;
/**
* Wrapper para expor as PartAbilities do GTNA para KubeJS.
* Usado como: GTNAPartAbility.THREAD_HATCH no script.
*/
public class GTNAPartAbilityWrapper {
public static final PartAbility THREAD_HATCH = GTNAPartAbility.THREAD_HATCH;
public static final PartAbility ACCELERATE_HATCH = GTNAPartAbility.ACCELERATE_HATCH;
public static final PartAbility OVERCLOCK_HATCH = GTNAPartAbility.OVERCLOCK_HATCH;
// PARALLEL_HATCH já existe no GT base
}
4.3.3 Machine Type Builder (Novo arquivo)
// com.raishxn.gtna.integration.kubejs.GTNAMachineTypes.java
package com.raishxn.gtna.integration.kubejs;
/**
* Factory methods para criar máquinas GTNA via KubeJS.
*/
public class GTNAMachineTypes {
/**
* Cria um multiblock que suporta todas as hatches GTNA.
* @param id Identificador do multiblock (ex: "my_multiblock")
* @return Builder configurável via KubeJS
*/
public static GTNAMultiblockBuilder multipleRecipesMachine(String id) {
return new GTNAMultiblockBuilder(id, WorkableElectricMultipleRecipesMachine::new);
}
}
5. API KubeJS — Exemplos Completos / Full KubeJS Examples
// kubejs/startup_scripts/my_multiblock.js
GTCEuStartupEvents.registry('gtceu:machine', event => {
event.create('my_awesome_machine', 'gtna:multiple_recipes')
// Tipo de receita que aceita
.recipeType('gtceu:assembler')
// Rotação permitida
.rotationState(RotationState.NON_Y_AXIS)
// Aparência no JEI
.appearanceBlock(GTBlocks.CASING_STEEL_SOLID)
// Padrão da estrutura
.pattern(definition => FactoryBlockPattern.start()
.aisle('CCCCC', 'CCCCC', 'CCCCC')
.aisle('CCCCC', 'C###C', 'CCCCC')
.aisle('CCCCC', 'C###C', 'CCCCC')
.aisle('CCCCC', 'C###C', 'CCCCC')
.aisle('CCCCC', 'CC~CC', 'CCCCC')
.where('~', Predicates.controller(Predicates.blocks(definition.get())))
.where('C', Predicates.blocks(GTBlocks.CASING_STEEL_SOLID.get())
// Hatches padrão GT
.or(Predicates.autoAbilities(definition.getRecipeTypes()))
.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))
// === HATCHES GTNA ===
.or(Predicates.abilities(PartAbility.PARALLEL_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(GTNAPartAbility.THREAD_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(GTNAPartAbility.ACCELERATE_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(GTNAPartAbility.OVERCLOCK_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(PartAbility.MUFFLER).setMaxGlobalLimited(1))
)
.where('#', Predicates.air())
.build()
)
// Modelo visual
.workableCasingModel(
'gtceu:block/casings/solid/machine_casing_solid_steel',
'gtceu:block/multiblock/implosion_compressor'
)
// Tooltips
.tooltips(
Component.literal('§6My Custom Multi-Thread Machine'),
Component.literal('§7Supports GTNA Thread, Accelerate & Overclock Hatches'),
Component.literal('§bUses WorkableElectricMultipleRecipesMachine')
)
})
5.2 Exemplo Avançado: Configuração de Eficiência Custom
// kubejs/startup_scripts/advanced_machine.js
GTCEuStartupEvents.registry('gtceu:machine', event => {
event.create('industrial_processor', 'gtna:multiple_recipes')
.recipeTypes(['gtceu:assembler', 'gtceu:circuit_assembler'])
.rotationState(RotationState.NON_Y_AXIS)
.appearanceBlock(GTBlocks.CASING_ALUMINIUM_FROSTPROOF)
// Configurações GTNA avançadas
.gtnaConfig(config => {
config.maxThreadMultiplier(2) // Dobra threads do Thread Hatch
config.overclockBonus(0.1) // 10% bônus adicional de OC
config.accelerateCapEnabled(true) // Limite no Accelerate
config.accelerateMinDuration(5) // Duração mínima 5 ticks (0.25s)
})
.pattern(definition => FactoryBlockPattern.start()
.aisle('AAAAAAA', 'AAAAAAA', 'AAAAAAA')
.aisle('AAAAAAA', 'A#####A', 'AAAAAAA')
.aisle('AAAAAAA', 'A#####A', 'AAAAAAA')
.aisle('AAAAAAA', 'A#####A', 'AAAAAAA')
.aisle('AAAAAAA', 'A#####A', 'AAAAAAA')
.aisle('AAAAAAA', 'A#####A', 'AAAAAAA')
.aisle('AAAAAAA', 'AAA~AAA', 'AAAAAAA')
.where('~', Predicates.controller(Predicates.blocks(definition.get())))
.where('A', Predicates.blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get())
.or(Predicates.autoAbilities(definition.getRecipeTypes()))
.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))
.or(Predicates.abilities(PartAbility.PARALLEL_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(GTNAPartAbility.THREAD_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(GTNAPartAbility.ACCELERATE_HATCH).setMaxGlobalLimited(2))
.or(Predicates.abilities(GTNAPartAbility.OVERCLOCK_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(PartAbility.MUFFLER).setMaxGlobalLimited(1))
)
.where('#', Predicates.air())
.build()
)
.workableCasingModel(
'gtceu:block/casings/solid/machine_casing_frost_proof',
'gtceu:block/multiblock/vacuum_freezer'
)
.tooltips(
Component.literal('§6Industrial Multi-Processor'),
Component.literal('§7Accepts Assembler + Circuit Assembler recipes'),
Component.literal('§bSupports up to 2 Accelerate Hatches!'),
Component.literal('§eThread multiplier: 2x')
)
})
5.3 Exemplo: Criar Receitas para Máquina GTNA Custom
// kubejs/server_scripts/my_recipes.js
ServerEvents.recipes(event => {
// Receitas para assembler que funcionam na máquina custom
event.recipes.gtceu.assembler('my_modpack:custom_component')
.itemInputs('4x gtceu:steel_plate', '2x gtceu:copper_wire_single')
.itemOutputs('my_modpack:custom_component')
.duration(200) // 10 seconds
.EUt(30) // LV tier
// Receitas usam Thread Hatch automaticamente quando a máquina
// é WorkableElectricMultipleRecipesMachine
})
6. Referência da API / API Reference
6.1 GTNAPartAbility Constants
| Constante |
Tipo |
Uso em Pattern |
Efeito |
GTNAPartAbility.THREAD_HATCH |
PartAbility |
.abilities(...).setMaxGlobalLimited(1) |
Permite receitas diferentes simultâneas |
GTNAPartAbility.ACCELERATE_HATCH |
PartAbility |
.abilities(...).setMaxGlobalLimited(N) |
Reduz duração das receitas por % |
GTNAPartAbility.OVERCLOCK_HATCH |
PartAbility |
.abilities(...).setMaxGlobalLimited(1) |
Multiplica velocidade de overclock |
PartAbility.PARALLEL_HATCH |
PartAbility (GT) |
.abilities(...).setMaxGlobalLimited(1) |
Advanced Parallel do GTNA |
6.2 Hatch Tier Effects
Thread Hatch (ZPM → MAX)
| Tier |
Threads Adicionais |
Fórmula |
| ZPM (7) |
+1 |
2^(7-6) - 1 = 1 |
| UV (8) |
+3 |
2^(8-6) - 1 = 3 |
| UHV (9) |
+7 |
2^(9-6) - 1 = 7 |
| UEV (10) |
+15 |
2^(10-6) - 1 = 15 |
| UIV (11) |
+31 |
2^(11-6) - 1 = 31 |
| UXV (12) |
+63 |
2^(12-6) - 1 = 63 |
| OpV (13) |
+127 |
2^(13-6) - 1 = 127 |
| MAX (14) |
+255 |
2^(14-6) - 1 = 255 |
Accelerate Hatch (LV → MAX)
| Tier |
Min Duration % |
Fórmula |
| LV (1) |
48% |
50 - 2×(1-1) = 48% |
| MV (2) |
46% |
50 - 2×(2-1) = 46% |
| HV (3) |
44% |
50 - 2×(3-1) = 44% |
| EV (4) |
42% |
50 - 2×(4-1) = 42% |
| ... |
... |
... |
| MAX (14) |
24% |
50 - 2×(14-1) = 24% |
[!WARNING]
Se a tier do Accelerate Hatch é menor que a tier da máquina, aplica-se penalidade de +20% por tier de diferença.
Overclock Hatch (UV → MAX)
| Tier |
Duration Multiplier |
Efeito |
| UV (8) |
0.55 (55%) |
Remove 45% da duração |
| UHV (9) |
0.333 (33.3%) |
Remove 66.7% |
| UEV (10) |
0.25 (25%) |
Remove 75% |
| UIV (11) |
0.20 (20%) |
Remove 80% |
| UXV (12) |
0.167 (16.7%) |
Remove 83.3% |
| OpV (13) |
0.143 (14.3%) |
Remove 85.7% |
| MAX (14) |
0.125 (12.5%) |
Remove 87.5% |
Advanced Parallel Hatch (UHV → OpV)
| Tier |
Parallel Count |
| UHV (9) |
1,024 |
| UEV (10) |
4,096 |
| UIV (11) |
16,384 |
| UXV (12) |
65,536 |
| OpV (13) |
262,144 |
6.3 Interaction Between Hatches
Final Duration = Base_Duration
× Electric_OC_Factor (GT standard)
× AccelerateHatch_Factor (calcDurationPercentage / 100)
× OverclockHatch_Factor (getOverclockMultiplier)
Example:
Base = 200 ticks
Electric OC (EV machine, LV recipe) = 200 / 4 = 50 ticks
Accelerate Hatch (HV tier, EV machine) = 50 × 0.44 = 22 ticks
Overclock Hatch (UV) = 22 × 0.55 = 12.1 → 12 ticks
Threads work INDEPENDENTLY:
With Thread Hatch UV (+3 threads):
Thread 1: Recipe A (12 ticks)
Thread 2: Recipe B (12 ticks) ← different recipe!
Thread 3: Recipe C (12 ticks)
Thread 4: Recipe D (12 ticks)
All 4 run simultaneously, each with its own parallels.
7. Arquivos Necessários / Required Files
7.1 Novos Arquivos Java
| Arquivo |
Pacote |
Descrição |
GTNAKubeJSPlugin.java |
integration.kubejs |
Plugin principal KubeJS |
GTNAPartAbilityWrapper.java |
integration.kubejs |
Wrapper de PartAbilities |
GTNAMachineTypes.java |
integration.kubejs |
Factory de máquinas |
GTNAMultiblockBuilder.java |
integration.kubejs |
Builder fluent para multiblocks |
GTNAHatchConfigBuilder.java |
integration.kubejs |
Configuração de hatches |
7.2 Dependência Gradle Necessária
// build.gradle — adicionar:
modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}")
7.3 Registro Condicional
// A integração KubeJS só é ativada se KubeJS estiver presente
if (ModList.get().isLoaded("kubejs")) {
GTNAKubeJSPlugin.init();
}
8. Testes / Testing
8.1 Script de Teste Mínimo
// kubejs/startup_scripts/test_gtna.js
// Este script deve funcionar sem erros se a integração está correta
console.log('GTNA KubeJS Integration Test')
console.log('Thread Hatch ability:', GTNAPartAbility.THREAD_HATCH)
console.log('Accelerate Hatch ability:', GTNAPartAbility.ACCELERATE_HATCH)
console.log('Overclock Hatch ability:', GTNAPartAbility.OVERCLOCK_HATCH)
GTCEuStartupEvents.registry('gtceu:machine', event => {
event.create('gtna_test_machine', 'gtna:multiple_recipes')
.recipeType('gtceu:assembler')
.rotationState(RotationState.NON_Y_AXIS)
.appearanceBlock(GTBlocks.CASING_STEEL_SOLID)
.pattern(definition => FactoryBlockPattern.start()
.aisle('CCC', 'CCC', 'CCC')
.aisle('CCC', 'C#C', 'CCC')
.aisle('CCC', 'C~C', 'CCC')
.where('~', Predicates.controller(Predicates.blocks(definition.get())))
.where('C', Predicates.blocks(GTBlocks.CASING_STEEL_SOLID.get())
.or(Predicates.autoAbilities(definition.getRecipeTypes()))
.or(Predicates.abilities(PartAbility.PARALLEL_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(GTNAPartAbility.THREAD_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(GTNAPartAbility.ACCELERATE_HATCH).setMaxGlobalLimited(1))
.or(Predicates.abilities(GTNAPartAbility.OVERCLOCK_HATCH).setMaxGlobalLimited(1))
)
.where('#', Predicates.air())
.build()
)
.workableCasingModel(
'gtceu:block/casings/solid/machine_casing_solid_steel',
'gtceu:block/multiblock/implosion_compressor'
)
.tooltips(Component.literal('§aGTNA Integration Test Machine'))
console.log('GTNA test machine registered successfully!')
})
8.2 Checklist de Validação
[ ] Script carrega sem erros (console log OK)
[ ] GTNAPartAbility constantes acessíveis no KubeJS
[ ] Multiblock formado corretamente in-game
[ ] Thread Hatch funciona (múltiplas receitas simultâneas)
[ ] Accelerate Hatch reduz duração
[ ] Overclock Hatch aplica multiplicador
[ ] Advanced Parallel Hatch aplica paralelos
[ ] Combinação de hatches funciona (stacking)
[ ] Tooltip mostra informações de hatches ativos
[ ] Display text mostra threads por receita
[ ] Save/Load funciona (mundo não corrompe)
9. Documentação para Wiki / Wiki Documentation
Esta seção será adicionada à wiki em:
- docs/development/api/kubejs.md — Guia completo
- docs/gameplay/tips/kubejs-examples.md — Exemplos para jogadores
PRD KubeJS Compatibility — GTNA v0.2.0