public void set_cmd() throws CivException {
    Player player = (Player) sender;

    TownChunk tc = CivGlobal.getTownChunk(player.getLocation());
    if (tc == null) {
      throw new CivException(CivSettings.localize.localizedString("cmd_plot_perm_setnotInTown"));
    }

    if (args.length < 4) {
      showPermCmdHelp();
      throw new CivException(CivSettings.localize.localizedString("cmd_plot_perm_setBadArg"));
    }

    PermissionNode node = null;
    switch (args[1].toLowerCase()) {
      case "build":
        node = tc.perms.build;
        break;
      case "destroy":
        node = tc.perms.destroy;
        break;
      case "interact":
        node = tc.perms.interact;
        break;
      case "itemuse":
        node = tc.perms.itemUse;
        break;
      case "reset":
        // TODO implement permissions reset.
        break;
      default:
        showPermCmdHelp();
        throw new CivException(CivSettings.localize.localizedString("cmd_plot_perm_setBadArg"));
    }

    if (node == null) {
      throw new CivException(
          CivSettings.localize.localizedString("cmd_plot_perm_setInternalError"));
    }

    boolean on;
    if (args[3].equalsIgnoreCase("on")
        || args[3].equalsIgnoreCase("yes")
        || args[3].equalsIgnoreCase("1")) {
      on = true;
    } else if (args[3].equalsIgnoreCase("off")
        || args[3].equalsIgnoreCase("no")
        || args[3].equalsIgnoreCase("0")) {
      on = false;
    } else {
      showPermCmdHelp();
      throw new CivException(CivSettings.localize.localizedString("cmd_plot_perm_setBadArg"));
    }

    switch (args[2].toLowerCase()) {
      case "owner":
        node.setPermitOwner(on);
        break;
      case "group":
        node.setPermitGroup(on);
        break;
      case "others":
        node.setPermitOthers(on);
    }

    tc.save();

    CivMessage.sendSuccess(
        sender,
        CivSettings.localize.localizedString(
            "var_cmd_plot_perm_setSuccess", node.getType(), on, args[2]));
  }