From 68a52c71bfe80ee53360df8e1eb5f806523e9eea Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 20 Mar 2019 22:46:13 -0700 Subject: [PATCH] Prevents dragon eggs from teleporting outside of protection zone https://github.com/BentoBoxWorld/BentoBox/issues/558 --- .../protection/BlockInteractionListener.java | 22 +++++++++++++++++++ .../LiquidsFlowingOutListener.java | 1 + 2 files changed, 23 insertions(+) diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BlockInteractionListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BlockInteractionListener.java index 390db2490..e582c34b0 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BlockInteractionListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/protection/BlockInteractionListener.java @@ -2,12 +2,14 @@ package world.bentobox.bentobox.listeners.flags.protection; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.player.PlayerInteractEvent; import world.bentobox.bentobox.api.flags.FlagListener; @@ -276,4 +278,24 @@ public class BlockInteractionListener extends FlagListener { public void onBlockBreak(final BlockBreakEvent e) { checkClickedBlock(e, e.getPlayer(), e.getBlock().getLocation(), e.getBlock().getType()); } + + /** + * Prevents dragon eggs from flying out of an island's protected space + * @param e - event + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onDragonEggTeleport(BlockFromToEvent e) { + Block from = e.getBlock(); + if (!from.getType().equals(Material.DRAGON_EGG) || !getIWM().inWorld(from.getLocation())) { + return; + } + // If egg starts in a protected island... + getIslands().getProtectedIslandAt(from.getLocation()).ifPresent(fromIsland -> { + // Cancel if toIsland is not fromIsland or if there is no protected island there + // This protects against eggs dropping into adjacent islands, e.g. island distance and protection range are equal + e.setCancelled(getIslands().getProtectedIslandAt(e.getToBlock().getLocation()).map(toIsland -> { + return toIsland != fromIsland; + }).orElse(true)); + }); + } } diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/LiquidsFlowingOutListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/LiquidsFlowingOutListener.java index 116e7d1ca..2d0be055d 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/LiquidsFlowingOutListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/LiquidsFlowingOutListener.java @@ -40,4 +40,5 @@ public class LiquidsFlowingOutListener extends FlagListener { e.setCancelled(true); } } + }