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) 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/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index ec40f54a10c..35b9351ae77 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -71,8 +71,8 @@ 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.kjs.helpers.KubeGTRegistryEventHandler; import com.gregtechceu.gtceu.integration.map.WaypointManager; import com.gregtechceu.gtceu.utils.input.SyncedKeyMappings; @@ -140,7 +140,7 @@ public static void init(final IEventBus 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(KubeGTRegistryEventHandler.class); } modBus.register(CommonProxy.class); 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..6739c5cd83e 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); + protected 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/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/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/GregTechKubeJSPlugin.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/GregTechKubeJSPlugin.java index daaf4cb184b..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,51 +116,11 @@ 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 { - @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/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..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 @@ -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; @@ -49,17 +48,14 @@ 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 i) { - super(GTResourceLocation.implicitAsGtceu(i)); + public GTRecipeTypeBuilder(ResourceLocation id) { + super(id); name = this.id.getPath(); category = "custom"; maxInputs = new Object2IntOpenHashMap<>(); @@ -138,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); 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); 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..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 @@ -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; @@ -43,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 @@ -51,10 +50,10 @@ 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(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..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 @@ -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; @@ -29,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; @@ -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..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 @@ -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; @@ -20,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; @@ -31,7 +29,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; } @@ -55,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; } @@ -65,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; } @@ -85,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; } @@ -110,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; } @@ -135,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; } 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/events/GTRegistryKubeEvent.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java new file mode 100644 index 00000000000..aa91f60442c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/events/GTRegistryKubeEvent.java @@ -0,0 +1,140 @@ +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; + +/** + * 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; + 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/GTResourceLocation.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/GTResourceLocation.java index 1e566e6b506..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 @@ -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; @@ -12,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; @@ -26,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(); @@ -47,7 +42,8 @@ public static GTResourceLocation wrap(@Nullable Object o) { } } }; - return new GTResourceLocation(id); + if (inner == null) return null; + return new GTResourceLocation(inner); } @Override @@ -70,8 +66,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/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java new file mode 100644 index 00000000000..a776583efe8 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/helpers/KubeGTRegistryEventHandler.java @@ -0,0 +1,86 @@ +package com.gregtechceu.gtceu.integration.kjs.helpers; + +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; + +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.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; + +/** + * 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 { + + @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) { + // 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++; + + // 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) { + KubeJS.LOGGER.info("Registered {}/{} objects of {}", added, objStorage.objects.size(), + registryKey.location()); + } + } +} 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",