diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index 9ead6e8e0..4caeb61a1 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -839,6 +839,8 @@ protect: enderdragon-blockdamage: true enderman-pickup: false villager-death: false + bed-explosion: false + respawn-anchor-explosion: false # Monsters won't follow players. # permission essentials.protect.entitytarget.bypass disables this. entitytarget: false diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java index d7170188f..921a83ab6 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtect.java @@ -1,6 +1,5 @@ package com.earth2me.essentials.protect; -import com.earth2me.essentials.metrics.Metrics; import com.earth2me.essentials.metrics.MetricsWrapper; import com.earth2me.essentials.utils.VersionUtil; import org.bukkit.Material; @@ -33,7 +32,7 @@ public class EssentialsProtect extends JavaPlugin implements IProtect { enableEmergencyMode(pm); return; } - + initialize(pm, essPlugin); if (metrics == null) { @@ -52,14 +51,19 @@ public class EssentialsProtect extends JavaPlugin implements IProtect { pm.registerEvents(entityListener, this); if (VersionUtil.getServerBukkitVersion().isHigherThan(VersionUtil.v1_13_2_R01)) { - final EssentialsProtectEntityListener1_13_2_R1 entityListener1_13_2_r1 = new EssentialsProtectEntityListener1_13_2_R1(this); - pm.registerEvents(entityListener1_13_2_r1, this); + final EssentialsProtectEntityListener_1_13_2_R1 entityListener_1_13_2_r1 = new EssentialsProtectEntityListener_1_13_2_R1(this); + pm.registerEvents(entityListener_1_13_2_r1, this); } if (VersionUtil.getServerBukkitVersion().isHigherThan(VersionUtil.v1_14_R01)) { final EssentialsProtectEntityListener_1_14_R1 entityListener_1_14_r1 = new EssentialsProtectEntityListener_1_14_R1(this); pm.registerEvents(entityListener_1_14_r1, this); } + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_1_R01)) { + final EssentialsProtectBlockListener_1_16_R1 blockListener_1_16_r1 = new EssentialsProtectBlockListener_1_16_R1(this); + pm.registerEvents(blockListener_1_16_r1, this); + } + final EssentialsProtectWeatherListener weatherListener = new EssentialsProtectWeatherListener(this); pm.registerEvents(weatherListener, this); } diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java index 42a456963..4a0f30ef4 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java @@ -2,7 +2,9 @@ package com.earth2me.essentials.protect; import com.earth2me.essentials.utils.EnumUtil; +import com.earth2me.essentials.utils.MaterialUtil; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.*; @@ -10,11 +12,13 @@ import org.bukkit.entity.minecart.ExplosiveMinecart; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.world.PortalCreateEvent; import java.util.Set; @@ -125,4 +129,19 @@ public class EssentialsProtectBlockListener implements Listener { event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_portal_creation)); } } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerInteract(final PlayerInteractEvent event) { + if (!event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + return; + } + Block block = event.getClickedBlock(); + if (block == null) { + return; + } + World.Environment environment = block.getWorld().getEnvironment(); + if (MaterialUtil.isBed(block.getType()) && !environment.equals(World.Environment.NORMAL)) { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_bed_explosion)); + } + } } diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener_1_16_R1.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener_1_16_R1.java new file mode 100644 index 000000000..ed899031b --- /dev/null +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener_1_16_R1.java @@ -0,0 +1,38 @@ +package com.earth2me.essentials.protect; + +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.type.RespawnAnchor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; + +public class EssentialsProtectBlockListener_1_16_R1 implements Listener { + + final private IProtect prot; + + EssentialsProtectBlockListener_1_16_R1(final IProtect parent) { + this.prot = parent; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerInteract(final PlayerInteractEvent event) { + if (!event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + return; + } + Block block = event.getClickedBlock(); + if (block == null) { + return; + } + World.Environment environment = block.getWorld().getEnvironment(); + if (block.getType() == Material.RESPAWN_ANCHOR && !environment.equals(World.Environment.NETHER)) { + RespawnAnchor respawnAnchor = (RespawnAnchor) block.getBlockData(); + if (respawnAnchor.getCharges() == respawnAnchor.getMaximumCharges()) { + event.setCancelled(prot.getSettingBool(ProtectConfig.prevent_respawn_anchor_explosion)); + } + } + } +} diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener1_13_2_R1.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener_1_13_2_R1.java similarity index 93% rename from EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener1_13_2_R1.java rename to EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener_1_13_2_R1.java index 247b01bc2..8fa9ab960 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener1_13_2_R1.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener_1_13_2_R1.java @@ -11,11 +11,11 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityTransformEvent; -public class EssentialsProtectEntityListener1_13_2_R1 implements Listener { +public class EssentialsProtectEntityListener_1_13_2_R1 implements Listener { private final IProtect prot; private final IEssentials ess; - EssentialsProtectEntityListener1_13_2_R1(final IProtect prot) { + EssentialsProtectEntityListener_1_13_2_R1(final IProtect prot) { this.prot = prot; this.ess = prot.getEssentialsConnect().getEssentials(); } diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/ProtectConfig.java b/EssentialsProtect/src/com/earth2me/essentials/protect/ProtectConfig.java index 24ac3a80c..bab0e37e6 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/ProtectConfig.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/ProtectConfig.java @@ -47,6 +47,8 @@ public enum ProtectConfig { prevent_ender_crystal_explosion("protect.prevent.ender-crystal-explosion", false), prevent_enderman_pickup("protect.prevent.enderman-pickup", false), prevent_villager_death("protect.prevent.villager-death", false), + prevent_bed_explosion("protect.prevent.bed-explosion", false), + prevent_respawn_anchor_explosion("protect.prevent.respawn-anchor-explosion", false), prevent_enderdragon_blockdmg("protect.prevent.enderdragon-blockdamage", true), prevent_entitytarget("protect.prevent.entitytarget", false), enderdragon_fakeexplosions("protect.enderdragon-fakeexplosions", false),