From 82cde6b5ec27c668121cbe8a2d79790c8e3216d5 Mon Sep 17 00:00:00 2001 From: Dark Arc Date: Fri, 18 Oct 2013 15:48:39 -0400 Subject: [PATCH] Implemented a PvM Flag --- .../bukkit/WorldGuardEntityListener.java | 115 +++++++++++++++--- .../protection/flags/DefaultFlag.java | 3 +- 2 files changed, 97 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java index bd30e6aa..674ca546 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java @@ -20,12 +20,14 @@ package com.sk89q.worldguard.bukkit; import static com.sk89q.worldguard.bukkit.BukkitUtil.toVector; +import java.util.HashSet; import java.util.Set; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.entity.Creature; import org.bukkit.entity.Creeper; import org.bukkit.entity.EnderDragon; import org.bukkit.entity.EnderPearl; @@ -37,6 +39,7 @@ import org.bukkit.entity.ItemFrame; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; +import org.bukkit.entity.Slime; import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.Tameable; import org.bukkit.entity.ThrownPotion; @@ -223,6 +226,7 @@ public class WorldGuardEntityListener implements Listener { if (attacker instanceof Player) { Player player = (Player) attacker; + LocalPlayer localPlayer = plugin.wrapPlayer(player); ConfigurationManager cfg = plugin.getGlobalStateManager(); WorldConfiguration wcfg = cfg.get(player.getWorld()); @@ -239,6 +243,29 @@ public class WorldGuardEntityListener implements Listener { } } } + + // Bukkit doesn't consider Slimes to be Creatures for whatever reason + if (defender instanceof Creature || defender instanceof Slime) { + if (wcfg.useRegions) { + Vector pt = toVector(defender.getLocation()); + Vector pt2 = toVector(attacker.getLocation()); + RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld()); + + // Accumulate all entities that aren't allowed to be attacked here + Set entityTypes = new HashSet(); + Set es = mgr.getApplicableRegions(pt).getFlag(DefaultFlag.DENY_PVM, localPlayer); + Set es2 = mgr.getApplicableRegions(pt2).getFlag(DefaultFlag.DENY_PVM, localPlayer); + + if (es != null) entityTypes.addAll(es); + if (es2 != null) entityTypes.addAll(es2); + + if (entityTypes.contains(defender.getType())) { + player.sendMessage(ChatColor.DARK_RED + "You may not attack that mob here."); + event.setCancelled(true); + return; + } + } + } } if (defender instanceof ItemFrame) { @@ -281,17 +308,30 @@ public class WorldGuardEntityListener implements Listener { } if (attacker != null) { - if (attacker instanceof Player) { - if (wcfg.useRegions) { - Vector pt = toVector(defender.getLocation()); - Vector pt2 = toVector(attacker.getLocation()); - RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld()); + if (wcfg.useRegions) { + Vector pt = toVector(defender.getLocation()); + Vector pt2 = toVector(attacker.getLocation()); + RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld()); + if (attacker instanceof Player) { if (!mgr.getApplicableRegions(pt2).allows(DefaultFlag.PVP, plugin.wrapPlayer((Player) attacker))) { tryCancelPVPEvent((Player) attacker, player, event, true); } else if (!mgr.getApplicableRegions(pt).allows(DefaultFlag.PVP ,localPlayer)) { tryCancelPVPEvent((Player) attacker, player, event, false); } + } else { + // Accumulate all entities that aren't allowed to be attacked here + Set entityTypes = new HashSet(); + Set es = mgr.getApplicableRegions(pt).getFlag(DefaultFlag.DENY_PVM, localPlayer); + Set es2 = mgr.getApplicableRegions(pt2).getFlag(DefaultFlag.DENY_PVM, localPlayer); + + if (es != null) entityTypes.addAll(es); + if (es2 != null) entityTypes.addAll(es2); + + if (entityTypes.contains(attacker.getType())) { + event.setCancelled(true); + return; + } } } @@ -408,6 +448,43 @@ public class WorldGuardEntityListener implements Listener { return; } + if (attacker instanceof Player) { + Player player = (Player) attacker; + LocalPlayer localPlayer = plugin.wrapPlayer(player); + + ConfigurationManager cfg = plugin.getGlobalStateManager(); + WorldConfiguration wcfg = cfg.get(player.getWorld()); + + if (event.getDamager() instanceof EnderPearl && attacker.equals(defender)) return; + if (wcfg.useRegions) { + Vector pt = toVector(defender.getLocation()); + Vector pt2 = toVector(attacker.getLocation()); + RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld()); + + if (defender instanceof Player) { + if (!mgr.getApplicableRegions(pt2).allows(DefaultFlag.PVP, plugin.wrapPlayer((Player) attacker))) { + tryCancelPVPEvent((Player) attacker, player, event, true); + } else if (!mgr.getApplicableRegions(pt).allows(DefaultFlag.PVP, localPlayer)) { + tryCancelPVPEvent((Player) attacker, player, event, false); + } + } else { + // Accumulate all entities that aren't allowed to be attacked here + Set entityTypes = new HashSet(); + Set es = mgr.getApplicableRegions(pt).getFlag(DefaultFlag.DENY_PVM, localPlayer); + Set es2 = mgr.getApplicableRegions(pt2).getFlag(DefaultFlag.DENY_PVM, localPlayer); + + if (es != null) entityTypes.addAll(es); + if (es2 != null) entityTypes.addAll(es2); + + if (entityTypes.contains(defender.getType())) { + player.sendMessage(ChatColor.DARK_RED + "You may not attack that mob here."); + event.setCancelled(true); + return; + } + } + } + } + if (defender instanceof Player) { Player player = (Player) defender; LocalPlayer localPlayer = plugin.wrapPlayer(player); @@ -422,35 +499,33 @@ public class WorldGuardEntityListener implements Listener { } // Check Mob - if (attacker != null && !(attacker instanceof Player)) { + if (!(attacker instanceof Player)) { if (wcfg.disableMobDamage) { event.setCancelled(true); return; } + if (wcfg.useRegions) { Vector pt = toVector(defender.getLocation()); + Vector pt2 = toVector(attacker.getLocation()); RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld()); if (!mgr.getApplicableRegions(pt).allows(DefaultFlag.MOB_DAMAGE, localPlayer)) { event.setCancelled(true); return; } - } - } - // Check Player - // if (event.getDamager() instanceof EnderPearl || event.getDamager() instanceof Snowball) return; - if (attacker != null && attacker instanceof Player) { - if (event.getDamager() instanceof EnderPearl && attacker == player) return; - if (wcfg.useRegions) { - Vector pt = toVector(defender.getLocation()); - Vector pt2 = toVector(attacker.getLocation()); - RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld()); + // Accumulate all entities that aren't allowed to be attacked here + Set entityTypes = new HashSet(); + Set es = mgr.getApplicableRegions(pt).getFlag(DefaultFlag.DENY_PVM, localPlayer); + Set es2 = mgr.getApplicableRegions(pt2).getFlag(DefaultFlag.DENY_PVM, localPlayer); - if (!mgr.getApplicableRegions(pt2).allows(DefaultFlag.PVP, plugin.wrapPlayer((Player) attacker))) { - tryCancelPVPEvent((Player) attacker, player, event, true); - } else if (!mgr.getApplicableRegions(pt).allows(DefaultFlag.PVP, localPlayer)) { - tryCancelPVPEvent((Player) attacker, player, event, false); + if (es != null) entityTypes.addAll(es); + if (es2 != null) entityTypes.addAll(es2); + + if (entityTypes.contains(attacker.getType())) { + event.setCancelled(true); + return; } } } diff --git a/src/main/java/com/sk89q/worldguard/protection/flags/DefaultFlag.java b/src/main/java/com/sk89q/worldguard/protection/flags/DefaultFlag.java index d83166e1..4cb3768c 100644 --- a/src/main/java/com/sk89q/worldguard/protection/flags/DefaultFlag.java +++ b/src/main/java/com/sk89q/worldguard/protection/flags/DefaultFlag.java @@ -78,6 +78,7 @@ public final class DefaultFlag { public static final BooleanFlag NOTIFY_ENTER = new BooleanFlag("notify-enter", RegionGroup.ALL); public static final BooleanFlag NOTIFY_LEAVE = new BooleanFlag("notify-leave", RegionGroup.ALL); public static final SetFlag DENY_SPAWN = new SetFlag("deny-spawn", RegionGroup.ALL, new EntityTypeFlag(null)); + public static final SetFlag DENY_PVM = new SetFlag("deny-pvm", new EntityTypeFlag(null)); public static final EnumFlag GAME_MODE = new EnumFlag("game-mode", GameMode.class, RegionGroup.ALL); public static final IntegerFlag HEAL_DELAY = new IntegerFlag("heal-delay", RegionGroup.ALL); public static final IntegerFlag HEAL_AMOUNT = new IntegerFlag("heal-amount", RegionGroup.ALL); @@ -100,7 +101,7 @@ public final class DefaultFlag { public static final Flag[] flagsList = new Flag[] { PASSTHROUGH, BUILD, CONSTRUCT, PVP, CHEST_ACCESS, PISTONS, TNT, LIGHTER, USE, PLACE_VEHICLE, DESTROY_VEHICLE, SLEEP, - MOB_DAMAGE, MOB_SPAWNING, DENY_SPAWN, INVINCIBILITY, EXP_DROPS, + MOB_DAMAGE, MOB_SPAWNING, DENY_SPAWN, DENY_PVM, INVINCIBILITY, EXP_DROPS, CREEPER_EXPLOSION, OTHER_EXPLOSION, ENDERDRAGON_BLOCK_DAMAGE, GHAST_FIREBALL, ENDER_BUILD, GREET_MESSAGE, FAREWELL_MESSAGE, NOTIFY_ENTER, NOTIFY_LEAVE, EXIT, ENTRY, LIGHTNING, ENTITY_PAINTING_DESTROY, ENDERPEARL,