Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
5bdfe0e
more registry stuff
gustovafing Jun 23, 2026
904abbc
move registry keys to seperate object
gustovafing Jun 23, 2026
7e70ac1
port forward some registration changes
gustovafing Jun 26, 2026
a3214bf
remove gt registry access
gustovafing Jun 26, 2026
a8d9cf1
organise
gustovafing Jun 29, 2026
465fb74
reorganise a few things
gustovafing Jul 16, 2026
a592d9c
store world gen layers in a proper registry
gustovafing Jul 16, 2026
ead68b5
a
gustovafing Jul 16, 2026
75f29fc
add more registration methods to registrate (WIP)
gustovafing Jul 16, 2026
2e6c66b
make all registration deferred
gustovafing Jul 16, 2026
7cf3cd6
fix material registration not working
gustovafing Jul 17, 2026
43695fa
fix some startup bugs
gustovafing Jul 17, 2026
1c10b72
get tests to pass
gustovafing Jul 17, 2026
6329c48
stop duplicating recipe types
gustovafing Jul 17, 2026
716b907
Add proper types/variable names to GTRegistryKubeEvent (thanks lat..)
screret Jul 18, 2026
367cefc
Disable spotless on the start of GregTechKubeJSPlugin so it can have …
screret Jul 18, 2026
1218f5f
Fix GT stuff's registration order
screret Jul 18, 2026
194f04d
Simplify GTRecipeTypeBuilder
screret Jul 18, 2026
c89d16f
Remove printing to KubeJS's logger
screret Jul 18, 2026
62a81f0
Get rid of the `KJSWrapping*Builder` classes
screret Jun 28, 2026
10de917
some organisation changes
gustovafing Jul 18, 2026
f5d5107
Add more nullability annotations and change MachineBuilder's generics…
screret Jun 28, 2026
8017065
make elements deferred
gustovafing Jul 18, 2026
0a52e49
Make machine registration use holders
screret Jun 28, 2026
a6f5542
Move registrate builders to `api.registry.registrate.builder`
screret Jul 18, 2026
e4100dc
Add a custom registry entry type for machines to simplify registering…
screret Jul 18, 2026
8f577f8
Use that custom entry type for machine registration
screret Jul 18, 2026
a6dd0f4
Merge branch 'refs/heads/gus/deferred-registration' into sc/deferred-…
screret Jul 18, 2026
09b5e03
Add a plain (+noconfig) builder/entry type that only has the registry…
screret Jul 18, 2026
bbb5928
Make world gen layer registration deferred
screret Jul 18, 2026
b4052fe
Make world gen layer registration deferred
screret Jul 18, 2026
e605565
fix compilation errors
screret Jul 18, 2026
38fa0a1
Remove unnecessary registry type wrappers
screret Jul 18, 2026
f39e96d
oops
gustovafing Jul 18, 2026
3cf9c72
Merge branch 'fork/screret/sc/deferred-registration-help/1.21' into g…
gustovafing Jul 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions docs/content/Modpacks/Changes/v9.0.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
title: "Version 9.0.0"
---


# Updating to `9.0.0`

## Registration Changes

GregTech content now follows proper registration standards for mc content using registries.

### For KJS

- Register material icon types with `GTCEuStartupEvents.materialIconType`

### For addons

**All content should now be registered via either your addon's registrate instance, or via a [deferred register](https://docs.neoforged.net/docs/1.21.1/concepts/registries/#deferredregister).**

The `GTCEuAPI.RegisterEvent` event has been removed, as content should now use registrate or deferred registers.

### Migration Regex

Some helpful regexes for migration are below:

##### Elements

Replace `public static final Element` with `public static final RegistryEntry<Element, Element>`

Replace `/= (new Element|((GTElements\.)?createAndRegister))/` with `= ADDON_REGISTRATE.element`

### Content registered via registrate.

