package com.cricketcraft.chisel.entity; import java.util.Random; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import com.cricketcraft.chisel.init.ChiselBlocks; public class EntityCloudInABottle extends EntityThrowable { Random rand = new Random(); public EntityCloudInABottle(World par1World) { super(par1World); } public EntityCloudInABottle(World par1World, EntityLivingBase par2EntityLiving) { super(par1World, par2EntityLiving); } public EntityCloudInABottle(World par1World, double x, double y, double z) { super(par1World, x, y, z); } @Override protected void onImpact(MovingObjectPosition movingobjectposition) { if (worldObj.isRemote) return; int x = movingobjectposition.blockX; int y = movingobjectposition.blockY; int z = movingobjectposition.blockZ; switch (movingobjectposition.sideHit) { case 0: y--; break; case 1: y++; break; case 2: z--; break; case 3: z++; break; case 4: x--; break; case 5: x++; break; } generate(worldObj, rand, x, y, z, 40); worldObj.playAuxSFX(2002, (int) Math.round(this.posX), (int) Math.round(this.posY), (int) Math.round(this.posZ), 2); setDead(); } public boolean generate(World world, Random random, int gx, int gy, int gz, int numberOfBlocks) { int X[] = new int[9]; int Y[] = new int[9]; int Z[] = new int[9]; for (int dir = 0; dir < 9; dir++) { X[dir] = gx; Y[dir] = gy; Z[dir] = gz; } int count = 0; while (count < numberOfBlocks) { for (int dir = 0; dir < 9; dir++) { if (count >= numberOfBlocks) break; int dx = dir % 3 - 1; int dz = dir / 3 - 1; if (dx == 0 && dz == 0) continue; X[dir] += random.nextInt(3) - 1 + dx; Z[dir] += random.nextInt(3) - 1 + dz; Y[dir] += random.nextInt(2) * (random.nextInt(3) - 1); int x = X[dir]; int y = Y[dir]; int z = Z[dir]; for (int j2 = x; j2 < x + random.nextInt(4) + 1; j2++) { for (int k2 = y; k2 < y + random.nextInt(1) + 2; k2++) { for (int l2 = z; l2 < z + random.nextInt(4) + 1; l2++) { if (world.getBlock(j2, k2, l2).isAir(world, j2, k2, l2) && Math.abs(j2 - x) + Math.abs(k2 - y) + Math.abs(l2 - z) < 4 * 1 + random.nextInt(2)) { world.setBlock(j2, k2, l2, ChiselBlocks.cloud); count++; } } } } } } // System.out.println("Created " + count + " cloud blocks."); return true; } }