@Command(
     aliases = {"update", "u"},
     parent = "r2w",
     helpLookup = "r2w update",
     description = "Update the template",
     permissions = {"r2w.command.update"},
     toolTip = "/r2w update <world_name> <world_dimension> x1 y1 z1 x2 y2 z2",
     min = 9,
     max = 9)
 public void update(final MessageReceiver caller, final String[] parameters)
     throws InterruptedException, ExecutionException {
   final int x1 = Integer.parseInt(parameters[3]);
   final int y1 = Integer.parseInt(parameters[4]);
   final int z1 = Integer.parseInt(parameters[5]);
   final int x2 = Integer.parseInt(parameters[6]);
   final int y2 = Integer.parseInt(parameters[7]);
   final int z2 = Integer.parseInt(parameters[8]);
   final Future<Boolean> future =
       templateManager.update(
           parameters[1], DimensionType.fromName(parameters[2]), x1, y1, z1, x2, y2, z2);
   if (future.get()) {
     sendMessage(caller, "Completed updating template");
   } else {
     sendMessage(caller, "Failed updating template");
   }
 }
 @Command(
     aliases = {"remove"},
     parent = "r2w",
     helpLookup = "r2w remove",
     description = "Remove world template",
     permissions = {"r2w.command.remove"},
     toolTip = "/r2w remove <world_name> <world_dimension>",
     min = 3,
     max = 3)
 public void removeTemplate(final MessageReceiver caller, final String[] parameters)
     throws IOException, InterruptedException, ExecutionException {
   final Future<Boolean> future =
       templateManager.removeTemplate(parameters[1], DimensionType.fromName(parameters[2]));
   if (future.get()) {
     sendMessage(caller, "Completed removing template");
   } else {
     sendMessage(caller, "Failed removing template");
   }
 }
  @Command(
      aliases = {"restore", "r"},
      parent = "r2w",
      helpLookup = "r2w restore",
      description = "Restore from template",
      permissions = {"r2w.command.restore"},
      toolTip = "/r2w restore [world_name world_dimension] [x1 y1 z1 [x2 y2 z2]]",
      min = 1,
      max = 9)
  public void restore(final MessageReceiver caller, final String[] parameters)
      throws InterruptedException, ExecutionException {
    boolean set = false;
    String world = null;
    String dimension = null;
    int x1 = 0;
    int y1 = 0;
    int z1 = 0;
    int x2 = 0;
    int y2 = 0;
    int z2 = 0;

    if (caller instanceof Player) {
      final Player player = (Player) caller;
      if (parameters.length == 1) {
        final Block block = getBlockLookingAt(player);
        world = block.getWorld().getName();
        dimension = block.getWorld().getType().getName();
        x1 = x2 = block.getX();
        y1 = y2 = block.getY();
        z1 = z2 = block.getZ();
        set = true;
      } else if (parameters.length == 4) {
        world = player.getWorld().getName();
        dimension = player.getWorld().getType().getName();
        x1 = x2 = Integer.parseInt(parameters[2]);
        y1 = y2 = Integer.parseInt(parameters[3]);
        z1 = z2 = Integer.parseInt(parameters[4]);
        set = true;
      } else if (parameters.length == 7) {
        world = player.getWorld().getName();
        dimension = player.getWorld().getType().getName();
        x1 = Integer.parseInt(parameters[2]);
        y1 = Integer.parseInt(parameters[3]);
        z1 = Integer.parseInt(parameters[4]);
        x2 = Integer.parseInt(parameters[5]);
        y2 = Integer.parseInt(parameters[6]);
        z2 = Integer.parseInt(parameters[7]);
        set = true;
      }
    }

    if (!set) {
      world = parameters[1];
      dimension = parameters[2];
      x1 = Integer.parseInt(parameters[3]);
      y1 = Integer.parseInt(parameters[4]);
      z1 = Integer.parseInt(parameters[5]);
      x2 = Integer.parseInt(parameters[6]);
      y2 = Integer.parseInt(parameters[7]);
      z2 = Integer.parseInt(parameters[8]);
    }

    final Future<Boolean> future =
        templateManager.restore(world, DimensionType.fromName(dimension), x1, y1, z1, x2, y2, z2);
    if (future.get()) {
      sendMessage(caller, "Completed restoring template");
    } else {
      sendMessage(caller, "Failed restoring template");
    }
  }