diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java index ad2efdba5..53ff1b9a9 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java @@ -1692,107 +1692,6 @@ public class IslandsManager { .anyMatch(n -> ChatColor.stripColor(n).equals(ChatColor.stripColor(name))); } - /** - * Called by the admin team fix command. Attempts to fix the database for teams. - * It will identify and correct situations where a player is listed in multiple - * teams, or is the owner of multiple teams. It will also try to fix the current - * cache. It is recommended to restart the server after this command is run. - * - * @param user - admin calling - * @param world - game world to check - * @return CompletableFuture boolean - true when done - * @deprecated Not compatible with multi-islands. Will be removed. - */ - @Deprecated - public CompletableFuture checkTeams(User user, World world) { - CompletableFuture r = new CompletableFuture<>(); - user.sendMessage("commands.admin.team.fix.scanning"); - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - Map owners = new HashMap<>(); - Map freq = new HashMap<>(); - Map> memberships = new HashMap<>(); - handler.loadObjects().stream().filter(i -> i.getOwner() != null).filter(i -> i.getWorld() != null) - .filter(i -> i.getWorld().equals(world)).filter(i -> !i.isDoNotLoad()).forEach(i -> { - int count = freq.getOrDefault(i.getOwner(), 0); - freq.put(i.getOwner(), count + 1); - if (owners.containsKey(i.getOwner())) { - // Player already has an island in the database - user.sendMessage("commands.admin.team.fix.duplicate-owner", TextVariables.NAME, - plugin.getPlayers().getName(i.getOwner())); - Island prev = owners.get(i.getOwner()); - // Find out if this island is in the cache - Island cachedIsland = this.getIsland(i.getWorld(), i.getOwner()); - if (cachedIsland != null && !cachedIsland.getUniqueId().equals(i.getUniqueId())) { - islandCache.deleteIslandFromCache(i.getUniqueId()); - handler.deleteID(i.getUniqueId()); - } - if (cachedIsland != null && !cachedIsland.getUniqueId().equals(prev.getUniqueId())) { - islandCache.deleteIslandFromCache(prev.getUniqueId()); - handler.deleteID(prev.getUniqueId()); - } - } else { - owners.put(i.getOwner(), i); - i.getMemberSet().forEach(u -> - // Place into membership - memberships.computeIfAbsent(u, k -> new ArrayList<>()).add(i)); - } - }); - freq.entrySet().stream().filter(en -> en.getValue() > 1) - .forEach(en -> user.sendMessage("commands.admin.team.fix.player-has", TextVariables.NAME, - plugin.getPlayers().getName(en.getKey()), TextVariables.NUMBER, - String.valueOf(en.getValue()))); - // Check for players in multiple teams - memberships.entrySet().stream().filter(en -> en.getValue().size() > 1).forEach(en -> { - // Get the islands - String ownerName = plugin.getPlayers().getName(en.getKey()); - user.sendMessage("commands.admin.team.fix.duplicate-member", TextVariables.NAME, ownerName); - int highestRank = 0; - Island highestIsland = null; - for (Island i : en.getValue()) { - int rankValue = i.getRank(en.getKey()); - String rank = RanksManager.getInstance().getRank(rankValue); - if (rankValue > highestRank || highestIsland == null) { - highestRank = rankValue; - highestIsland = i; - } - String xyz = Util.xyz(i.getCenter().toVector()); - user.sendMessage("commands.admin.team.fix.rank-on-island", TextVariables.RANK, - user.getTranslation(rank), TextVariables.XYZ, xyz); - user.sendRawMessage(i.getUniqueId()); - } - // Fix island ownership in cache - // Correct island cache - if (highestRank == RanksManager.OWNER_RANK && highestIsland != null - && islandCache.getIslandById(highestIsland.getUniqueId()) != null) { - islandCache.setOwner(islandCache.getIslandById(highestIsland.getUniqueId()), en.getKey()); - } - // Fix all the entries that are not the highest - for (Island island : en.getValue()) { - if (!island.equals(highestIsland)) { - // Get the actual island being used in the cache - Island i = islandCache.getIslandById(island.getUniqueId()); - if (i != null) { - // Remove membership of this island - i.removeMember(en.getKey()); - } - // Remove from database island - island.removeMember(en.getKey()); - // Save to database - handler.saveObjectAsync(island) - .thenRun(() -> user.sendMessage("commands.admin.team.fix.fixed")); - } else { - // Special check for when a player is an owner and member - } - } - - }); - user.sendMessage("commands.admin.team.fix.done"); - r.complete(true); - }); - - return r; - } - /** * Is user mid home teleport? * diff --git a/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java b/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java index 52d2d8d2d..bf459c7d2 100644 --- a/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java +++ b/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java @@ -62,7 +62,7 @@ public class IslandCache { return; } // Get the old island - Island oldIsland = islandsById.get(newIsland.getUniqueId()); + Island oldIsland = getIslandById(newIsland.getUniqueId()); Set newMembers = newIsland.getMembers().keySet(); if (oldIsland != null) { Set oldMembers = oldIsland.getMembers().keySet(); @@ -84,7 +84,7 @@ public class IslandCache { islandsByUUID.put(newMember, set); } - if (islandsById.put(newIsland.getUniqueId(), newIsland) == null) { + if (setIslandById(newIsland) == null) { BentoBox.getInstance().logError("islandsById failed to update"); } @@ -101,7 +101,7 @@ public class IslandCache { return false; } if (addToGrid(island)) { - islandsById.put(island.getUniqueId(), island); + setIslandById(island); // Only add islands to this map if they are owned if (island.isOwned()) { islandsByUUID.computeIfAbsent(island.getOwner(), k -> new HashSet<>()).add(island.getUniqueId()); @@ -120,7 +120,7 @@ public class IslandCache { * associated per world. */ public void addPlayer(@NonNull UUID uuid, @NonNull Island island) { - this.islandsById.put(island.getUniqueId(), island); + this.setIslandById(island); this.islandsByUUID.computeIfAbsent(uuid, k -> new HashSet<>()).add(island.getUniqueId()); } @@ -166,7 +166,7 @@ public class IslandCache { */ public void deleteIslandFromCache(@NonNull String uniqueId) { if (islandsById.containsKey(uniqueId)) { - deleteIslandFromCache(islandsById.get(uniqueId)); + deleteIslandFromCache(getIslandById(uniqueId)); } } @@ -182,7 +182,6 @@ public class IslandCache { public Island get(@NonNull World world, @NonNull UUID uuid) { List islands = getIslands(world, uuid); if (islands.isEmpty()) { - System.out.println("empty"); return null; } for (Island island : islands) { @@ -208,7 +207,7 @@ public class IslandCache { if (w == null) { return new ArrayList<>(); } - return islandsByUUID.computeIfAbsent(uuid, k -> new HashSet<>()).stream().map(islandsById::get) + return islandsByUUID.computeIfAbsent(uuid, k -> new HashSet<>()).stream().map(this::getIslandById) .filter(Objects::nonNull).filter(island -> w.equals(island.getWorld())) .sorted(Comparator.comparingLong(Island::getCreatedDate)) .collect(Collectors.toList()); @@ -384,7 +383,7 @@ public class IslandCache { islandsByUUID.computeIfAbsent(newOwnerUUID, k -> new HashSet<>()).add(island.getUniqueId()); } island.setRank(newOwnerUUID, RanksManager.OWNER_RANK); - islandsById.put(island.getUniqueId(), island); + setIslandById(island); } /** @@ -399,6 +398,10 @@ public class IslandCache { return islandsById.get(uniqueId); } + private Island setIslandById(Island island) { + return islandsById.put(island.getUniqueId(), island); + } + /** * Resets all islands in this game mode to default flag settings *