Пример #1
0
  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);
        }
      }
    }
  }
Пример #2
0
  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);
          }
        }
      }
    }
  }