public FieldSign(Block block, String[] lines, Player player) {
    if (!SignHelper.isSign(block)) {
      valid = false;
      return;
    }

    valid = extractData(block, lines);
    playerName = player.getName();
  }
  public FieldSign(Block block) {
    if (!SignHelper.isSign(block)) {
      valid = false;
      return;
    }

    sign = ((Sign) block.getState());

    String[] lines = sign.getLines();

    valid = extractData(block, lines);
  }
  public boolean extractData(Block block, String[] lines) {
    tag = ChatColor.stripColor(lines[0]);

    price = SignHelper.extractPrice(ChatColor.stripColor(lines[1]));

    if (price == 0) {
      return false;
    }

    item = SignHelper.extractItemFromParenthesis(ChatColor.stripColor(lines[1]));

    if (!isBuyable()) {
      period = ChatColor.stripColor(lines[2]);

      if (!SignHelper.isValidPeriod(period)) {
        return false;
      }

      fieldSign =
          tag.equalsIgnoreCase(ChatBlock.format("fieldSignRent"))
              || tag.equalsIgnoreCase(ChatBlock.format("fieldSignBuy"))
              || tag.equalsIgnoreCase(ChatBlock.format("fieldSignShare"));

      if (!fieldSign) {
        return false;
      }
    }

    if (item == null) {
      if (!PreciousStones.getInstance().getPermissionsManager().hasEconomy()) {
        noEconomy = true;
        return false;
      }
    }

    Block attachedBlock = SignHelper.getAttachedBlock(block);
    field = PreciousStones.getInstance().getForceFieldManager().getField(attachedBlock);

    if (field == null) {
      return false;
    }

    if (playerName != null) {
      if (!field.isOwner(playerName)) {
        return false;
      }
    }

    if (isRentable()) {
      if (!field.hasFlag(FieldFlag.RENTABLE)) {
        return false;
      }
    }

    if (isShareable()) {
      if (!field.hasFlag(FieldFlag.SHAREABLE)) {
        return false;
      }
    }

    if (isBuyable()) {
      if (!field.hasFlag(FieldFlag.BUYABLE)) {
        return false;
      }
    }

    return true;
  }
 /**
  * Returns the block the fieldSign is attacked to
  *
  * @return
  */
 public Block getAttachedBlock() {
   return SignHelper.getAttachedBlock(sign.getBlock());
 }
 public void updateRemainingTime(int seconds) {
   sign.setLine(3, ChatColor.BOLD + SignHelper.secondsToPeriods(seconds) + ChatColor.BOLD);
   sign.update();
 }