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 extends ParticleType> supplier, ParticleProvider provider) {
+ supplier.listen(it -> register(it, provider));
+ }
+
+ public static void register(RegistrySupplier extends ParticleType> supplier, DeferredParticleProvider provider) {
+ supplier.listen(it -> register(it, provider));
+ }
+
@ExpectPlatform
public static void register(ParticleType type, ParticleProvider provider) {
throw new AssertionError();
diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json
index f4843666..13a1e039 100644
--- a/fabric/src/main/resources/fabric.mod.json
+++ b/fabric/src/main/resources/fabric.mod.json
@@ -36,7 +36,7 @@
"depends": {
"minecraft": "~1.19-",
"fabricloader": ">=0.13.0",
- "fabric": ">=0.50.0"
+ "fabric": ">=0.54.0"
},
"breaks": {
"optifabric": "<1.13.0"
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 75d4120f..ad3641ce 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;
@@ -34,13 +35,17 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RegisterParticleProvidersEvent;
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.function.Consumer;
-@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;
@@ -73,28 +78,30 @@ public class ParticleProviderRegistryImpl {
private static List> deferred = new ArrayList<>();
- private static void _register(ParticleProviderRegistrar registrar, ParticleType type, ParticleProvider provider) {
+ private static void doRegister(ParticleProviderRegistrar registrar, ParticleType type, ParticleProvider provider) {
registrar.register(type, provider);
}
- private static void _register(ParticleProviderRegistrar registrar, ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) {
+ private static void doRegister(ParticleProviderRegistrar registrar, ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) {
registrar.register(type, sprites ->
provider.create(new ExtendedSpriteSetImpl(Minecraft.getInstance().particleEngine, sprites)));
}
public static void register(ParticleType type, ParticleProvider provider) {
if (deferred == null) {
- _register(ParticleProviderRegistrar.ofFallback(), type, provider);
+ LOGGER.warn("Something is attempting to register particle providers at a later point than intended! This might cause issues!", new Throwable());
+ doRegister(ParticleProviderRegistrar.ofFallback(), type, provider);
} else {
- deferred.add(registrar -> _register(registrar, type, provider));
+ deferred.add(registrar -> doRegister(registrar, type, provider));
}
}
public static void register(ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) {
if (deferred == null) {
- _register(ParticleProviderRegistrar.ofFallback(), type, provider);
+ LOGGER.warn("Something is attempting to register particle providers at a later point than intended! This might cause issues!", new Throwable());
+ doRegister(ParticleProviderRegistrar.ofFallback(), type, provider);
} else {
- deferred.add(registrar -> _register(registrar, type, provider));
+ deferred.add(registrar -> doRegister(registrar, type, provider));
}
}
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