private void progress() {
    if (!hasEmptyWaterBottle()) {
      remove();
      return;
    }

    if (player.isDead() || !player.isOnline()) {
      remove();
      return;
    }

    if (player.getWorld() != location.getWorld()) {
      remove();
      return;
    }

    if (System.currentTimeMillis() < time + interval) return;

    time = System.currentTimeMillis();

    Vector direction = Methods.getDirection(location, player.getEyeLocation()).normalize();
    location = location.clone().add(direction);

    if (location == null || block == null) {
      remove();
      return;
    }

    if (location.getBlock().equals(block.getLocation().getBlock())) return;

    if (Methods.isRegionProtectedFromBuild(player, "WaterManipulation", location)) {
      remove();
      return;
    }

    if (location.distance(player.getEyeLocation())
        > Methods.waterbendingNightAugment(range, player.getWorld())) {
      remove();
      return;
    }

    if (location.distance(player.getEyeLocation()) <= 1.5) {
      fillBottle();
      return;
    }

    Block newblock = location.getBlock();
    if (Methods.isTransparentToEarthbending(player, newblock) && !newblock.isLiquid()) {
      block.revertBlock();
      block = new TempBlock(newblock, Material.WATER, full);
    } else {
      remove();
      return;
    }
  }
 public WaterReturn(Player player, Block block) {
   if (instances.containsKey(player)) return;
   this.player = player;
   location = block.getLocation();
   if (Methods.canBend(player.getName(), "WaterManipulation")) {
     if (!Methods.isRegionProtectedFromBuild(player, "WaterManipulation", location)
         && Methods.canBend(player.getName(), "WaterManipulation")) {
       if (Methods.isTransparentToEarthbending(player, block) && !block.isLiquid())
         this.block = new TempBlock(block, Material.WATER, full);
     }
   }
   // if (ID >= Integer.MAX_VALUE) {
   // ID = Integer.MIN_VALUE;
   // }
   // id = ID++;
   instances.put(player, this);
 }