mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
182 lines
6.8 KiB
Java
182 lines
6.8 KiB
Java
package com.hbm.particle;
|
|
|
|
import java.awt.Color;
|
|
|
|
import org.lwjgl.opengl.GL11;
|
|
|
|
import com.hbm.lib.RefStrings;
|
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.particle.EntityFX;
|
|
import net.minecraft.client.renderer.Tessellator;
|
|
import net.minecraft.client.renderer.texture.TextureManager;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.util.ForgeDirection;
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public class ParticleFoundry extends EntityFX {
|
|
|
|
protected int color;
|
|
protected ForgeDirection dir;
|
|
/* how far the metal splooshes down from the base point */
|
|
protected double length;
|
|
/* the material coming right out of the faucet, either above or next to the base point */
|
|
protected double base;
|
|
/* how far the base part goes back */
|
|
protected double offset;
|
|
|
|
public static final ResourceLocation lava = new ResourceLocation(RefStrings.MODID + ":textures/blocks/lava_gray.png");
|
|
private TextureManager theRenderEngine;
|
|
|
|
public ParticleFoundry(TextureManager texan, World world, double x, double y, double z, int color, int direction, double length, double base, double offset) {
|
|
super(world, x, y, z);
|
|
this.color = color;
|
|
this.dir = ForgeDirection.getOrientation(direction);
|
|
this.theRenderEngine = texan; //it's a little texan man we enslaved to do the texture binding for us
|
|
this.length = length;
|
|
this.base = base;
|
|
this.offset = offset;
|
|
|
|
this.particleMaxAge = 20;
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate() {
|
|
|
|
this.prevPosX = this.posX;
|
|
this.prevPosY = this.posY;
|
|
this.prevPosZ = this.posZ;
|
|
|
|
if(this.particleAge++ >= this.particleMaxAge) {
|
|
this.setDead();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getFXLayer() {
|
|
return 3;
|
|
}
|
|
|
|
@Override
|
|
public void renderParticle(Tessellator tess, float interp, float x, float y, float z, float oX, float oZ) {
|
|
|
|
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
|
|
double dX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double)interp;
|
|
double dY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double)interp;
|
|
double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp;
|
|
|
|
float pX = (float) ((this.prevPosX + (this.posX - this.prevPosX) * (double) interp - dX));
|
|
float pY = (float) ((this.prevPosY + (this.posY - this.prevPosY) * (double) interp - dY));
|
|
float pZ = (float) ((this.prevPosZ + (this.posZ - this.prevPosZ) * (double) interp - dZ));
|
|
|
|
ForgeDirection rot = this.dir.getRotation(ForgeDirection.UP);
|
|
double width = 0.0625 + ((this.particleAge + interp) / this.particleMaxAge) * 0.0625;
|
|
double girth = 0.125 * (1 - ((this.particleAge + interp) / this.particleMaxAge));
|
|
|
|
Color color = new Color(this.color).brighter();
|
|
double brightener = 0.7D;
|
|
int r = (int) (255D - (255D - color.getRed()) * brightener);
|
|
int g = (int) (255D - (255D - color.getGreen()) * brightener);
|
|
int b = (int) (255D - (255D - color.getBlue()) * brightener);
|
|
|
|
GL11.glColor3f(r / 255F, g / 255F, b / 255F);
|
|
|
|
GL11.glPushMatrix();
|
|
GL11.glDisable(GL11.GL_CULL_FACE);
|
|
GL11.glDisable(GL11.GL_BLEND);
|
|
GL11.glTranslatef(pX, pY, pZ);
|
|
this.theRenderEngine.bindTexture(lava);
|
|
|
|
tess.startDrawingQuads();
|
|
tess.setNormal(0.0F, 1.0F, 0.0F);
|
|
tess.setBrightness(240);
|
|
|
|
double dirXG = dir.offsetX * girth;
|
|
double dirZG = dir.offsetZ * girth;
|
|
double rotXW = rot.offsetX * width;
|
|
double rotZW = rot.offsetZ * width;
|
|
|
|
double uMin = 0.5 - width;
|
|
double uMax = 0.5 + width;
|
|
double vMin = 0;
|
|
double vMax = length;
|
|
|
|
double add = (int)(System.currentTimeMillis() / 100 % 16) / 16D;
|
|
|
|
//lower back
|
|
tess.addVertexWithUV(rotXW, girth, rotZW, uMax, vMax + add + girth);
|
|
tess.addVertexWithUV(-rotXW, girth, -rotZW, uMin, vMax + add + girth);
|
|
tess.addVertexWithUV(-rotXW, -length, -rotZW, uMin, vMin + add);
|
|
tess.addVertexWithUV(rotXW, -length, rotZW, uMax, vMin + add);
|
|
|
|
//lower front
|
|
tess.addVertexWithUV(dirXG + rotXW, 0, dirZG + rotZW, uMax, vMax + add);
|
|
tess.addVertexWithUV(dirXG - rotXW, 0, dirZG - rotZW, uMin, vMax + add);
|
|
tess.addVertexWithUV(dirXG - rotXW, -length, dirZG - rotZW, uMin, vMin + add);
|
|
tess.addVertexWithUV(dirXG + rotXW, -length, dirZG + rotZW, uMax, vMin + add);
|
|
|
|
double wMin = 0;
|
|
double wMax = girth;
|
|
|
|
//lower left
|
|
tess.addVertexWithUV(rotXW, girth, rotZW, wMin, vMax + add + girth);
|
|
tess.addVertexWithUV(dirXG + rotXW, 0, dirZG + rotZW, wMax, vMax + add);
|
|
tess.addVertexWithUV(dirXG + rotXW, -length, dirZG + rotZW, wMax, vMin + add);
|
|
tess.addVertexWithUV(rotXW, -length, rotZW, wMin, vMin + add);
|
|
|
|
//lower right
|
|
tess.addVertexWithUV(-rotXW, girth, -rotZW, wMin, vMax + add + girth);
|
|
tess.addVertexWithUV(dirXG - rotXW, 0, dirZG - rotZW, wMax, vMax + add);
|
|
tess.addVertexWithUV(dirXG - rotXW, -length, dirZG - rotZW, wMax, vMin + add);
|
|
tess.addVertexWithUV(-rotXW, -length, -rotZW, wMin, vMin + add);
|
|
|
|
double dirOX = dir.offsetX * offset;
|
|
double dirOZ = dir.offsetZ * offset;
|
|
|
|
vMax = offset;
|
|
|
|
//upper back
|
|
tess.addVertexWithUV(rotXW, 0, rotZW, uMax, vMax - add);
|
|
tess.addVertexWithUV(-rotXW, 0, -rotZW, uMin, vMax - add);
|
|
tess.addVertexWithUV(-rotXW - dirOX, base, -rotZW - dirOZ, uMin, vMin - add);
|
|
tess.addVertexWithUV(rotXW - dirOX, base, rotZW - dirOZ, uMax, vMin - add);
|
|
|
|
//upper front
|
|
tess.addVertexWithUV(rotXW, girth, rotZW, uMax, vMax - add + 0.25);
|
|
tess.addVertexWithUV(-rotXW, girth, -rotZW, uMin, vMax - add + 0.25);
|
|
tess.addVertexWithUV(-rotXW - dirOX, base + girth, -rotZW - dirOZ, uMin, vMin - add + 0.25);
|
|
tess.addVertexWithUV(rotXW - dirOX, base + girth, rotZW - dirOZ, uMax, vMin - add + 0.25);
|
|
|
|
//upper left
|
|
tess.addVertexWithUV(rotXW, 0, rotZW, wMax, vMax - add + 0.75);
|
|
tess.addVertexWithUV(rotXW, girth, rotZW, wMin, vMax - add + 0.75);
|
|
tess.addVertexWithUV(rotXW - dirOX, base + girth, rotZW - dirOZ, wMin, vMin - add + 0.75);
|
|
tess.addVertexWithUV(rotXW - dirOX, base, rotZW - dirOZ, wMax, vMin - add + 0.75);
|
|
|
|
//upper right
|
|
tess.addVertexWithUV(-rotXW, 0, -rotZW, wMax, vMax - add + 0.75);
|
|
tess.addVertexWithUV(-rotXW, girth, -rotZW, wMin, vMax - add + 0.75);
|
|
tess.addVertexWithUV(-rotXW - dirOX, base + girth, -rotZW - dirOZ, wMin, vMin - add + 0.75);
|
|
tess.addVertexWithUV(-rotXW - dirOX, base, -rotZW - dirOZ, wMax, vMin - add + 0.75);
|
|
|
|
vMax = 0.125F;
|
|
|
|
//bend
|
|
tess.addVertexWithUV(dirXG + rotXW, 0, dirZG + rotZW, uMax, vMin + add + 0.75);
|
|
tess.addVertexWithUV(dirXG - rotXW, 0, dirZG - rotZW, uMin, vMin + add + 0.75);
|
|
tess.addVertexWithUV(-rotXW, girth, -rotZW, uMin, vMax + add + 0.75);
|
|
tess.addVertexWithUV(rotXW, girth, rotZW, uMax, vMax + add + 0.75);
|
|
|
|
tess.draw();
|
|
|
|
|
|
GL11.glColor3f(1F, 1F, 1F);
|
|
GL11.glEnable(GL11.GL_CULL_FACE);
|
|
GL11.glPopMatrix();
|
|
}
|
|
}
|