From 36ee63a70b8646a6a0db6cf4fb04f19e27c60a7c Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 9 Feb 2019 11:13:20 -0800 Subject: [PATCH] Fixes permission limits for new islands, resets, owner change etc. --- .../java/bentobox/addon/limits/Limits.java | 12 ++- .../addon/limits/commands/LimitPanel.java | 6 +- .../limits/listeners/BlockLimitsListener.java | 2 +- .../addon/limits/listeners/JoinListener.java | 89 ++++++++++++++++--- .../limits/objects/IslandBlockCount.java | 3 + 5 files changed, 98 insertions(+), 14 deletions(-) diff --git a/src/main/java/bentobox/addon/limits/Limits.java b/src/main/java/bentobox/addon/limits/Limits.java index ac265ad..d6d98ec 100644 --- a/src/main/java/bentobox/addon/limits/Limits.java +++ b/src/main/java/bentobox/addon/limits/Limits.java @@ -91,10 +91,20 @@ public class Limits extends Addon { * @param world - world * @return game mode name or empty string if none */ - public String getGameMode(World world) { + public String getGameModeName(World world) { return gameModes.stream().filter(gm -> gm.inWorld(world)).findFirst().map(gm -> gm.getDescription().getName()).orElse(""); } + /** + * Get the name of the game mode for this world + * @param world - world + * @return game mode name or empty string if none + */ + public String getGameModePermPrefix(World world) { + return gameModes.stream().filter(gm -> gm.inWorld(world)).findFirst().map(gm -> gm.getPermissionPrefix()).orElse(""); + } + + /** * Check if any of the game modes covered have this name * @param gameMode - name of game mode diff --git a/src/main/java/bentobox/addon/limits/commands/LimitPanel.java b/src/main/java/bentobox/addon/limits/commands/LimitPanel.java index 1592551..3fd6abd 100644 --- a/src/main/java/bentobox/addon/limits/commands/LimitPanel.java +++ b/src/main/java/bentobox/addon/limits/commands/LimitPanel.java @@ -37,7 +37,11 @@ class LimitPanel { // Get the island for the target Island island = addon.getIslands().getIsland(world, target); if (island == null) { - user.sendMessage("general.errors.player-has-no-island"); + if (user.getUniqueId().equals(target)) { + user.sendMessage("general.errors.no-island"); + } else { + user.sendMessage("general.errors.player-has-no-island"); + } return; } IslandBlockCount ibc = addon.getBlockLimitListener().getIsland(island.getUniqueId()); diff --git a/src/main/java/bentobox/addon/limits/listeners/BlockLimitsListener.java b/src/main/java/bentobox/addon/limits/listeners/BlockLimitsListener.java index 51eece3..d897a01 100644 --- a/src/main/java/bentobox/addon/limits/listeners/BlockLimitsListener.java +++ b/src/main/java/bentobox/addon/limits/listeners/BlockLimitsListener.java @@ -224,7 +224,7 @@ public class BlockLimitsListener implements Listener { // Check if on island return addon.getIslands().getIslandAt(b.getLocation()).map(i -> { String id = i.getUniqueId(); - String gameMode = addon.getGameMode(b.getWorld()); + String gameMode = addon.getGameModeName(b.getWorld()); if (gameMode.isEmpty()) { // Invalid world return -1; diff --git a/src/main/java/bentobox/addon/limits/listeners/JoinListener.java b/src/main/java/bentobox/addon/limits/listeners/JoinListener.java index 1545802..9faccea 100644 --- a/src/main/java/bentobox/addon/limits/listeners/JoinListener.java +++ b/src/main/java/bentobox/addon/limits/listeners/JoinListener.java @@ -1,9 +1,13 @@ package bentobox.addon.limits.listeners; import java.util.Locale; +import java.util.UUID; import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -13,6 +17,10 @@ import org.bukkit.permissions.PermissionAttachmentInfo; import bentobox.addon.limits.Limits; import bentobox.addon.limits.objects.IslandBlockCount; +import world.bentobox.bentobox.api.events.island.IslandEvent; +import world.bentobox.bentobox.api.events.island.IslandEvent.Reason; +import world.bentobox.bentobox.api.events.team.TeamEvent.TeamSetownerEvent; +import world.bentobox.bentobox.database.objects.Island; /** * Sets block limits based on player permission @@ -27,17 +35,6 @@ public class JoinListener implements Listener { this.addon = addon; } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) - public void onPlayerJoin(PlayerJoinEvent e) { - // Check if player has any islands in the game modes - addon.getGameModes().forEach(gm -> { - if (addon.getIslands().hasIsland(gm.getOverWorld(), e.getPlayer().getUniqueId())) { - String islandId = addon.getIslands().getIsland(gm.getOverWorld(), e.getPlayer().getUniqueId()).getUniqueId(); - checkPerms(e.getPlayer(), gm.getPermissionPrefix() + "island.limit.", islandId, gm.getDescription().getName()); - } - }); - } - private void checkPerms(Player player, String permissionPrefix, String islandId, String gameMode) { IslandBlockCount ibc = addon.getBlockLimitListener().getIsland(islandId); int limit = -1; @@ -82,4 +79,74 @@ public class JoinListener implements Listener { addon.logError("Player " + name + " has permission: '" + perm + " but " + error + " Ignoring..."); } + /* + * Event handling + */ + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onNewIsland(IslandEvent e) { + if (!e.getReason().equals(Reason.CREATED) + && !e.getReason().equals(Reason.RESETTED) + && !e.getReason().equals(Reason.REGISTERED)) { + return; + } + setOwnerPerms(e.getIsland(), e.getOwner()); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onOwnerChange(TeamSetownerEvent e) { + removeOwnerPerms(e.getIsland()); + setOwnerPerms(e.getIsland(), e.getNewOwner()); + } + + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onPlayerJoin(PlayerJoinEvent e) { + // Check if player has any islands in the game modes + addon.getGameModes().forEach(gm -> { + if (addon.getIslands().hasIsland(gm.getOverWorld(), e.getPlayer().getUniqueId())) { + String islandId = addon.getIslands().getIsland(gm.getOverWorld(), e.getPlayer().getUniqueId()).getUniqueId(); + checkPerms(e.getPlayer(), gm.getPermissionPrefix() + "island.limit.", islandId, gm.getDescription().getName()); + } + }); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onUnregisterIsland(IslandEvent e) { + if (!e.getReason().equals(Reason.UNREGISTERED)) { + return; + } + removeOwnerPerms(e.getIsland()); + } + + /* + * Utility methods + */ + + private void removeOwnerPerms(Island island) { + World world = island.getWorld(); + if (addon.inGameModeWorld(world)) { + IslandBlockCount ibc = addon.getBlockLimitListener().getIsland(island.getUniqueId()); + if (ibc != null) { + ibc.getBlockLimits().clear(); + } + } + } + + private void setOwnerPerms(Island island, UUID ownerUUID) { + World world = island.getWorld(); + if (addon.inGameModeWorld(world)) { + // Check if owner is online + OfflinePlayer owner = Bukkit.getOfflinePlayer(ownerUUID); + if (owner.isOnline()) { + // Set perm-based limits + String prefix = addon.getGameModePermPrefix(world); + String name = addon.getGameModeName(world); + if (!prefix.isEmpty() && !name.isEmpty()) { + checkPerms(owner.getPlayer(), prefix + "island.limit.", island.getUniqueId(), name); + } + } + } + } + } diff --git a/src/main/java/bentobox/addon/limits/objects/IslandBlockCount.java b/src/main/java/bentobox/addon/limits/objects/IslandBlockCount.java index dc7e30f..c629de2 100644 --- a/src/main/java/bentobox/addon/limits/objects/IslandBlockCount.java +++ b/src/main/java/bentobox/addon/limits/objects/IslandBlockCount.java @@ -24,6 +24,9 @@ public class IslandBlockCount implements DataObject { @Expose private Map blockCount = new HashMap<>(); + /** + * Permission based limits + */ @Expose private Map blockLimits = new HashMap<>();