thaumic-machinery/src/main/java/net/anvilcraft/thaummach/particles/FXWisp.java

235 lines
8.1 KiB
Java

package net.anvilcraft.thaummach.particles;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
public class FXWisp extends EntityFX {
public boolean shrink;
float moteParticleScale;
int moteHalfLife;
public boolean tinkle;
public int blendmode;
public FXWisp(
World world, double d, double d1, double d2, float f, float f1, float f2
) {
this(world, d, d1, d2, 1.0F, f, f1, f2);
}
public FXWisp(
World world, double d, double d1, double d2, float f, float f1, float f2, float f3
) {
super(world, d, d1, d2, 0.0, 0.0, 0.0);
this.shrink = false;
this.tinkle = false;
this.blendmode = 1;
if (f1 == 0.0F) {
f1 = 1.0F;
}
super.particleRed = f1;
super.particleGreen = f2;
super.particleBlue = f3;
super.particleGravity = 0.0F;
super.motionX = super.motionY = super.motionZ = 0.0;
super.particleScale *= f;
this.moteParticleScale = super.particleScale;
super.particleMaxAge = (int) (36.0 / (Math.random() * 0.3 + 0.7));
this.moteHalfLife = super.particleMaxAge / 2;
super.noClip = false;
}
public FXWisp(World world, double d, double d1, double d2, float f, int type) {
this(world, d, d1, d2, f, 0.0F, 0.0F, 0.0F);
switch (type) {
case 0:
super.particleRed = 0.75F + world.rand.nextFloat() * 0.25F;
super.particleGreen = 0.25F + world.rand.nextFloat() * 0.25F;
super.particleBlue = 0.75F + world.rand.nextFloat() * 0.25F;
break;
case 1:
super.particleRed = 0.5F + world.rand.nextFloat() * 0.3F;
super.particleGreen = 0.5F + world.rand.nextFloat() * 0.3F;
super.particleBlue = 0.2F;
break;
case 2:
super.particleRed = 0.2F;
super.particleGreen = 0.2F;
super.particleBlue = 0.7F + world.rand.nextFloat() * 0.3F;
break;
case 3:
super.particleRed = 0.2F;
super.particleGreen = 0.7F + world.rand.nextFloat() * 0.3F;
super.particleBlue = 0.2F;
break;
case 4:
super.particleRed = 0.7F + world.rand.nextFloat() * 0.3F;
super.particleGreen = 0.2F;
super.particleBlue = 0.2F;
break;
case 5:
this.blendmode = 771;
super.particleRed = world.rand.nextFloat() * 0.1F;
super.particleGreen = world.rand.nextFloat() * 0.1F;
super.particleBlue = world.rand.nextFloat() * 0.1F;
break;
case 6:
super.particleRed = 0.8F + world.rand.nextFloat() * 0.2F;
super.particleGreen = 0.8F + world.rand.nextFloat() * 0.2F;
super.particleBlue = 0.8F + world.rand.nextFloat() * 0.2F;
break;
case 7:
float rr = world.rand.nextFloat();
super.particleRed = 0.2F + rr * 0.3F;
super.particleGreen = 0.2F + rr * 0.3F;
super.particleBlue = 0.7F + world.rand.nextFloat() * 0.3F;
}
}
public FXWisp(
World world,
double d,
double d1,
double d2,
double x,
double y,
double z,
float f,
int type
) {
this(world, d, d1, d2, f, type);
double dx = x - super.posX;
double dy = y - super.posY;
double dz = z - super.posZ;
super.motionX = dx / (double) super.particleMaxAge;
super.motionY = dy / (double) super.particleMaxAge;
super.motionZ = dz / (double) super.particleMaxAge;
}
public void renderParticle(
Tessellator tessellator, float f, float f1, float f2, float f3, float f4, float f5
) {
float agescale = 0.0F;
if (this.shrink) {
agescale = ((float) super.particleMaxAge - (float) super.particleAge)
/ (float) super.particleMaxAge;
} else {
agescale = (float) super.particleAge / (float) this.moteHalfLife;
if (agescale > 1.0F) {
agescale = 2.0F - agescale;
}
}
super.particleScale = this.moteParticleScale * agescale;
tessellator.draw();
GL11.glPushMatrix();
GL11.glDepthMask(false);
GL11.glEnable(3042);
GL11.glBlendFunc(770, this.blendmode);
Minecraft.getMinecraft().renderEngine.bindTexture(
new ResourceLocation("thaummach", "textures/misc/p_large.png")
);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.75F);
float f10 = 0.5F * super.particleScale;
float f11 = (float
) (super.prevPosX + (super.posX - super.prevPosX) * (double) f
- EntityFX.interpPosX);
float f12 = (float
) (super.prevPosY + (super.posY - super.prevPosY) * (double) f
- EntityFX.interpPosY);
float f13 = (float
) (super.prevPosZ + (super.posZ - super.prevPosZ) * (double) f
- EntityFX.interpPosZ);
tessellator.startDrawingQuads();
tessellator.setBrightness(240);
tessellator.setColorRGBA_F(
super.particleRed, super.particleGreen, super.particleBlue, 0.5F
);
tessellator.addVertexWithUV(
(double) (f11 - f1 * f10 - f4 * f10),
(double) (f12 - f2 * f10),
(double) (f13 - f3 * f10 - f5 * f10),
0.0,
1.0
);
tessellator.addVertexWithUV(
(double) (f11 - f1 * f10 + f4 * f10),
(double) (f12 + f2 * f10),
(double) (f13 - f3 * f10 + f5 * f10),
1.0,
1.0
);
tessellator.addVertexWithUV(
(double) (f11 + f1 * f10 + f4 * f10),
(double) (f12 + f2 * f10),
(double) (f13 + f3 * f10 + f5 * f10),
1.0,
0.0
);
tessellator.addVertexWithUV(
(double) (f11 + f1 * f10 - f4 * f10),
(double) (f12 - f2 * f10),
(double) (f13 + f3 * f10 - f5 * f10),
0.0,
0.0
);
tessellator.draw();
GL11.glDisable(3042);
GL11.glDepthMask(true);
GL11.glPopMatrix();
Minecraft.getMinecraft().renderEngine.bindTexture(
new ResourceLocation("textures/particle/particles.png")
);
tessellator.startDrawingQuads();
}
public void onUpdate() {
EntityPlayer renderentity = Minecraft.getMinecraft().thePlayer;
int visibleDistance = 50;
if (renderentity.getDistance(super.posX, super.posY, super.posZ)
> (double) visibleDistance) {
this.setDead();
}
super.prevPosX = super.posX;
super.prevPosY = super.posY;
super.prevPosZ = super.posZ;
if (super.particleAge == 0 && this.tinkle
&& super.worldObj.rand.nextInt(3) == 0) {
super.worldObj.playSoundAtEntity(
this,
"random.orb",
0.02F,
0.5F
* ((super.worldObj.rand.nextFloat() - super.worldObj.rand.nextFloat())
* 0.6F
+ 2.0F)
);
}
if (super.particleAge++ >= super.particleMaxAge) {
this.setDead();
}
super.motionY -= 0.04 * (double) super.particleGravity;
this.moveEntity(super.motionX, super.motionY, super.motionZ);
super.motionX *= 0.9800000190734863;
super.motionY *= 0.9800000190734863;
super.motionZ *= 0.9800000190734863;
if (super.onGround) {
super.motionX *= 0.699999988079071;
super.motionZ *= 0.699999988079071;
}
}
public void setGravity(float value) {
super.particleGravity = value;
}
}