public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector pos) {
    player.print("Added point #" + region.size() + " at " + pos + ".");

    session.dispatchCUIEvent(player, new SelectionPoint2DEvent(region.size() - 1, pos, getArea()));
    session.dispatchCUIEvent(
        player, new SelectionMinMaxEvent(region.getMinimumY(), region.getMaximumY()));
  }
  public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector pos) {
    player.print("Starting a new polygon at " + pos + ".");

    session.dispatchCUIEvent(player, new SelectionShapeEvent(getTypeID()));
    session.dispatchCUIEvent(player, new SelectionPoint2DEvent(0, pos, getArea()));
    session.dispatchCUIEvent(
        player, new SelectionMinMaxEvent(region.getMinimumY(), region.getMaximumY()));
  }
  public void describeCUI(LocalSession session, LocalPlayer player) {
    final List<BlockVector2D> points = region.getPoints();
    for (int id = 0; id < points.size(); id++) {
      session.dispatchCUIEvent(player, new SelectionPoint2DEvent(id, points.get(id), getArea()));
    }

    session.dispatchCUIEvent(
        player, new SelectionMinMaxEvent(region.getMinimumY(), region.getMaximumY()));
  }
  public boolean selectPrimary(Vector pos) {
    if (pos.equals(pos1)) {
      return false;
    }

    pos1 = pos.toBlockVector();
    region = new Polygonal2DRegion(region.getWorld());
    region.addPoint(pos);
    region.expandY(pos.getBlockY());

    return true;
  }
  public boolean selectSecondary(Vector pos) {
    if (region.size() > 0) {
      final List<BlockVector2D> points = region.getPoints();

      final BlockVector2D lastPoint = points.get(region.size() - 1);
      if (lastPoint.getBlockX() == pos.getBlockX() && lastPoint.getBlockZ() == pos.getBlockZ()) {
        return false;
      }

      if (maxPoints >= 0 && points.size() > maxPoints) {
        return false;
      }
    }

    region.addPoint(pos);
    region.expandY(pos.getBlockY());

    return true;
  }
 public int getPointCount() {
   return region.getPoints().size();
 }
 public int getArea() {
   return region.getArea();
 }
 public List<String> getInformationLines() {
   return Collections.singletonList("# points: " + region.size());
 }
 public void clear() {
   pos1 = null;
   region = new Polygonal2DRegion(region.getWorld());
 }
 public void learnChanges() {
   BlockVector2D pt = region.getPoints().get(0);
   pos1 = new BlockVector(pt.getBlockX(), region.getMinimumPoint().getBlockY(), pt.getBlockZ());
 }
 public boolean isDefined() {
   return region.size() > 2;
 }