package com.atsuishio.superbwarfare.client.particle; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.*; import net.minecraft.core.particles.SimpleParticleType; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; @OnlyIn(Dist.CLIENT) public class CustomSmokeParticle extends TextureSheetParticle { public static FireStarParticleProvider provider(SpriteSet spriteSet) { return new FireStarParticleProvider(spriteSet); } public static class FireStarParticleProvider implements ParticleProvider { private final SpriteSet spriteSet; public FireStarParticleProvider(SpriteSet spriteSet) { this.spriteSet = spriteSet; } public Particle createParticle(@NotNull SimpleParticleType typeIn, @NotNull ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { return new CustomSmokeParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); } } private final SpriteSet spriteSet; protected CustomSmokeParticle(ClientLevel world, double x, double y, double z, double vx, double vy, double vz, SpriteSet spriteSet) { super(world, x, y, z); this.spriteSet = spriteSet; this.setSize(0.4f, 0.4f); this.quadSize *= 10f; this.lifetime = this.random.nextInt(200) + 600; this.gravity = 0.001f; this.hasPhysics = true; this.xd = vx * 0.9; this.yd = vy * 0.9; this.zd = vz * 0.9; this.setSpriteFromAge(spriteSet); } @Override public @NotNull ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } @Override public void tick() { super.tick(); if (!this.removed) { this.setSprite(this.spriteSet.get(Math.min((this.age / 8) + 1, 8), 8)); } if (this.age++ < this.lifetime && !(this.alpha <= 0.0F)) { if (this.age >= this.lifetime - 60 && this.alpha > 0.01F) { this.alpha -= 0.015F; } } else { this.remove(); } } }