public class HantenParticle extends TextureSheetParticle {
	public static HantenParticleProvider provider(SpriteSet spriteSet) {
		return new HantenParticleProvider(spriteSet);
	}

	public static class HantenParticleProvider implements ParticleProvider<SimpleParticleType> {
		private final SpriteSet spriteSet;

		public HantenParticleProvider(SpriteSet spriteSet) {
			this.spriteSet = spriteSet;
		}

		public Particle createParticle(SimpleParticleType typeIn, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) {
			HantenParticle particle = new HantenParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet);
			class HantenRenderSequence {
				private ClientLevel world;

				private class HantenRenderer {
					public EntityModel model = new Modelbattle_nyanko(Minecraft.getInstance().getEntityModels().bakeLayer(Modelbattle_nyanko.LAYER_LOCATION));

					public HantenRenderer() {
						MinecraftForge.EVENT_BUS.register(this);
					}

					private float scale = (float) 1;
					private int rotX = (int) 0;
					private int rotY = (int) 0;
					private int rotZ = (int) 0;

					@SubscribeEvent
					public void render(RenderLevelStageEvent event) {
						if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_PARTICLES) {
							VertexConsumer consumer = Minecraft.getInstance().renderBuffers().bufferSource().getBuffer(RenderType.entityCutoutNoCull(new ResourceLocation("jisaku:textures/particle/hanten.png")));
							Vec3 camPos = event.getCamera().getPosition();
							double x = Mth.lerp(event.getPartialTick(), particle.xo, particle.x) - camPos.x();
							double y = Mth.lerp(event.getPartialTick(), particle.yo, particle.y) - camPos.y();
							double z = Mth.lerp(event.getPartialTick(), particle.zo, particle.z) - camPos.z();
							event.getPoseStack().pushPose();
							event.getPoseStack().translate(x, y, z);
							event.getPoseStack().mulPose(Axis.XP.rotationDegrees(180));
							event.getPoseStack().scale(scale, scale, scale);
							event.getPoseStack().mulPose(Axis.XP.rotationDegrees(rotX));
							event.getPoseStack().mulPose(Axis.YP.rotationDegrees(rotY));
							event.getPoseStack().mulPose(Axis.ZP.rotationDegrees(rotZ));
							model.renderToBuffer(event.getPoseStack(), consumer, particle.getLightColor(event.getPartialTick()), OverlayTexture.NO_OVERLAY, 1, 1, 1, 1);
							event.getPoseStack().popPose();
						}
					}
				}

				private HantenRenderer renderer;

				public void start(ClientLevel world) {
					this.renderer = new HantenRenderer();
					MinecraftForge.EVENT_BUS.register(this);
					this.world = world;
				}

				@SubscribeEvent
				public void tick(TickEvent.ClientTickEvent event) {
					if (!particle.isAlive())
						end();
				}

				private void end() {
					MinecraftForge.EVENT_BUS.unregister(renderer);
					MinecraftForge.EVENT_BUS.unregister(this);
				}
			}
			HantenRenderSequence sequence = new HantenRenderSequence();
			sequence.start(worldIn);
			return particle;
		}
	}

	private final SpriteSet spriteSet;

	protected HantenParticle(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.2f, 0.2f);
		this.lifetime = 10;
		this.gravity = 0f;
		this.hasPhysics = true;
		this.xd = vx * 1;
		this.yd = vy * 1;
		this.zd = vz * 1;
		this.setSpriteFromAge(spriteSet);
	}

	@Override
	public ParticleRenderType getRenderType() {
		return ParticleRenderType.NO_RENDER;
	}

	@Override
	public void tick() {
		super.tick();
		if (!this.removed) {
			this.setSprite(this.spriteSet.get((this.age / 2) % 1 + 1, 1));
		}
	}
}