The following should be registered via registrate:
- Materials - Use `REGISTRATE.material(String name)` to access the material builder.
- Elements - Use `REGISTRATE.element(...)` to register an element.
- Tag prefixes - Use the following methods:
- `REGISTRATE.tagPrefix(String name)`
- `REGISTRATE.tagPrefix(String name, boolean invertedName)`
- `REGISTRATE.oreTagPrefix(String name, TagKey<Block> miningToolTag)`
- Material icon sets - Use the following methods:
- `REGISTRATE.materialIconSet(String id)`
- `REGISTRATE.materialIconSet(String id, MaterialIconSet parent)`
- `REGISTRATE.materialIconSet(String id, @Nullable MaterialIconSet parent, boolean isRoot)`
- Recipe types - Use `REGISTRATE.recipeType(String name, String group, RecipeType<?>... proxyRecipes)`
- Recipe categories - Use `REGISTRATE.recipeCategory(String categoryName, GTRecipeType recipeType)`
- World gen layers - Use `REGISTRATE.simpleWorldGenLayer(...)`
- Medical conditions - Use `REGISTRATE.medicalCondition(...)`

### Other content

All other content should be registered via deferred registers.
Content that can be registered via registrate can also be registered via deferred registers, but registrate is recommended.

An exmaple of using a deferred register is shown below.
```java
class AddonCovers {

private static final DeferredRegistry<CoverDefinition> COVER_REGISTER =
DeferredRegister.create(GTRegistries.Keys.COVER, ADDON_MOD_ID);

public static final DeferredHolder<CoverDefinition, CoverDefinition> CUSTOM_COVER = COVER_REGISTER.create("addon_custom_cover",
() -> new CoverDefinition(ADDON.id("addon_custom_cover"), AddonCustomCover::new));

// The init function should be called at some point during your mod's construction (e.g. in your main mod file or mod startup file)
public static void init(IEventBus modBus) {
COVER_REGISTER.register(modBus);
}
}

```

### Other changes

