package net.minecraft.server; import java.util.Iterator; import java.util.Random; import javax.annotation.Nullable; import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit public class BlockChorusFlower extends Block { public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 5); protected BlockChorusFlower() { super(Material.PLANT, MaterialMapColor.z); this.y(this.blockStateList.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(0))); this.a(CreativeModeTab.c); this.a(true); } public Item getDropType(IBlockData iblockdata, Random random, int i) { return Items.a; } public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { if (!this.b(world, blockposition)) { world.setAir(blockposition, true); } else { BlockPosition blockposition1 = blockposition.up(); if (world.isEmpty(blockposition1) && blockposition1.getY() < 256) { int i = ((Integer) iblockdata.get(BlockChorusFlower.AGE)).intValue(); if (i < 5 && random.nextInt(1) == 0) { boolean flag = false; boolean flag1 = false; IBlockData iblockdata1 = world.getType(blockposition.down()); Block block = iblockdata1.getBlock(); int j; if (block == Blocks.END_STONE) { flag = true; } else if (block == Blocks.CHORUS_PLANT) { j = 1; int k; for (k = 0; k < 4; ++k) { Block block1 = world.getType(blockposition.down(j + 1)).getBlock(); if (block1 != Blocks.CHORUS_PLANT) { if (block1 == Blocks.END_STONE) { flag1 = true; } break; } ++j; } k = 4; if (flag1) { ++k; } if (j < 2 || random.nextInt(k) >= j) { flag = true; } } else if (iblockdata1.getMaterial() == Material.AIR) { flag = true; } if (flag && a(world, blockposition1, (EnumDirection) null) && world.isEmpty(blockposition.up(2))) { // world.setTypeAndData(blockposition, Blocks.CHORUS_PLANT.getBlockData(), 2); // this.a(world, blockposition1, i); // CraftBukkit start - add event BlockPosition target = blockposition1; if (CraftEventFactory.handleBlockSpreadEvent( world.getWorld().getBlockAt(target.getX(), target.getY(), target.getZ()), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), this, toLegacyData(this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(i))) )) { world.setTypeAndData(blockposition, Blocks.CHORUS_PLANT.getBlockData(), 2); world.triggerEffect(1033, blockposition, 0); } // CraftBukkit end } else if (i < 4) { j = random.nextInt(4); boolean flag2 = false; if (flag1) { ++j; } for (int l = 0; l < j; ++l) { EnumDirection enumdirection = EnumDirection.EnumDirectionLimit.HORIZONTAL.a(random); BlockPosition blockposition2 = blockposition.shift(enumdirection); if (world.isEmpty(blockposition2) && world.isEmpty(blockposition2.down()) && a(world, blockposition2, enumdirection.opposite())) { // CraftBukkit start - add event // this.a(world, blockposition2, i + 1); BlockPosition target = blockposition2; if (CraftEventFactory.handleBlockSpreadEvent( world.getWorld().getBlockAt(target.getX(), target.getY(), target.getZ()), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), this, toLegacyData(this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(i + 1))) )) { world.triggerEffect(1033, blockposition, 0); flag2 = true; } // CraftBukkit end } } if (flag2) { world.setTypeAndData(blockposition, Blocks.CHORUS_PLANT.getBlockData(), 2); } else { // CraftBukkit - add event if (CraftEventFactory.handleBlockGrowEvent( world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(iblockdata.set(BlockChorusFlower.AGE, Integer.valueOf(5))) )) { world.triggerEffect(1034, blockposition, 0); } // this.c(world, blockposition); // CraftBukkit end } } else if (i == 4) { // CraftBukkit - add event if (CraftEventFactory.handleBlockGrowEvent( world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(iblockdata.set(BlockChorusFlower.AGE, Integer.valueOf(5))) )) { world.triggerEffect(1034, blockposition, 0); } // this.c(world, blockposition); // CraftBukkit end } } } } } private void a(World world, BlockPosition blockposition, int i) { world.setTypeAndData(blockposition, this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(i)), 2); world.triggerEffect(1033, blockposition, 0); } private void c(World world, BlockPosition blockposition) { world.setTypeAndData(blockposition, this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(5)), 2); world.triggerEffect(1034, blockposition, 0); } private static boolean a(World world, BlockPosition blockposition, EnumDirection enumdirection) { Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator(); EnumDirection enumdirection1; do { if (!iterator.hasNext()) { return true; } enumdirection1 = (EnumDirection) iterator.next(); } while (enumdirection1 == enumdirection || world.isEmpty(blockposition.shift(enumdirection1))); return false; } public boolean c(IBlockData iblockdata) { return false; } public boolean b(IBlockData iblockdata) { return false; } public boolean canPlace(World world, BlockPosition blockposition) { return super.canPlace(world, blockposition) && this.b(world, blockposition); } public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1) { if (!this.b(world, blockposition)) { world.a(blockposition, (Block) this, 1); } } public boolean b(World world, BlockPosition blockposition) { IBlockData iblockdata = world.getType(blockposition.down()); Block block = iblockdata.getBlock(); if (block != Blocks.CHORUS_PLANT && block != Blocks.END_STONE) { if (iblockdata.getMaterial() == Material.AIR) { int i = 0; Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator(); while (iterator.hasNext()) { EnumDirection enumdirection = (EnumDirection) iterator.next(); IBlockData iblockdata1 = world.getType(blockposition.shift(enumdirection)); Block block1 = iblockdata1.getBlock(); if (block1 == Blocks.CHORUS_PLANT) { ++i; } else if (iblockdata1.getMaterial() != Material.AIR) { return false; } } return i == 1; } else { return false; } } else { return true; } } public void a(World world, EntityHuman entityhuman, BlockPosition blockposition, IBlockData iblockdata, @Nullable TileEntity tileentity, ItemStack itemstack) { super.a(world, entityhuman, blockposition, iblockdata, tileentity, itemstack); a(world, blockposition, new ItemStack(Item.getItemOf(this))); } protected ItemStack w(IBlockData iblockdata) { return ItemStack.a; } public IBlockData fromLegacyData(int i) { return this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(i)); } public int toLegacyData(IBlockData iblockdata) { return ((Integer) iblockdata.get(BlockChorusFlower.AGE)).intValue(); } protected BlockStateList getStateList() { return new BlockStateList(this, new IBlockState[] { BlockChorusFlower.AGE}); } public static void a(World world, BlockPosition blockposition, Random random, int i) { world.setTypeAndData(blockposition, Blocks.CHORUS_PLANT.getBlockData(), 2); a(world, blockposition, random, blockposition, i, 0); } private static void a(World world, BlockPosition blockposition, Random random, BlockPosition blockposition1, int i, int j) { int k = random.nextInt(4) + 1; if (j == 0) { ++k; } for (int l = 0; l < k; ++l) { BlockPosition blockposition2 = blockposition.up(l + 1); if (!a(world, blockposition2, (EnumDirection) null)) { return; } world.setTypeAndData(blockposition2, Blocks.CHORUS_PLANT.getBlockData(), 2); } boolean flag = false; if (j < 4) { int i1 = random.nextInt(4); if (j == 0) { ++i1; } for (int j1 = 0; j1 < i1; ++j1) { EnumDirection enumdirection = EnumDirection.EnumDirectionLimit.HORIZONTAL.a(random); BlockPosition blockposition3 = blockposition.up(k).shift(enumdirection); if (Math.abs(blockposition3.getX() - blockposition1.getX()) < i && Math.abs(blockposition3.getZ() - blockposition1.getZ()) < i && world.isEmpty(blockposition3) && world.isEmpty(blockposition3.down()) && a(world, blockposition3, enumdirection.opposite())) { flag = true; world.setTypeAndData(blockposition3, Blocks.CHORUS_PLANT.getBlockData(), 2); a(world, blockposition3, random, blockposition1, i, j + 1); } } } if (!flag) { world.setTypeAndData(blockposition.up(k), Blocks.CHORUS_FLOWER.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(5)), 2); } } }