From c882ca3288302aa5cfdd84e27efecf92bae1ed93 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 3 Jan 2021 17:54:33 -0800 Subject: [PATCH] Added owner to WarpRemoveEvent https://github.com/BentoBoxWorld/Warps/issues/91 --- .../bentobox/warps/WarpSignsManager.java | 11 ++++++ .../bentobox/warps/event/WarpRemoveEvent.java | 38 +++++++++++++------ .../warps/listeners/WarpSignsListener.java | 35 ++++++++++------- 3 files changed, 59 insertions(+), 25 deletions(-) diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index 87ddae1..d408638 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.UUID; @@ -128,6 +129,16 @@ public class WarpSignsManager { return getWarpMap(location.getWorld()).entrySet().stream().filter(en -> en.getValue().equals(location)) .findFirst().map(en -> plugin.getPlayers().getName(en.getKey())).orElse(""); } + + /** + * Get the optional UUID of the warp owner by location + * @param location to search + * @return Optional UUID of warp owner or empty if there is none + */ + public Optional getWarpOwnerUUID(Location location) { + return getWarpMap(location.getWorld()).entrySet().stream().filter(en -> en.getValue().equals(location)) + .findFirst().map(Map.Entry::getKey); + } /** * Get sorted list of warps with most recent players listed first diff --git a/src/main/java/world/bentobox/warps/event/WarpRemoveEvent.java b/src/main/java/world/bentobox/warps/event/WarpRemoveEvent.java index 54837f0..ccbd369 100644 --- a/src/main/java/world/bentobox/warps/event/WarpRemoveEvent.java +++ b/src/main/java/world/bentobox/warps/event/WarpRemoveEvent.java @@ -5,8 +5,8 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; - -import world.bentobox.warps.Warp; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; /** * This event is fired when a Warp is removed (when a warp sign is broken) @@ -18,32 +18,48 @@ import world.bentobox.warps.Warp; public class WarpRemoveEvent extends Event{ private static final HandlerList handlers = new HandlerList(); - private Location warpLoc; - private UUID remover; + private final Location warpLoc; + private final UUID remover; + private final UUID owner; /** - * @param plugin - BSkyBlock plugin objects - * @param warpLoc - * @param remover + * @param warpLoc - Warp location + * @param remover - UUID of remover + * @param owner - UUID of warp owner - rarely, may be null */ - public WarpRemoveEvent(Warp plugin, Location warpLoc, UUID remover){ + public WarpRemoveEvent(@NonNull Location warpLoc, UUID remover, @Nullable UUID owner){ this.warpLoc = warpLoc; this.remover = remover; + this.owner = owner; } /** * Get the location of the removed Warp * @return removed warp's location */ - public Location getWarpLocation(){return this.warpLoc;} + @NonNull + public Location getWarpLocation(){ + return this.warpLoc; + } /** * Get who has removed the warp * @return the warp's remover */ - public UUID getRemover(){return this.remover;} + @NonNull + public UUID getRemover(){ + return this.remover; + } - @Override + /** + * @return the owner + */ + @Nullable + protected UUID getOwner() { + return owner; + } + + @Override public HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java index f16f48c..e0800f6 100644 --- a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java +++ b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java @@ -5,7 +5,11 @@ import java.util.Iterator; import java.util.Map; import java.util.UUID; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Tag; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; @@ -14,9 +18,10 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.SignChangeEvent; - import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.scheduler.BukkitRunnable; +import org.eclipse.jdt.annotation.Nullable; + import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.events.addon.AddonEvent; import world.bentobox.bentobox.api.events.team.TeamKickEvent; @@ -99,21 +104,21 @@ public class WarpSignsListener implements Listener { boolean inWorld = addon.getPlugin().getIWM().inWorld(b.getWorld()); // Signs only // FIXME: When we drop support for 1.13, switch to Tag.SIGNS - if (!e.getBlock().getType().name().contains("SIGN") + if (!b.getType().name().contains("SIGN") || (inWorld && !addon.inRegisteredWorld(b.getWorld())) - || (!inWorld && !addon.getSettings().isAllowInOtherWorlds()) ) { + || (!inWorld && !addon.getSettings().isAllowInOtherWorlds()) + || !isWarpSign(b)) { return; } User user = User.getInstance(e.getPlayer()); - if (isWarpSign(b)) { - if (isPlayersSign(e.getPlayer(), b, inWorld)) { - addon.getWarpSignsManager().removeWarp(b.getLocation()); - Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(addon, b.getLocation(), user.getUniqueId())); - } else { - // Someone else's sign - not allowed - user.sendMessage("warps.error.no-remove"); - e.setCancelled(true); - } + UUID owner = addon.getWarpSignsManager().getWarpOwnerUUID(b.getLocation()).orElse(null); + if (isPlayersSign(e.getPlayer(), b, inWorld)) { + addon.getWarpSignsManager().removeWarp(b.getLocation()); + Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(b.getLocation(), user.getUniqueId(), owner)); + } else { + // Someone else's sign - not allowed + user.sendMessage("warps.error.no-remove"); + e.setCancelled(true); } } @@ -175,7 +180,9 @@ public class WarpSignsListener implements Listener { oldSign.update(true, false); user.sendMessage("warps.deactivate"); addon.getWarpSignsManager().removeWarp(oldSignBlock.getWorld(), user.getUniqueId()); - Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(addon, oldSign.getLocation(), user.getUniqueId())); + @Nullable + UUID owner = addon.getWarpSignsManager().getWarpOwnerUUID(oldSignLoc).orElse(null); + Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(oldSign.getLocation(), user.getUniqueId(), owner)); } } // Set up the new warp sign