From cf120ca331ba7a3481b358a712ed7e5c36bf768c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 08:55:45 +0300 Subject: [PATCH 01/20] These don't have implicit GT ids on 1.20, by the way. --- .../integration/kjs/builders/block/ActiveBlockBuilder.java | 3 +-- .../integration/kjs/builders/block/CoilBlockBuilder.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/block/ActiveBlockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/block/ActiveBlockBuilder.java index 788984d9330..60b87bde4d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/block/ActiveBlockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/block/ActiveBlockBuilder.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.ActiveBlock; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; @@ -40,7 +39,7 @@ public enum Type { public transient String activeTexture; public ActiveBlockBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); property(GTBlockStateProperties.ACTIVE); renderType(BlockRenderType.CUTOUT_MIPPED); activeTexture = ACTIVE.apply(baseTexture); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/block/CoilBlockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/block/CoilBlockBuilder.java index f0a02ebe4cb..72ad37680b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/block/CoilBlockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/block/CoilBlockBuilder.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.common.block.CoilBlock; import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; @@ -29,8 +28,8 @@ public class CoilBlockBuilder extends ActiveBlockBuilder { @Setter public transient String texture = "minecraft:missingno"; - public CoilBlockBuilder(ResourceLocation i) { - super(GTResourceLocation.implicitAsGtceu(i)); + public CoilBlockBuilder(ResourceLocation id) { + super(id); property(GTBlockStateProperties.ACTIVE); renderType(BlockRenderType.CUTOUT_MIPPED); noValidSpawns(true); From 46025c9fd239e2cf4a9acf98917d6bd1eaa1e8a6 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:03:37 +0300 Subject: [PATCH 02/20] Remove the (Kube)ResourceLocation mixins and their usages --- .../core/IResourceLocationExtensions.java | 12 ------ .../core/mixins/ResourceLocationMixin.java | 42 ------------------- .../kubejs/KubeResourceLocationMixin.java | 26 ------------ .../kjs/builders/ElementBuilder.java | 3 +- .../kjs/builders/GTRecipeCategoryBuilder.java | 3 +- .../kjs/builders/GTRecipeTypeBuilder.java | 5 +-- .../machine/KJSSteamMachineBuilder.java | 3 +- .../machine/KJSTieredMachineBuilder.java | 5 +-- .../machine/KJSTieredMultiblockBuilder.java | 5 +-- .../machine/KJSWrappingMachineBuilder.java | 3 +- .../machine/KJSWrappingMultiblockBuilder.java | 3 +- .../MultiblockMachineBuilderWrapper.java | 3 +- .../material/MaterialBuilderWrapper.java | 3 +- .../builders/prefix/OreTagPrefixBuilder.java | 3 +- .../kjs/builders/prefix/TagPrefixBuilder.java | 3 +- .../worldgen/BedrockFluidBuilder.java | 3 +- .../builders/worldgen/BedrockOreBuilder.java | 3 +- .../worldgen/OreVeinDefinitionBuilder.java | 3 +- .../kjs/helpers/GTResourceLocation.java | 5 --- src/main/resources/gtceu.mixins.json | 2 - 20 files changed, 18 insertions(+), 120 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/IResourceLocationExtensions.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ResourceLocationMixin.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/kubejs/KubeResourceLocationMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/core/IResourceLocationExtensions.java b/src/main/java/com/gregtechceu/gtceu/core/IResourceLocationExtensions.java deleted file mode 100644 index 316bc4f8943..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/IResourceLocationExtensions.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.core; - -import net.minecraft.resources.ResourceLocation; - -public interface IResourceLocationExtensions { - - public boolean gtm$getImplicit(); - - public void gtm$setImplicit(boolean implicit); - - public ResourceLocation gtm$asNonImplicit(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ResourceLocationMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ResourceLocationMixin.java deleted file mode 100644 index 53c98c9f965..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ResourceLocationMixin.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins; - -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.core.IResourceLocationExtensions; - -import net.minecraft.resources.ResourceLocation; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(ResourceLocation.class) -public class ResourceLocationMixin implements IResourceLocationExtensions { - - @Unique - private boolean gtm$isImplicit; - - @Override - public boolean gtm$getImplicit() { - return this.gtm$isImplicit; - } - - @Override - public void gtm$setImplicit(boolean implicit) { - this.gtm$isImplicit = implicit; - } - - @Override - public ResourceLocation gtm$asNonImplicit() { - if (this.gtm$getImplicit()) { - return GTCEu.id(((ResourceLocation) (Object) this).getPath()); - } - return (ResourceLocation) (Object) this; - } - - @Inject(method = "*", at = @At("TAIL")) - private void populateImplicit(String namespace, String path, CallbackInfo info) { - gtm$isImplicit = false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/kubejs/KubeResourceLocationMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/kubejs/KubeResourceLocationMixin.java deleted file mode 100644 index 890581623aa..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/kubejs/KubeResourceLocationMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gregtechceu.gtceu.core.mixins.kubejs; - -import com.gregtechceu.gtceu.core.IResourceLocationExtensions; - -import net.minecraft.resources.ResourceLocation; - -import dev.latvian.mods.kubejs.util.KubeResourceLocation; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(value = KubeResourceLocation.class) -public abstract class KubeResourceLocationMixin { - - @Inject(at = @At("HEAD"), method = "wrap", cancellable = true) - private static void wrap(Object args, CallbackInfoReturnable cir) { - if (args instanceof String stringArg) { - if (!stringArg.contains(":")) { - var loc = ResourceLocation.fromNamespaceAndPath("kubejs", stringArg); - ((IResourceLocationExtensions) (Object) loc).gtm$setImplicit(true); - cir.setReturnValue(new KubeResourceLocation(loc)); - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/ElementBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/ElementBuilder.java index f5b4f14c1a5..58042849634 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/ElementBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/ElementBuilder.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.data.chemical.Element; import com.gregtechceu.gtceu.common.data.GTElements; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -26,7 +25,7 @@ public class ElementBuilder extends BuilderBase { public transient boolean isIsotope; public ElementBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); name = id.getPath(); translatableName = Component.translatable(id.toLanguageKey("element")); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/GTRecipeCategoryBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/GTRecipeCategoryBuilder.java index d74fc471f1b..6fb2fa37037 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/GTRecipeCategoryBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/GTRecipeCategoryBuilder.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.recipe.category.GTRecipeCategory; import com.gregtechceu.gtceu.common.data.GTRecipeCategories; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -35,7 +34,7 @@ public class GTRecipeCategoryBuilder extends BuilderBase { private transient String langValue; public GTRecipeCategoryBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); recipeType = GTRecipeTypes.DUMMY_RECIPES; icon = null; isXEIVisible = true; 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 77e77596897..963ad7e0da5 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 @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sound.SoundEntry; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; @@ -58,8 +57,8 @@ public class GTRecipeTypeBuilder extends BuilderBase { @Setter protected transient BiConsumer uiBuilder; - public GTRecipeTypeBuilder(ResourceLocation i) { - super(GTResourceLocation.implicitAsGtceu(i)); + public GTRecipeTypeBuilder(ResourceLocation id) { + super(id); name = this.id.getPath(); category = "custom"; maxInputs = new Object2IntOpenHashMap<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java index e1b75835371..a845676bba3 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.resources.ResourceLocation; @@ -36,7 +35,7 @@ public class KJSSteamMachineBuilder extends BuilderBase imple private MachineDefinition lpObject = null, hpObject = null; public KJSSteamMachineBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.dummyBuilder = true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java index da84661c2d0..ea689b28a57 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.resources.ResourceLocation; @@ -54,7 +53,7 @@ public class KJSTieredMachineBuilder extends BuilderBase<@Nullable MachineDefini public transient BiFunction editableUI; public KJSTieredMachineBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.addDefaultTooltips = false; this.addDefaultModel = false; this.dummyBuilder = true; @@ -63,7 +62,7 @@ public KJSTieredMachineBuilder(ResourceLocation id) { public KJSTieredMachineBuilder(ResourceLocation id, TieredCreationFunction machine, BiFunction editableUI, boolean isGenerator) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.machine = machine; this.editableUI = editableUI; this.isGenerator = isGenerator; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java index b53516f700f..59d542353b4 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.api.registry.registrate.MultiblockMachineBuilder; import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.resources.ResourceLocation; @@ -39,12 +38,12 @@ public class KJSTieredMultiblockBuilder extends BuilderBase<@Nullable Multiblock public transient DefinitionFunction definition = (tier, def) -> def.tier(tier); public KJSTieredMultiblockBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.dummyBuilder = true; } public KJSTieredMultiblockBuilder(ResourceLocation id, TieredCreationFunction machine) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.machine = machine; this.dummyBuilder = true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMachineBuilder.java index 02b82e57a8c..32c43732985 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMachineBuilder.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.kjs.builders.machine; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.resources.ResourceLocation; @@ -23,7 +22,7 @@ public class KJSWrappingMachineBuilder extends BuilderBase im private final KJSTieredMachineBuilder tieredBuilder; public KJSWrappingMachineBuilder(ResourceLocation id, KJSTieredMachineBuilder tieredBuilder) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.tieredBuilder = tieredBuilder; this.dummyBuilder = true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java index ec8d7bd4089..f13138e7cad 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.kjs.builders.machine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.resources.ResourceLocation; @@ -22,7 +21,7 @@ public class KJSWrappingMultiblockBuilder extends BuilderBase internal) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.internal = internal; this.dummyBuilder = true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/material/MaterialBuilderWrapper.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/material/MaterialBuilderWrapper.java index 474a7e60c0c..29d36b618fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/material/MaterialBuilderWrapper.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/material/MaterialBuilderWrapper.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.fluids.FluidBuilder; import com.gregtechceu.gtceu.api.fluids.FluidState; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKey; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import com.gregtechceu.gtceu.integration.kjs.helpers.MaterialStackWrapper; import net.minecraft.resources.ResourceLocation; @@ -31,7 +30,7 @@ public class MaterialBuilderWrapper extends BuilderBase { private final Material.Builder internal; public MaterialBuilderWrapper(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.internal = new Material.Builder(this.id); this.dummyBuilder = true; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/OreTagPrefixBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/OreTagPrefixBuilder.java index 600dd56afce..73c4f1fb231 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/OreTagPrefixBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/OreTagPrefixBuilder.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -38,7 +37,7 @@ public class OreTagPrefixBuilder extends TagPrefixBuilder { public transient boolean shouldDropAsItem = false; public OreTagPrefixBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java index c6b21f7a231..a51af258ec0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialStack; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.client.renderer.RenderType; import net.minecraft.network.chat.Component; @@ -33,7 +32,7 @@ public class TagPrefixBuilder extends BuilderBase { private final List secondaryMaterials = new ArrayList<>(); public TagPrefixBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); this.base = create(id.getPath()); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/BedrockFluidBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/BedrockFluidBuilder.java index be0f214cdb2..9745cad9732 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/BedrockFluidBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/BedrockFluidBuilder.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.data.worldgen.BiomeWeightModifier; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidDefinition; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.core.*; import net.minecraft.resources.ResourceKey; @@ -37,7 +36,7 @@ public class BedrockFluidBuilder extends BuilderBase { private final transient Set> dimensions = new HashSet<>(); public BedrockFluidBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); } public static BedrockFluidBuilder from(BedrockFluidDefinition definition, ResourceLocation id) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/BedrockOreBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/BedrockOreBuilder.java index 60097bb0d47..60ef3aa704f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/BedrockOreBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/BedrockOreBuilder.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.data.worldgen.BiomeWeightModifier; import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.WeightedMaterial; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.core.HolderSet; import net.minecraft.resources.ResourceKey; @@ -41,7 +40,7 @@ public class BedrockOreBuilder extends BuilderBase { private final List biomes = new LinkedList<>(); public BedrockOreBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); } public static BedrockOreBuilder from(BedrockOreDefinition definition, ResourceLocation id) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/OreVeinDefinitionBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/OreVeinDefinitionBuilder.java index 319de8ee77d..167cc076fdc 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/OreVeinDefinitionBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/worldgen/OreVeinDefinitionBuilder.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; import com.gregtechceu.gtceu.api.data.worldgen.generator.indicators.SurfaceIndicatorGenerator; import com.gregtechceu.gtceu.api.data.worldgen.generator.veins.*; -import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; import net.minecraft.core.HolderSet; import net.minecraft.core.registries.Registries; @@ -61,7 +60,7 @@ public class OreVeinDefinitionBuilder extends BuilderBase { private List indicatorGenerators; public OreVeinDefinitionBuilder(ResourceLocation id) { - super(GTResourceLocation.implicitAsGtceu(id)); + super(id); } @Tolerate diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java index 1e566e6b506..1fd92d992f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.integration.kjs.helpers; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.core.IResourceLocationExtensions; import net.minecraft.ResourceLocationException; import net.minecraft.core.Holder; @@ -70,8 +69,4 @@ public GTResourceLocation withPrefix(String pathPrefix) { public GTResourceLocation withSuffix(String pathSuffix) { return new GTResourceLocation(wrapped.withSuffix(pathSuffix)); } - - public static ResourceLocation implicitAsGtceu(ResourceLocation loc) { - return ((IResourceLocationExtensions) (Object) loc).gtm$asNonImplicit(); - } } diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 34a93e9dd60..c14d9529f27 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -57,7 +57,6 @@ "ReloadableServerResourcesMixin", "RepairItemRecipeMixin", "ResourceKeyArgumentAccessor", - "ResourceLocationMixin", "ServerChunkProviderMixin", "ServerGamePacketListenerImplAccessor", "ShapedRecipeAccessor", @@ -69,7 +68,6 @@ "emi.FillRecipePacketMixin", "emi.FluidEmiStackMixin", "jei.FluidHelperMixin", - "kubejs.KubeResourceLocationMixin", "ldlib.ButtonWidgetMixin", "ldlib.DummyWorldMixin", "ldlib.ItemStackPayloadMixin", From 8449f6d5bd73812b83c18f19df952075adb503e4 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:05:11 +0300 Subject: [PATCH 03/20] Add back `GTCEuStartupEvents.registry` and a simple handler for it --- .../integration/kjs/GTCEuStartupEvents.java | 7 + .../kjs/events/GTRegistryKubeEvent.java | 133 ++++++++++++++++++ .../kjs/helpers/RegistryEventHandler.java | 72 ++++++++++ 3 files changed, 212 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java 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 bd1839c4b5b..5d1437ebf68 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GTCEuStartupEvents.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GTCEuStartupEvents.java @@ -2,8 +2,13 @@ import com.gregtechceu.gtceu.integration.kjs.events.*; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; + 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; public interface GTCEuStartupEvents { @@ -12,6 +17,8 @@ public interface 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); EventHandler CRAFTING_COMPONENTS = GROUP.startup("craftingComponents", () -> CraftingComponentsEventJS.class); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java new file mode 100644 index 00000000000..71b86f0e709 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java @@ -0,0 +1,133 @@ +package com.gregtechceu.gtceu.integration.kjs.events; + +import com.gregtechceu.gtceu.integration.kjs.helpers.GTResourceLocation; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; + +import dev.latvian.mods.kubejs.DevProperties; +import dev.latvian.mods.kubejs.error.KubeRuntimeException; +import dev.latvian.mods.kubejs.event.EventResult; +import dev.latvian.mods.kubejs.event.KubeStartupEvent; +import dev.latvian.mods.kubejs.registry.*; +import dev.latvian.mods.kubejs.script.ConsoleJS; +import dev.latvian.mods.kubejs.script.SourceLine; +import dev.latvian.mods.rhino.Context; + +import java.util.LinkedList; +import java.util.List; +import java.util.function.Supplier; + +public class GTRegistryKubeEvent implements KubeStartupEvent, AdditionalObjectRegistry { + + private final ResourceKey> registryKey; + private final BuilderTypeRegistryHandler.Info builderInfo; + public final List> created; + + public GTRegistryKubeEvent(ResourceKey> registryKey) { + this.registryKey = registryKey; + this.builderInfo = BuilderTypeRegistryHandler.info(registryKey); + this.created = new LinkedList<>(); + } + + public BuilderBase create(Context cx, GTResourceLocation id, GTResourceLocation type) { + var sourceLine = SourceLine.of(cx); + var t = builderInfo.namedType(type.wrapped()); + + if (t == null) { + throw new KubeRuntimeException("Unknown type '" + type + "' for object '" + id + "'!").source(sourceLine); + } + + var b = t.factory().createBuilder(id.wrapped()); + + if (b == null) { + throw new KubeRuntimeException("Unknown type '" + type + "' for object '" + id + "'!").source(sourceLine); + } else if (builderInfo.directCodec() != null) { + throw new KubeRuntimeException("Type '" + type + "' for object '" + id + "' is a datapack registry type!") + .source(sourceLine); + } else { + b.sourceLine = sourceLine; + b.registryKey = registryKey; + addBuilder(b); + created.add(b); + } + + return b; + } + + public BuilderBase create(Context cx, GTResourceLocation id) { + var sourceLine = SourceLine.of(cx); + var t = builderInfo.defaultType(); + + if (t == null) { + throw new KubeRuntimeException( + "Registry '" + registryKey.location() + "' doesn't have a default type registered!") + .source(sourceLine); + } + + var b = t.factory().createBuilder(id.wrapped()); + + if (b == null) { + throw new KubeRuntimeException("Unknown type '" + t.type() + "' for object '" + id + "'!") + .source(sourceLine); + } else { + b.sourceLine = sourceLine; + b.registryKey = registryKey; + addBuilder(b); + created.add(b); + } + + return b; + } + + public CustomBuilderObject createCustom(Context cx, GTResourceLocation id, Supplier object) { + var sourceLine = SourceLine.of(cx); + + if (object == null) { + throw new KubeRuntimeException("Tried to register a null object with id: " + id).source(sourceLine); + } + + var b = new CustomBuilderObject(id.wrapped(), object); + b.sourceLine = sourceLine; + b.registryKey = registryKey; + addBuilder(b); + created.add(b); + return b; + } + + @Override + public void afterPosted(EventResult result) { + for (var c : created) { + c.createAdditionalObjects(this); + } + } + + @Override + public void add(ResourceKey> registry, BuilderBase builder) { + builder.registryKey = (ResourceKey) registry; + addBuilder(builder); + } + + private void addBuilder(BuilderBase builder) { + if (builder == null) { + throw new IllegalArgumentException( + "Can't add null builder in registry '" + builder.registryKey.location() + "'!"); + } + + if (DevProperties.get().logRegistryEventObjects) { + ConsoleJS.STARTUP.info("~ " + builder.registryKey.location() + " | " + builder.id); + } + + var objStorage = RegistryObjectStorage.of(builder.registryKey); + + if (objStorage.objects.containsKey(builder.id)) { + throw new IllegalArgumentException( + "Duplicate key '" + builder.id + "' in registry '" + builder.registryKey.location() + "'!"); + } + + objStorage.objects.put(builder.id, (BuilderBase) builder); + RegistryObjectStorage.ALL_BUILDERS.add(builder); + + // registry.deferredRegister.register() + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java new file mode 100644 index 00000000000..82331e0a03b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java @@ -0,0 +1,72 @@ +package com.gregtechceu.gtceu.integration.kjs.helpers; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.integration.kjs.GTCEuStartupEvents; +import com.gregtechceu.gtceu.integration.kjs.events.GTRegistryKubeEvent; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.registries.RegisterEvent; + +import dev.latvian.mods.kubejs.DevProperties; +import dev.latvian.mods.kubejs.KubeJS; +import dev.latvian.mods.kubejs.registry.RegistryObjectStorage; +import dev.latvian.mods.kubejs.script.ConsoleJS; +import dev.latvian.mods.kubejs.script.ScriptType; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +@EventBusSubscriber(modid = GTCEu.MOD_ID) +public class RegistryEventHandler { + + @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())) { + return; + } + + handleRegistryEvent((ResourceKey) event.getRegistryKey(), event); + } + + private static void handleRegistryEvent(ResourceKey> registryKey, RegisterEvent event) { + GTCEuStartupEvents.REGISTRY.post(ScriptType.STARTUP, (ResourceKey) registryKey, + new GTRegistryKubeEvent<>(registryKey)); + + var objStorage = RegistryObjectStorage.of(registryKey); + + if (objStorage.objects.isEmpty()) { + if (DevProperties.get().logRegistryEventObjects) { + GTCEu.LOGGER.info("Skipping {} registry - no objects to build", registryKey.location()); + } + + return; + } + + if (DevProperties.get().logRegistryEventObjects) { + GTCEu.LOGGER.info("Building {} objects of {} registry", objStorage.objects.size(), registryKey.location()); + } + + int added = 0; + + for (var builder : objStorage) { + if (!builder.dummyBuilder) { + event.register(registryKey, builder.id, builder::createTransformedObject); + + if (DevProperties.get().logRegistryEventObjects) { + ConsoleJS.STARTUP.info("+ " + registryKey.location() + " | " + builder.id); + } + + added++; + } + } + + if (!objStorage.objects.isEmpty() && DevProperties.get().logRegistryEventObjects) { + KubeJS.LOGGER.info("Registered {}/{} objects of {}", added, objStorage.objects.size(), + registryKey.location()); + } + } +} From 16637645af517fc23f2a0f8178848def48cf1c70 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:07:55 +0300 Subject: [PATCH 04/20] Move Registrate wrapper handling to RegistryEventHandler --- .../gregtechceu/gtceu/common/CommonProxy.java | 5 --- .../integration/kjs/GregTechKubeJSPlugin.java | 38 ------------------- .../kjs/helpers/RegistryEventHandler.java | 22 ++++++++--- 3 files changed, 16 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index ec40f54a10c..0107f20bec2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -137,11 +137,6 @@ public class CommonProxy { public static void init(final IEventBus modBus) { CommonProxy.modBus = modBus; - if (GTCEu.Mods.isKubeJSLoaded()) { - // initialize this before the class's static listeners - // so KubeJS materials are registered before the material registry is closed. - modBus.addListener(EventPriority.LOW, GregTechKubeJSPlugin::registerWrappers); - } modBus.register(CommonProxy.class); UIFactory.register(MachineUIFactory.INSTANCE); 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 daaf4cb184b..bbd00d1f451 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java @@ -129,44 +129,6 @@ public class GregTechKubeJSPlugin implements KubeJSPlugin { - @ApiStatus.Internal - public static void registerWrappers(RegisterEvent event) { - registerWrappers(event, GTRegistries.MACHINE_REGISTRY); - registerWrappers(event, GTRegistries.MATERIAL_REGISTRY); - } - - private static void registerWrappers(RegisterEvent event, ResourceKey> registryKey) { - if (event.getRegistryKey() != registryKey) { - return; - } - var objStorage = RegistryObjectStorage.of(registryKey); - ResourceLocation registryLoc = registryKey.location(); - - int added = 0; - - for (var builder : objStorage) { - if (builder.dummyBuilder) { - // don't actually register anything here, the wrapper builders register themselves with Registrate - builder.createTransformedObject(); - - if (DevProperties.get().logRegistryEventObjects) { - ConsoleJS.STARTUP.info("+ " + registryLoc + " | " + builder.id); - } - added++; - } - - // add all registry objects' namespaces to the dynamic packs so their resources are listed as expected. - // although usually only one namespace is used, it's easier and faster to - // just always add them to the set than to check if they're already added. - if (GTCEu.isClientSide()) GTDynamicResourcePack.addNamespace(builder.id.getNamespace()); - GTDynamicDataPack.addNamespace(builder.id.getNamespace()); - } - - if (!objStorage.objects.isEmpty() && DevProperties.get().logRegistryEventObjects) { - GTCEu.LOGGER.info("Registered {}/{} objects of {}", added, objStorage.objects.size(), registryLoc); - } - } - @Override public void registerBuilderTypes(BuilderTypeRegistry registry) { registry.addDefault(GTRegistries.ELEMENT_REGISTRY, ElementBuilder.class, ElementBuilder::new); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java index 82331e0a03b..ae85eaa6d90 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java @@ -2,6 +2,8 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.data.pack.GTDynamicDataPack; +import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; import com.gregtechceu.gtceu.integration.kjs.GTCEuStartupEvents; import com.gregtechceu.gtceu.integration.kjs.events.GTRegistryKubeEvent; @@ -53,15 +55,23 @@ private static void handleRegistryEvent(ResourceKey> registryKey int added = 0; for (var builder : objStorage) { - if (!builder.dummyBuilder) { + if (builder.dummyBuilder) { + // don't actually register anything here, the wrapper builders register themselves with Registrate + builder.createTransformedObject(); + } else { event.register(registryKey, builder.id, builder::createTransformedObject); + } - if (DevProperties.get().logRegistryEventObjects) { - ConsoleJS.STARTUP.info("+ " + registryKey.location() + " | " + builder.id); - } - - added++; + if (DevProperties.get().logRegistryEventObjects) { + ConsoleJS.STARTUP.info("+ " + registryKey.location() + " | " + builder.id); } + added++; + + // add all registry objects' namespaces to the dynamic packs so their resources are listed as expected. + // although usually only one namespace is used, it's easier and faster to + // just always add them to the set than to check if they're already added. + if (GTCEu.isClientSide()) GTDynamicResourcePack.addNamespace(builder.id.getNamespace()); + GTDynamicDataPack.addNamespace(builder.id.getNamespace()); } if (!objStorage.objects.isEmpty() && DevProperties.get().logRegistryEventObjects) { From 5ba8db52e9bba9989e5f427398465d3514294435 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:08:08 +0300 Subject: [PATCH 05/20] Clean up GTResourceLocation type wrapper --- .../kjs/helpers/GTResourceLocation.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java index 1fd92d992f1..c413e0adae5 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java @@ -11,7 +11,6 @@ import com.mojang.serialization.Codec; import dev.latvian.mods.kubejs.core.RegistryObjectKJS; import dev.latvian.mods.kubejs.error.KubeRuntimeException; -import dev.latvian.mods.rhino.Wrapper; import org.jetbrains.annotations.Nullable; import java.util.function.UnaryOperator; @@ -25,15 +24,12 @@ public record GTResourceLocation(ResourceLocation wrapped) { public static final Codec CODEC = GTCEu.GTCEU_ID.xmap(GTResourceLocation::new, GTResourceLocation::wrapped); - @Nullable - public static GTResourceLocation wrap(@Nullable Object o) { - if (o == null) return null; - o = Wrapper.unwrapped(o); - - ResourceLocation id = switch (o) { - case ResourceLocation resLoc -> resLoc; + public static @Nullable GTResourceLocation wrap(@Nullable Object o) { + ResourceLocation inner = switch (o) { + case null -> null; + case ResourceLocation id -> id; case ResourceKey key -> key.location(); - case Holder holder when holder.getKey() != null -> holder.getKey().location(); + case Holder holder -> holder.getKey() == null ? null : holder.getKey().location(); case RegistryObjectKJS key -> key.kjs$getIdLocation(); default -> { var s = o instanceof JsonPrimitive p ? p.getAsString() : o.toString(); @@ -46,7 +42,8 @@ public static GTResourceLocation wrap(@Nullable Object o) { } } }; - return new GTResourceLocation(id); + if (inner == null) return null; + return new GTResourceLocation(inner); } @Override From e0bff1f15615acf86ee1a0adfe15625fbbc9f980 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:08:59 +0300 Subject: [PATCH 06/20] Nullability annotation cleanup day --- .../gtceu/api/registry/registrate/MachineBuilder.java | 2 +- .../registry/registrate/MultiblockMachineBuilder.java | 5 +++-- .../integration/kjs/builders/GTRecipeTypeBuilder.java | 9 +++------ .../kjs/builders/machine/KJSTieredMachineBuilder.java | 4 ++-- .../builders/machine/KJSTieredMultiblockBuilder.java | 2 +- .../kjs/builders/material/MaterialBuilderWrapper.java | 11 +++++------ 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java index db835cf0205..20e35f61848 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java @@ -159,7 +159,7 @@ public TYPE getThis() { return (TYPE) this; } - public TYPE blockModel(NonNullBiConsumer, GTBlockstateProvider> blockModel) { + public TYPE blockModel(@Nullable NonNullBiConsumer, GTBlockstateProvider> blockModel) { this.blockModel = blockModel; return getThis(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java index 29ccab444bc..8bbce66a68e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java @@ -26,6 +26,7 @@ import lombok.experimental.Accessors; import lombok.experimental.Tolerate; import org.apache.commons.lang3.function.TriFunction; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.*; @@ -43,7 +44,7 @@ public class MultiblockMachineBuilder> recoveryItems = new ArrayList<>(); private Function> partSorter = (c) -> (a, b) -> 0; - private TriFunction partAppearance; + private @Nullable TriFunction partAppearance; @Getter private BiConsumer> additionalDisplay = (m, l) -> {}; @@ -80,7 +81,7 @@ public TYPE partSorter(Function partAppearance) { + public TYPE partAppearance(@Nullable TriFunction partAppearance) { this.partAppearance = partAppearance; return getThis(); } 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 963ad7e0da5..6a0b93c3dec 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 @@ -48,14 +48,11 @@ public class GTRecipeTypeBuilder extends BuilderBase { protected transient int maxTooltips; @Setter - @Nullable - private transient GTRecipeType smallRecipeMap; + private transient @Nullable GTRecipeType smallRecipeMap; @Setter - @Nullable - private transient Supplier iconSupplier; - @Nullable + private transient @Nullable Supplier iconSupplier; @Setter - protected transient BiConsumer uiBuilder; + protected transient @Nullable BiConsumer uiBuilder; public GTRecipeTypeBuilder(ResourceLocation id) { super(id); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java index ea689b28a57..bec02905419 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java @@ -42,7 +42,7 @@ public class KJSTieredMachineBuilder extends BuilderBase<@Nullable MachineDefini @Setter public transient DefinitionFunction definition = (tier, def) -> def.tier(tier); @Setter - public transient Int2IntFunction tankScalingFunction = GTMachineUtils.defaultTankSizeFunction; + public transient @Nullable Int2IntFunction tankScalingFunction = GTMachineUtils.defaultTankSizeFunction; @Setter public transient boolean addDefaultTooltips = true; @Setter @@ -50,7 +50,7 @@ public class KJSTieredMachineBuilder extends BuilderBase<@Nullable MachineDefini @Setter public transient boolean isGenerator = false; - public transient BiFunction editableUI; + public transient @Nullable BiFunction editableUI; public KJSTieredMachineBuilder(ResourceLocation id) { super(id); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java index 59d542353b4..b535141dd57 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java @@ -28,7 +28,7 @@ public class KJSTieredMultiblockBuilder extends BuilderBase<@Nullable MultiblockMachineDefinition @NotNull []> implements IMachineBuilderKJS { - private final MultiblockMachineBuilder[] builders = new MultiblockMachineBuilder[TIER_COUNT]; + private final MultiblockMachineBuilder[] builders = new MultiblockMachineBuilder[TIER_COUNT]; @Setter public transient int[] tiers = GTMachineUtils.ELECTRIC_TIERS; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/material/MaterialBuilderWrapper.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/material/MaterialBuilderWrapper.java index 29d36b618fa..c9107ed135f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/material/MaterialBuilderWrapper.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/material/MaterialBuilderWrapper.java @@ -19,7 +19,6 @@ import dev.latvian.mods.kubejs.registry.BuilderBase; import dev.latvian.mods.kubejs.typings.Info; import dev.latvian.mods.kubejs.typings.Param; -import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.function.UnaryOperator; @@ -54,7 +53,7 @@ public MaterialBuilderWrapper fluid() { Can be called multiple times to add multiple fluids. """) - public MaterialBuilderWrapper fluid(@NotNull FluidStorageKey key, @NotNull FluidState state) { + public MaterialBuilderWrapper fluid(FluidStorageKey key, FluidState state) { internal.fluid(key, state); return this; } @@ -64,7 +63,7 @@ public MaterialBuilderWrapper fluid(@NotNull FluidStorageKey key, @NotNull Fluid Can be called multiple times to add multiple fluids. """) - public MaterialBuilderWrapper fluid(@NotNull FluidStorageKey key, @NotNull FluidBuilder builder) { + public MaterialBuilderWrapper fluid(FluidStorageKey key, FluidBuilder builder) { internal.fluid(key, builder); return this; } @@ -84,7 +83,7 @@ public MaterialBuilderWrapper liquid() { @see #fluid(FluidStorageKey, FluidState) """) - public MaterialBuilderWrapper liquid(@NotNull FluidBuilder builder) { + public MaterialBuilderWrapper liquid(FluidBuilder builder) { internal.liquid(builder); return this; } @@ -109,7 +108,7 @@ public MaterialBuilderWrapper plasma() { @see #fluid(FluidStorageKey, FluidState) """) - public MaterialBuilderWrapper plasma(@NotNull FluidBuilder builder) { + public MaterialBuilderWrapper plasma(FluidBuilder builder) { internal.plasma(builder); return this; } @@ -134,7 +133,7 @@ public MaterialBuilderWrapper gas() { @see #fluid(FluidStorageKey, FluidState) """) - public MaterialBuilderWrapper gas(@NotNull FluidBuilder builder) { + public MaterialBuilderWrapper gas(FluidBuilder builder) { internal.gas(builder); return this; } From 0180ccb732672f26c78542b8a4eee45d4aaeeedb Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:09:22 +0300 Subject: [PATCH 07/20] Remove unused field in TagPrefixBuilder --- .../integration/kjs/builders/prefix/TagPrefixBuilder.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java index a51af258ec0..f851d1873ea 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java @@ -15,10 +15,8 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import dev.latvian.mods.kubejs.registry.BuilderBase; -import lombok.Getter; import lombok.experimental.Accessors; -import java.util.ArrayList; import java.util.List; import java.util.function.*; @@ -26,10 +24,7 @@ @Accessors(chain = true) public class TagPrefixBuilder extends BuilderBase { - public final TagPrefix base; - - @Getter - private final List secondaryMaterials = new ArrayList<>(); + public transient final TagPrefix base; public TagPrefixBuilder(ResourceLocation id) { super(id); From 0fcf0fc07719585af3f13f271c8e6572229bd35d Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:10:46 +0300 Subject: [PATCH 08/20] Disallow implicit GT namespace registration for recipe types --- .../com/gregtechceu/gtceu/common/data/GTRecipeTypes.java | 9 +++++++-- .../integration/kjs/builders/GTRecipeTypeBuilder.java | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java index d5e28f9db12..efb860d1f98 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -33,6 +33,7 @@ import net.minecraft.client.resources.language.I18n; import net.minecraft.core.HolderSet; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.item.ItemStack; @@ -664,8 +665,12 @@ public class GTRecipeTypes { public static final GTRecipeType DUMMY_RECIPES = register("dummy", DUMMY) .setXEIVisible(false); - public static GTRecipeType register(String name, String group, RecipeType... proxyRecipes) { - var recipeType = new GTRecipeType(GTCEu.id(name), group, proxyRecipes); + private static GTRecipeType register(String name, String group, RecipeType... proxyRecipes) { + return register(GTCEu.id(name), group, proxyRecipes); + } + + public static GTRecipeType register(ResourceLocation id, String group, RecipeType... proxyRecipes) { + var recipeType = new GTRecipeType(id, group, proxyRecipes); GTRegistries.register(BuiltInRegistries.RECIPE_TYPE, recipeType.registryName, recipeType); recipeType.setSerializer(GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, recipeType.registryName, new GTRecipeSerializer())); 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 6a0b93c3dec..20e3b52aac8 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 @@ -134,7 +134,7 @@ public String getTranslationKeyGroup() { @Override public GTRecipeType createObject() { - var type = GTRecipeTypes.register(name, category); + var type = GTRecipeTypes.register(this.id, this.category); type.maxInputs.putAll(maxInputs); type.maxOutputs.putAll(maxOutputs); type.getRecipeUI().getSlotOverlays().putAll(slotOverlays); From b3afa0ca8738b53541486a0b5b43d4f1bcdb3594 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:11:38 +0300 Subject: [PATCH 09/20] Otherwise clean up GTRecipeTypeBuilder --- .../kjs/builders/GTRecipeTypeBuilder.java | 59 ++++++++----------- 1 file changed, 23 insertions(+), 36 deletions(-) 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 20e3b52aac8..d430d3808ad 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 @@ -31,21 +31,20 @@ @Accessors(chain = true) public class GTRecipeTypeBuilder extends BuilderBase { - public transient String name, category; - public transient final Object2IntMap> maxInputs; - public transient final Object2IntMap> maxOutputs; - private ProgressTexture progressBarTexture; - @Nullable - private SteamTexture steamProgressBarTexture; - private ProgressTexture.FillDirection steamMoveType; - private transient final Byte2ObjectMap slotOverlays; + public transient String category; + public transient final Object2IntMap> maxInputs = new Object2IntOpenHashMap<>(); + public transient final Object2IntMap> maxOutputs = new Object2IntOpenHashMap<>(); + + private ProgressTexture progressBarTexture = new ProgressTexture(); + private @Nullable SteamTexture steamProgressBarTexture = null; + private ProgressTexture.FillDirection steamMoveType = ProgressTexture.FillDirection.LEFT_TO_RIGHT; + private transient final Byte2ObjectMap slotOverlays = new Byte2ObjectArrayMap<>(); @Setter - @Nullable - protected transient SoundEntry sound; + protected transient @Nullable SoundEntry sound = null; @Setter protected transient boolean hasResearchSlot; @Setter - protected transient int maxTooltips; + protected transient int maxTooltips = 4; @Setter private transient @Nullable GTRecipeType smallRecipeMap; @@ -56,20 +55,7 @@ public class GTRecipeTypeBuilder extends BuilderBase { public GTRecipeTypeBuilder(ResourceLocation id) { super(id); - name = this.id.getPath(); category = "custom"; - maxInputs = new Object2IntOpenHashMap<>(); - maxOutputs = new Object2IntOpenHashMap<>(); - progressBarTexture = new ProgressTexture(); - steamProgressBarTexture = null; - steamMoveType = ProgressTexture.FillDirection.LEFT_TO_RIGHT; - slotOverlays = new Byte2ObjectArrayMap<>(); - this.sound = null; - this.hasResearchSlot = false; - this.maxTooltips = 4; - this.smallRecipeMap = null; - this.iconSupplier = null; - this.uiBuilder = null; } public GTRecipeTypeBuilder category(String category) { @@ -135,18 +121,19 @@ public String getTranslationKeyGroup() { @Override public GTRecipeType createObject() { var type = GTRecipeTypes.register(this.id, this.category); - type.maxInputs.putAll(maxInputs); - type.maxOutputs.putAll(maxOutputs); - type.getRecipeUI().getSlotOverlays().putAll(slotOverlays); - type.getRecipeUI().setProgressBarTexture(progressBarTexture); - type.getRecipeUI().setSteamProgressBarTexture(steamProgressBarTexture); - type.getRecipeUI().setSteamMoveType(steamMoveType); - type.setSound(sound); - type.setHasResearchSlot(hasResearchSlot); - type.setMaxTooltips(maxTooltips); - type.setSmallRecipeMap(smallRecipeMap); - type.setIconSupplier(iconSupplier); - type.setUiBuilder(uiBuilder); + type.maxInputs.putAll(this.maxInputs); + type.maxOutputs.putAll(this.maxOutputs); + type.getRecipeUI().getSlotOverlays().putAll(this.slotOverlays); + type.getRecipeUI().setProgressBarTexture(this.progressBarTexture); + type.getRecipeUI().setSteamProgressBarTexture(this.steamProgressBarTexture); + type.getRecipeUI().setSteamMoveType(this.steamMoveType); + type.setSound(this.sound); + type.setHasResearchSlot(this.hasResearchSlot); + type.setMaxTooltips(this.maxTooltips); + type.setSmallRecipeMap(this.smallRecipeMap); + type.setIconSupplier(this.iconSupplier); + type.setUiBuilder(this.uiBuilder); + return type; } } From 71b27e10604cd025a4c4182f731c41c7e048cd07 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:11:58 +0300 Subject: [PATCH 10/20] Make RegisterWoodsEventJS not require all parts of the wood set --- .../kjs/events/RegisterWoodsEventJS.java | 307 +++++------------- 1 file changed, 88 insertions(+), 219 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/RegisterWoodsEventJS.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/RegisterWoodsEventJS.java index ae667833dd3..bf29c177122 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/RegisterWoodsEventJS.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/RegisterWoodsEventJS.java @@ -4,246 +4,111 @@ import com.gregtechceu.gtceu.data.recipe.WoodTypeEntry; import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; import dev.latvian.mods.kubejs.event.EventResult; import dev.latvian.mods.kubejs.event.KubeEvent; import dev.latvian.mods.rhino.util.HideFromJS; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Objects; public class RegisterWoodsEventJS implements KubeEvent { public RegisterWoodsEventJS() { this.woods = new ArrayList<>(); - this.wrapped = new ArrayList<>(); + this.builders = new ArrayList<>(); } @HideFromJS public ArrayList woods; @HideFromJS - public ArrayList wrapped; + public ArrayList builders; - public class Wrapped { + @Accessors(fluent = true, chain = true) + public class Builder { - RegisterWoodsEventJS evt; - String modId; - String woodName; + private final String modId; + private final String woodName; @HideFromJS - Wrapped(String modId, String woodName) { + private Builder(String modId, String woodName) { this.modId = modId; this.woodName = woodName; } - private String _recipeId; - private Item _plank; - private Item _strippedLog; - private Item _strippedWood; - private Item _wood; - private Item _log; - private Item _door; - private Item _trapdoor; - private Item _slab; - private Item _fence; - private Item _fenceGate; - private Item _stairs; - private Item _boat; - private Item _chestBoat; - private Item _sign; - private Item _hangingSign; - private Item _button; - private Item _pressurePlate; - - public Wrapped recipeId(String recipeId) { - this._recipeId = recipeId; - return this; - } - - public Wrapped plank(Item plank) { - this._plank = plank; - return this; - } - - public Wrapped strippedLog(Item strippedLog) { - this._strippedLog = strippedLog; - return this; - } - - public Wrapped strippedWood(Item strippedWood) { - this._strippedWood = strippedWood; - return this; - } - - public Wrapped wood(Item wood) { - this._wood = wood; - return this; - } - - public Wrapped log(Item log) { - this._log = log; - return this; - } - - public Wrapped door(Item door) { - this._door = door; - return this; - } - - public Wrapped trapdoor(Item trapdoor) { - this._trapdoor = trapdoor; - return this; - } - - public Wrapped slab(Item slab) { - this._slab = slab; - return this; - } - - public Wrapped fence(Item fence) { - this._fence = fence; - return this; - } - - public Wrapped fenceGate(Item fenceGate) { - this._fenceGate = fenceGate; - return this; - } - - public Wrapped stairs(Item stairs) { - this._stairs = stairs; - return this; - } - - public Wrapped boat(Item boat) { - this._boat = boat; - return this; - } - - public Wrapped chestBoat(Item chestBoat) { - this._chestBoat = chestBoat; - return this; - } - - public Wrapped sign(Item sign) { - this._sign = sign; - return this; - } - - public Wrapped hangingSign(Item hangingSign) { - this._hangingSign = hangingSign; - return this; - } - - public Wrapped button(Item button) { - this._button = button; - return this; - } - - public Wrapped pressurePlate(Item pressurePlate) { - this._pressurePlate = pressurePlate; - return this; - } + @Setter + private transient String recipeId; + @Setter + private transient Item plank; + @Setter + private transient Item strippedLog; + @Setter + private transient Item strippedWood; + @Setter + private transient Item wood; + @Setter + private transient Item log; + @Setter + private transient Item door; + @Setter + private transient Item trapdoor; + @Setter + private transient Item slab; + @Setter + private transient Item fence; + @Setter + private transient Item fenceGate; + @Setter + private transient Item stairs; + @Setter + private transient Item boat; + @Setter + private transient Item chestBoat; + @Setter + private transient Item sign; + @Setter + private transient Item hangingSign; + @Setter + private transient Item button; + @Setter + private transient Item pressurePlate; @HideFromJS public WoodTypeEntry toEntry() throws IllegalArgumentException { - if (this.modId == null) { - throw new IllegalArgumentException("Need a modId"); - } - if (this.woodName == null) { - throw new IllegalArgumentException("Need a woodName"); - } - if (this._recipeId == null) { - throw new IllegalArgumentException("Need a recipeId"); - } - - if (this._plank == null) { - throw new IllegalArgumentException("Need a plank"); - } - - if (this._strippedLog == null) { - throw new IllegalArgumentException("Need a strippedLog"); - } - - if (this._strippedWood == null) { - throw new IllegalArgumentException("Need a strippedWood"); - } - - if (this._wood == null) { - throw new IllegalArgumentException("Need a wood"); - } - - if (this._log == null) { - throw new IllegalArgumentException("Need a log"); - } - - if (this._door == null) { - throw new IllegalArgumentException("Need a door"); - } - - if (this._trapdoor == null) { - throw new IllegalArgumentException("Need a trapdoor"); - } - - if (this._slab == null) { - throw new IllegalArgumentException("Need a slab"); - } - - if (this._fence == null) { - throw new IllegalArgumentException("Need a fence"); - } - - if (this._fenceGate == null) { - throw new IllegalArgumentException("Need a fenceGate"); - } - - if (this._stairs == null) { - throw new IllegalArgumentException("Need a stairs"); - } - - if (this._boat == null) { - throw new IllegalArgumentException("Need a boat"); - } - - if (this._chestBoat == null) { - throw new IllegalArgumentException("Need a chestBoat"); - } - - if (this._sign == null) { - throw new IllegalArgumentException("Need a sign"); - } - - if (this._hangingSign == null) { - throw new IllegalArgumentException("Need a hangingSign"); - } - - if (this._button == null) { - throw new IllegalArgumentException("Need a button"); - } - - if (this._pressurePlate == null) { - throw new IllegalArgumentException("Need a pressurePlate"); - } - - return new WoodTypeEntry.Builder(this.modId, this.woodName) - .planks(this._plank, this._recipeId + "_planks") - .log(Items.OAK_LOG).removeCharcoalRecipe() - .strippedLog(this._strippedLog) - .wood(this._wood) - .strippedWood(this._strippedWood) - .door(this._door, this._recipeId + "_door") - .trapdoor(this._trapdoor, this._recipeId + "_trapdoor") - .slab(this._slab, this._recipeId + "_slab") - .fence(this._fence, this._recipeId + "_fence") - .fenceGate(this._fenceGate, this._recipeId + "_fence_gate") - .stairs(this._stairs, this._recipeId + "_stairs") - .boat(this._boat, this._recipeId + "_boat") - .chestBoat(this._chestBoat, this._recipeId + "_chest_boat") - .sign(this._sign, this._recipeId + "_sign") - .hangingSign(this._hangingSign, this._recipeId + "_hanging_sign") - .button(this._button, this._recipeId + "_button") - .pressurePlate(this._pressurePlate, this._recipeId + "_pressure_plate") - .registerAllMaterialInfo() + WoodTypeEntry.Builder builder = new WoodTypeEntry.Builder(this.modId, this.woodName); + + if (this.plank != null) + builder.planks(this.plank, this.recipeId == null ? null : this.recipeId + "_planks"); + if (this.log != null) builder.strippedLog(this.log).removeCharcoalRecipe(); + if (this.strippedLog != null) builder.strippedLog(this.strippedLog); + if (this.wood != null) builder.strippedLog(this.wood); + if (this.strippedWood != null) builder.strippedWood(this.strippedWood); + if (this.door != null) builder.door(this.door, this.recipeId == null ? null : this.recipeId + "_door"); + if (this.trapdoor != null) + builder.trapdoor(this.trapdoor, this.recipeId == null ? null : this.recipeId + "_trapdoor"); + if (this.slab != null) builder.slab(this.slab, this.recipeId == null ? null : this.recipeId + "_slab"); + if (this.fence != null) builder.fence(this.fence, this.recipeId == null ? null : this.recipeId + "_fence"); + if (this.fenceGate != null) + builder.fenceGate(this.fenceGate, this.recipeId == null ? null : this.recipeId + "_fence_gate"); + if (this.stairs != null) + builder.stairs(this.stairs, this.recipeId == null ? null : this.recipeId + "_stairs"); + if (this.boat != null) builder.boat(this.boat, this.recipeId == null ? null : this.recipeId + "_boat"); + if (this.chestBoat != null) + builder.chestBoat(this.chestBoat, this.recipeId == null ? null : this.recipeId + "_chest_boat"); + if (this.sign != null) builder.sign(this.sign, this.recipeId == null ? null : this.recipeId + "_sign"); + if (this.hangingSign != null) + builder.hangingSign(this.hangingSign, this.recipeId == null ? null : this.recipeId + "_hanging_sign"); + if (this.button != null) + builder.button(this.button, this.recipeId == null ? null : this.recipeId + "_button"); + if (this.pressurePlate != null) builder.pressurePlate(this.pressurePlate, + this.recipeId == null ? null : this.recipeId + "_pressure_plate"); + + return builder.registerMaterialInfo(this.plank != null, this.door != null, this.slab != null, + this.fence != null, this.fenceGate != null, this.stairs != null, this.boat != null, + this.chestBoat != null, this.button != null, this.pressurePlate != null) .build(); } @@ -264,16 +129,20 @@ public void register() { } } - public Wrapped register(String modId, String woodName) { - var wrap = new Wrapped(modId, woodName); - this.wrapped.add(wrap); - return wrap; + public Builder register(@NotNull String modId, @NotNull String woodName) { + Objects.requireNonNull(modId, "modId"); + Objects.requireNonNull(woodName, "woodName"); + + Builder value = new Builder(modId, woodName); + + this.builders.add(value); + return value; } @Override public void afterPosted(EventResult result) { - for (var wrapped : this.wrapped) { - wrapped.register(); + for (Builder builder : this.builders) { + builder.register(); } KubeEvent.super.afterPosted(result); } From 734827cc3e7e962fab10a61b5999e47ac03c2599 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:12:04 +0300 Subject: [PATCH 11/20] Revert "Make RegisterWoodsEventJS not require all parts of the wood set" This reverts commit 71b27e10604cd025a4c4182f731c41c7e048cd07. --- .../kjs/events/RegisterWoodsEventJS.java | 307 +++++++++++++----- 1 file changed, 219 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/RegisterWoodsEventJS.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/RegisterWoodsEventJS.java index bf29c177122..ae667833dd3 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/RegisterWoodsEventJS.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/RegisterWoodsEventJS.java @@ -4,111 +4,246 @@ import com.gregtechceu.gtceu.data.recipe.WoodTypeEntry; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import dev.latvian.mods.kubejs.event.EventResult; import dev.latvian.mods.kubejs.event.KubeEvent; import dev.latvian.mods.rhino.util.HideFromJS; -import lombok.Setter; -import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.Objects; public class RegisterWoodsEventJS implements KubeEvent { public RegisterWoodsEventJS() { this.woods = new ArrayList<>(); - this.builders = new ArrayList<>(); + this.wrapped = new ArrayList<>(); } @HideFromJS public ArrayList woods; @HideFromJS - public ArrayList builders; + public ArrayList wrapped; - @Accessors(fluent = true, chain = true) - public class Builder { + public class Wrapped { - private final String modId; - private final String woodName; + RegisterWoodsEventJS evt; + String modId; + String woodName; @HideFromJS - private Builder(String modId, String woodName) { + Wrapped(String modId, String woodName) { this.modId = modId; this.woodName = woodName; } - @Setter - private transient String recipeId; - @Setter - private transient Item plank; - @Setter - private transient Item strippedLog; - @Setter - private transient Item strippedWood; - @Setter - private transient Item wood; - @Setter - private transient Item log; - @Setter - private transient Item door; - @Setter - private transient Item trapdoor; - @Setter - private transient Item slab; - @Setter - private transient Item fence; - @Setter - private transient Item fenceGate; - @Setter - private transient Item stairs; - @Setter - private transient Item boat; - @Setter - private transient Item chestBoat; - @Setter - private transient Item sign; - @Setter - private transient Item hangingSign; - @Setter - private transient Item button; - @Setter - private transient Item pressurePlate; + private String _recipeId; + private Item _plank; + private Item _strippedLog; + private Item _strippedWood; + private Item _wood; + private Item _log; + private Item _door; + private Item _trapdoor; + private Item _slab; + private Item _fence; + private Item _fenceGate; + private Item _stairs; + private Item _boat; + private Item _chestBoat; + private Item _sign; + private Item _hangingSign; + private Item _button; + private Item _pressurePlate; + + public Wrapped recipeId(String recipeId) { + this._recipeId = recipeId; + return this; + } + + public Wrapped plank(Item plank) { + this._plank = plank; + return this; + } + + public Wrapped strippedLog(Item strippedLog) { + this._strippedLog = strippedLog; + return this; + } + + public Wrapped strippedWood(Item strippedWood) { + this._strippedWood = strippedWood; + return this; + } + + public Wrapped wood(Item wood) { + this._wood = wood; + return this; + } + + public Wrapped log(Item log) { + this._log = log; + return this; + } + + public Wrapped door(Item door) { + this._door = door; + return this; + } + + public Wrapped trapdoor(Item trapdoor) { + this._trapdoor = trapdoor; + return this; + } + + public Wrapped slab(Item slab) { + this._slab = slab; + return this; + } + + public Wrapped fence(Item fence) { + this._fence = fence; + return this; + } + + public Wrapped fenceGate(Item fenceGate) { + this._fenceGate = fenceGate; + return this; + } + + public Wrapped stairs(Item stairs) { + this._stairs = stairs; + return this; + } + + public Wrapped boat(Item boat) { + this._boat = boat; + return this; + } + + public Wrapped chestBoat(Item chestBoat) { + this._chestBoat = chestBoat; + return this; + } + + public Wrapped sign(Item sign) { + this._sign = sign; + return this; + } + + public Wrapped hangingSign(Item hangingSign) { + this._hangingSign = hangingSign; + return this; + } + + public Wrapped button(Item button) { + this._button = button; + return this; + } + + public Wrapped pressurePlate(Item pressurePlate) { + this._pressurePlate = pressurePlate; + return this; + } @HideFromJS public WoodTypeEntry toEntry() throws IllegalArgumentException { - WoodTypeEntry.Builder builder = new WoodTypeEntry.Builder(this.modId, this.woodName); - - if (this.plank != null) - builder.planks(this.plank, this.recipeId == null ? null : this.recipeId + "_planks"); - if (this.log != null) builder.strippedLog(this.log).removeCharcoalRecipe(); - if (this.strippedLog != null) builder.strippedLog(this.strippedLog); - if (this.wood != null) builder.strippedLog(this.wood); - if (this.strippedWood != null) builder.strippedWood(this.strippedWood); - if (this.door != null) builder.door(this.door, this.recipeId == null ? null : this.recipeId + "_door"); - if (this.trapdoor != null) - builder.trapdoor(this.trapdoor, this.recipeId == null ? null : this.recipeId + "_trapdoor"); - if (this.slab != null) builder.slab(this.slab, this.recipeId == null ? null : this.recipeId + "_slab"); - if (this.fence != null) builder.fence(this.fence, this.recipeId == null ? null : this.recipeId + "_fence"); - if (this.fenceGate != null) - builder.fenceGate(this.fenceGate, this.recipeId == null ? null : this.recipeId + "_fence_gate"); - if (this.stairs != null) - builder.stairs(this.stairs, this.recipeId == null ? null : this.recipeId + "_stairs"); - if (this.boat != null) builder.boat(this.boat, this.recipeId == null ? null : this.recipeId + "_boat"); - if (this.chestBoat != null) - builder.chestBoat(this.chestBoat, this.recipeId == null ? null : this.recipeId + "_chest_boat"); - if (this.sign != null) builder.sign(this.sign, this.recipeId == null ? null : this.recipeId + "_sign"); - if (this.hangingSign != null) - builder.hangingSign(this.hangingSign, this.recipeId == null ? null : this.recipeId + "_hanging_sign"); - if (this.button != null) - builder.button(this.button, this.recipeId == null ? null : this.recipeId + "_button"); - if (this.pressurePlate != null) builder.pressurePlate(this.pressurePlate, - this.recipeId == null ? null : this.recipeId + "_pressure_plate"); - - return builder.registerMaterialInfo(this.plank != null, this.door != null, this.slab != null, - this.fence != null, this.fenceGate != null, this.stairs != null, this.boat != null, - this.chestBoat != null, this.button != null, this.pressurePlate != null) + if (this.modId == null) { + throw new IllegalArgumentException("Need a modId"); + } + if (this.woodName == null) { + throw new IllegalArgumentException("Need a woodName"); + } + if (this._recipeId == null) { + throw new IllegalArgumentException("Need a recipeId"); + } + + if (this._plank == null) { + throw new IllegalArgumentException("Need a plank"); + } + + if (this._strippedLog == null) { + throw new IllegalArgumentException("Need a strippedLog"); + } + + if (this._strippedWood == null) { + throw new IllegalArgumentException("Need a strippedWood"); + } + + if (this._wood == null) { + throw new IllegalArgumentException("Need a wood"); + } + + if (this._log == null) { + throw new IllegalArgumentException("Need a log"); + } + + if (this._door == null) { + throw new IllegalArgumentException("Need a door"); + } + + if (this._trapdoor == null) { + throw new IllegalArgumentException("Need a trapdoor"); + } + + if (this._slab == null) { + throw new IllegalArgumentException("Need a slab"); + } + + if (this._fence == null) { + throw new IllegalArgumentException("Need a fence"); + } + + if (this._fenceGate == null) { + throw new IllegalArgumentException("Need a fenceGate"); + } + + if (this._stairs == null) { + throw new IllegalArgumentException("Need a stairs"); + } + + if (this._boat == null) { + throw new IllegalArgumentException("Need a boat"); + } + + if (this._chestBoat == null) { + throw new IllegalArgumentException("Need a chestBoat"); + } + + if (this._sign == null) { + throw new IllegalArgumentException("Need a sign"); + } + + if (this._hangingSign == null) { + throw new IllegalArgumentException("Need a hangingSign"); + } + + if (this._button == null) { + throw new IllegalArgumentException("Need a button"); + } + + if (this._pressurePlate == null) { + throw new IllegalArgumentException("Need a pressurePlate"); + } + + return new WoodTypeEntry.Builder(this.modId, this.woodName) + .planks(this._plank, this._recipeId + "_planks") + .log(Items.OAK_LOG).removeCharcoalRecipe() + .strippedLog(this._strippedLog) + .wood(this._wood) + .strippedWood(this._strippedWood) + .door(this._door, this._recipeId + "_door") + .trapdoor(this._trapdoor, this._recipeId + "_trapdoor") + .slab(this._slab, this._recipeId + "_slab") + .fence(this._fence, this._recipeId + "_fence") + .fenceGate(this._fenceGate, this._recipeId + "_fence_gate") + .stairs(this._stairs, this._recipeId + "_stairs") + .boat(this._boat, this._recipeId + "_boat") + .chestBoat(this._chestBoat, this._recipeId + "_chest_boat") + .sign(this._sign, this._recipeId + "_sign") + .hangingSign(this._hangingSign, this._recipeId + "_hanging_sign") + .button(this._button, this._recipeId + "_button") + .pressurePlate(this._pressurePlate, this._recipeId + "_pressure_plate") + .registerAllMaterialInfo() .build(); } @@ -129,20 +264,16 @@ public void register() { } } - public Builder register(@NotNull String modId, @NotNull String woodName) { - Objects.requireNonNull(modId, "modId"); - Objects.requireNonNull(woodName, "woodName"); - - Builder value = new Builder(modId, woodName); - - this.builders.add(value); - return value; + public Wrapped register(String modId, String woodName) { + var wrap = new Wrapped(modId, woodName); + this.wrapped.add(wrap); + return wrap; } @Override public void afterPosted(EventResult result) { - for (Builder builder : this.builders) { - builder.register(); + for (var wrapped : this.wrapped) { + wrapped.register(); } KubeEvent.super.afterPosted(result); } From 9cbd9d332dd7e19d9df8a0179ce555994cedc73e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:12:04 +0300 Subject: [PATCH 12/20] Revert "Otherwise clean up GTRecipeTypeBuilder" This reverts commit b3afa0ca8738b53541486a0b5b43d4f1bcdb3594. --- .../kjs/builders/GTRecipeTypeBuilder.java | 59 +++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) 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 d430d3808ad..20e3b52aac8 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 @@ -31,20 +31,21 @@ @Accessors(chain = true) public class GTRecipeTypeBuilder extends BuilderBase { - public transient String category; - public transient final Object2IntMap> maxInputs = new Object2IntOpenHashMap<>(); - public transient final Object2IntMap> maxOutputs = new Object2IntOpenHashMap<>(); - - private ProgressTexture progressBarTexture = new ProgressTexture(); - private @Nullable SteamTexture steamProgressBarTexture = null; - private ProgressTexture.FillDirection steamMoveType = ProgressTexture.FillDirection.LEFT_TO_RIGHT; - private transient final Byte2ObjectMap slotOverlays = new Byte2ObjectArrayMap<>(); + public transient String name, category; + public transient final Object2IntMap> maxInputs; + public transient final Object2IntMap> maxOutputs; + private ProgressTexture progressBarTexture; + @Nullable + private SteamTexture steamProgressBarTexture; + private ProgressTexture.FillDirection steamMoveType; + private transient final Byte2ObjectMap slotOverlays; @Setter - protected transient @Nullable SoundEntry sound = null; + @Nullable + protected transient SoundEntry sound; @Setter protected transient boolean hasResearchSlot; @Setter - protected transient int maxTooltips = 4; + protected transient int maxTooltips; @Setter private transient @Nullable GTRecipeType smallRecipeMap; @@ -55,7 +56,20 @@ public class GTRecipeTypeBuilder extends BuilderBase { public GTRecipeTypeBuilder(ResourceLocation id) { super(id); + name = this.id.getPath(); category = "custom"; + maxInputs = new Object2IntOpenHashMap<>(); + maxOutputs = new Object2IntOpenHashMap<>(); + progressBarTexture = new ProgressTexture(); + steamProgressBarTexture = null; + steamMoveType = ProgressTexture.FillDirection.LEFT_TO_RIGHT; + slotOverlays = new Byte2ObjectArrayMap<>(); + this.sound = null; + this.hasResearchSlot = false; + this.maxTooltips = 4; + this.smallRecipeMap = null; + this.iconSupplier = null; + this.uiBuilder = null; } public GTRecipeTypeBuilder category(String category) { @@ -121,19 +135,18 @@ public String getTranslationKeyGroup() { @Override public GTRecipeType createObject() { var type = GTRecipeTypes.register(this.id, this.category); - type.maxInputs.putAll(this.maxInputs); - type.maxOutputs.putAll(this.maxOutputs); - type.getRecipeUI().getSlotOverlays().putAll(this.slotOverlays); - type.getRecipeUI().setProgressBarTexture(this.progressBarTexture); - type.getRecipeUI().setSteamProgressBarTexture(this.steamProgressBarTexture); - type.getRecipeUI().setSteamMoveType(this.steamMoveType); - type.setSound(this.sound); - type.setHasResearchSlot(this.hasResearchSlot); - type.setMaxTooltips(this.maxTooltips); - type.setSmallRecipeMap(this.smallRecipeMap); - type.setIconSupplier(this.iconSupplier); - type.setUiBuilder(this.uiBuilder); - + type.maxInputs.putAll(maxInputs); + type.maxOutputs.putAll(maxOutputs); + type.getRecipeUI().getSlotOverlays().putAll(slotOverlays); + type.getRecipeUI().setProgressBarTexture(progressBarTexture); + type.getRecipeUI().setSteamProgressBarTexture(steamProgressBarTexture); + type.getRecipeUI().setSteamMoveType(steamMoveType); + type.setSound(sound); + type.setHasResearchSlot(hasResearchSlot); + type.setMaxTooltips(maxTooltips); + type.setSmallRecipeMap(smallRecipeMap); + type.setIconSupplier(iconSupplier); + type.setUiBuilder(uiBuilder); return type; } } From b51c734496c90b9467c0cec2d935d40a03f51725 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 09:44:30 +0300 Subject: [PATCH 13/20] Move client runs to run/client subdirectory --- gradle/scripts/moddevgradle.gradle | 3 +++ gradle/scripts/resources.gradle | 1 + 2 files changed, 4 insertions(+) diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index 029ea70b32e..bb8566b7e44 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -51,6 +51,7 @@ neoForge { sourceSet = sourceSets.clientExtra ideName = "Client 1" + gameDirectory.set(file('run/client')) systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) } @@ -59,6 +60,7 @@ neoForge { sourceSet = sourceSets.clientExtra ideName = "Client 2" + gameDirectory.set(file('run/client')) programArguments.addAll('--username', 'YoungOnion', '--uuid', '3a27782d-6864-4814-a9fe-7c6931f29a8a') systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) } @@ -79,6 +81,7 @@ neoForge { sourceSet = sourceSets.client ideName = "Clean Client" + gameDirectory.set(file('run/client')) systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) } diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index 1813194b7ac..9a7dace755d 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -23,6 +23,7 @@ tasks.register('printVersion') { tasks.matching { it.name.startsWith('prepare') }.configureEach { doFirst { mkdir('run') + mkdir('run/client') mkdir('run/server') mkdir('run/gametest') mkdir('run/data') From d86f21ee0cb856f6189da462987cf45dcba1a273 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 10:19:29 +0300 Subject: [PATCH 14/20] Oh. right. oops. --- .../java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java index efb860d1f98..6739c5cd83e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -665,7 +665,7 @@ public class GTRecipeTypes { public static final GTRecipeType DUMMY_RECIPES = register("dummy", DUMMY) .setXEIVisible(false); - private static GTRecipeType register(String name, String group, RecipeType... proxyRecipes) { + protected static GTRecipeType register(String name, String group, RecipeType... proxyRecipes) { return register(GTCEu.id(name), group, proxyRecipes); } From 25d3e5903b78b2833d750af17b8a520eeddd2e39 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 11:07:57 +0300 Subject: [PATCH 15/20] Move KubeJS to extra client --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 04d2dd05aba..c7aa54c63f9 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -92,7 +92,7 @@ dependencies { // extraLocalRuntime(forge.worldstripper) localRuntime(forge.cc.tweaked.forge.impl) - localRuntime(forge.bundles.kjs) + extraLocalRuntime(forge.bundles.kjs) extraLocalRuntime(forge.ftblibrary) extraLocalRuntime(forge.ftbteams) From 916d8382d3246f26a1e142bfc5bf6d827bf57438 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 11:12:08 +0300 Subject: [PATCH 16/20] Splurdless --- .../java/com/gregtechceu/gtceu/common/CommonProxy.java | 1 - .../gtceu/integration/kjs/GregTechKubeJSPlugin.java | 8 -------- 2 files changed, 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 0107f20bec2..ddb4a4506dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -71,7 +71,6 @@ import com.gregtechceu.gtceu.data.recipe.*; import com.gregtechceu.gtceu.integration.cctweaked.CCTweakedPlugin; import com.gregtechceu.gtceu.integration.kjs.GTCEuStartupEvents; -import com.gregtechceu.gtceu.integration.kjs.GregTechKubeJSPlugin; import com.gregtechceu.gtceu.integration.kjs.events.MaterialModificationEventJS; import com.gregtechceu.gtceu.integration.map.WaypointManager; import com.gregtechceu.gtceu.utils.input.SyncedKeyMappings; 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 bbd00d1f451..da75535c515 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java @@ -74,8 +74,6 @@ import com.gregtechceu.gtceu.common.data.models.GTMachineModels; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveFancyUIWorkableMachine; -import com.gregtechceu.gtceu.data.pack.GTDynamicDataPack; -import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; import com.gregtechceu.gtceu.data.recipe.CraftingComponent; import com.gregtechceu.gtceu.data.recipe.GTCraftingComponents; import com.gregtechceu.gtceu.integration.kjs.builders.ElementBuilder; @@ -100,17 +98,13 @@ import com.gregtechceu.gtceu.integration.kjs.recipe.KJSHelpers; import com.gregtechceu.gtceu.integration.kjs.recipe.components.*; -import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.levelgen.placement.HeightRangePlacement; -import net.neoforged.neoforge.registries.RegisterEvent; -import dev.latvian.mods.kubejs.DevProperties; import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; import dev.latvian.mods.kubejs.event.EventGroupRegistry; import dev.latvian.mods.kubejs.plugin.ClassFilter; @@ -122,10 +116,8 @@ import dev.latvian.mods.kubejs.registry.RegistryObjectStorage; import dev.latvian.mods.kubejs.registry.ServerRegistryRegistry; import dev.latvian.mods.kubejs.script.BindingRegistry; -import dev.latvian.mods.kubejs.script.ConsoleJS; import dev.latvian.mods.kubejs.script.TypeWrapperRegistry; import dev.latvian.mods.rhino.Wrapper; -import org.jetbrains.annotations.ApiStatus; public class GregTechKubeJSPlugin implements KubeJSPlugin { From 3d075f2cf46c19c828db74937b5446259e5d2731 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 11:55:59 +0300 Subject: [PATCH 17/20] Right yea cant use automatic event listener discovery here --- src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java | 6 ++++++ ...tryEventHandler.java => KubeGTRegistryEventHandler.java} | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) rename src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/{RegistryEventHandler.java => KubeGTRegistryEventHandler.java} (96%) diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index ddb4a4506dd..35b9351ae77 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -72,6 +72,7 @@ import com.gregtechceu.gtceu.integration.cctweaked.CCTweakedPlugin; import com.gregtechceu.gtceu.integration.kjs.GTCEuStartupEvents; import com.gregtechceu.gtceu.integration.kjs.events.MaterialModificationEventJS; +import com.gregtechceu.gtceu.integration.kjs.helpers.KubeGTRegistryEventHandler; import com.gregtechceu.gtceu.integration.map.WaypointManager; import com.gregtechceu.gtceu.utils.input.SyncedKeyMappings; @@ -136,6 +137,11 @@ public class CommonProxy { public static void init(final IEventBus modBus) { CommonProxy.modBus = modBus; + if (GTCEu.Mods.isKubeJSLoaded()) { + // initialize this before the class's static listeners + // so KubeJS materials are registered before the material registry is closed. + modBus.register(KubeGTRegistryEventHandler.class); + } modBus.register(CommonProxy.class); UIFactory.register(MachineUIFactory.INSTANCE); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java rename to src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java index ae85eaa6d90..5f066d1a4e2 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/RegistryEventHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java @@ -11,7 +11,6 @@ import net.minecraft.resources.ResourceKey; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.registries.RegisterEvent; import dev.latvian.mods.kubejs.DevProperties; @@ -21,8 +20,7 @@ import dev.latvian.mods.kubejs.script.ScriptType; @SuppressWarnings({ "rawtypes", "unchecked" }) -@EventBusSubscriber(modid = GTCEu.MOD_ID) -public class RegistryEventHandler { +public class KubeGTRegistryEventHandler { @SubscribeEvent(priority = EventPriority.LOW) public static void registerAll(RegisterEvent event) { From 7540dff36c761b7668bb392514123dc020c8f963 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 12:40:40 +0300 Subject: [PATCH 18/20] Add doc comments pointing to original source of KJS registry event code --- .../gtceu/integration/kjs/events/GTRegistryKubeEvent.java | 7 +++++++ .../kjs/helpers/KubeGTRegistryEventHandler.java | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java index 71b86f0e709..aa91f60442c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java @@ -18,6 +18,13 @@ import java.util.List; import java.util.function.Supplier; +/** + * This is a copy of KubeJS's {@link RegistryKubeEvent} with minor modifications, licensed LGPL 3. Source + * + * @param The type of object to register + */ public class GTRegistryKubeEvent implements KubeStartupEvent, AdditionalObjectRegistry { private final ResourceKey> registryKey; 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 5f066d1a4e2..a776583efe8 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 @@ -19,6 +19,12 @@ import dev.latvian.mods.kubejs.script.ConsoleJS; import dev.latvian.mods.kubejs.script.ScriptType; +/** + * This is a copy of KubeJS's {@link dev.latvian.mods.kubejs.registry.RegistryEventHandler} with minor modifications, + * licensed LGPL 3. Source + */ @SuppressWarnings({ "rawtypes", "unchecked" }) public class KubeGTRegistryEventHandler { From 82f3fbf14d830d63c848b1300e7de57e8ed62046 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 12:41:07 +0300 Subject: [PATCH 19/20] Revert "Remove unused field in TagPrefixBuilder" This reverts commit 0180ccb732672f26c78542b8a4eee45d4aaeeedb. --- .../integration/kjs/builders/prefix/TagPrefixBuilder.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java index f851d1873ea..a51af258ec0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/prefix/TagPrefixBuilder.java @@ -15,8 +15,10 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import dev.latvian.mods.kubejs.registry.BuilderBase; +import lombok.Getter; import lombok.experimental.Accessors; +import java.util.ArrayList; import java.util.List; import java.util.function.*; @@ -24,7 +26,10 @@ @Accessors(chain = true) public class TagPrefixBuilder extends BuilderBase { - public transient final TagPrefix base; + public final TagPrefix base; + + @Getter + private final List secondaryMaterials = new ArrayList<>(); public TagPrefixBuilder(ResourceLocation id) { super(id); From 025ba7bac14aeff84ed6f1c25f8b1649822ca9e3 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 11 May 2026 12:41:25 +0300 Subject: [PATCH 20/20] Revert "Move client runs to run/client subdirectory" This reverts commit b51c734496c90b9467c0cec2d935d40a03f51725. --- gradle/scripts/moddevgradle.gradle | 3 --- gradle/scripts/resources.gradle | 1 - 2 files changed, 4 deletions(-) diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index bb8566b7e44..029ea70b32e 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -51,7 +51,6 @@ neoForge { sourceSet = sourceSets.clientExtra ideName = "Client 1" - gameDirectory.set(file('run/client')) systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) } @@ -60,7 +59,6 @@ neoForge { sourceSet = sourceSets.clientExtra ideName = "Client 2" - gameDirectory.set(file('run/client')) programArguments.addAll('--username', 'YoungOnion', '--uuid', '3a27782d-6864-4814-a9fe-7c6931f29a8a') systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) } @@ -81,7 +79,6 @@ neoForge { sourceSet = sourceSets.client ideName = "Clean Client" - gameDirectory.set(file('run/client')) systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) } diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index 9a7dace755d..1813194b7ac 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -23,7 +23,6 @@ tasks.register('printVersion') { tasks.matching { it.name.startsWith('prepare') }.configureEach { doFirst { mkdir('run') - mkdir('run/client') mkdir('run/server') mkdir('run/gametest') mkdir('run/data')