diff --git a/fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/registry/FabricRegistry.java b/fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/registry/FabricRegistry.java index e64b66f..72a71c3 100644 --- a/fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/registry/FabricRegistry.java +++ b/fabric/src/main/java/games/moegirl/sinocraft/sinocore/fabric/registry/FabricRegistry.java @@ -3,8 +3,7 @@ import com.google.common.base.Suppliers; import games.moegirl.sinocraft.sinocore.api.registry.IRegRef; import games.moegirl.sinocraft.sinocore.api.registry.IRegistry; -import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; -import net.fabricmc.fabric.api.event.registry.RegistryAttribute; +import games.moegirl.sinocraft.sinocore.api.registry.RegistryManager; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceKey; @@ -26,13 +25,7 @@ public FabricRegistry(String modId, ResourceKey> key) { this.modId = modId; this.key = key; - registry = (Registry) BuiltInRegistries.REGISTRY.get(key.location()); - if (registry == null) { - // 不存在的注册表 -- 创建自定义注册表 - registry = FabricRegistryBuilder.createSimple(key) - .attribute(RegistryAttribute.SYNCED) - .buildAndRegister(); - } + registry = RegistryManager.getOrCreateRegistry(key); sup = Suppliers.memoize(() -> (Registry) BuiltInRegistries.REGISTRY.get(key.location())); } diff --git a/fabric/src/main/java/games/moegirl/sinocraft/sinocore/platform/fabric/RegistryPlatformImpl.java b/fabric/src/main/java/games/moegirl/sinocraft/sinocore/platform/fabric/RegistryPlatformImpl.java index 7a446eb..c1ece3a 100644 --- a/fabric/src/main/java/games/moegirl/sinocraft/sinocore/platform/fabric/RegistryPlatformImpl.java +++ b/fabric/src/main/java/games/moegirl/sinocraft/sinocore/platform/fabric/RegistryPlatformImpl.java @@ -2,12 +2,22 @@ import games.moegirl.sinocraft.sinocore.api.registry.*; import games.moegirl.sinocraft.sinocore.fabric.registry.*; +import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; +import net.fabricmc.fabric.api.event.registry.RegistryAttribute; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import org.jetbrains.annotations.ApiStatus; @ApiStatus.Internal public class RegistryPlatformImpl { + public static Registry createRegistry(RegistryBuilder builder) { + var b = FabricRegistryBuilder.createSimple(builder.getKey()); + if (builder.isSync()) { + b.attribute(RegistryAttribute.SYNCED); + } + return b.buildAndRegister(); + } + public static IRegistry create(String modId, ResourceKey> key) { return new FabricRegistry<>(modId, key); } diff --git a/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/registry/NeoForgeRegistry.java b/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/registry/NeoForgeRegistry.java index 45331b3..27a42fc 100644 --- a/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/registry/NeoForgeRegistry.java +++ b/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/registry/NeoForgeRegistry.java @@ -2,19 +2,15 @@ import games.moegirl.sinocraft.sinocore.api.registry.IRegRef; import games.moegirl.sinocraft.sinocore.api.registry.IRegistry; +import games.moegirl.sinocraft.sinocore.api.registry.RegistryManager; import games.moegirl.sinocraft.sinocore.neoforge.util.ModBusHelper; import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredRegister; -import net.neoforged.neoforge.registries.NewRegistryEvent; -import net.neoforged.neoforge.registries.RegistryBuilder; -import org.jetbrains.annotations.NotNull; import java.util.*; -import java.util.function.Consumer; import java.util.function.Supplier; public class NeoForgeRegistry implements IRegistry { @@ -31,11 +27,10 @@ public NeoForgeRegistry(String modId, ResourceKey> key) { this.modId = modId; this.dr = DeferredRegister.create(key, modId); - if (!BuiltInRegistries.REGISTRY.containsKey(key.location())) { - bus.addListener((Consumer) event -> event.register(new RegistryBuilder<>(key) - .sync(true) - .create())); + if (!RegistryManager.hasRegistry(key)) { + RegistryManager.createRegistry(key); } + registered = false; } diff --git a/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/util/ModBusHelper.java b/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/util/ModBusHelper.java index b5657cc..817a4ea 100644 --- a/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/util/ModBusHelper.java +++ b/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/neoforge/util/ModBusHelper.java @@ -8,9 +8,9 @@ public class ModBusHelper { public static IEventBus getModBus(String modId) { if ("minecraft".equals(modId)) { - return getModBus("sinocore"); + throw new RuntimeException("Hey, Minecraft has no event bus!"); } - return Objects.requireNonNull(ModList.get().getModContainerById(modId).get().getEventBus()); + return Objects.requireNonNull(ModList.get().getModContainerById(modId).orElseThrow().getEventBus()); } } diff --git a/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/platform/neoforge/RegistryPlatformImpl.java b/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/platform/neoforge/RegistryPlatformImpl.java index 37132a3..eb8fab2 100644 --- a/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/platform/neoforge/RegistryPlatformImpl.java +++ b/neoforge/src/main/java/games/moegirl/sinocraft/sinocore/platform/neoforge/RegistryPlatformImpl.java @@ -1,11 +1,27 @@ package games.moegirl.sinocraft.sinocore.platform.neoforge; +import games.moegirl.sinocraft.sinocore.SinoCore; import games.moegirl.sinocraft.sinocore.api.registry.*; import games.moegirl.sinocraft.sinocore.neoforge.registry.*; +import games.moegirl.sinocraft.sinocore.neoforge.util.ModBusHelper; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; +import net.neoforged.neoforge.registries.NewRegistryEvent; + +import java.util.function.Consumer; public class RegistryPlatformImpl { + public static Registry createRegistry(RegistryBuilder builder) { + var b = new net.neoforged.neoforge.registries.RegistryBuilder(builder.getKey()); + b.sync(builder.isSync()); + var registry = b.create(); + + var bus = ModBusHelper.getModBus(SinoCore.MODID); + bus.addListener((Consumer) event -> event.register(registry)); + + return registry; + } + public static IRegistry create(String modId, ResourceKey> key) { return new NeoForgeRegistry<>(modId, key); } diff --git a/src/main/java/games/moegirl/sinocraft/sinocore/api/registry/RegistryBuilder.java b/src/main/java/games/moegirl/sinocraft/sinocore/api/registry/RegistryBuilder.java new file mode 100644 index 0000000..7b79eff --- /dev/null +++ b/src/main/java/games/moegirl/sinocraft/sinocore/api/registry/RegistryBuilder.java @@ -0,0 +1,42 @@ +package games.moegirl.sinocraft.sinocore.api.registry; + +import lombok.Getter; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; + +/** + * A builder for creating custom registries. + * + * @param Registry entry type. + * @see RegistryManager#createRegistry(RegistryBuilder) + */ +@Getter +public class RegistryBuilder { + private final ResourceKey> key; + + private boolean sync = false; + + public RegistryBuilder(ResourceKey> key) { + this.key = key; + } + + /** + * Set the registry to be synchronized to client. + * + * @return this + */ + public RegistryBuilder sync() { + return sync(true); + } + + /** + * Set whether the registry should be synchronized to client. + * + * @param value Whether to sync. + * @return this + */ + public RegistryBuilder sync(boolean value) { + this.sync = value; + return this; + } +} diff --git a/src/main/java/games/moegirl/sinocraft/sinocore/api/registry/RegistryManager.java b/src/main/java/games/moegirl/sinocraft/sinocore/api/registry/RegistryManager.java index 01930c5..3402980 100644 --- a/src/main/java/games/moegirl/sinocraft/sinocore/api/registry/RegistryManager.java +++ b/src/main/java/games/moegirl/sinocraft/sinocore/api/registry/RegistryManager.java @@ -4,8 +4,10 @@ import com.mojang.logging.LogUtils; import games.moegirl.sinocraft.sinocore.platform.RegistryPlatform; import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import java.util.ArrayList; @@ -41,6 +43,15 @@ private static > U appendRegistrable(Map Registry entry type. + * @param Registry type. + * @return List of registries. + */ @SuppressWarnings("unchecked") public static > List getRegistries(String modId, ResourceKey> key) { if (!REGISTRIES.containsKey(modId)) { @@ -57,6 +68,70 @@ public static > List getRegistries(String modId .build(); } + /** + * Check if a registry exists. + * + * @param key Registry key. + * @param Registry entry type. + * @return true if exists. + */ + public static boolean hasRegistry(ResourceKey> key) { + if (!key.isFor(BuiltInRegistries.REGISTRY.key())) { + return false; + } + return BuiltInRegistries.REGISTRY.containsKey(key.location()); + } + + /** + * Get a registry by its key. + * + * @param key Registry key. + * @param Registry entry type. + * @return The registry, or null if not found. + */ + @Nullable + @SuppressWarnings("unchecked") + public static Registry getRegistry(ResourceKey> key) { + return (Registry) BuiltInRegistries.REGISTRY.get(key.location()); + } + + /** + * Create a new registry (sync by default). + * + * @param key Registry key. + * @param Registry entry type. + * @return The created registry. + */ + public static Registry createRegistry(ResourceKey> key) { + return createRegistry(new RegistryBuilder<>(key).sync()); + } + + /** + * Create a new registry. + * + * @param builder Registry builder. + * @param Registry entry type. + * @return The created registry. + */ + public static Registry createRegistry(RegistryBuilder builder) { + return RegistryPlatform.createRegistry(builder); + } + + /** + * Get if the registry exists, otherwise create a new one (sync by default). + * + * @param key Registry key. + * @param Registry entry type. + * @return The registry. + */ + public static Registry getOrCreateRegistry(ResourceKey> key) { + Registry registry = getRegistry(key); + if (registry != null) { + return registry; + } + return createRegistry(key); + } + /** * 创建一个新的 SinoCore 注册表 *
    diff --git a/src/main/java/games/moegirl/sinocraft/sinocore/platform/RegistryPlatform.java b/src/main/java/games/moegirl/sinocraft/sinocore/platform/RegistryPlatform.java index afdda0f..4e0a1c7 100644 --- a/src/main/java/games/moegirl/sinocraft/sinocore/platform/RegistryPlatform.java +++ b/src/main/java/games/moegirl/sinocraft/sinocore/platform/RegistryPlatform.java @@ -8,6 +8,11 @@ @ApiStatus.Internal public class RegistryPlatform { + @ExpectPlatform + public static Registry createRegistry(RegistryBuilder builder) { + throw new AssertionError(); + } + @ExpectPlatform public static IRegistry create(String modId, ResourceKey> key) { throw new AssertionError();