package net.minecraft.client.particle; import com.google.common.collect.EvictingQueue; import java.util.Iterator; import java.util.Queue; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; import net.minecraft.ReportedException; import net.minecraft.client.Camera; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.state.level.ParticleGroupRenderState; @Environment(EnvType.CLIENT) public abstract class ParticleGroup
{ private static final int MAX_PARTICLES = 16384; protected final ParticleEngine engine; protected final Queue
particles = EvictingQueue.create(16384); public ParticleGroup(final ParticleEngine engine) { this.engine = engine; } public boolean isEmpty() { return this.particles.isEmpty(); } public void tickParticles() { if (!this.particles.isEmpty()) { Iterator
iterator = this.particles.iterator(); while (iterator.hasNext()) { P particle = (P)iterator.next(); this.tickParticle(particle); if (!particle.isAlive()) { particle.getParticleLimit().ifPresent(options -> this.engine.updateCount(options, -1)); iterator.remove(); } } } } private void tickParticle(final Particle particle) { try { particle.tick(); } catch (Throwable var5) { CrashReport report = CrashReport.forThrowable(var5, "Ticking Particle"); CrashReportCategory category = report.addCategory("Particle being ticked"); category.setDetail("Particle", particle::toString); category.setDetail("Particle Type", particle.getGroup()::toString); throw new ReportedException(report); } } public void add(final Particle particle) { this.particles.add(particle); } public int size() { return this.particles.size(); } public abstract ParticleGroupRenderState extractRenderState(Frustum frustum, Camera camera, float partialTickTime); public Queue
getAll() { return this.particles; } }