75 lines
2.2 KiB
Java
75 lines
2.2 KiB
Java
package electroblob.wizardry.client.particle;
|
|
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public class ParticleBlizzard extends ParticleSnow {
|
|
|
|
private double angle;
|
|
private double radius;
|
|
private double speed;
|
|
|
|
public ParticleBlizzard(World world, int maxAge, double originX, double originZ, double radius, double yPos){
|
|
super(world, 0, 0, 0, 0, 0, 0, maxAge);
|
|
this.angle = this.rand.nextDouble() * Math.PI * 2;
|
|
double x = originX - Math.cos(angle) * radius;
|
|
double z = originZ + radius * Math.sin(angle);
|
|
this.radius = radius;
|
|
this.setPosition(x, yPos, z);
|
|
this.prevPosX = x;
|
|
this.prevPosY = yPos;
|
|
this.prevPosZ = z;
|
|
if(rand.nextBoolean()){
|
|
speed = rand.nextDouble() * 2 + 1;
|
|
}else{
|
|
speed = rand.nextDouble() * -2 - 1;
|
|
}
|
|
this.multipleParticleScaleBy(1.5f);
|
|
}
|
|
|
|
@Override
|
|
public void init(){
|
|
super.init();
|
|
this.fullBrightness = true;
|
|
}
|
|
|
|
// @Override
|
|
// public void renderParticle(VertexBuffer buffer, Entity entity, float partialTicks, float rotationX, float
|
|
// rotationZ, float rotationYZ, float rotationXY, float rotationXZ){
|
|
// if(this.particleAge < this.particleMaxAge / 3 || (this.particleAge + this.particleMaxAge) / 3 % 2 == 0){
|
|
// super.renderParticle(buffer, entity, partialTicks, rotationX, rotationZ, rotationYZ, rotationXY, rotationXZ);
|
|
// }
|
|
// }
|
|
|
|
@Override
|
|
public void onUpdate(){
|
|
|
|
this.prevPosX = this.posX;
|
|
this.prevPosY = this.posY;
|
|
this.prevPosZ = this.posZ;
|
|
|
|
if(this.particleAge++ >= this.particleMaxAge){
|
|
this.setExpired();
|
|
}
|
|
|
|
// This is in radians per tick...
|
|
double omega = Math.signum(speed) * ((Math.PI * 2) / 20 - speed / (20 * radius));
|
|
|
|
// v = r times omega; therefore the normalised velocity vector needs to be r times the angle increment / 2 pi.
|
|
this.angle += omega;
|
|
|
|
this.motionY -= 0.04D * (double)this.particleGravity;
|
|
this.motionZ = radius * omega * Math.cos(angle);
|
|
this.motionX = radius * omega * Math.sin(angle);
|
|
this.move(motionX, motionY, motionZ);
|
|
|
|
if(this.particleAge > this.particleMaxAge / 2){
|
|
this.setAlphaF(
|
|
1.0F - ((float)this.particleAge - (float)(this.particleMaxAge / 2)) / (float)this.particleMaxAge);
|
|
}
|
|
|
|
}
|
|
}
|