2024-08-10 23:10:28 +02:00

125 lines
4.0 KiB
Java

package com.hbm.particle;
import java.util.Random;
import org.lwjgl.opengl.GL11;
import com.hbm.wiaj.WorldInAJar;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
public class ParticleDebris extends EntityFX {
private RenderBlocks renderer;
public WorldInAJar world;
public static Random rng = new Random();
public ParticleDebris(World world, double x, double y, double z) {
super(world, x, y, z);
}
public ParticleDebris(World world, double x, double y, double z, double mx, double my, double mz) {
super(world, x, y, z);
double mult = 3;
this.motionX = mx * mult;
this.motionY = my * mult;
this.motionZ = mz * mult;
this.particleMaxAge = 100;
this.particleGravity = 0.15F;
this.noClip = true;
}
@Override
public int getFXLayer() {
return 3;
}
@Override
public void onUpdate() {
this.prevPosX = this.posX;
this.prevPosY = this.posY;
this.prevPosZ = this.posZ;
if(this.particleAge > 5) this.noClip = false;
rng.setSeed(this.getEntityId());
this.prevRotationPitch = this.rotationPitch;
this.prevRotationYaw = this.rotationYaw;
this.rotationPitch += rng.nextFloat() * 10;
this.rotationYaw += rng.nextFloat() * 10;
if(this.getEntityId() % 3 == 0) {
TextureManager man = Minecraft.getMinecraft().renderEngine;
ParticleRocketFlame fx = new ParticleRocketFlame(man, worldObj, posX, posY, posZ).setScale(1F * Math.max(world.sizeY, 6) / 16F);
fx.prevPosX = fx.posX;
fx.prevPosY = fx.posY;
fx.prevPosZ = fx.posZ;
fx.setMaxAge(50);
Minecraft.getMinecraft().effectRenderer.addEffect(fx);
}
this.motionY -= this.particleGravity;
this.moveEntity(this.motionX, this.motionY, this.motionZ);
this.particleAge++;
if(this.onGround || this.isInWeb) this.setDead();
}
@Override
public void renderParticle(Tessellator tess, float interp, float fX, float fY, float fZ, float sX, float sZ) {
if(world == null) return;
if(renderer == null) {
renderer = new RenderBlocks(world);
}
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));
renderer.enableAO = true;
world.lightlevel = worldObj.getLightBrightnessForSkyBlocks((int) Math.floor(posX), (int) Math.floor(posY), (int) Math.floor(posZ), 0);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_BLEND);
//OpenGlHelper.glBlendFunc(770, 771, 1, 0);
GL11.glPushMatrix();
GL11.glTranslatef(pX, pY, pZ);
GL11.glRotated(prevRotationPitch + (rotationPitch - prevRotationPitch) * interp, 0, 1, 0);
GL11.glRotated(prevRotationYaw + (rotationYaw - prevRotationYaw) * interp, 0, 0, 1);
GL11.glTranslated(-world.sizeX / 2D, -world.sizeY / 2D, -world.sizeZ / 2D);
Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture);
GL11.glShadeModel(GL11.GL_SMOOTH);
Tessellator.instance.startDrawingQuads();
for(int ix = 0; ix < world.sizeX; ix++) {
for(int iy = 0; iy < world.sizeY; iy++) {
for(int iz = 0; iz < world.sizeZ; iz++) {
try { renderer.renderBlockByRenderType(world.getBlock(ix, iy, iz), ix, iy, iz); } catch(Exception ex) { }
}
}
}
Tessellator.instance.draw();
GL11.glShadeModel(GL11.GL_FLAT);
GL11.glPopMatrix();
}
}