diff --git a/src/main/java/dev/zenfyr/pulsar/api/client/particles/AbstractScreenParticle.java b/src/main/java/dev/zenfyr/pulsar/api/client/particles/AbstractScreenParticle.java index 001ffe0..fec101f 100644 --- a/src/main/java/dev/zenfyr/pulsar/api/client/particles/AbstractScreenParticle.java +++ b/src/main/java/dev/zenfyr/pulsar/api/client/particles/AbstractScreenParticle.java @@ -4,12 +4,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.ApiStatus; @Environment(EnvType.CLIENT) -public abstract class AbstractScreenParticle implements Renderable { +public abstract class AbstractScreenParticle { public double x, y, velX, velY; public double prevX, prevY; public int age = 0, deathAge = 200; @@ -27,7 +26,6 @@ public abstract class AbstractScreenParticle implements Renderable { this.client = Minecraft.getInstance(); } - @Override @ApiStatus.OverrideOnly public abstract void extractRenderState( GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta); @@ -45,14 +43,14 @@ public abstract class AbstractScreenParticle implements Renderable { } @ApiStatus.Internal - public final void extractRenderStateInternal( + public final void extractParticleRenderState( GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) { if (removed || (screen != null && client.screen != screen)) return; extractRenderState(graphics, mouseX, mouseY, delta); } @ApiStatus.Internal - public final void tickInternal() { + public final void tickParticle() { this.prevX = x; this.prevY = y; diff --git a/src/main/java/dev/zenfyr/pulsar/api/client/particles/ScreenParticleHelper.java b/src/main/java/dev/zenfyr/pulsar/api/client/particles/ScreenParticleHelper.java deleted file mode 100644 index 40d39f4..0000000 --- a/src/main/java/dev/zenfyr/pulsar/api/client/particles/ScreenParticleHelper.java +++ /dev/null @@ -1,253 +0,0 @@ -package dev.zenfyr.pulsar.api.client.particles; - -import dev.zenfyr.pulsar.api.util.MakeSure; -import dev.zenfyr.pulsar.impl.client.particles.GuiParticleRenderState; -import dev.zenfyr.pulsar.impl.client.particles.VanillaParticle; -import dev.zenfyr.pulsar.impl.client.particles.VanillaParticleManager; -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; -import java.util.function.Supplier; -import lombok.experimental.UtilityClass; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.renderer.state.level.ParticlesRenderState; -import net.minecraft.core.particles.ParticleOptions; -import org.jetbrains.annotations.ApiStatus; - -/** - *
provides tools for creating screen particles. {@link #addScreenParticle} methods, provide a way - * to create "screen bound" particles, meaning that they stop rendering when the screen they appeared on - * is closed.
- */ -@UtilityClass -@SuppressWarnings("unused") -@Environment(EnvType.CLIENT) -public final class ScreenParticleHelper { - - private static final Setprovides tools for creating screen particles. {@link #addParticle} methods accept a + * {@code screen} parameter, which binds that particle to that screen, + * meaning that they stop rendering when the screen they appeared on is closed.
+ */ +@ApiStatus.NonExtendable +public interface ScreenParticles { + + static ScreenParticles get(Minecraft client) { + return ((ScreenParticlesDuck) client).pulsar$getScreenParticles(); + } + + default void addParticle(AbstractScreenParticle particle) { + this.addParticle(null, particle); + } + + void addParticle(@Nullable Screen screen, @NotNull AbstractScreenParticle particle); + + default void addParticles(AbstractScreenParticle... particles) { + this.addParticles(null, particles); + } + + default void addParticles(Screen screen, AbstractScreenParticle... particles) { + for (AbstractScreenParticle particle : particles) { + this.addParticle(screen, particle); + } + } +} diff --git a/src/main/java/dev/zenfyr/pulsar/api/client/particles/VanillaParticles.java b/src/main/java/dev/zenfyr/pulsar/api/client/particles/VanillaParticles.java new file mode 100644 index 0000000..ec58e2a --- /dev/null +++ b/src/main/java/dev/zenfyr/pulsar/api/client/particles/VanillaParticles.java @@ -0,0 +1,47 @@ +package dev.zenfyr.pulsar.api.client.particles; + +import dev.zenfyr.pulsar.api.util.MathUtil; +import dev.zenfyr.pulsar.impl.client.particles.VanillaParticle; +import dev.zenfyr.pulsar.impl.client.particles.VanillaParticleManager; +import net.minecraft.client.particle.Particle; +import net.minecraft.core.particles.ParticleOptions; + +/** + * A utility class for creating screen particles based on vanilla particle types. + */ +public class VanillaParticles { + + public static AbstractScreenParticle create( + ParticleOptions options, double x, double y, double velX, double velY) { + return create(VanillaParticleManager.createScreenParticle(options, x, y, velX, velY, 0)); + } + + public static AbstractScreenParticle create( + ParticleOptions options, double x, double y, double velX, double velY, double velZ) { + return create(VanillaParticleManager.createScreenParticle(options, x, y, velX, velY, velZ)); + } + + public static AbstractScreenParticle[] create( + ParticleOptions options, + double x, + double y, + double deltaX, + double deltaY, + double speed, + int count) { + AbstractScreenParticle[] particles = new AbstractScreenParticle[count]; + for (int i = 0; i < count; i++) { + double offsetX = MathUtil.random().nextGaussian() * deltaX; + double offsetY = MathUtil.random().nextGaussian() * deltaY; + double velX = MathUtil.random().nextGaussian() * speed; + double velY = MathUtil.random().nextGaussian() * speed; + + particles[i] = create(options, x + offsetX, y + offsetY, velX, velY, 0); + } + return particles; + } + + public static AbstractScreenParticle create(Particle particle) { + return new VanillaParticle(particle); + } +} diff --git a/src/main/java/dev/zenfyr/pulsar/impl/client/particles/ScreenParticlesDuck.java b/src/main/java/dev/zenfyr/pulsar/impl/client/particles/ScreenParticlesDuck.java new file mode 100644 index 0000000..1d04a1a --- /dev/null +++ b/src/main/java/dev/zenfyr/pulsar/impl/client/particles/ScreenParticlesDuck.java @@ -0,0 +1,6 @@ +package dev.zenfyr.pulsar.impl.client.particles; + +public interface ScreenParticlesDuck { + + ScreenParticlesImpl pulsar$getScreenParticles(); +} diff --git a/src/main/java/dev/zenfyr/pulsar/impl/client/particles/ScreenParticlesImpl.java b/src/main/java/dev/zenfyr/pulsar/impl/client/particles/ScreenParticlesImpl.java new file mode 100644 index 0000000..ae6fd0f --- /dev/null +++ b/src/main/java/dev/zenfyr/pulsar/impl/client/particles/ScreenParticlesImpl.java @@ -0,0 +1,74 @@ +package dev.zenfyr.pulsar.impl.client.particles; + +import com.google.common.collect.EvictingQueue; +import dev.zenfyr.pulsar.api.client.particles.AbstractScreenParticle; +import dev.zenfyr.pulsar.api.client.particles.ScreenParticles; +import java.util.Queue; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.renderer.state.level.ParticlesRenderState; +import org.jetbrains.annotations.NotNull; + +public class ScreenParticlesImpl implements ScreenParticles { + + private final Queue
* Inspired by the removed {@code gesundheit} module of Lib39
*/
-@ApiStatus.Internal
@Environment(EnvType.CLIENT)
public class VanillaParticle extends AbstractScreenParticle {
final Particle particle;
- public VanillaParticle(
- ParticleOptions options, double x, double y, double velX, double velY, double velZ) {
- this(VanillaParticleManager.createScreenParticle(options, x, y, velX, velY, velZ));
- }
-
- public VanillaParticle(ParticleOptions options, double x, double y, double velX, double velY) {
- this(options, x, y, velX, velY, 0);
- }
-
public VanillaParticle(Particle particle) {
super(0, 0, 0, 0);
@@ -48,7 +33,7 @@ public class VanillaParticle extends AbstractScreenParticle {
@Override
public void extractRenderState(
GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) {
- // NOOP, rendered by the manager
+ // NOOP, rendered by the manager lol
}
@Override
diff --git a/src/main/java/dev/zenfyr/pulsar/impl/client/particles/VanillaParticleManager.java b/src/main/java/dev/zenfyr/pulsar/impl/client/particles/VanillaParticleManager.java
index ed1e20b..9d03e59 100644
--- a/src/main/java/dev/zenfyr/pulsar/impl/client/particles/VanillaParticleManager.java
+++ b/src/main/java/dev/zenfyr/pulsar/impl/client/particles/VanillaParticleManager.java
@@ -32,7 +32,7 @@ public class VanillaParticleManager {
private final Map