diff --git a/src/main/java/eu/endermite/togglepvp/TogglePvP.java b/src/main/java/eu/endermite/togglepvp/TogglePvP.java index 01d60ec..3c2544f 100644 --- a/src/main/java/eu/endermite/togglepvp/TogglePvP.java +++ b/src/main/java/eu/endermite/togglepvp/TogglePvP.java @@ -4,9 +4,9 @@ import eu.endermite.togglepvp.commands.MainCommand; import eu.endermite.togglepvp.config.ConfigCache; import eu.endermite.togglepvp.listeners.player.*; import eu.endermite.togglepvp.listeners.player.WolfAttackPlayerListener; -import eu.endermite.togglepvp.listeners.player.WolfTargettingPlayerListener; -import eu.endermite.togglepvp.listeners.wolf.PlayerAttackWolfListener; -import eu.endermite.togglepvp.listeners.wolf.PlayerHitWolfWithProjectile; +import eu.endermite.togglepvp.listeners.wolf.WolfTargettingPlayerListener; +import eu.endermite.togglepvp.listeners.unspecific.*; +import eu.endermite.togglepvp.listeners.wolf.*; import eu.endermite.togglepvp.players.PlayerManager; import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.DatabaseSQLite; @@ -41,18 +41,21 @@ public final class TogglePvP extends JavaPlugin { getServer().getPluginManager().registerEvents(new PlayerHitByProjectileListener(), this); getServer().getPluginManager().registerEvents(new AreaEffectCloudApplyListener(), this); getServer().getPluginManager().registerEvents(new PlayerHitBySplashPotionListener(), this); - getServer().getPluginManager().registerEvents(new PlayerHitByLightningListener(), this); + getServer().getPluginManager().registerEvents(new EntityHitByLightningListener(), this); getServer().getPluginManager().registerEvents(new LightningBlockIgniteListener(), this); 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 PlaceWitherRoseListener(), this); getServer().getPluginManager().registerEvents(new PlayerHitByExplosionListener(), this); getServer().getPluginManager().registerEvents(new WolfTargettingPlayerListener(), this); getServer().getPluginManager().registerEvents(new WolfAttackPlayerListener(), this); - getServer().getPluginManager().registerEvents(new PlayerAttackWolfListener(), this); getServer().getPluginManager().registerEvents(new PlayerHitWolfWithProjectile(), this); + getServer().getPluginManager().registerEvents(new WolfHitBySplashPotionListener(), this); + getServer().getPluginManager().registerEvents(new WolfHitByFireworkListener(), this); + getServer().getPluginManager().registerEvents(new WolfTargettingWolfListener(), this); + getServer().getPluginManager().registerEvents(new WolfHitByExplosionListener(), this); Objects.requireNonNull(getCommand("pvp")).setExecutor(new MainCommand()); Objects.requireNonNull(getCommand("pvp")).setTabCompleter(new MainCommand()); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java index c66617f..c4da785 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java @@ -1,6 +1,7 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -19,13 +20,18 @@ public class PlayerHitByFireworkListener implements Listener { if (damager == victim) { return; } + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); + if (!damagerPvpEnabled) { + event.setCancelled(true); + PluginMessages.sendActionBar(damager.getUniqueId(), TogglePvP.getPlugin().getConfigCache().getCannot_attack_attacker()); + return; + } boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { event.setCancelled(true); + PluginMessages.sendActionBar(damager.getUniqueId(), TogglePvP.getPlugin().getConfigCache().getCannot_attack_victim()); } - } - } } 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 5a324ed..ce69e6c 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java @@ -37,10 +37,8 @@ public class PlayerHitBySplashPotionListener implements Listener { harmful = true; } } - if (!harmful) return; - for (Entity entity : event.getAffectedEntities()) { if (entity instanceof Player) { Player damager = (Player) event.getEntity().getShooter(); @@ -62,8 +60,5 @@ public class PlayerHitBySplashPotionListener implements Listener { } } } - - - } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/AreaEffectCloudApplyListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java similarity index 68% rename from src/main/java/eu/endermite/togglepvp/listeners/player/AreaEffectCloudApplyListener.java rename to src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java index c7b374a..e22c952 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/AreaEffectCloudApplyListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java @@ -1,10 +1,12 @@ -package eu.endermite.togglepvp.listeners.player; +package eu.endermite.togglepvp.listeners.unspecific; import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.AreaEffectCloudApplyEvent; @@ -34,10 +36,11 @@ public class AreaEffectCloudApplyListener implements Listener { potionEffectType.equals(PotionEffectType.WITHER)) { Iterator it = event.getAffectedEntities().iterator(); + Player damager = (Player) event.getEntity().getSource(); while(it.hasNext()) { LivingEntity entity = it.next(); if(entity instanceof Player) { - Player damager = (Player) event.getEntity().getSource(); + Player victim = (Player) entity; if (damager == victim) continue; @@ -54,6 +57,23 @@ public class AreaEffectCloudApplyListener implements Listener { it.remove(); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); } + } else if (entity instanceof Wolf) { + Wolf victim = (Wolf) entity; + if (victim.getOwner() == null) { + return; + } + ConfigCache config = TogglePvP.getPlugin().getConfigCache(); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); + if (!damagerPvpEnabled) { + it.remove(); + PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_attacker()); + continue; + } + boolean victimPvpEnabled = (boolean) SmartCache.getPlayerData(victim.getOwner().getUniqueId()).get("pvpenabled"); + if (!victimPvpEnabled) { + it.remove(); + PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_victim()); + } } } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java similarity index 59% rename from src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java rename to src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java index c13f2e5..dd67a16 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java @@ -1,8 +1,10 @@ -package eu.endermite.togglepvp.listeners.player; +package eu.endermite.togglepvp.listeners.unspecific; import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.players.SmartCache; import org.bukkit.entity.LightningStrike; import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -13,18 +15,26 @@ import org.bukkit.metadata.FixedMetadataValue; * Listen for lightning strikes and tag the trident spawned ones. * Idea from aasmus' PvPToggle plugin */ -public class PlayerHitByLightningListener implements Listener { +public class EntityHitByLightningListener implements Listener { /** * Cancels damage from lightning strike caused by channeling for players with pvp off */ @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(); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); - if (!victimPvpEnabled) { - event.setCancelled(true); + if (event.getDamager() instanceof LightningStrike && event.getDamager().getMetadata("TRIDENT").size() >= 1) { + if (event.getEntity() instanceof Player) { + Player victim = (Player) event.getEntity(); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); + if (!victimPvpEnabled) { + event.setCancelled(true); + } + } else if (event.getEntity() instanceof Wolf) { + Wolf victim = (Wolf) event.getEntity(); + boolean victimPvpEnabled = (boolean) SmartCache.getPlayerData(victim.getOwner().getUniqueId()).get("pvpenabled"); + if (!victimPvpEnabled) { + event.setCancelled(true); + } } } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/FishingListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java similarity index 57% rename from src/main/java/eu/endermite/togglepvp/listeners/player/FishingListener.java rename to src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java index d8ef827..3b0ff1b 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/FishingListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java @@ -1,15 +1,19 @@ -package eu.endermite.togglepvp.listeners.player; +package eu.endermite.togglepvp.listeners.unspecific; import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; public class FishingListener implements Listener { + ConfigCache config = TogglePvP.getPlugin().getConfigCache(); + /** * Prevents hooking players with disabled pvp with fishing rod */ @@ -18,19 +22,33 @@ public class FishingListener implements Listener { if (event.getCaught() instanceof Player) { Player damager = event.getPlayer(); Player victim = (Player) event.getCaught(); - if (damager == victim) { return; } - - ConfigCache config = TogglePvP.getPlugin().getConfigCache(); boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!damagerPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); return; } + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); + if (!victimPvpEnabled) { + event.setCancelled(true); + PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + } + } else if (event.getCaught() instanceof Wolf) { + Wolf victim = (Wolf) event.getCaught(); + if (victim.getOwner() == null) { + return; + } + Player damager = event.getPlayer(); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); + if (!damagerPvpEnabled) { + event.setCancelled(true); + PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); + return; + } + boolean victimPvpEnabled = (boolean) SmartCache.getPlayerData(victim.getOwner().getUniqueId()).get("pvpenabled"); if (!victimPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java similarity index 77% rename from src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java rename to src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java index e8d9421..9d617a2 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java @@ -1,13 +1,15 @@ -package eu.endermite.togglepvp.listeners.player; +package eu.endermite.togglepvp.listeners.unspecific; import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; 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.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -48,6 +50,25 @@ public class LavaDumpAndIgniteListener implements Listener { return; } } + } else if (entity instanceof Wolf) { + Wolf victim = (Wolf) entity; + if (victim.getOwner() == null) { + return; + } + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); + if (!damagerPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_attacker()); + event.setCancelled(true); + return; + } + try { + boolean victimPvpEnabled = (boolean) SmartCache.getPlayerData(victim.getOwner().getUniqueId()).get("pvpenabled"); + if (!victimPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_victim()); + event.setCancelled(true); + return; + } + } catch (NullPointerException ignored) {} } } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/LightningBlockIgniteListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LightningBlockIgniteListener.java similarity index 64% rename from src/main/java/eu/endermite/togglepvp/listeners/player/LightningBlockIgniteListener.java rename to src/main/java/eu/endermite/togglepvp/listeners/unspecific/LightningBlockIgniteListener.java index 6f178f6..a52a813 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/LightningBlockIgniteListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LightningBlockIgniteListener.java @@ -1,9 +1,11 @@ -package eu.endermite.togglepvp.listeners.player; +package eu.endermite.togglepvp.listeners.unspecific; import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.players.SmartCache; import org.bukkit.entity.Entity; import org.bukkit.entity.LightningStrike; import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -21,9 +23,17 @@ public class LightningBlockIgniteListener implements Listener { for (Entity entity : lightningStrike.getNearbyEntities(2,2,2)) { if (entity instanceof Player) { - Player player = (Player) entity; - - if (!TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(player.getUniqueId())) { + Player victim = (Player) entity; + if (!TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId())) { + event.setCancelled(true); + return; + } + } else if (entity instanceof Wolf) { + Wolf victim = (Wolf) entity; + if (victim.getOwner() == null) { + return; + } + if (!(boolean) SmartCache.getPlayerData(victim.getOwner().getUniqueId()).get("pvpenabled")) { event.setCancelled(true); return; } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java similarity index 64% rename from src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java rename to src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java index 187297d..4decdca 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java @@ -1,19 +1,21 @@ -package eu.endermite.togglepvp.listeners.player; +package eu.endermite.togglepvp.listeners.unspecific; import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; 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.entity.Wolf; 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 { +public class PlaceWitherRoseListener implements Listener { private ConfigCache config = TogglePvP.getPlugin().getConfigCache(); @@ -47,6 +49,24 @@ public class PlayerPlaceWitherRoseListener implements Listener { return; } } + } else if (entity instanceof Wolf) { + Wolf victim = (Wolf) entity; + if (victim.getOwner() == null) { + return; + } + Player damager = event.getPlayer(); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); + if (!damagerPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_attacker()); + event.setCancelled(true); + return; + } + boolean victimPvpEnabled = (boolean) SmartCache.getPlayerData(victim.getOwner().getUniqueId()).get("pvpenabled"); + if (!victimPvpEnabled) { + PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_victim()); + event.setCancelled(true); + return; + } } } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java new file mode 100644 index 0000000..a27f5aa --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java @@ -0,0 +1,50 @@ +package eu.endermite.togglepvp.listeners.wolf; + +import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; +import eu.endermite.togglepvp.util.PluginMessages; +import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +import java.util.UUID; + +public class WolfHitByExplosionListener implements Listener { + + /** + * Cancels explosion damage for wolves with pvp off that is caused by players + */ + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerHitByExplosion(org.bukkit.event.entity.EntityDamageByEntityEvent event) { + if (event.getEntity() instanceof Wolf) { + if (!event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) { + return; + } + Wolf victim = (Wolf) event.getEntity(); + if (victim.getOwner() == null) { + return; + } + try { + UUID damageruuid = UUID.fromString(event.getDamager().getMetadata("PLAYEREXPLODED").get(0).asString()); + ConfigCache config = TogglePvP.getPlugin().getConfigCache(); + boolean damagerPvpEnabled = (boolean) SmartCache.getPlayerData(damageruuid).get("pvpenabled"); + if (!damagerPvpEnabled) { + PluginMessages.sendActionBar(damageruuid, config.getCannot_attack_pets_attacker()); + event.setCancelled(true); + return; + } + boolean victimPvpEnabled = (boolean) SmartCache.getPlayerData(victim.getOwner().getUniqueId()).get("pvpenabled"); + if (!victimPvpEnabled) { + PluginMessages.sendActionBar(damageruuid, config.getCannot_attack_pets_victim()); + event.setCancelled(true); + } + } catch (NullPointerException | IndexOutOfBoundsException ignored) { + } + } + } + +} diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java new file mode 100644 index 0000000..a8763ed --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java @@ -0,0 +1,38 @@ +package eu.endermite.togglepvp.listeners.wolf; + +import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.util.PluginMessages; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class WolfHitByFireworkListener implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onFireworkDamage(org.bukkit.event.entity.EntityDamageByEntityEvent event) { + if (event.getDamager() instanceof Firework && event.getEntity() instanceof Wolf) { + Wolf victim = (Wolf) event.getEntity(); + if (victim.getOwner() == null) { + return; + } + Firework firework = (Firework) event.getDamager(); + if (firework.getShooter() instanceof Player) { + Player damager = (Player) firework.getShooter(); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getOwner().getUniqueId()); + if (!damagerPvpEnabled) { + event.setCancelled(true); + PluginMessages.sendActionBar(damager.getUniqueId(), TogglePvP.getPlugin().getConfigCache().getCannot_attack_pets_attacker()); + return; + } + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); + if (!victimPvpEnabled) { + event.setCancelled(true); + PluginMessages.sendActionBar(damager.getUniqueId(), TogglePvP.getPlugin().getConfigCache().getCannot_attack_pets_victim()); + } + } + } + } +} diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java new file mode 100644 index 0000000..fd816b9 --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java @@ -0,0 +1,70 @@ +package eu.endermite.togglepvp.listeners.wolf; + +import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; +import eu.endermite.togglepvp.util.PluginMessages; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +public class WolfHitBySplashPotionListener implements Listener { + + /** + * If thrown potion applies negative effects and it's thrown by a player + * it will have no effect on a pet of a player with pvp off + */ + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onWolfHitBySplashPotion(org.bukkit.event.entity.PotionSplashEvent event) { + + if (!(event.getEntity().getShooter() instanceof Player)) + return; + + boolean harmful = false; + + for (PotionEffect effect : event.getPotion().getEffects()) { + if (effect.getType().equals(PotionEffectType.BLINDNESS) || + effect.getType().equals(PotionEffectType.CONFUSION) || + effect.getType().equals(PotionEffectType.HARM) || + effect.getType().equals(PotionEffectType.HUNGER) || + effect.getType().equals(PotionEffectType.POISON) || + effect.getType().equals(PotionEffectType.SLOW_DIGGING) || + effect.getType().equals(PotionEffectType.WEAKNESS) || + effect.getType().equals(PotionEffectType.SLOW) || + effect.getType().equals(PotionEffectType.WITHER)) { + harmful = true; + } + } + if (!harmful) + return; + for (Entity entity : event.getAffectedEntities()) { + if (entity instanceof Wolf) { + Player damager = (Player) event.getEntity().getShooter(); + Wolf victim = (Wolf) entity; + + if (victim.getOwner() == null) { + return; + } + + ConfigCache config = TogglePvP.getPlugin().getConfigCache(); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); + if (!damagerPvpEnabled) { + event.setIntensity(victim, 0); + PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_attacker()); + continue; + } + boolean victimPvpEnabled = (boolean) SmartCache.getPlayerData(victim.getOwner().getUniqueId()).get("pvpenabled"); + if (!victimPvpEnabled) { + event.setIntensity(victim, 0); + PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + } + } + } + } + +} diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/WolfTargettingPlayerListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingPlayerListener.java similarity index 68% rename from src/main/java/eu/endermite/togglepvp/listeners/player/WolfTargettingPlayerListener.java rename to src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingPlayerListener.java index dd23eae..f0a8786 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/WolfTargettingPlayerListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingPlayerListener.java @@ -1,4 +1,4 @@ -package eu.endermite.togglepvp.listeners.player; +package eu.endermite.togglepvp.listeners.wolf; import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.players.SmartCache; @@ -10,7 +10,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; public class WolfTargettingPlayerListener implements Listener { - /** * Stops wolves with owners targetting players with pvp off */ @@ -20,7 +19,6 @@ public class WolfTargettingPlayerListener implements Listener { Wolf wolf = (Wolf) event.getEntity(); if (wolf.getOwner() != null) { if (event.getTarget() instanceof Player) { - boolean attackerPvPEnabled = (boolean) SmartCache.getPlayerData(wolf.getOwner().getUniqueId()).get("pvpenabled"); Player victim = (Player) event.getTarget(); boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); @@ -29,17 +27,6 @@ public class WolfTargettingPlayerListener implements Listener { } } } - } else if (event.getEntity() instanceof Fox) { - Fox fox = (Fox) event.getEntity(); - if (fox.getFirstTrustedPlayer() != null) { - if (event.getTarget() instanceof Player) { - Player victim = (Player) event.getTarget(); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); - if (!victimPvpEnabled) { - event.setCancelled(true); - } - } - } } } }