From 16a720ca02bd7ba1171cd45f804d742b66cf991b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 29 Aug 2026 14:14:21 +0300 Subject: [PATCH 1/6] Add KJS recipe type builder for vanilla recipe type registry --- .../gtceu/integration/kjs/GregTechKubeJSPlugin.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java index f53c1f0aa5c..618e14f9c1b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java @@ -135,6 +135,9 @@ public void registerBuilderTypes(BuilderTypeRegistry registry) { reg.add(GTCEu.id("ore"), OreTagPrefixBuilder.class, OreTagPrefixBuilder::new); }); + registry.of(Registries.RECIPE_TYPE, reg -> { + reg.add(GTCEu.id("machine"), GTRecipeTypeBuilder.class, GTRecipeTypeBuilder::new); + }); registry.addDefault(GTRegistries.Keys.RECIPE_TYPE, GTRecipeTypeBuilder.class, GTRecipeTypeBuilder::new); registry.addDefault(GTRegistries.Keys.RECIPE_CATEGORY, GTRecipeCategoryBuilder.class, GTRecipeCategoryBuilder::new); From 4ee7b57d2479e5d144721d9b3eec0e3d92852254 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 29 Aug 2026 14:22:22 +0300 Subject: [PATCH 2/6] Remove unused GT recipe type value transformer --- .../api/sync_system/data_transformers/ValueTransformers.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java index 7dd86cc66be..6cfd5c32c89 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformers.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.recipe.ConsumedInputsData; import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.TypeDeclaration; @@ -177,7 +176,6 @@ public static void registerGenericTransformerSupplier(Class type, Supplie registerCodecTransformer(MonitorGroup.class, MonitorGroup.CODEC, MonitorGroup.STREAM_CODEC); registerCodecTransformer(ConsumedInputsData.class, ConsumedInputsData.CODEC, ByteBufCodecs.fromCodecWithRegistries(ConsumedInputsData.CODEC)); - registerTransformer(GTRecipeType.class, new RegistryReferenceTransformer<>(GTRegistries.Keys.RECIPE_TYPE, GTRecipeType::getRegistryName)); registerTransformer(Material.class, new RegistryReferenceTransformer<>(GTRegistries.Keys.MATERIAL, Material::getResourceLocation)); // spotless:on From 34c33c503626427c70e4f4e83bed9c5c93ff4b86 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 29 Aug 2026 15:43:09 +0300 Subject: [PATCH 3/6] Fix the GT recipe type wrapper --- .../integration/kjs/GregTechKubeJSPlugin.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java index 618e14f9c1b..b83a53858dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java @@ -116,11 +116,15 @@ import dev.latvian.mods.kubejs.recipe.schema.RecipeSchemaRegistry; import dev.latvian.mods.kubejs.registry.BuilderTypeRegistry; import dev.latvian.mods.kubejs.registry.RegistryObjectStorage; +import dev.latvian.mods.kubejs.registry.RegistryType; import dev.latvian.mods.kubejs.registry.ServerRegistryRegistry; import dev.latvian.mods.kubejs.script.BindingRegistry; import dev.latvian.mods.kubejs.script.TypeWrapperRegistry; +import dev.latvian.mods.kubejs.util.ID; import dev.latvian.mods.kubejs.util.RegistryAccessContainer; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.Wrapper; +import dev.latvian.mods.rhino.type.TypeInfo; public class GregTechKubeJSPlugin implements KubeJSPlugin { @@ -342,7 +346,22 @@ private void registryObjectTypeWrapper(TypeWrapperRegistry typeWrappers, Cla public void registerTypeWrappers(TypeWrapperRegistry registry) { registry.register(GTResourceLocation.class, GTResourceLocation::wrap); - registryObjectTypeWrapper(registry, GTRecipeType.class, GTRegistries.Keys.RECIPE_TYPE); + registry.register(GTRecipeType.class, (Context cx, Object from, TypeInfo target) -> { + if (ID.isKey(from)) { + // if it's an ID, make it default to the GT namespace + GTResourceLocation wrapper = GTResourceLocation.wrap(from); + if (wrapper != null) from = wrapper.wrapped(); + } + + // first convert + Object o = cx.jsToJava(from, RegistryType.ofKey(Registries.RECIPE_TYPE).type()); + if (o instanceof GTRecipeType gtType) { + return gtType; + } else { + cx.reportConversionError(from, target); + return null; + } + }); registryObjectTypeWrapper(registry, GTRecipeCategory.class, GTRegistries.Keys.RECIPE_CATEGORY); registryObjectTypeWrapper(registry, ChanceLogic.class, GTRegistries.Keys.CHANCE_LOGIC); From b5fa43c874f4f85050eaaa1bf2bae784acc49c99 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 29 Aug 2026 16:38:02 +0300 Subject: [PATCH 4/6] Fix GT registry events not being fired for recipe types --- .../integration/kjs/helpers/KubeGTRegistryEventHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java index a776583efe8..5412ac5dcb7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java @@ -31,7 +31,7 @@ public class KubeGTRegistryEventHandler { @SubscribeEvent(priority = EventPriority.LOW) public static void registerAll(RegisterEvent event) { // only post the GT registry event for GT registries - if (!GTRegistries.getRegistries().contains(event.getRegistry())) { + if (!GTRegistries.getRegistryOrder().contains(event.getRegistryKey().location())) { return; } From 7b0ea0b089fdafca26e771802629524470a4affe Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 29 Aug 2026 16:41:23 +0300 Subject: [PATCH 5/6] Fix the recipe type builder double-registering itself --- .../gtceu/integration/kjs/builders/GTRecipeTypeBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/GTRecipeTypeBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/GTRecipeTypeBuilder.java index 0c06e52770c..ffc27e9bc7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/GTRecipeTypeBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/GTRecipeTypeBuilder.java @@ -51,6 +51,8 @@ public GTRecipeTypeBuilder(ResourceLocation id) { this.maxTooltips = 4; this.smallRecipeMap = null; this.iconSupplier = null; + + this.dummyBuilder = true; } public GTRecipeTypeBuilder category(String category) { From dd3b2612043d6a986a64db8e05e64c70c813ce3a Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 29 Aug 2026 16:45:51 +0300 Subject: [PATCH 6/6] Make `GTCEuStartupEvents.registry` assume GT namespace unless otherwise specified --- .../integration/kjs/GTCEuStartupEvents.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GTCEuStartupEvents.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GTCEuStartupEvents.java index d83e02c2eaf..9283b6752ff 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GTCEuStartupEvents.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GTCEuStartupEvents.java @@ -1,29 +1,51 @@ package com.gregtechceu.gtceu.integration.kjs; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.integration.kjs.events.*; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; import dev.latvian.mods.kubejs.event.EventGroup; import dev.latvian.mods.kubejs.event.EventHandler; import dev.latvian.mods.kubejs.event.EventTargetType; import dev.latvian.mods.kubejs.event.TargetedEventHandler; +import dev.latvian.mods.kubejs.util.Cast; +import dev.latvian.mods.rhino.type.TypeInfo; public interface GTCEuStartupEvents { + EventTargetType>> REGISTRY_ASSUME_GT = Cast.to(EventTargetType.create(ResourceKey.class) + .transformer(GTCEuStartupEvents::toRegistryKeyAssumeGTNamespace) + .identity() + .describeType(TypeInfo.of(ResourceKey.class) + .withParams(TypeInfo.of(Registry.class)))); + EventGroup GROUP = EventGroup.of("GTCEuStartupEvents"); EventHandler MATERIAL_ICON_INFO = GROUP.startup("materialIconInfo", () -> MaterialIconInfoEventJS.class); EventHandler WORLD_GEN_LAYERS = GROUP.startup("worldGenLayers", () -> WorldGenLayerEventJS.class); TargetedEventHandler>> REGISTRY = GROUP.startup("registry", () -> GTRegistryKubeEvent.class) - .requiredTarget(EventTargetType.REGISTRY); - EventHandler MATERIAL_MODIFICATION = GROUP.startup("materialModification", - () -> MaterialModificationEventJS.class); + .requiredTarget(REGISTRY_ASSUME_GT); + EventHandler MATERIAL_MODIFICATION = GROUP.startup("materialModification", () -> MaterialModificationEventJS.class); EventHandler CRAFTING_COMPONENTS = GROUP.startup("craftingComponents", () -> CraftingComponentsEventJS.class); EventHandler REGISTER_WOODS = GROUP.startup("registerWoods", () -> RegisterWoodsEventJS.class); EventHandler MACHINE_MODIFICATION = GROUP.startup("machineModification", () -> ModifyMachineEventJS.class); EventHandler REGISTER_SPOILABLES = GROUP.startup("registerSpoilables", () -> RegisterSpoilablesEventJS.class); + + @SuppressWarnings("rawtypes") + private static ResourceKey> toRegistryKeyAssumeGTNamespace(Object object) { + return switch (object) { + case null -> null; + case ResourceKey rl -> rl; + case ResourceLocation rl -> ResourceKey.createRegistryKey(rl); + default -> { + String s = object.toString(); + yield s.isBlank() ? null : ResourceKey.createRegistryKey(GTCEu.id(s)); + } + }; + } }