From d8f783999b76967e98f32c3cba3633d646d2b104 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 17 Jul 2018 22:38:47 -0700 Subject: [PATCH] Added creeper listener. Fixed bugs with listener reg. --- .../listeners/flags/CreeperListener.java | 57 +++++++++++++++++++ .../us/tastybento/bskyblock/lists/Flags.java | 9 ++- .../bskyblock/managers/FlagsManager.java | 2 +- 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/CreeperListener.java diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/CreeperListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/CreeperListener.java new file mode 100644 index 000000000..ecaa0e56a --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/CreeperListener.java @@ -0,0 +1,57 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Creeper; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityExplodeEvent; + +import us.tastybento.bskyblock.api.flags.AbstractFlagListener; +import us.tastybento.bskyblock.api.localization.TextVariables; +import us.tastybento.bskyblock.api.user.User; +import us.tastybento.bskyblock.lists.Flags; + +/** + * Listens for creepers hsssssssh! + * For the {@link us.tastybento.bskyblock.lists.Flags#CREEPER_DAMAGE} + * and {@link us.tastybento.bskyblock.lists.Flags#CREEPER_GRIEFING} flags. + * @author tastybento + * + */ +public class CreeperListener extends AbstractFlagListener { + + /** + * Prevent damage from explosion + * @param e - event + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onExplosion(final EntityExplodeEvent e) { + Bukkit.getLogger().info(e.getEventName()); + if (e.getEntity() == null || !e.getEntityType().equals(EntityType.CREEPER)) { + return; + } + // If creeper damage is not allowed in world, remove it + if (!Flags.CREEPER_DAMAGE.isSetForWorld(e.getLocation().getWorld())) { + // If any were removed, then prevent damage too + e.blockList().clear(); + e.setCancelled(true); + return; + } + // Check for griefing + Creeper creeper = (Creeper)e.getEntity(); + if (!Flags.CREEPER_GRIEFING.isSetForWorld(e.getLocation().getWorld()) && creeper.getTarget() instanceof Player) { + Player target = (Player)creeper.getTarget(); + if (!getIslands().locationIsOnIsland(target, e.getLocation())) { + User user = User.getInstance(target); + user.notify("protection.protected", TextVariables.DESCRIPTION, user.getTranslation(Flags.CREEPER_GRIEFING.getHintReference())); + e.setCancelled(true); + e.blockList().clear(); + } + } + } +} diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 3c29f63ba..7e334035e 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -15,6 +15,7 @@ import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; import us.tastybento.bskyblock.listeners.flags.BreedingListener; import us.tastybento.bskyblock.listeners.flags.BucketListener; import us.tastybento.bskyblock.listeners.flags.CleanSuperFlatListener; +import us.tastybento.bskyblock.listeners.flags.CreeperListener; import us.tastybento.bskyblock.listeners.flags.EggListener; import us.tastybento.bskyblock.listeners.flags.EnderChestListener; import us.tastybento.bskyblock.listeners.flags.EnterExitListener; @@ -191,10 +192,16 @@ public class Flags { public static final Flag CHEST_DAMAGE = new FlagBuilder().id("CHEST_DAMAGE").icon(Material.TRAPPED_CHEST).type(Type.WORLD_SETTING) .allowedByDefault(false).build(); - public static final Flag CREEPER_DAMAGE = new FlagBuilder().id("CREEPER_DAMAGE").icon(Material.GREEN_SHULKER_BOX).type(Type.WORLD_SETTING) + public static final Flag CREEPER_DAMAGE = new FlagBuilder().id("CREEPER_DAMAGE").listener(new CreeperListener()).icon(Material.GREEN_SHULKER_BOX).type(Type.WORLD_SETTING) .allowedByDefault(true).build(); + /** + * Prevents creeper griefing. This is where a visitor will trigger a creeper to blow up an island. + */ public static final Flag CREEPER_GRIEFING = new FlagBuilder().id("CREEPER_GRIEFING").icon(Material.FIREWORK).type(Type.WORLD_SETTING) .allowedByDefault(false).build(); + /** + * Globally allows or disallows TNT explosion damage/pain. + */ public static final Flag TNT = new FlagBuilder().id("TNT").icon(Material.TNT).listener(new TNTListener()).allowedByDefault(false).type(Type.WORLD_SETTING).build(); diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 37a3cd88d..f7ad11d88 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -56,7 +56,7 @@ public class FlagsManager { * Register any unregistered listeners - called after the plugin is fully loaded */ public void registerListeners() { - registeredListeners.entrySet().stream().filter(Map.Entry::getValue).map(Map.Entry::getKey).forEach(this::registerListener); + registeredListeners.entrySet().stream().filter(e -> !e.getValue()).map(Map.Entry::getKey).forEach(this::registerListener); } /**