mirror of
https://github.com/Ellpeck/NaturesAura.git
synced 2024-06-30 05:56:34 +02:00
100 lines
4.4 KiB
Java
100 lines
4.4 KiB
Java
package de.ellpeck.naturesaura.particles;
|
|
|
|
import de.ellpeck.naturesaura.NaturesAura;
|
|
import net.minecraft.client.particle.IParticleRenderType;
|
|
import net.minecraft.client.particle.Particle;
|
|
import net.minecraft.client.renderer.ActiveRenderInfo;
|
|
import net.minecraft.client.renderer.BufferBuilder;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.api.distmarker.Dist;
|
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
public class ParticleMagic extends Particle {
|
|
|
|
public static final ResourceLocation TEXTURE = new ResourceLocation(NaturesAura.MOD_ID, "textures/particles/magic_round.png");
|
|
|
|
private final float desiredScale;
|
|
private final boolean fade;
|
|
private float particleScale;
|
|
|
|
public ParticleMagic(World world, double posX, double posY, double posZ, double motionX, double motionY, double motionZ, int color, float scale, int maxAge, float gravity, boolean collision, boolean fade) {
|
|
super(world, posX, posY, posZ);
|
|
this.desiredScale = scale;
|
|
this.maxAge = maxAge;
|
|
this.canCollide = collision;
|
|
this.particleGravity = gravity;
|
|
this.fade = fade;
|
|
|
|
this.motionX = motionX;
|
|
this.motionY = motionY;
|
|
this.motionZ = motionZ;
|
|
|
|
float r = (((color >> 16) & 255) / 255F) * (1F - this.rand.nextFloat() * 0.25F);
|
|
float g = (((color >> 8) & 255) / 255F) * (1F - this.rand.nextFloat() * 0.25F);
|
|
float b = ((color & 255) / 255F) * (1F - this.rand.nextFloat() * 0.25F);
|
|
this.setColor(r, g, b);
|
|
|
|
this.particleAlpha = 1F;
|
|
this.particleScale = 0F;
|
|
}
|
|
|
|
@Override
|
|
public void tick() {
|
|
this.prevPosX = this.posX;
|
|
this.prevPosY = this.posY;
|
|
this.prevPosZ = this.posZ;
|
|
|
|
this.age++;
|
|
if (this.age > this.maxAge) {
|
|
this.setExpired();
|
|
} else {
|
|
this.motionY -= 0.04D * (double) this.particleGravity;
|
|
this.move(this.motionX, this.motionY, this.motionZ);
|
|
|
|
float lifeRatio = (float) this.age / (float) this.maxAge;
|
|
if (this.fade && lifeRatio > 0.75F)
|
|
this.particleAlpha = 1F - (lifeRatio - 0.75F) / 0.25F;
|
|
if (lifeRatio <= 0.25F)
|
|
this.particleScale = this.desiredScale * (lifeRatio / 0.25F);
|
|
else if (this.fade)
|
|
this.particleScale = this.desiredScale * (1F - (lifeRatio - 0.25F) / 0.75F);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void renderParticle(BufferBuilder buffer, ActiveRenderInfo entityIn, float partialTicks, float rotationX, float rotationZ, float rotationYZ, float rotationXY, float rotationXZ) {
|
|
double x = this.prevPosX + (this.posX - this.prevPosX) * partialTicks - interpPosX;
|
|
double y = this.prevPosY + (this.posY - this.prevPosY) * partialTicks - interpPosY;
|
|
double z = this.prevPosZ + (this.posZ - this.prevPosZ) * partialTicks - interpPosZ;
|
|
float sc = 0.1F * this.particleScale;
|
|
|
|
int brightness = this.getBrightnessForRender(partialTicks);
|
|
int sky = brightness >> 16 & 0xFFFF;
|
|
int block = brightness & 0xFFFF;
|
|
|
|
buffer.pos(x + (-rotationX * sc - rotationXY * sc), y + -rotationZ * sc, z + (-rotationYZ * sc - rotationXZ * sc))
|
|
.tex(0, 1).color(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha)
|
|
.lightmap(sky, block).endVertex();
|
|
buffer.pos(x + (-rotationX * sc + rotationXY * sc), y + (rotationZ * sc), z + (-rotationYZ * sc + rotationXZ * sc))
|
|
.tex(1, 1).color(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha)
|
|
.lightmap(sky, block).endVertex();
|
|
buffer.pos(x + (rotationX * sc + rotationXY * sc), y + (rotationZ * sc), z + (rotationYZ * sc + rotationXZ * sc))
|
|
.tex(1, 0).color(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha)
|
|
.lightmap(sky, block).endVertex();
|
|
buffer.pos(x + (rotationX * sc - rotationXY * sc), y + (-rotationZ * sc), z + (rotationYZ * sc - rotationXZ * sc))
|
|
.tex(0, 0).color(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha)
|
|
.lightmap(sky, block).endVertex();
|
|
}
|
|
|
|
@Override
|
|
public IParticleRenderType getRenderType() {
|
|
return IParticleRenderType.CUSTOM;
|
|
}
|
|
|
|
@Override
|
|
public int getBrightnessForRender(float f) {
|
|
return 15 << 20 | 15 << 4;
|
|
}
|
|
} |