From b95c34b6f2fdbf8fb59d5600a239bfe9385a5313 Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Thu, 30 Jul 2015 16:56:09 -0700 Subject: [PATCH] Allowing other plugins to disable PvP protections. Now plugins that want to can selectively disable GP's PvP protections. --- .../GriefPrevention/EntityEventHandler.java | 51 ++++++++++++++----- .../events/PreventPvPEvent.java | 49 ++++++++++++++++++ 2 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 src/me/ryanhamshire/GriefPrevention/events/PreventPvPEvent.java diff --git a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java index 6b93a70..252ebb3 100644 --- a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java @@ -26,6 +26,9 @@ import java.util.HashSet; import java.util.List; import java.util.UUID; +import me.ryanhamshire.GriefPrevention.events.PreventPvPEvent; + +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; @@ -81,7 +84,7 @@ import org.bukkit.projectiles.ProjectileSource; import org.bukkit.util.Vector; //handles events related to entities -class EntityEventHandler implements Listener +public class EntityEventHandler implements Listener { //convenience reference for the singleton datastore private DataStore dataStore; @@ -626,9 +629,14 @@ class EntityEventHandler implements Listener !attackerClaim.isAdminClaim() && GriefPrevention.instance.config_pvp_noCombatInPlayerLandClaims)) { attackerData.lastClaim = attackerClaim; - event.setCancelled(true); - GriefPrevention.sendMessage(attacker, TextMode.Err, Messages.CantFightWhileImmune); - return; + PreventPvPEvent pvpEvent = new PreventPvPEvent(attackerClaim); + Bukkit.getPluginManager().callEvent(pvpEvent); + if(!pvpEvent.isCancelled()) + { + event.setCancelled(true); + GriefPrevention.sendMessage(attacker, TextMode.Err, Messages.CantFightWhileImmune); + return; + } } Claim defenderClaim = this.dataStore.getClaimAt(defender.getLocation(), false, defenderData.lastClaim); @@ -639,9 +647,14 @@ class EntityEventHandler implements Listener !defenderClaim.isAdminClaim() && GriefPrevention.instance.config_pvp_noCombatInPlayerLandClaims)) { defenderData.lastClaim = defenderClaim; - event.setCancelled(true); - GriefPrevention.sendMessage(attacker, TextMode.Err, Messages.PlayerInPvPSafeZone); - return; + PreventPvPEvent pvpEvent = new PreventPvPEvent(defenderClaim); + Bukkit.getPluginManager().callEvent(pvpEvent); + if(!pvpEvent.isCancelled()) + { + event.setCancelled(true); + GriefPrevention.sendMessage(attacker, TextMode.Err, Messages.PlayerInPvPSafeZone); + return; + } } } } @@ -1026,9 +1039,14 @@ class EntityEventHandler implements Listener !attackerClaim.isAdminClaim() && GriefPrevention.instance.config_pvp_noCombatInPlayerLandClaims)) { attackerData.lastClaim = attackerClaim; - event.setIntensity(effected, 0); - GriefPrevention.sendMessage(thrower, TextMode.Err, Messages.CantFightWhileImmune); - continue; + PreventPvPEvent pvpEvent = new PreventPvPEvent(attackerClaim); + Bukkit.getPluginManager().callEvent(pvpEvent); + if(!pvpEvent.isCancelled()) + { + event.setIntensity(effected, 0); + GriefPrevention.sendMessage(thrower, TextMode.Err, Messages.CantFightWhileImmune); + continue; + } } Claim defenderClaim = this.dataStore.getClaimAt(effectedPlayer.getLocation(), false, defenderData.lastClaim); @@ -1038,16 +1056,21 @@ class EntityEventHandler implements Listener !defenderClaim.isAdminClaim() && GriefPrevention.instance.config_pvp_noCombatInPlayerLandClaims)) { defenderData.lastClaim = defenderClaim; - event.setIntensity(effected, 0); - GriefPrevention.sendMessage(thrower, TextMode.Err, Messages.PlayerInPvPSafeZone); - continue; + PreventPvPEvent pvpEvent = new PreventPvPEvent(defenderClaim); + Bukkit.getPluginManager().callEvent(pvpEvent); + if(!pvpEvent.isCancelled()) + { + event.setIntensity(effected, 0); + GriefPrevention.sendMessage(thrower, TextMode.Err, Messages.PlayerInPvPSafeZone); + continue; + } } } } } } - private static final HashSet positiveEffects = new HashSet(Arrays.asList + public static final HashSet positiveEffects = new HashSet(Arrays.asList ( PotionEffectType.ABSORPTION, PotionEffectType.DAMAGE_RESISTANCE, diff --git a/src/me/ryanhamshire/GriefPrevention/events/PreventPvPEvent.java b/src/me/ryanhamshire/GriefPrevention/events/PreventPvPEvent.java new file mode 100644 index 0000000..1aeecf5 --- /dev/null +++ b/src/me/ryanhamshire/GriefPrevention/events/PreventPvPEvent.java @@ -0,0 +1,49 @@ +package me.ryanhamshire.GriefPrevention.events; + +import me.ryanhamshire.GriefPrevention.Claim; + +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +//if cancelled, GriefPrevention will not cancel the PvP event it's processing. +public class PreventPvPEvent extends Event implements Cancellable +{ + private static final HandlerList handlers = new HandlerList(); + private boolean cancelled = false; + + public static HandlerList getHandlerList() + { + return handlers; + } + + Claim claim; + + public PreventPvPEvent(Claim claim) + { + this.claim = claim; + } + + public Claim getClaim() + { + return this.claim; + } + + @Override + public HandlerList getHandlers() + { + return handlers; + } + + @Override + public boolean isCancelled() + { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancelled) + { + this.cancelled = cancelled; + } +} \ No newline at end of file