package com.cricketcraft.chisel.entity.fx;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
import com.cricketcraft.chisel.block.BlockSnakestoneObsidian;
import com.cricketcraft.chisel.utils.General;
public class EntitySnakestoneObsidianFX extends EntityFX {
BlockSnakestoneObsidian block;
double tx, ty, tz;
double speed;
public EntitySnakestoneObsidianFX(World world, BlockSnakestoneObsidian b, int x, int y, int z) {
super(world, x + 0.5, y + 0.5, z + 0.5, 0, 0, 0);
block = b;
particleScale = 0.5f + 0.5f * General.rand.nextFloat();
speed = 0.04 + 0.04 * General.rand.nextDouble();
particleMaxAge = (int) (Math.random() * 10.0D) + 40;
tx = x + General.rand.nextDouble();
ty = y + General.rand.nextDouble();
tz = z + General.rand.nextDouble();
switch (General.rand.nextInt(6)) {
case 0:
tx = x;
break;
case 1:
tx = x + 1;
break;
case 2:
ty = y;
break;
case 3:
ty = y + 1;
break;
case 4:
tz = z;
break;
case 5:
tz = z + 1;
break;
}
double dx = (tx - posX) * 3;
double dy = (ty - posY) * 3;
double dz = (tz - posZ) * 3;
setPosition(posX + dx, posY + dy, posZ + dz);
prevPosX = posX;
prevPosY = posY;
prevPosZ = posZ;
noClip = true;
setParticleIcon(block.particles[General.rand.nextInt(block.particles.length)]);
}
@Override
public int getFXLayer() {
return 1;
}
@Override
public void renderParticle(Tessellator tessellator, float partialTick, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
GL11.glDepthMask(false);
GL11.glEnable(3042);
GL11.glBlendFunc(770, 771);
super.renderParticle(tessellator, partialTick, rotX, rotXZ, rotZ, rotYZ, rotXY);
}
@Override
public void onUpdate() {
if (particleAge++ >= particleMaxAge) {
setDead();
return;
}
double dx = tx - posX;
double dy = ty - posY;
double dz = tz - posZ;
double distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
if (distance == 0) {
setDead();
return;
}
if (distance < 0.4) {
particleAlpha = (float) (distance / 0.4);
} else if (particleAge < 20) {
particleAlpha = 1.0f * particleAge / 20;
} else {
particleAlpha = 1.0f;
}
if (distance < speed) {
speed = distance;
}
prevPosX = posX;
prevPosY = posY;
prevPosZ = posZ;
double px = posX + dx / distance * speed;
double py = posY + dy / distance * speed;
double pz = posZ + dz / distance * speed;
setPosition(px, py, pz);
}
}