- World gen layers now store their dimensions as `ResourceKey<Level>` rather than `ResourceLocation`
- Dimension markers now store their dimension as a `ResourceKey<Level>` rather than `ResourceLocation`
2 changes: 1 addition & 1 deletion docs/content/Modpacks/Examples/Parallel-Hatch-Part.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ GTCEuStartupEvents.registry("gtceu:machine", (event) => {
GTMachineModels.createWorkableTieredHullMachineModel(
GTCEu.id("block/machines/parallel_hatch_mk4") // (6)
)[
"andThen(com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder$ModelInitializer)"
"andThen(com.gregtechceu.gtceu.api.registry.registrate.builder.MachineBuilder$ModelInitializer)"
]((ctx, prov, model) => {
model.addReplaceableTextures("bottom", "top", "side");
})
Expand Down
6 changes: 3 additions & 3 deletions docs/content/Modpacks/Other-Topics/Ambiguous-Methods.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ GTCEuStartupEvents.registry('gtceu:machine', event => {

you'd get the error:
```
Error in 'GTCEuStartupEvents.registry': The choice of Java method com.gregtechceu.gtceu.api.registry.registrate.MultiblockMachineBuilder.tooltips matching JavaScript argument types (net.minecraft.network.chat.MutableComponent) is ambiguous; candidate methods are:
class com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder tooltips(java.util.List)
class com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder tooltips(net.minecraft.network.chat.Component[])
Error in 'GTCEuStartupEvents.registry': The choice of Java method com.gregtechceu.gtceu.api.registry.registrate.builder.MultiblockMachineBuilder.tooltips matching JavaScript argument types (net.minecraft.network.chat.MutableComponent) is ambiguous; candidate methods are:
class com.gregtechceu.gtceu.api.registry.registrate.builder.MachineBuilder tooltips(java.util.List)
class com.gregtechceu.gtceu.api.registry.registrate.builder.MachineBuilder tooltips(net.minecraft.network.chat.Component[])
```

In this case, there's ambiguity between the following 2 java functions:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
},
"min_y": 10,
"spread": {
"targets": "gtceu:plutonium_239"
"targets": "gtceu:plutonium"
},
"top": {
"layers": 2,
Expand Down
17 changes: 0 additions & 17 deletions src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,6 @@ public interface IGTAddon {
*/
GTRegistrate getRegistrate();

/**
* This runs after GTCEu has set up it's content. Set up GT loading-dependent (but NOT ones dependent on
*
* @apiNote DO NOT REGISTER ANY OF YOUR OWN CONTENT HERE, AS IF YOU DO, IT'LL REGISTER AS IF GTCEu REGISTERED IT
* AND YOUR DATAGEN AND EVENTS WILL <b><i>NOT</i></b> WORK AS EXPECTED, IF AT ALL.
*/
void gtInitComplete();

/**
* Call init on your custom IWorldGenLayer class(es) here
*
* @deprecated Subscribe to the {@code GTCEuAPI.RegisterEvent<ResourceLocation, IWorldGenLayer>} register event
* instead
*/
@Deprecated(forRemoval = true, since = "8.0.0")
default void registerWorldgenLayers() {}

/**
* Call init on your custom VeinGenerator class(es) here
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

import net.minecraft.core.Holder;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.Tag;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
Expand Down Expand Up @@ -75,7 +77,7 @@ public static Codec<List<Content>> contentCodec(RecipeCapability<?> capability)
*/
public T copyInner(T content) {
RegistryFriendlyByteBuf buf = new RegistryFriendlyByteBuf(Unpooled.buffer(),
GTRegistries.builtinRegistry(), ConnectionType.NEOFORGE);
RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY), ConnectionType.NEOFORGE);
serializer.toNetwork(buf, content);
return serializer.fromNetwork(buf);
}
Expand Down Expand Up @@ -194,7 +196,7 @@ public boolean isTickSlot(int index, IO io, GTRecipe recipe) {
private static DataResult<Holder.Reference<RecipeCapability<?>>> safeReference(Holder<RecipeCapability<?>> value) {
return value.getDelegate() instanceof Holder.Reference<RecipeCapability<?>> reference ?
DataResult.success(reference) : DataResult.error(
() -> "Unregistered holder in " + GTRegistries.RECIPE_CAPABILITY_REGISTRY + ": " + value);
() -> "Unregistered holder in " + GTRegistries.Keys.RECIPE_CAPABILITY + ": " + value);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.gregtechceu.gtceu.GTCEu;
import com.gregtechceu.gtceu.api.capability.ICoverable;
import com.gregtechceu.gtceu.client.renderer.cover.ICoverRenderer;
import com.gregtechceu.gtceu.client.renderer.cover.SimpleCoverRenderer;

import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
Expand Down Expand Up @@ -30,6 +31,10 @@ public interface TieredCoverBehaviourProvider {
@Getter
private final @Nullable Supplier<ICoverRenderer> coverRenderer;

public CoverDefinition(ResourceLocation id, CoverBehaviourProvider behaviorCreator) {
this(id, behaviorCreator, () -> () -> new SimpleCoverRenderer(id.withPath("block/cover/" + id.getPath())));
}

public CoverDefinition(ResourceLocation id, CoverBehaviourProvider behaviorCreator,
Supplier<Supplier<ICoverRenderer>> coverRenderer) {
this.behaviorCreator = behaviorCreator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ private void loadFilterFromItem() {
cover.coverHolder instanceof MachineCoverContainer mcc) {
var machine = MetaMachine.getMachine(mcc.getLevel(), mcc.getBlockPos());
if (machine != null) {
smart.setModeFromMachine(machine.getDefinition().getName());
// TODO make this use machines' definitions or full IDs?
smart.setModeFromMachine(machine.getDefinition().getId().getPath());
}
}
this.onFilterLoaded.accept(this.filter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@

import net.minecraft.core.component.DataComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.Level;

import lombok.Getter;
import org.jetbrains.annotations.Nullable;
Expand All @@ -18,6 +20,9 @@ public class DimensionMarker {

public static final int MAX_TIER = 99;

@Getter
public final ResourceKey<Level> dimension;

@Getter
public final int tier; // not only used to represent dimension tier, but also for sorting

Expand All @@ -26,7 +31,9 @@ public class DimensionMarker {

private final MemoizedSupplier<ItemStack> iconSupplier;

public DimensionMarker(int tier, Supplier<? extends ItemLike> supplier, @Nullable Component overrideName) {
public DimensionMarker(ResourceKey<Level> dim, int tier, Supplier<? extends ItemLike> supplier,
@Nullable Component overrideName) {
this.dimension = dim;
this.tier = tier;
this.overrideName = overrideName;
this.iconSupplier = GTMemoizer.memoize(() -> getStack(supplier.get().asItem()));
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.gregtechceu.gtceu.api.data.chemical.material;

import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate;

import net.minecraft.resources.ResourceLocation;

/**
Expand All @@ -21,7 +23,7 @@ public MarkerMaterial(ResourceLocation resourceLocation) {
}

@Override
protected void registerMaterial() {}
protected void registerMaterial(GTRegistrate registrate) {}

@Override
public void verifyMaterial() {}
Expand Down
Loading
Loading