Пример #1
0
 private void unLightarea(Player player) {
   TorchBurnLightLevelOwner lightLevelOwner;
   for (Location l : playerBlocks.get(player)) {
     lightLevelOwner = prevState.get(l);
     if (lightLevelOwner != null) {
       if (lightLevelOwner.getPlayer().equals(player)) {
         // this is if my pull request to bukkit gets accepted
         //					l.getBlock().setLightLevel(lightLevelOwner.getLevel());
         ((CraftWorld) (player.getWorld()))
             .getHandle()
             .a(
                 EnumSkyBlock.BLOCK,
                 l.getBlockX(),
                 l.getBlockY(),
                 l.getBlockZ(),
                 lightLevelOwner.getLevel());
         prevState.remove(l);
       }
     }
   }
 }
Пример #2
0
  protected void lightArea(Player player, int intensity, int falloff) {
    assert (intensity >= 0);
    assert (intensity <= 15);
    assert (falloff > 0);
    assert (falloff <= 15);
    CraftWorld world = (CraftWorld) player.getWorld();
    int radius = intensity / falloff;
    int blockX = player.getLocation().getBlockX();
    int blockY = player.getLocation().getBlockY();
    int blockZ = player.getLocation().getBlockZ();

    // first reset all light around
    if (playerBlocks.containsKey(player)) {
      unLightarea(player);
      playerBlocks.remove(player);
    }

    List<Location> blockList = new ArrayList<Location>();

    for (int x = -radius; x <= radius; x++)
      for (int y = -radius; y <= radius; y++)
        for (int z = -radius; z <= radius; z++) {
          int newIntensity;
          int curIntensity = world.getHandle().getLightLevel(blockX + x, blockY + y, blockZ + z);

          if (fastServer == false) {
            // this is fast
            newIntensity =
                (intensity - (Math.abs(x) + Math.abs(y) + Math.abs(z))) < 0
                    ? 0
                    : intensity - (Math.abs(x) + Math.abs(y) + Math.abs(z));
          } else {
            // this is slow, but nicer
            Vector origin = new Vector(blockX, blockY, blockZ);
            Vector v = new Vector(blockX + x, blockY + y, blockZ + z);
            if (v.isInSphere(origin, radius)) {
              // looks like the entry is within the radius
              double distanceSq = v.distanceSquared(origin);
              newIntensity =
                  (int) (((intensity - Math.sqrt(distanceSq) * falloff) * 100 + 0.5) / 100);
            } else {
              newIntensity = curIntensity;
            }
          }

          TorchBurnLightLevelOwner prevIntensity;
          Location l = new Location(world, blockX + x, blockY + y, blockZ + z);
          prevIntensity = TorchBurn.prevState.get(l);
          int worldIntensity = world.getHandle().getLightLevel(blockX + x, blockY + y, blockZ + z);
          if (prevIntensity != null) {
            // this area was in the map already. see if we are brightening and if it belongs to us
            if (prevIntensity.getLevel() < newIntensity
                && !(prevIntensity.getPlayer().equals(player))) {
              // we are brightening, remove the other guy's entry and add our own
              TorchBurn.prevState.remove(l);
              TorchBurn.prevState.put(l, new TorchBurnLightLevelOwner(player, worldIntensity));
            }
          } else {
            // add the current world's light level to the map
            TorchBurn.prevState.put(
                l,
                new TorchBurnLightLevelOwner(
                    player, world.getHandle().getLightLevel(blockX + x, blockY + y, blockZ + z)));
          }
          // light 'em up!
          if (newIntensity > worldIntensity) {
            //						if my pull request to bukkit gets accepted
            //						l.getBlock().setLightLevel(newIntensity);
            world
                .getHandle()
                .a(EnumSkyBlock.BLOCK, blockX + x, blockY + y, blockZ + z, newIntensity);
          }

          blockList.add(l);
        }
    playerBlocks.put(player, blockList);
  }