diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java index f3cfaf0fc..464ad9602 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java @@ -442,6 +442,10 @@ public class IslandsManager { : Optional.empty(); } + public boolean isIslandAd(@NonNull Location location) { + return plugin.getIWM().inWorld(location) ? islandCache.isIslandAt(location) : false; + } + /** * Returns an unmodifiable collection of all existing islands * (even those who may be unowned). 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 b5f3f5413..a1c0c6859 100644 --- a/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java +++ b/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java @@ -257,6 +257,23 @@ public class IslandCache { } } + /** + * Returns if there is island at the location. This includes + * the full island space, not just the protected area. + * Does not cause a database load of the island. + * + * @param location the location + * @return true if there is an island there + */ + @Nullable + public boolean isIslandAt(@NonNull Location location) { + World w = Util.getWorld(location.getWorld()); + if (w == null || !grids.containsKey(w)) { + return false; + } + return grids.get(w).isIslandAt(location.getBlockX(), location.getBlockZ()); + } + /** * Returns the island at the location or null if there is none. This includes * the full island space, not just the protected area diff --git a/src/main/java/world/bentobox/bentobox/managers/island/IslandGrid.java b/src/main/java/world/bentobox/bentobox/managers/island/IslandGrid.java index 11a76c367..82120a986 100644 --- a/src/main/java/world/bentobox/bentobox/managers/island/IslandGrid.java +++ b/src/main/java/world/bentobox/bentobox/managers/island/IslandGrid.java @@ -3,6 +3,8 @@ package world.bentobox.bentobox.managers.island; import java.util.Map.Entry; import java.util.TreeMap; +import org.eclipse.jdt.annotation.Nullable; + import world.bentobox.bentobox.database.objects.Island; /** @@ -11,7 +13,11 @@ import world.bentobox.bentobox.database.objects.Island; * */ class IslandGrid { - private final TreeMap> grid = new TreeMap<>(); + + private record IslandData(String id, int minX, int minZ, int range) { + } + + private final TreeMap> grid = new TreeMap<>(); private final IslandCache im; /** @@ -29,10 +35,13 @@ class IslandGrid { */ public boolean addToGrid(Island island) { // Check if we know about this island already - if (grid.containsKey(island.getMinX())) { - TreeMap zEntry = grid.get(island.getMinX()); - if (zEntry.containsKey(island.getMinZ())) { - if (island.getUniqueId().equals(zEntry.get(island.getMinZ()))) { + int minX = island.getMinX(); + int minZ = island.getMinZ(); + IslandData islandData = new IslandData(island.getUniqueId(), minZ, minZ, island.getRange()); + if (grid.containsKey(minX)) { + TreeMap zEntry = grid.get(minX); + if (zEntry.containsKey(minZ)) { + if (island.getUniqueId().equals(zEntry.get(minZ).id())) { // If it is the same island then it's okay return true; } @@ -40,14 +49,14 @@ class IslandGrid { return false; } else { // Add island - zEntry.put(island.getMinZ(), island.getUniqueId()); - grid.put(island.getMinX(), zEntry); + zEntry.put(minZ, islandData); + grid.put(minX, zEntry); } } else { // Add island - TreeMap zEntry = new TreeMap<>(); - zEntry.put(island.getMinZ(), island.getUniqueId()); - grid.put(island.getMinX(), zEntry); + TreeMap zEntry = new TreeMap<>(); + zEntry.put(minZ, islandData); + grid.put(minX, zEntry); } return true; } @@ -60,7 +69,7 @@ class IslandGrid { public boolean removeFromGrid(Island island) { String id = island.getUniqueId(); boolean removed = grid.values().stream() - .anyMatch(innerMap -> innerMap.values().removeIf(innerValue -> innerValue.equals(id))); + .anyMatch(innerMap -> innerMap.values().removeIf(innerValue -> innerValue.id().equals(id))); grid.values().removeIf(TreeMap::isEmpty); @@ -70,35 +79,55 @@ class IslandGrid { /** * Retrieves the island located at the specified x and z coordinates, covering both the protected area * and the full island space. Returns null if no island exists at the given location. + * This will load the island from the database if it is not in the cache. * * @param x the x coordinate of the location * @param z the z coordinate of the location * @return the Island at the specified location, or null if no island is found */ public Island getIslandAt(int x, int z) { + String id = getIslandStringAt(x, z); + if (id == null) { + return null; + } + + // Retrieve the island using the id found - loading from database if required + return im.getIslandById(id); + } + + /** + * Checks if an island is at this coordinate or not + * @param x coord + * @param z coord + * @return true if there is an island registered in the grid + */ + public boolean isIslandAt(int x, int z) { + return getIslandStringAt(x, z) != null; + } + + /** + * Get the island ID string for an island at this coordinates, or null if none. + * @param x coord + * @param z coord + * @return Unique Island ID string, or null if there is no island here. + */ + public @Nullable String getIslandStringAt(int x, int z) { // Attempt to find the closest x-coordinate entry that does not exceed 'x' - Entry> xEntry = grid.floorEntry(x); + Entry> xEntry = grid.floorEntry(x); if (xEntry == null) { return null; // No x-coordinate entry found, return null } // Attempt to find the closest z-coordinate entry that does not exceed 'z' within the found x-coordinate - Entry zEntry = xEntry.getValue().floorEntry(z); + Entry zEntry = xEntry.getValue().floorEntry(z); if (zEntry == null) { return null; // No z-coordinate entry found, return null } - - // Retrieve the island using the id found in the z-coordinate entry - Island island = im.getIslandById(zEntry.getValue()); - if (island == null) { - return null; // No island found by the id, return null - } // Check if the specified coordinates are within the island space - if (island.inIslandSpace(x, z)) { - return island; // Coordinates are within island space, return the island + if (x >= zEntry.getValue().minX() && x < zEntry.getValue().minX() + zEntry.getValue().range() * 2 + && z >= zEntry.getValue().minZ() && z < zEntry.getValue().minZ() + zEntry.getValue().range() * 2) { + return zEntry.getValue().id(); } - - // Coordinates are outside the island space, return null return null; } @@ -107,7 +136,7 @@ class IslandGrid { */ public long getSize() { long count = 0; - for (TreeMap innerMap : grid.values()) { + for (TreeMap innerMap : grid.values()) { count += innerMap.size(); } return count; diff --git a/src/main/java/world/bentobox/bentobox/panels/customizable/SettingsPanel.java b/src/main/java/world/bentobox/bentobox/panels/customizable/SettingsPanel.java deleted file mode 100644 index 32c4ba91b..000000000 --- a/src/main/java/world/bentobox/bentobox/panels/customizable/SettingsPanel.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * - */ -package world.bentobox.bentobox.panels.customizable; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import org.bukkit.World; - -import world.bentobox.bentobox.BentoBox; -import world.bentobox.bentobox.api.commands.CompositeCommand; -import world.bentobox.bentobox.api.flags.Flag; -import world.bentobox.bentobox.api.panels.PanelItem; -import world.bentobox.bentobox.api.panels.TabbedPanel; -import world.bentobox.bentobox.api.panels.TemplatedPanel.ItemSlot; -import world.bentobox.bentobox.api.panels.reader.ItemTemplateRecord; -import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; - -/** - * - */ -public class SettingsPanel extends AbstractPanel { - - protected static final String PROTECTION_PANEL = "protection.panel."; - private static final String CLICK_TO_SWITCH = PROTECTION_PANEL + "mode.click-to-switch"; - protected Flag.Type type; - protected World world; - protected Island island; - protected TabbedPanel parent; - - private Map currentMode = new HashMap<>(); - - public SettingsPanel(CompositeCommand command, User user) { - super(command, user); - // TODO Auto-generated constructor stub - } - - @Override - protected void build() { - // TODO Auto-generated method stub - - } - - @Override - protected PanelItem createNextButton(ItemTemplateRecord arg0, ItemSlot arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - protected PanelItem createPreviousButton(ItemTemplateRecord arg0, ItemSlot arg1) { - // TODO Auto-generated method stub - return null; - } - -}