public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { org.bukkit.World bworld = world.getWorld(); Server server = world.getServer(); org.bukkit.block.Block source = bworld == null ? null : bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); int i = ((Integer) iblockdata.get(LEVEL)).intValue(); byte b0 = 1; if ((this.material == Material.LAVA) && (!world.worldProvider.n())) { b0 = 2; } int j = a(world); if (i > 0) { int l = -100; this.a = 0; EnumDirection enumdirection; for (Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator(); iterator.hasNext(); l = a(world, blockposition.shift(enumdirection), l)) { enumdirection = (EnumDirection) iterator.next(); } int i1 = l + b0; if ((i1 >= 8) || (l < 0)) { i1 = -1; } if (e(world, blockposition.up()) >= 0) { int k = e(world, blockposition.up()); if (k >= 8) { i1 = k; } else { i1 = k + 8; } } if ((this.a >= 2) && (this.material == Material.WATER)) { IBlockData iblockdata1 = world.getType(blockposition.down()); if (iblockdata1.getBlock().getMaterial().isBuildable()) { i1 = 0; } else if ((iblockdata1.getBlock().getMaterial() == this.material) && (((Integer) iblockdata1.get(LEVEL)).intValue() == 0)) { i1 = 0; } } if ((this.material == Material.LAVA) && (i < 8) && (i1 < 8) && (i1 > i) && (random.nextInt(4) != 0)) { j *= 4; } if (i1 == i) { f(world, blockposition, iblockdata); } else { i = i1; if (i1 < 0) { world.setAir(blockposition); } else { iblockdata = iblockdata.set(LEVEL, Integer.valueOf(i1)); world.setTypeAndData(blockposition, iblockdata, 2); world.a(blockposition, this, j); world.applyPhysics(blockposition, this); } } } else { f(world, blockposition, iblockdata); } IBlockData iblockdata2 = world.getType(blockposition.down()); if (h(world, blockposition.down(), iblockdata2)) { BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN); if (server != null) { server.getPluginManager().callEvent(event); } if (!event.isCancelled()) { if ((this.material == Material.LAVA) && (world.getType(blockposition.down()).getBlock().getMaterial() == Material.WATER)) { world.setTypeUpdate(blockposition.down(), Blocks.STONE.getBlockData()); fizz(world, blockposition.down()); return; } if (i >= 8) { flow(world, blockposition.down(), iblockdata2, i); } else { flow(world, blockposition.down(), iblockdata2, i + 8); } } } else if ((i >= 0) && ((i == 0) || (g(world, blockposition.down(), iblockdata2)))) { Set set = f(world, blockposition); int k = i + b0; if (i >= 8) { k = 1; } if (k >= 8) { return; } Iterator iterator1 = set.iterator(); while (iterator1.hasNext()) { EnumDirection enumdirection1 = (EnumDirection) iterator1.next(); BlockFromToEvent event = new BlockFromToEvent(source, CraftBlock.notchToBlockFace(enumdirection1)); if (server != null) { server.getPluginManager().callEvent(event); } if (!event.isCancelled()) { flow( world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k); } } } }
public void a(World world, Entity entity, WorldMap worldmap) { // CraftBukkit - world.worldProvider -> ((WorldServer) world) if (((WorldServer) world).dimension == worldmap.map && entity instanceof EntityHuman) { int i = 1 << worldmap.scale; int j = worldmap.centerX; int k = worldmap.centerZ; int l = MathHelper.floor(entity.locX - j) / i + 64; int i1 = MathHelper.floor(entity.locZ - k) / i + 64; int j1 = 128 / i; if (world.worldProvider.g) { j1 /= 2; } WorldMapHumanTracker worldmaphumantracker = worldmap.a((EntityHuman) entity); ++worldmaphumantracker.d; for (int k1 = l - j1 + 1; k1 < l + j1; ++k1) { if ((k1 & 15) == (worldmaphumantracker.d & 15)) { int l1 = 255; int i2 = 0; double d0 = 0.0D; for (int j2 = i1 - j1 - 1; j2 < i1 + j1; ++j2) { if (k1 >= 0 && j2 >= -1 && k1 < 128 && j2 < 128) { int k2 = k1 - l; int l2 = j2 - i1; boolean flag = k2 * k2 + l2 * l2 > (j1 - 2) * (j1 - 2); int i3 = (j / i + k1 - 64) * i; int j3 = (k / i + j2 - 64) * i; HashMultiset hashmultiset = HashMultiset.create(); Chunk chunk = world.getChunkAtWorldCoords(i3, j3); if (!chunk.isEmpty()) { int k3 = i3 & 15; int l3 = j3 & 15; int i4 = 0; double d1 = 0.0D; int j4; if (world.worldProvider.g) { j4 = i3 + j3 * 231871; j4 = j4 * j4 * 31287121 + j4 * 11; if ((j4 >> 20 & 1) == 0) { hashmultiset.add(Blocks.DIRT.f(0), 10); } else { hashmultiset.add(Blocks.STONE.f(0), 100); } d1 = 100.0D; } else { for (j4 = 0; j4 < i; ++j4) { for (int k4 = 0; k4 < i; ++k4) { int l4 = chunk.b(j4 + k3, k4 + l3) + 1; Block block = Blocks.AIR; int i5 = 0; if (l4 > 1) { do { --l4; block = chunk.getType(j4 + k3, l4, k4 + l3); i5 = chunk.getData(j4 + k3, l4, k4 + l3); } while (block.f(i5) == MaterialMapColor.b && l4 > 0); if (l4 > 0 && block.getMaterial().isLiquid()) { int j5 = l4 - 1; Block block1; do { block1 = chunk.getType(j4 + k3, j5--, k4 + l3); ++i4; } while (j5 > 0 && block1.getMaterial().isLiquid()); } } d1 += (double) l4 / (double) (i * i); hashmultiset.add(block.f(i5)); } } } i4 /= i * i; double d2 = (d1 - d0) * 4.0D / (i + 4) + ((k1 + j2 & 1) - 0.5D) * 0.4D; byte b0 = 1; if (d2 > 0.6D) { b0 = 2; } if (d2 < -0.6D) { b0 = 0; } MaterialMapColor materialmapcolor = Iterables.getFirst( Multisets.copyHighestCountFirst(hashmultiset), MaterialMapColor.b); if (materialmapcolor == MaterialMapColor.n) { d2 = i4 * 0.1D + (k1 + j2 & 1) * 0.2D; b0 = 1; if (d2 < 0.5D) { b0 = 2; } if (d2 > 0.9D) { b0 = 0; } } d0 = d1; if (j2 >= 0 && k2 * k2 + l2 * l2 < j1 * j1 && (!flag || (k1 + j2 & 1) != 0)) { byte b1 = worldmap.colors[k1 + j2 * 128]; byte b2 = (byte) (materialmapcolor.M * 4 + b0); if (b1 != b2) { if (l1 > j2) { l1 = j2; } if (i2 < j2) { i2 = j2; } worldmap.colors[k1 + j2 * 128] = b2; } } } } } if (l1 <= i2) { worldmap.flagDirty(k1, l1, i2); } } } } }