/**
   * Adds a fields perimeter to a player's visualization buffer
   *
   * @param player
   * @param field
   */
  public void addVisualizationField(Player player, Field field) {
    Visualization vis = visualizations.get(player.getName());

    if (vis == null) {
      vis = new Visualization();
    }

    if (plugin.getCuboidManager().hasOpenCuboid(player)) {
      return;
    }

    PlayerEntry data = plugin.getPlayerManager().getPlayerEntry(player.getName());

    if (data.getDensity() == 0) {
      return;
    }

    vis.addField(field);

    int visualizationType =
        field.hasFlag(FieldFlag.CUBOID)
            ? plugin.getSettingsManager().getCuboidVisualizationType()
            : plugin.getSettingsManager().getVisualizeBlock();
    int frameType = plugin.getSettingsManager().getVisualizeFrameBlock();

    int minx = field.getX() - field.getRadius() - 1;
    int maxx = field.getX() + field.getRadius() + 1;
    int minz = field.getZ() - field.getRadius() - 1;
    int maxz = field.getZ() + field.getRadius() + 1;
    int miny = field.getY() - (Math.max(field.getHeight() - 1, 0) / 2) - 1;
    int maxy = field.getY() + (Math.max(field.getHeight() - 1, 0) / 2) + 1;

    if (field.hasFlag(FieldFlag.CUBOID)) {
      minx = field.getMinx() - 1;
      maxx = field.getMaxx() + 1;
      minz = field.getMinz() - 1;
      maxz = field.getMaxz() + 1;
      miny = field.getMiny() - 1;
      maxy = field.getMaxy() + 1;
    }

    Location loc = null;

    for (int x = minx; x <= maxx; x++) {
      int frame = (x == minx || x == maxx) ? 89 : frameType;

      loc = new Location(player.getWorld(), x, miny, maxz);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, frame, (byte) 0);
      }

      loc = new Location(player.getWorld(), x, maxy, minz);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, frame, (byte) 0);
      }

      loc = new Location(player.getWorld(), x, miny, minz);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, frame, (byte) 0);
      }

      loc = new Location(player.getWorld(), x, maxy, maxz);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, frame, (byte) 0);
      }
    }

    for (int y = miny; y <= maxy; y++) {
      loc = new Location(player.getWorld(), minx, y, maxz);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, 89, (byte) 0);
      }

      loc = new Location(player.getWorld(), maxx, y, minz);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, 89, (byte) 0);
      }

      loc = new Location(player.getWorld(), minx, y, minz);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, 89, (byte) 0);
      }

      loc = new Location(player.getWorld(), maxx, y, maxz);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, 89, (byte) 0);
      }
    }

    for (int z = minz; z <= maxz; z++) {
      int frame = (z == minz || z == maxz) ? 89 : frameType;

      loc = new Location(player.getWorld(), minx, maxy, z);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, frame, (byte) 0);
      }

      loc = new Location(player.getWorld(), maxx, miny, z);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, frame, (byte) 0);
      }

      loc = new Location(player.getWorld(), minx, miny, z);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, frame, (byte) 0);
      }

      loc = new Location(player.getWorld(), maxx, maxy, z);
      if (Helper.isAirOrWater(loc)) {
        vis.addBlock(loc, frame, (byte) 0);
      }
    }

    visualizations.put(player.getName(), vis);
  }