package com.simibubi.create; import java.util.function.Supplier; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.modules.contraptions.particle.AirFlowParticleData; import com.simibubi.create.modules.contraptions.particle.ICustomParticle; import com.simibubi.create.modules.contraptions.particle.RotationIndicatorParticleData; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.ParticleManager; import net.minecraft.particles.IParticleData; import net.minecraft.particles.ParticleType; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.registries.IForgeRegistry; public enum AllParticles { ROTATION_INDICATOR(RotationIndicatorParticleData::new), AIR_FLOW(AirFlowParticleData::new), ; private ParticleEntry entry; private AllParticles(Supplier> typeFactory) { String asId = Lang.asId(this.name()); entry = new ParticleEntry(new ResourceLocation(Create.ID, asId), typeFactory); } public static void register(RegistryEvent.Register> event) { for (AllParticles particle : values()) particle.entry.register(event.getRegistry()); } @OnlyIn(Dist.CLIENT) public static void registerFactories(ParticleFactoryRegisterEvent event) { ParticleManager particles = Minecraft.getInstance().particles; for (AllParticles particle : values()) particle.entry.registerFactory(particles); } public ParticleType get() { return entry.getType(); } public String parameter() { return Lang.asId(name()); } private class ParticleEntry { Supplier> typeFactory; ParticleType type; ResourceLocation id; public ParticleEntry(ResourceLocation id, Supplier> typeFactory) { this.id = id; this.typeFactory = typeFactory; } ParticleType getType() { makeType(); return type; } void register(IForgeRegistry> registry) { makeType(); registry.register(type); } void makeType() { if (type == null) { type = typeFactory.get().createType(); type.setRegistryName(id); } } @OnlyIn(Dist.CLIENT) void registerFactory(ParticleManager particles) { makeType(); particles.registerFactory(type, typeFactory.get().getFactory()); } } }