auracore/src/main/java/dev/tilera/auracore/client/FXSparkle.java
Timo Ley aca1f55d3e
All checks were successful
continuous-integration/drone/tag Build is passing
Initial release
2022-11-19 12:16:58 +01:00

257 lines
11 KiB
Java

package dev.tilera.auracore.client;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import thaumcraft.client.lib.UtilsFX;
public class FXSparkle extends EntityFX {
public boolean leyLineEffect = false;
public int multiplier = 2;
public boolean shrink = true;
public int particle = 16;
public boolean tinkle = false;
public int blendmode = 1;
public boolean slowdown = true;
public int currentColor = 0;
public FXSparkle(World world, double d, double d1, double d2, float f, float f1, float f2, float f3, int m) {
super(world, d, d1, d2, 0.0, 0.0, 0.0);
if (f1 == 0.0f) {
f1 = 1.0f;
}
this.particleRed = f1;
this.particleGreen = f2;
this.particleBlue = f3;
this.particleGravity = 0.0f;
(this).motionZ = 0.0;
(this).motionY = 0.0;
(this).motionX = 0.0;
this.particleScale *= f;
this.particleMaxAge = 3 * m;
this.multiplier = m;
(this).noClip = false;
this.setSize(0.01f, 0.01f);
(this).prevPosX = (this).posX;
(this).prevPosY = (this).posY;
(this).prevPosZ = (this).posZ;
}
public FXSparkle(World world, double d, double d1, double d2, float f, int type, int m) {
this(world, d, d1, d2, f, 0.0f, 0.0f, 0.0f, m);
this.currentColor = type;
switch (type) {
case 0: {
this.particleRed = 0.75f + world.rand.nextFloat() * 0.25f;
this.particleGreen = 0.25f + world.rand.nextFloat() * 0.25f;
this.particleBlue = 0.75f + world.rand.nextFloat() * 0.25f;
break;
}
case 1: {
this.particleRed = 0.5f + world.rand.nextFloat() * 0.3f;
this.particleGreen = 0.5f + world.rand.nextFloat() * 0.3f;
this.particleBlue = 0.2f;
break;
}
case 2: {
this.particleRed = 0.2f;
this.particleGreen = 0.2f;
this.particleBlue = 0.7f + world.rand.nextFloat() * 0.3f;
break;
}
case 3: {
this.particleRed = 0.2f;
this.particleGreen = 0.7f + world.rand.nextFloat() * 0.3f;
this.particleBlue = 0.2f;
break;
}
case 4: {
this.particleRed = 0.7f + world.rand.nextFloat() * 0.3f;
this.particleGreen = 0.2f;
this.particleBlue = 0.2f;
break;
}
case 5: {
this.blendmode = 771;
this.particleRed = world.rand.nextFloat() * 0.1f;
this.particleGreen = world.rand.nextFloat() * 0.1f;
this.particleBlue = world.rand.nextFloat() * 0.1f;
break;
}
case 6: {
this.particleRed = 0.8f + world.rand.nextFloat() * 0.2f;
this.particleGreen = 0.8f + world.rand.nextFloat() * 0.2f;
this.particleBlue = 0.8f + world.rand.nextFloat() * 0.2f;
break;
}
case 7: {
this.particleRed = 0.2f;
this.particleGreen = 0.5f + world.rand.nextFloat() * 0.3f;
this.particleBlue = 0.6f + world.rand.nextFloat() * 0.3f;
}
}
}
public FXSparkle(World world, double d, double d1, double d2, double x, double y, double z, float f, int type, int m) {
this(world, d, d1, d2, f, type, m);
double dx = x - (this).posX;
double dy = y - (this).posY;
double dz = z - (this).posZ;
(this).motionX = dx / (double)this.particleMaxAge;
(this).motionY = dy / (double)this.particleMaxAge;
(this).motionZ = dz / (double)this.particleMaxAge;
}
@Override
public void renderParticle(Tessellator tessellator, float f, float f1, float f2, float f3, float f4, float f5) {
tessellator.draw();
GL11.glPushMatrix();
GL11.glDepthMask((boolean)false);
GL11.glEnable((int)3042);
GL11.glBlendFunc((int)770, (int)this.blendmode);
UtilsFX.bindTexture(new ResourceLocation("auracore", "textures/misc/particles.png"));
GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)0.75f);
int part = this.particle + this.particleAge / this.multiplier;
float var8 = (float)(part % 8) / 8.0f;
float var9 = var8 + 0.124875f;
float var10 = (float)(part / 8) / 8.0f;
float var11 = var10 + 0.124875f;
float var12 = 0.1f * this.particleScale;
if (this.shrink) {
var12 *= (float)(this.particleMaxAge - this.particleAge + 1) / (float)this.particleMaxAge;
}
float var13 = (float)((this).prevPosX + ((this).posX - (this).prevPosX) * (double)f - EntityFX.interpPosX);
float var14 = (float)((this).prevPosY + ((this).posY - (this).prevPosY) * (double)f - EntityFX.interpPosY);
float var15 = (float)((this).prevPosZ + ((this).posZ - (this).prevPosZ) * (double)f - EntityFX.interpPosZ);
float var16 = 1.0f;
tessellator.startDrawingQuads();
tessellator.setBrightness(240);
tessellator.setColorRGBA_F(this.particleRed * var16, this.particleGreen * var16, this.particleBlue * var16, 1.0f);
tessellator.addVertexWithUV((double)(var13 - f1 * var12 - f4 * var12), (double)(var14 - f2 * var12), (double)(var15 - f3 * var12 - f5 * var12), (double)var9, (double)var11);
tessellator.addVertexWithUV((double)(var13 - f1 * var12 + f4 * var12), (double)(var14 + f2 * var12), (double)(var15 - f3 * var12 + f5 * var12), (double)var9, (double)var10);
tessellator.addVertexWithUV((double)(var13 + f1 * var12 + f4 * var12), (double)(var14 + f2 * var12), (double)(var15 + f3 * var12 + f5 * var12), (double)var8, (double)var10);
tessellator.addVertexWithUV((double)(var13 + f1 * var12 - f4 * var12), (double)(var14 - f2 * var12), (double)(var15 + f3 * var12 - f5 * var12), (double)var8, (double)var11);
tessellator.draw();
GL11.glDisable((int)3042);
GL11.glDepthMask((boolean)true);
GL11.glPopMatrix();
UtilsFX.bindTexture(new ResourceLocation("textures/particle/particles.png"));
tessellator.startDrawingQuads();
}
@Override
public void onUpdate() {
(this).prevPosX = (this).posX;
(this).prevPosY = (this).posY;
(this).prevPosZ = (this).posZ;
if (this.particleAge == 0 && this.tinkle && this.worldObj.rand.nextInt(10) == 0) {
(this).worldObj.playSoundAtEntity(this, "random.orb", 0.02f, 0.7f * ((this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.6f + 2.0f));
}
if (this.particleAge++ >= this.particleMaxAge) {
this.setDead();
}
(this).motionY -= 0.04 * (double)this.particleGravity;
if (!(this).noClip) {
this.func_145771_j((this).posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0, (this).posZ);
}
(this).posX += (this).motionX;
(this).posY += (this).motionY;
(this).posZ += (this).motionZ;
if (this.slowdown) {
(this).motionX *= 0.9080000019073486;
(this).motionY *= 0.9080000019073486;
(this).motionZ *= 0.9080000019073486;
if ((this).onGround) {
(this).motionX *= (double)0.7f;
(this).motionZ *= (double)0.7f;
}
}
if (this.leyLineEffect) {
FXSparkle fx = new FXSparkle((this).worldObj, (this).prevPosX + (double)((this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.1f), (this).prevPosY + (double)((this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.1f), (this).prevPosZ + (double)((this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.1f), 1.0f, this.currentColor, 3 + this.worldObj.rand.nextInt(3));
(fx).noClip = true;
Minecraft.getMinecraft().effectRenderer.addEffect((EntityFX)fx);
}
}
public void setGravity(float value) {
this.particleGravity = value;
}
@Override
protected boolean func_145771_j(double par1, double par3, double par5) {
int var7 = MathHelper.floor_double((double)par1);
int var8 = MathHelper.floor_double((double)par3);
int var9 = MathHelper.floor_double((double)par5);
double var10 = par1 - (double)var7;
double var12 = par3 - (double)var8;
double var14 = par5 - (double)var9;
if (!(this).worldObj.isAirBlock(var7, var8, var9)) {
boolean var16 = !(this).worldObj.isBlockNormalCubeDefault(var7 - 1, var8, var9, false);
boolean var17 = !(this).worldObj.isBlockNormalCubeDefault(var7 + 1, var8, var9, false);
boolean var18 = !(this).worldObj.isBlockNormalCubeDefault(var7, var8 - 1, var9, false);
boolean var19 = !(this).worldObj.isBlockNormalCubeDefault(var7, var8 + 1, var9, false);
boolean var20 = !(this).worldObj.isBlockNormalCubeDefault(var7, var8, var9 - 1, false);
boolean var21 = !(this).worldObj.isBlockNormalCubeDefault(var7, var8, var9 + 1, false);
int var22 = -1;
double var23 = 9999.0;
if (var16 && var10 < var23) {
var23 = var10;
var22 = 0;
}
if (var17 && 1.0 - var10 < var23) {
var23 = 1.0 - var10;
var22 = 1;
}
if (var18 && var12 < var23) {
var23 = var12;
var22 = 2;
}
if (var19 && 1.0 - var12 < var23) {
var23 = 1.0 - var12;
var22 = 3;
}
if (var20 && var14 < var23) {
var23 = var14;
var22 = 4;
}
if (var21 && 1.0 - var14 < var23) {
var23 = 1.0 - var14;
var22 = 5;
}
float var25 = (this).rand.nextFloat() * 0.05f + 0.025f;
float var26 = ((this).rand.nextFloat() - (this).rand.nextFloat()) * 0.1f;
if (var22 == 0) {
(this).motionX = -var25;
(this).motionY = (this).motionZ = (double)var26;
}
if (var22 == 1) {
(this).motionX = var25;
(this).motionY = (this).motionZ = (double)var26;
}
if (var22 == 2) {
(this).motionY = -var25;
(this).motionX = (this).motionZ = (double)var26;
}
if (var22 == 3) {
(this).motionY = var25;
(this).motionX = (this).motionZ = (double)var26;
}
if (var22 == 4) {
(this).motionZ = -var25;
(this).motionY = (this).motionX = (double)var26;
}
if (var22 == 5) {
(this).motionZ = var25;
(this).motionY = (this).motionX = (double)var26;
}
return true;
}
return false;
}
}