diff --git a/src/main/java/eu/endermite/togglepvp/TogglePvP.java b/src/main/java/eu/endermite/togglepvp/TogglePvP.java index 28c1f1b..d951191 100644 --- a/src/main/java/eu/endermite/togglepvp/TogglePvP.java +++ b/src/main/java/eu/endermite/togglepvp/TogglePvP.java @@ -41,6 +41,8 @@ public final class TogglePvP extends JavaPlugin { getServer().getPluginManager().registerEvents(new PlayerHitByFireworkListener(), this); getServer().getPluginManager().registerEvents(new FishingListener(), this); getServer().getPluginManager().registerEvents(new LavaDumpAndIgniteListener(), this); + getServer().getPluginManager().registerEvents(new PlayerPlaceWitherRoseListener(), this); + getServer().getPluginManager().registerEvents(new PlayerHitByExplosionListener(), this); getServer().getPluginManager().registerEvents(new WolfTargettingListener(), this); getServer().getPluginManager().registerEvents(new WolfAttackPlayerListener(), this); diff --git a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java index da8a97b..8254de6 100644 --- a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java +++ b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java @@ -6,7 +6,8 @@ import org.bukkit.configuration.Configuration; public class ConfigCache { - @Getter private final boolean pvp_enabled_by_default, lava_and_fire_stopper_enabled; + @Getter private final boolean pvp_enabled_by_default; + @Getter private final boolean lava_and_fire_stopper_enabled; @Getter private final String pvp_enabled; @Getter private final String pvp_disabled; @Getter private final String cannot_attack_victim; @@ -16,6 +17,7 @@ public class ConfigCache { @Getter private final String pvp_enabled_other; @Getter private final String pvp_disabled_other; @Getter private final double lava_and_fire_stopper_radius; + @Getter private final boolean channeling_enchant_disabled; public ConfigCache() { @@ -27,6 +29,8 @@ public class ConfigCache { this.lava_and_fire_stopper_enabled = config.getBoolean("settings.lava_and_fire_stopper.enabled", true); this.lava_and_fire_stopper_radius = config.getDouble("settings.lava_and_fire_stopper.radius", 2.5); + this.channeling_enchant_disabled = config.getBoolean("channeling_enchant_disabled", true); + // Messages this.pvp_enabled = config.getString("messages.pvp_enabled", "&cYou enabled PvP!"); this.pvp_disabled = config.getString("messages.pvp_disabled", "&cYou disabled PvP!"); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java index 4228705..6a393b2 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java @@ -2,8 +2,10 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.util.BoundingBoxUtil; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -21,30 +23,33 @@ public class LavaDumpAndIgniteListener implements Listener { if (!TogglePvP.getPlugin().getConfigCache().isLava_and_fire_stopper_enabled()) return; - Location location = event.getBlockClicked().getLocation(); - Player damager = event.getPlayer(); - double radius = config.getLava_and_fire_stopper_radius(); - BoundingBox boundingBox = getBoundingBox(location, radius); - - for (Entity entity : location.getWorld().getNearbyEntities(boundingBox)) { - if (entity instanceof Player) { - Player victim = (Player) entity; - if (victim != damager) { - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); - if (!damagerPvpEnabled) { - PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); - event.setCancelled(true); - return; - } - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); - if (!victimPvpEnabled) { - PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); - event.setCancelled(true); - return; + if (event.getBucket().equals(Material.LAVA_BUCKET) || event.getBucket().equals(Material.PUFFERFISH_BUCKET)) { + Location location = event.getBlockClicked().getLocation(); + Player damager = event.getPlayer(); + double radius = config.getLava_and_fire_stopper_radius(); + BoundingBox boundingBox = BoundingBoxUtil.getBoundingBox(location, radius); + for (Entity entity : location.getWorld().getNearbyEntities(boundingBox)) { + if (entity instanceof Player) { + Player victim = (Player) entity; + if (victim != damager) { + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + if (!damagerPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); + event.setCancelled(true); + return; + } + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + if (!victimPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + event.setCancelled(true); + return; + } } } } } + + } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onIgnite(org.bukkit.event.block.BlockIgniteEvent event) { @@ -56,7 +61,7 @@ public class LavaDumpAndIgniteListener implements Listener { Location location = event.getBlock().getLocation(); Player damager = event.getPlayer(); double radius = config.getLava_and_fire_stopper_radius(); - BoundingBox boundingBox = getBoundingBox(location, radius); + BoundingBox boundingBox = BoundingBoxUtil.getBoundingBox(location, radius); for (Entity entity : location.getWorld().getNearbyEntities(boundingBox)) { if (entity instanceof Player) { Player victim = (Player) entity; @@ -82,18 +87,6 @@ public class LavaDumpAndIgniteListener implements Listener { } - private BoundingBox getBoundingBox(Location location, double radius) { - double x1 = location.getX()+radius; - double y1 = location.getY()+radius; - double z1 = location.getZ()+radius; - - double x2 = location.getX()-radius; - double y2 = location.getY()-radius; - double z2 = location.getZ()-radius; - - return new BoundingBox(x1, y1, z1, x2, y2, z2); - - } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java new file mode 100644 index 0000000..b8e4eb5 --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java @@ -0,0 +1,52 @@ +package eu.endermite.togglepvp.listeners.player; + +import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.util.PluginMessages; +import org.bukkit.Bukkit; +import org.bukkit.entity.EnderCrystal; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.metadata.FixedMetadataValue; + +import java.util.UUID; + + +public class PlayerHitByExplosionListener implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerHitEnderCrystal(org.bukkit.event.entity.EntityDamageByEntityEvent event) { + if (event.getEntity() instanceof EnderCrystal && event.getDamager() instanceof Player) { + EnderCrystal enderCrystal = (EnderCrystal) event.getEntity(); + enderCrystal.setMetadata("PLAYEREXPLODED", new FixedMetadataValue(TogglePvP.getPlugin(), event.getDamager().getUniqueId().toString())); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerHitByExplosion(org.bukkit.event.entity.EntityDamageByEntityEvent event) { + if (event.getEntity() instanceof Player) { + Player victim = (Player) event.getEntity(); + try { + UUID playeruuid = UUID.fromString(event.getDamager().getMetadata("PLAYEREXPLODED").get(0).asString()); + Player damager = Bukkit.getPlayer(playeruuid); + if (victim != damager) { + ConfigCache config = TogglePvP.getPlugin().getConfigCache(); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + if (!damagerPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); + event.setCancelled(true); + return; + } + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + if (!victimPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + event.setCancelled(true); + return; + } + } + } catch (NullPointerException ignored) {} + } + } +} diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java index aa91941..d5bf017 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java @@ -4,6 +4,7 @@ import eu.endermite.togglepvp.TogglePvP; import org.bukkit.entity.LightningStrike; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.weather.LightningStrikeEvent; import org.bukkit.metadata.FixedMetadataValue; @@ -17,7 +18,7 @@ public class PlayerHitByLightningListener implements Listener { /** * Cancels damage from lightning strike caused by channeling for players with pvp off */ - @EventHandler(ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPlayerLightningDamage(org.bukkit.event.entity.EntityDamageByEntityEvent event) { if (event.getDamager() instanceof LightningStrike && event.getDamager().getMetadata("TRIDENT").size() >= 1 && event.getEntity() instanceof Player) { Player victim = (Player) event.getEntity(); @@ -31,9 +32,15 @@ public class PlayerHitByLightningListener implements Listener { /** * Tags the lightning strike */ - @EventHandler(ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onLightningStrike(LightningStrikeEvent event){ if(event.getCause() == LightningStrikeEvent.Cause.TRIDENT){ + + if (TogglePvP.getPlugin().getConfigCache().isChanneling_enchant_disabled()) { + event.setCancelled(true); + return; + } + event.getLightning().setMetadata("TRIDENT", new FixedMetadataValue(TogglePvP.getPlugin(), event.getLightning().getLocation())); } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java index 181543a..4b395f7 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java @@ -4,7 +4,6 @@ import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -12,8 +11,6 @@ import org.bukkit.event.Listener; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import java.util.Iterator; - public class PlayerHitBySplashPotionListener implements Listener { /** diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java new file mode 100644 index 0000000..d1d9413 --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java @@ -0,0 +1,54 @@ +package eu.endermite.togglepvp.listeners.player; + +import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.util.BoundingBoxUtil; +import eu.endermite.togglepvp.util.PluginMessages; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.util.BoundingBox; + +public class PlayerPlaceWitherRoseListener implements Listener { + + private ConfigCache config = TogglePvP.getPlugin().getConfigCache(); + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerWitherRosePlace(org.bukkit.event.block.BlockPlaceEvent event) { + + if (!TogglePvP.getPlugin().getConfigCache().isLava_and_fire_stopper_enabled()) + return; + + if(event.getBlock().getType().equals(Material.WITHER_ROSE)) { + + Location location = event.getBlockPlaced().getLocation(); + double radius = config.getLava_and_fire_stopper_radius(); + + BoundingBox boundingBox = BoundingBoxUtil.getBoundingBox(location, radius); + for (Entity entity : location.getWorld().getNearbyEntities(boundingBox)) { + if (entity instanceof Player) { + Player damager = event.getPlayer(); + Player victim = (Player) entity; + if (victim != damager) { + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + if (!damagerPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); + event.setCancelled(true); + return; + } + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + if (!victimPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + event.setCancelled(true); + return; + } + } + } + } + } + } +} diff --git a/src/main/java/eu/endermite/togglepvp/util/BoundingBoxUtil.java b/src/main/java/eu/endermite/togglepvp/util/BoundingBoxUtil.java new file mode 100644 index 0000000..140f0f3 --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/util/BoundingBoxUtil.java @@ -0,0 +1,22 @@ +package eu.endermite.togglepvp.util; + +import org.bukkit.Location; +import org.bukkit.util.BoundingBox; + +public class BoundingBoxUtil { + + public static BoundingBox getBoundingBox(Location location, double radius) { + + double x1 = location.getX()+radius; + double y1 = location.getY()+radius; + double z1 = location.getZ()+radius; + + double x2 = location.getX()-radius; + double y2 = location.getY()-radius; + double z2 = location.getZ()-radius; + + return new BoundingBox(x1, y1, z1, x2, y2, z2); + + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2811d54..3e142bc 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -2,11 +2,15 @@ settings: # Decides if pvp should be enabled or disabled by default pvp_enabled_by_default: false - # Prevents dumping lava and lighting blocks on fire near players with pvp off + # Prevents dumping lava and pufferfish bucket, placing wither roses and lighting blocks on fire near players with pvp off lava_and_fire_stopper: enabled: true radius: 2.5 + # Disables channeling (trident enchant) lightning strike + # You may want to keep it disabled because players with pvp off can use it to attack players with pvp on + channeling_enchant_disabled: false + messages: pvp_enabled: "&cYou enabled PvP!" pvp_disabled: "&cYou disabled PvP!"