public void removeResidence(Player player, String name, boolean resadmin) {
   ClaimedResidence res = this.getByName(name);
   if (res != null) {
     if (player != null && !resadmin) {
       if (!res.getPermissions().hasResidencePermission(player, true) && !resadmin) {
         player.sendMessage("§c" + Residence.getLanguage().getPhrase("NoPermission"));
         return;
       }
     }
     ResidenceDeleteEvent resevent =
         new ResidenceDeleteEvent(
             player, res, player == null ? DeleteCause.OTHER : DeleteCause.PLAYER_DELETE);
     Residence.getServ().getPluginManager().callEvent(resevent);
     if (resevent.isCancelled()) return;
     ClaimedResidence parent = res.getParent();
     if (parent != null) {
       String[] split = name.split("\\.");
       parent.removeSubzone(split[split.length - 1]);
     } else {
       residences.remove(name);
     }
     // Residence.getLeaseManager().removeExpireTime(name); - causing concurrent modification
     // exception in lease manager... worked around for now
     Residence.getRentManager().removeRentable(name);
     if (player != null)
       player.sendMessage(
           "§a" + Residence.getLanguage().getPhrase("ResidenceRemove", "§e" + name + "§a"));
   } else {
     if (player != null)
       player.sendMessage("§c" + Residence.getLanguage().getPhrase("InvalidResidence"));
   }
 }
 public void listAllResidences(Player player, int page, boolean showhidden) {
   Set<Entry<String, ClaimedResidence>> set = residences.entrySet();
   ArrayList<String> temp = new ArrayList<String>();
   synchronized (residences) {
     Iterator<Entry<String, ClaimedResidence>> it = set.iterator();
     while (it.hasNext()) {
       Entry<String, ClaimedResidence> next = it.next();
       ClaimedResidence res = next.getValue();
       boolean hidden = res.getPermissions().has("hidden", false);
       if ((showhidden && hidden)
           || (!showhidden && !hidden)
           || player.getName().equals(res.getOwner()))
         temp.add(
             "§a"
                 + next.getKey()
                 + "§e - "
                 + Residence.getLanguage().getPhrase("Owner")
                 + ": "
                 + res.getOwner()
                 + " - "
                 + Residence.getLanguage().getPhrase("World")
                 + ": "
                 + res.getWorld());
     }
   }
   InformationPager.printInfo(player, Residence.getLanguage().getPhrase("Residences"), temp, page);
 }
 public String checkAreaCollision(CuboidArea newarea, ClaimedResidence parentResidence) {
   Set<Entry<String, ClaimedResidence>> set = residences.entrySet();
   for (Entry<String, ClaimedResidence> entry : set) {
     ClaimedResidence check = entry.getValue();
     if (check != parentResidence && check.checkCollision(newarea)) {
       return entry.getKey();
     }
   }
   return null;
 }
 public int getOwnedZoneCount(String player) {
   Collection<ClaimedResidence> set = residences.values();
   int count = 0;
   synchronized (residences) {
     for (ClaimedResidence res : set) {
       if (res.getPermissions().getOwner().equalsIgnoreCase(player)) {
         count++;
       }
     }
   }
   return count;
 }
 public void removeAllByOwner(String owner) {
   Set<Entry<String, ClaimedResidence>> set = residences.entrySet();
   synchronized (residences) {
     Iterator<ClaimedResidence> it = residences.values().iterator();
     while (it.hasNext()) {
       ClaimedResidence res = it.next();
       if (res.getOwner().equalsIgnoreCase(owner)) {
         it.remove();
       }
     }
   }
 }
 public void removeAllFromWorld(CommandSender sender, String world) {
   int count = 0;
   Iterator<ClaimedResidence> it = residences.values().iterator();
   while (it.hasNext()) {
     ClaimedResidence next = it.next();
     if (next.getWorld().equals(world)) {
       it.remove();
       count++;
     }
   }
   if (count == 0) sender.sendMessage("§cNo residences found in world: §e" + world);
   else sender.sendMessage("§cRemoved §e" + count + "§c residences in world: §e" + world);
 }
 public void applyListToResidence(
     Player player, String listname, String areaname, boolean resadmin) {
   FlagPermissions list = this.getList(player.getName(), listname);
   if (list == null) {
     player.sendMessage(ChatColor.RED + Residence.getLanguage().getPhrase("InvalidList"));
     return;
   }
   ClaimedResidence res = Residence.getResidenceManager().getByName(areaname);
   if (res == null) {
     player.sendMessage(ChatColor.RED + Residence.getLanguage().getPhrase("InvalidResidence"));
     return;
   }
   res.getPermissions().applyTemplate(player, list, resadmin);
 }
 public ClaimedResidence getByName(String name) {
   if (name == null) return null;
   String[] split = name.split("\\.");
   if (split.length == 1) {
     return residences.get(name);
   }
   ClaimedResidence res = residences.get(split[0]);
   for (int i = 1; i < split.length; i++) {
     if (res != null) {
       res = res.getSubzone(split[i]);
     } else {
       return null;
     }
   }
   return res;
 }
 public boolean setGroupFlag(
     Player player, String group, String flag, String flagstate, boolean resadmin) {
   group = group.toLowerCase();
   if (validFlagGroups.containsKey(flag))
     return this.setFlagGroupOnGroup(player, flag, group, flagstate, resadmin);
   FlagState state = FlagPermissions.stringToFlagState(flagstate);
   if (checkCanSetFlag(player, flag, state, false, resadmin)) {
     if (Residence.getPermissionManager().hasGroup(group)) {
       ResidenceFlagChangeEvent fc =
           new ResidenceFlagChangeEvent(
               residence, player, flag, ResidenceFlagChangeEvent.FlagType.GROUP, state, group);
       Residence.getServ().getPluginManager().callEvent(fc);
       if (fc.isCancelled()) return false;
       if (super.setGroupFlag(group, flag, state)) {
         player.sendMessage(
             ChatColor.GREEN
                 + Residence.getLanguage()
                     .getPhrase("FlagSet", flag + "|" + residence.getName() + "|" + flagstate));
         return true;
       }
     } else {
       player.sendMessage(ChatColor.RED + Residence.getLanguage().getPhrase("InvalidGroup"));
       return false;
     }
   }
   return false;
 }
 public void giveResidence(
     Player reqPlayer, String targPlayer, String residence, boolean resadmin) {
   ClaimedResidence res = getByName(residence);
   if (res == null) {
     reqPlayer.sendMessage("§c" + Residence.getLanguage().getPhrase("InvalidResidence"));
     return;
   }
   if (!res.getPermissions().hasResidencePermission(reqPlayer, true) && !resadmin) {
     reqPlayer.sendMessage("§c" + Residence.getLanguage().getPhrase("NoPermission"));
     return;
   }
   Player giveplayer = Residence.getServ().getPlayer(targPlayer);
   if (giveplayer == null || !giveplayer.isOnline()) {
     reqPlayer.sendMessage("§c" + Residence.getLanguage().getPhrase("NotOnline"));
     return;
   }
   CuboidArea[] areas = res.getAreaArray();
   PermissionGroup g = Residence.getPermissionManager().getGroup(giveplayer);
   if (areas.length > g.getMaxPhysicalPerResidence() && !resadmin) {
     reqPlayer.sendMessage("§c" + Residence.getLanguage().getPhrase("ResidenceGiveLimits"));
     return;
   }
   if (getOwnedZoneCount(giveplayer.getName()) >= g.getMaxZones() && !resadmin) {
     reqPlayer.sendMessage("§c" + Residence.getLanguage().getPhrase("ResidenceGiveLimits"));
     return;
   }
   if (!resadmin) {
     for (CuboidArea area : areas) {
       if (!g.inLimits(area)) {
         reqPlayer.sendMessage("§c" + Residence.getLanguage().getPhrase("ResidenceGiveLimits"));
         return;
       }
     }
   }
   res.getPermissions().setOwner(giveplayer.getName(), true);
   reqPlayer.sendMessage(
       "§a"
           + Residence.getLanguage()
               .getPhrase(
                   "ResidenceGive", "§e" + residence + "§a.§e" + giveplayer.getName() + "§a"));
   giveplayer.sendMessage(
       Residence.getLanguage()
           .getPhrase(
               "ResidenceRecieve", "§a" + reqPlayer.getName() + "§e.§a" + residence + "§e"));
 }
 public String getNameByLoc(Location loc) {
   if (loc == null) return null;
   Set<Entry<String, ClaimedResidence>> set = residences.entrySet();
   ClaimedResidence res = null;
   String name = null;
   synchronized (residences) {
     for (Entry<String, ClaimedResidence> key : set) {
       res = key.getValue();
       if (res.containsLoc(loc)) {
         name = key.getKey();
         break;
       }
     }
   }
   if (name == null) return null;
   String szname = res.getSubzoneNameByLoc(loc);
   if (szname != null) {
     return name + "." + szname;
   }
   return name;
 }
 public boolean addResidence(String name, String owner, Location loc1, Location loc2) {
   if (!Residence.validName(name)) return false;
   if (loc1 == null
       || loc2 == null
       || !loc1.getWorld().getName().equals(loc2.getWorld().getName())) {
     return false;
   }
   PermissionGroup group =
       Residence.getPermissionManager().getGroup(owner, loc1.getWorld().getName());
   CuboidArea newArea = new CuboidArea(loc1, loc2);
   ClaimedResidence newRes = new ClaimedResidence(owner, loc1.getWorld().getName());
   newRes.getPermissions().applyDefaultFlags();
   newRes.setEnterMessage(group.getDefaultEnterMessage());
   newRes.setLeaveMessage(group.getDefaultLeaveMessage());
   ResidenceCreationEvent resevent = new ResidenceCreationEvent(null, name, newRes, newArea);
   Residence.getServ().getPluginManager().callEvent(resevent);
   if (resevent.isCancelled()) {
     return false;
   }
   newArea = resevent.getPhysicalArea();
   name = resevent.getResidenceName();
   if (residences.containsKey(name)) {
     return false;
   }
   newRes.addArea(newArea, "main");
   if (newRes.getAreaCount() != 0) {
     residences.put(name, newRes);
   }
   return true;
 }
 public ClaimedResidence getByLoc(Location loc) {
   if (loc == null) return null;
   ClaimedResidence res = null;
   boolean found = false;
   Set<Entry<String, ClaimedResidence>> set = residences.entrySet();
   synchronized (residences) {
     for (Entry<String, ClaimedResidence> key : set) {
       res = key.getValue();
       if (res.containsLoc(loc)) {
         found = true;
         break;
       }
     }
   }
   if (!found) {
     return null;
   }
   ClaimedResidence subres = res.getSubzoneByLoc(loc);
   if (subres == null) {
     return res;
   }
   return subres;
 }
  public void addResidence(
      Player player, String name, Location loc1, Location loc2, boolean resadmin) {
    if (!Residence.validName(name)) {
      player.sendMessage("§c" + Residence.getLanguage().getPhrase("InvalidNameCharacters"));
      return;
    }
    if (player == null) return;
    if (loc1 == null
        || loc2 == null
        || !loc1.getWorld().getName().equals(loc2.getWorld().getName())) {
      player.sendMessage("§c" + Residence.getLanguage().getPhrase("SelectPoints"));
      return;
    }
    PermissionGroup group = Residence.getPermissionManager().getGroup(player);
    boolean createpermission =
        group.canCreateResidences()
            || Residence.getPermissionManager().hasAuthority(player, "residence.create", false);
    if (!createpermission && !resadmin) {
      player.sendMessage("§c" + Residence.getLanguage().getPhrase("NoPermission"));
      return;
    }
    if (getOwnedZoneCount(player.getName()) >= group.getMaxZones() && !resadmin) {
      player.sendMessage("§c" + Residence.getLanguage().getPhrase("ResidenceTooMany"));
      return;
    }
    CuboidArea newArea = new CuboidArea(loc1, loc2);
    ClaimedResidence newRes = new ClaimedResidence(player.getName(), loc1.getWorld().getName());
    newRes.getPermissions().applyDefaultFlags();
    newRes.setEnterMessage(group.getDefaultEnterMessage());
    newRes.setLeaveMessage(group.getDefaultLeaveMessage());

    ResidenceCreationEvent resevent = new ResidenceCreationEvent(player, name, newRes, newArea);
    Residence.getServ().getPluginManager().callEvent(resevent);
    if (resevent.isCancelled()) return;
    newArea = resevent.getPhysicalArea();
    name = resevent.getResidenceName();
    if (residences.containsKey(name)) {
      player.sendMessage(
          "§c" + Residence.getLanguage().getPhrase("ResidenceAlreadyExists", "§e" + name + "§c"));
      return;
    }
    newRes.addArea(player, newArea, "main", resadmin);
    if (newRes.getAreaCount() != 0) {
      residences.put(name, newRes);
      Residence.getLeaseManager().removeExpireTime(name);
      player.sendMessage(
          "§a" + Residence.getLanguage().getPhrase("ResidenceCreate", "§e" + name + "§a"));
      if (Residence.getConfigManager().useLeases())
        Residence.getLeaseManager().setExpireTime(player, name, group.getLeaseGiveTime());
    }
  }
  public boolean setFlag(Player player, String flag, String flagstate, boolean resadmin) {
    if (validFlagGroups.containsKey(flag))
      return this.setFlagGroup(player, flag, flagstate, resadmin);

    FlagState state = FlagPermissions.stringToFlagState(flagstate);

    if (Residence.getConfigManager().isPvPFlagPrevent()) {
      for (String oneFlag : Residence.getConfigManager().getProtectedFlagsList()) {
        if (!flag.equalsIgnoreCase(oneFlag)) continue;

        ArrayList<Player> players = this.residence.getPlayersInResidence();
        if (!resadmin
            && (players.size() > 1
                || players.size() == 1 && !players.get(0).getName().equals(this.getOwner()))) {
          int size = 0;
          for (Player one : players) {
            if (!one.getName().equals(this.getOwner())) size++;
          }
          player.sendMessage(
              ChatColor.RED
                  + Residence.getLanguage().getPhrase("FlagChangeDeny", flag + "|" + size));
          return false;
        }
      }
    }

    if (checkCanSetFlag(player, flag, state, true, resadmin)) {
      ResidenceFlagChangeEvent fc =
          new ResidenceFlagChangeEvent(
              residence, player, flag, ResidenceFlagChangeEvent.FlagType.RESIDENCE, state, null);
      Residence.getServ().getPluginManager().callEvent(fc);
      if (fc.isCancelled()) return false;
      if (super.setFlag(flag, state)) {
        player.sendMessage(
            ChatColor.GREEN
                + Residence.getLanguage()
                    .getPhrase("FlagSet", flag + "|" + residence.getName() + "|" + flagstate));
        return true;
      }
    }
    return false;
  }
 public boolean hasResidencePermission(Player player, boolean requireOwner) {
   if (Residence.getConfigManager().enabledRentSystem()) {
     String resname = residence.getName();
     if (Residence.getRentManager().isRented(resname)) {
       if (requireOwner) {
         return false;
       }
       String renter = Residence.getRentManager().getRentingPlayer(resname);
       if (player.getName().equalsIgnoreCase(renter)) {
         return true;
       } else {
         return (playerHas(player.getName(), "admin", false));
       }
     }
   }
   if (requireOwner) {
     return (this.getOwner().equalsIgnoreCase(player.getName()));
   }
   return (playerHas(player.getName(), "admin", false)
       || this.getOwner().equalsIgnoreCase(player.getName()));
 }
 public void mirrorPerms(
     Player reqPlayer, String targetArea, String sourceArea, boolean resadmin) {
   ClaimedResidence reciever = this.getByName(targetArea);
   ClaimedResidence source = this.getByName(sourceArea);
   if (source == null || reciever == null) {
     reqPlayer.sendMessage("§c" + Residence.getLanguage().getPhrase("InvalidResidence"));
     return;
   }
   if (!resadmin) {
     if (!reciever.getPermissions().hasResidencePermission(reqPlayer, true)
         || !source.getPermissions().hasResidencePermission(reqPlayer, true)) {
       reqPlayer.sendMessage("§c" + Residence.getLanguage().getPhrase("NoPermission"));
       return;
     }
   }
   reciever.getPermissions().applyTemplate(reqPlayer, source.getPermissions(), resadmin);
 }
  public boolean setPlayerFlag(
      Player player,
      String targetPlayer,
      String flag,
      String flagstate,
      boolean resadmin,
      boolean Show) {

    if (Residence.getPlayerUUID(targetPlayer) == null) {
      player.sendMessage("no player by this name");
      return false;
    }

    if (validFlagGroups.containsKey(flag))
      return this.setFlagGroupOnPlayer(player, targetPlayer, flag, flagstate, resadmin);
    FlagState state = FlagPermissions.stringToFlagState(flagstate);
    if (checkCanSetFlag(player, flag, state, false, resadmin)) {
      ResidenceFlagChangeEvent fc =
          new ResidenceFlagChangeEvent(
              residence,
              player,
              flag,
              ResidenceFlagChangeEvent.FlagType.PLAYER,
              state,
              targetPlayer);
      Residence.getServ().getPluginManager().callEvent(fc);
      if (fc.isCancelled()) return false;
      if (super.setPlayerFlag(targetPlayer, flag, state)) {
        if (Show)
          player.sendMessage(
              ChatColor.GREEN
                  + Residence.getLanguage()
                      .getPhrase("FlagSet", flag + "|" + residence.getName() + "|" + flagstate));
        return true;
      }
    }
    return false;
  }
 public static ResidenceManager loadMap(Map<String, Object> root, ResidenceManager resm)
     throws Exception {
   if (root != null) {
     for (Entry<String, Object> res : root.entrySet()) {
       try {
         resm.residences.put(
             res.getKey(), ClaimedResidence.load((Map<String, Object>) res.getValue(), null));
       } catch (Exception ex) {
         System.out.print(
             "[Residence] Failed to load residence ("
                 + res.getKey()
                 + ")! Reason:"
                 + ex.getMessage()
                 + " Error Log:");
         Logger.getLogger(ResidenceManager.class.getName()).log(Level.SEVERE, null, ex);
         if (Residence.getConfigManager().stopOnSaveError()) {
           throw (ex);
         }
       }
     }
   }
   return resm;
 }
 public boolean renameResidence(Player player, String oldName, String newName, boolean resadmin) {
   if (!Residence.validName(newName)) {
     player.sendMessage("§c" + Residence.getLanguage().getPhrase("InvalidNameCharacters"));
     return false;
   }
   ClaimedResidence res = this.getByName(oldName);
   if (res == null) {
     if (player != null)
       player.sendMessage("§c" + Residence.getLanguage().getPhrase("InvalidResidence"));
     return false;
   }
   if (res.getPermissions().hasResidencePermission(player, true) || resadmin) {
     if (res.getParent() == null) {
       if (residences.containsKey(newName)) {
         if (player != null)
           player.sendMessage(
               "§c"
                   + Residence.getLanguage()
                       .getPhrase("ResidenceAlreadyExists", "§e" + newName + "§c"));
         return false;
       }
       residences.put(newName, res);
       residences.remove(oldName);
       if (Residence.getConfigManager().useLeases())
         Residence.getLeaseManager().updateLeaseName(oldName, newName);
       if (Residence.getConfigManager().enabledRentSystem()) {
         Residence.getRentManager().updateRentableName(oldName, newName);
       }
       if (player != null)
         player.sendMessage(
             "§a"
                 + Residence.getLanguage()
                     .getPhrase("ResidenceRename", "§e" + oldName + "§a.§e" + newName + "§a"));
       return true;
     } else {
       String[] oldname = oldName.split("\\.");
       ClaimedResidence parent = res.getParent();
       return parent.renameSubzone(player, oldname[oldname.length - 1], newName, resadmin);
     }
   } else {
     if (player != null)
       player.sendMessage("§c" + Residence.getLanguage().getPhrase("NoPermission"));
     return false;
   }
 }
 public void printAreaInfo(String areaname, Player player) {
   ClaimedResidence res = this.getByName(areaname);
   if (res == null) {
     player.sendMessage("§c" + Residence.getLanguage().getPhrase("InvalidResidence"));
     return;
   }
   ResidencePermissions perms = res.getPermissions();
   if (Residence.getConfigManager().enableEconomy())
     player.sendMessage(
         "§e"
             + Residence.getLanguage().getPhrase("Residence")
             + ":§2 "
             + areaname
             + " §eBank: §6"
             + res.getBank().getStoredMoney());
   else
     player.sendMessage("§e" + Residence.getLanguage().getPhrase("Residence") + ":§2 " + areaname);
   if (Residence.getConfigManager().enabledRentSystem()
       && Residence.getRentManager().isRented(areaname))
     player.sendMessage(
         "§e"
             + Residence.getLanguage().getPhrase("Owner")
             + ":§c "
             + perms.getOwner()
             + "§e Rented by: §c"
             + Residence.getRentManager().getRentingPlayer(areaname));
   else
     player.sendMessage(
         "§e"
             + Residence.getLanguage().getPhrase("Owner")
             + ":§c "
             + perms.getOwner()
             + "§e - "
             + Residence.getLanguage().getPhrase("World")
             + ": §c"
             + perms.getWorld());
   player.sendMessage(
       "§e" + Residence.getLanguage().getPhrase("Flags") + ":§9 " + perms.listFlags());
   player.sendMessage(
       "§e"
           + Residence.getLanguage().getPhrase("Your.Flags")
           + ": §a"
           + perms.listPlayerFlags(player.getName()));
   player.sendMessage(
       "§e" + Residence.getLanguage().getPhrase("Group.Flags") + ":§c " + perms.listGroupFlags());
   player.sendMessage(
       "§e"
           + Residence.getLanguage().getPhrase("Others.Flags")
           + ":§c "
           + perms.listOtherPlayersFlags(player.getName()));
   String aid = res.getAreaIDbyLoc(player.getLocation());
   if (aid != null)
     player.sendMessage("§e" + Residence.getLanguage().getPhrase("CurrentArea") + ": §6" + aid);
   player.sendMessage(
       "§e" + Residence.getLanguage().getPhrase("Total.Size") + ":§d " + res.getTotalSize());
   if (Residence.getConfigManager().useLeases()
       && Residence.getLeaseManager().leaseExpires(areaname)) {
     player.sendMessage(
         "§e"
             + Residence.getLanguage().getPhrase("LeaseExpire")
             + ":§a "
             + Residence.getLeaseManager().getExpireTime(areaname));
   }
 }