package zmaster587.advancedRocketry.entity.fx; import java.util.ArrayList; import net.minecraft.world.World; import zmaster587.advancedRocketry.AdvancedRocketry; import zmaster587.libVulpes.util.Vector3F; public class FxSystemElectricArc { public static void spawnArc(World world, double x, double y, double z, double sizeMult, int numrecursion) { //left child = 2*current index //right child = 2*current index + 1 // parent = index/2 makeNextPosition(world, new Vector3F<Double>(x, y, z), sizeMult, numrecursion); } private static void makeNextPosition(World world, Vector3F<Double> parent, double scale, int numrecursion) { double radius = scale*2; double angle = world.rand.nextDouble()*Math.PI*2; double xOffset = radius* Math.cos(angle); double zOffset = radius* Math.sin(angle); Vector3F<Double> blockPosL = new Vector3F<Double>(parent.x - xOffset, parent.y + scale*4, parent.z + zOffset); Vector3F<Double> blockPosR = new Vector3F<Double>(parent.x + xOffset, parent.y + scale*4, parent.z - zOffset); int numParticles = (int)(scale*1000/numrecursion); for(int i = 0; i < numParticles; i++) { double distance = i/(double)numParticles; double offset = scale*(0.1*Math.sin(numrecursion*1.5f*i/(Math.PI*8f)) + 0.1*Math.sin(numrecursion*0.5*i/(Math.PI*8f))); AdvancedRocketry.proxy.spawnParticle("arc", world, parent.x + distance*(blockPosL.x - parent.x + offset), parent.y + distance*(blockPosL.y - parent.y + offset), parent.z + distance*(blockPosL.z - parent.z), scale/4f, 0, 0); AdvancedRocketry.proxy.spawnParticle("arc", world, parent.x + distance*(blockPosR.x - parent.x + offset), parent.y + distance*(blockPosR.y - parent.y - offset), parent.z + distance*(blockPosR.z - parent.z), scale/4f, 0, 0); } numrecursion--; if(numrecursion > 0) { if(world.rand.nextInt(4) < 2) makeNextPosition(world, blockPosL, scale/2.0, numrecursion); if(world.rand.nextInt(4) < 2) makeNextPosition(world, blockPosR, scale/2.0, numrecursion); } } }