From a7d31393a0efe8b6e5ea70f1fbfecf477ac51753 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 31 Jul 2022 18:48:38 +0200 Subject: [PATCH] Fix ParticleProviderRegistry not working properly on Forge, add Javadocs (#305) * Fix ParticleProviderRegistry not working properly on Forge, add Javadocs Based on https://github.com/architectury/architectury-api/pull/196#issuecomment-1200268981, supersedes #196 * Update testmod, fix bounds on deferred register * Warn when registering particles too late on Forge --- .../particle/ParticleProviderRegistry.java | 21 +++++++++++++++++++ .../forge/ParticleProviderRegistryImpl.java | 21 ++++++++++++------- gradle.properties | 2 +- .../test/particle/TestParticles.java | 4 +--- .../particles/test_particle.json | 0 .../particles/test_particle.json | 2 -- 6 files changed, 37 insertions(+), 13 deletions(-) rename {testmod-fabric => testmod-common}/src/main/resources/assets/architectury_test/particles/test_particle.json (100%) delete mode 100644 testmod-forge/src/main/resources/assets/architectury_test/particles/test_particle.json diff --git a/common/src/main/java/dev/architectury/registry/client/particle/ParticleProviderRegistry.java b/common/src/main/java/dev/architectury/registry/client/particle/ParticleProviderRegistry.java index 9f1bb711..63c4104d 100644 --- a/common/src/main/java/dev/architectury/registry/client/particle/ParticleProviderRegistry.java +++ b/common/src/main/java/dev/architectury/registry/client/particle/ParticleProviderRegistry.java @@ -19,7 +19,9 @@ package dev.architectury.registry.client.particle; +import dev.architectury.event.events.client.ClientLifecycleEvent; import dev.architectury.injectables.annotations.ExpectPlatform; +import dev.architectury.registry.registries.RegistrySupplier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.particle.ParticleProvider; @@ -31,6 +33,17 @@ import net.minecraft.core.particles.ParticleType; import java.util.List; +/** + * A utility class for registering custom {@link ParticleProvider}s for particle types. + *

+ * This class's methods should be invoked before {@link ClientLifecycleEvent#CLIENT_SETUP}, + * as doing so afterwards will result in the providers not being registered properly on Forge, causing crashes on startup. + *

+ * Generally speaking, you should either listen to the registration of your particle type yourself and use either + * {@link #register(ParticleType, ParticleProvider)} or {@link #register(ParticleType, DeferredParticleProvider)} to register the provider, + * or use the helper methods {@link #register(RegistrySupplier, ParticleProvider)} and {@link #register(RegistrySupplier, DeferredParticleProvider)}, + * which will automatically handle the listening for you. + */ @Environment(EnvType.CLIENT) public final class ParticleProviderRegistry { public interface ExtendedSpriteSet extends SpriteSet { @@ -39,6 +52,14 @@ public final class ParticleProviderRegistry { List getSprites(); } + public static void register(RegistrySupplier> supplier, ParticleProvider provider) { + supplier.listen(it -> register(it, provider)); + } + + public static void register(RegistrySupplier> supplier, DeferredParticleProvider provider) { + supplier.listen(it -> register(it, provider)); + } + @ExpectPlatform public static void register(ParticleType type, ParticleProvider provider) { throw new AssertionError(); diff --git a/forge/src/main/java/dev/architectury/registry/client/particle/forge/ParticleProviderRegistryImpl.java b/forge/src/main/java/dev/architectury/registry/client/particle/forge/ParticleProviderRegistryImpl.java index 952646f1..91253305 100644 --- a/forge/src/main/java/dev/architectury/registry/client/particle/forge/ParticleProviderRegistryImpl.java +++ b/forge/src/main/java/dev/architectury/registry/client/particle/forge/ParticleProviderRegistryImpl.java @@ -19,6 +19,7 @@ package dev.architectury.registry.client.particle.forge; +import com.mojang.logging.LogUtils; import dev.architectury.forge.ArchitecturyForge; import dev.architectury.registry.client.particle.ParticleProviderRegistry; import net.minecraft.client.Minecraft; @@ -33,13 +34,17 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import org.slf4j.Logger; import java.util.ArrayList; import java.util.List; import java.util.Random; -@Mod.EventBusSubscriber(modid = ArchitecturyForge.MOD_ID, value = Dist.CLIENT) +@Mod.EventBusSubscriber(modid = ArchitecturyForge.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class ParticleProviderRegistryImpl { + + public static final Logger LOGGER = LogUtils.getLogger(); + private static final class ExtendedSpriteSetImpl implements ParticleProviderRegistry.ExtendedSpriteSet { private final ParticleEngine engine; private final SpriteSet delegate; @@ -72,28 +77,30 @@ public class ParticleProviderRegistryImpl { private static ArrayList deferred = new ArrayList<>(); - private static void _register(ParticleType type, ParticleProvider provider) { + private static void doRegister(ParticleType type, ParticleProvider provider) { Minecraft.getInstance().particleEngine.register(type, provider); } - private static void _register(ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) { + private static void doRegister(ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) { Minecraft.getInstance().particleEngine.register(type, sprites -> provider.create(new ExtendedSpriteSetImpl(Minecraft.getInstance().particleEngine, sprites))); } public static void register(ParticleType type, ParticleProvider provider) { if (deferred == null) { - _register(type, provider); + LOGGER.warn("Something is attempting to register particle providers at a later point than intended! This might cause issues!", new Throwable()); + doRegister(type, provider); } else { - deferred.add(() -> _register(type, provider)); + deferred.add(() -> doRegister(type, provider)); } } public static void register(ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) { if (deferred == null) { - _register(type, provider); + LOGGER.warn("Something is attempting to register particle providers at a later point than intended! This might cause issues!", new Throwable()); + doRegister(type, provider); } else { - deferred.add(() -> _register(type, provider)); + deferred.add(() -> doRegister(type, provider)); } } diff --git a/gradle.properties b/gradle.properties index ae2a4f0f..17f53994 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ artifact_type=release archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot -base_version=4.6 +base_version=4.7 maven_group=dev.architectury fabric_loader_version=0.13.3 diff --git a/testmod-common/src/main/java/dev/architectury/test/particle/TestParticles.java b/testmod-common/src/main/java/dev/architectury/test/particle/TestParticles.java index 246afabd..dfa89af6 100644 --- a/testmod-common/src/main/java/dev/architectury/test/particle/TestParticles.java +++ b/testmod-common/src/main/java/dev/architectury/test/particle/TestParticles.java @@ -40,9 +40,7 @@ public class TestParticles { public static void initialize() { PARTICLE_TYPES.register(); if (Platform.getEnvironment() == Env.CLIENT) { - ClientLifecycleEvent.CLIENT_SETUP.register(instance -> { - ParticleProviderRegistry.register(TEST_PARTICLE.get(), HeartParticle.Provider::new); - }); + ParticleProviderRegistry.register(TEST_PARTICLE, HeartParticle.Provider::new); } } } diff --git a/testmod-fabric/src/main/resources/assets/architectury_test/particles/test_particle.json b/testmod-common/src/main/resources/assets/architectury_test/particles/test_particle.json similarity index 100% rename from testmod-fabric/src/main/resources/assets/architectury_test/particles/test_particle.json rename to testmod-common/src/main/resources/assets/architectury_test/particles/test_particle.json diff --git a/testmod-forge/src/main/resources/assets/architectury_test/particles/test_particle.json b/testmod-forge/src/main/resources/assets/architectury_test/particles/test_particle.json deleted file mode 100644 index 7a73a41b..00000000 --- a/testmod-forge/src/main/resources/assets/architectury_test/particles/test_particle.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file