Enhanced registries

This commit is contained in:
IThundxr 2025-02-20 16:08:24 -05:00
parent 7bf2be0ab9
commit 17fe7a31ed
Failed to generate hash of commit
6 changed files with 46 additions and 34 deletions

View file

@ -1,5 +1,7 @@
package com.simibubi.create.api.registry;
import java.lang.reflect.Field;
import org.jetbrains.annotations.ApiStatus;
import com.mojang.serialization.Lifecycle;
@ -10,18 +12,21 @@ import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType;
import com.simibubi.create.content.kinetics.fan.processing.FanProcessingType;
import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointType;
import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType;
import com.simibubi.create.foundation.mixin.accessor.BuiltInRegistriesAccessor;
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.Registry;
import net.minecraft.core.WritableRegistry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceKey;
/**
* Static registries added by Create.
*
* @see CreateRegistries
*/
public class CreateBuiltInRegistries {
public static final WritableRegistry<WritableRegistry<?>> ROOT_REGISTRY = getRootRegistry();
public static final Registry<ArmInteractionPointType> ARM_INTERACTION_POINT_TYPE = simple(CreateRegistries.ARM_INTERACTION_POINT_TYPE);
public static final Registry<FanProcessingType> FAN_PROCESSING_TYPE = simple(CreateRegistries.FAN_PROCESSING_TYPE);
public static final Registry<ItemAttributeType> ITEM_ATTRIBUTE_TYPE = simple(CreateRegistries.ITEM_ATTRIBUTE_TYPE);
@ -36,12 +41,24 @@ public class CreateBuiltInRegistries {
@SuppressWarnings("unchecked")
private static <T> Registry<T> register(ResourceKey<Registry<T>> key, WritableRegistry<T> registry) {
BuiltInRegistriesAccessor.getWRITABLE_REGISTRY().register(
ROOT_REGISTRY.register(
(ResourceKey<WritableRegistry<?>>) (Object) key, registry, Lifecycle.stable()
);
return registry;
}
@SuppressWarnings("unchecked")
private static WritableRegistry<WritableRegistry<?>> getRootRegistry() {
// an accessor can't be used here because BuiltInRegistries is loaded too early during datagen.
try {
Field field = BuiltInRegistries.class.getDeclaredField("WRITABLE_REGISTRY");
field.setAccessible(true);
return (WritableRegistry<WritableRegistry<?>>) field.get(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException("Create: Failed to get root registry", e);
}
}
@ApiStatus.Internal
public static void init() {
// make sure the class is loaded.

View file

@ -1,15 +0,0 @@
package com.simibubi.create.foundation.mixin;
import org.spongepowered.asm.mixin.Mixin;
import com.simibubi.create.api.registry.CreateBuiltInRegistries;
import net.minecraft.core.registries.BuiltInRegistries;
@Mixin(BuiltInRegistries.class)
public class BuiltInRegistriesMixin {
static {
// Mixin merges static blocks.
CreateBuiltInRegistries.init();
}
}

View file

@ -1,15 +0,0 @@
package com.simibubi.create.foundation.mixin.accessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.core.WritableRegistry;
import net.minecraft.core.registries.BuiltInRegistries;
@Mixin(BuiltInRegistries.class)
public interface BuiltInRegistriesAccessor {
@Accessor
static WritableRegistry<WritableRegistry<?>> getWRITABLE_REGISTRY() {
throw new AbstractMethodError();
}
}

View file

@ -0,0 +1,3 @@
{
"better_registry": "coremods/better_registry.js"
}

View file

@ -0,0 +1,24 @@
var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI')
// Necessary to fix forge being a terrible loader
function initializeCoreMod() {
return {
"registrycoremod": {
'target': {
'type': 'METHOD',
'class': 'net.minecraft.core.registries.BuiltInRegistries',
'methodName': '<clinit>',
'methodDesc': '()V'
},
'transformer': function (method) {
var CreateBuiltInRegistries = "com/simibubi/create/api/registry/CreateBuiltInRegistries";
var insn = ASMAPI.buildMethodCall(CreateBuiltInRegistries, "init", "()V", ASMAPI.MethodType.STATIC)
method.instructions.insertBefore(method.instructions.getLast(), insn)
return method;
}
}
}
}

View file

@ -9,7 +9,6 @@
"mixins": [
"ArmorTrimMixin",
"BlockItemMixin",
"BuiltInRegistriesMixin",
"ClientboundMapItemDataPacketMixin",
"CustomItemUseEffectsMixin",
"EntityMixin",
@ -23,7 +22,6 @@
"TestCommandMixin",
"WaterWheelFluidSpreadMixin",
"accessor.AbstractProjectileDispenseBehaviorAccessor",
"accessor.BuiltInRegistriesAccessor",
"accessor.DispenserBlockAccessor",
"accessor.FallingBlockEntityAccessor",
"accessor.FlowingFluidAccessor",