From 9e15a4a557b0e6e00aab3b9d2affa49893670bc4 Mon Sep 17 00:00:00 2001 From: Wizjany Date: Thu, 14 Apr 2011 21:17:11 -0400 Subject: [PATCH 1/5] Added override for flint and steel blocking. --- .../worldguard/bukkit/WorldGuardBlockListener.java | 4 ++-- .../worldguard/bukkit/WorldGuardPlayerListener.java | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java index dd45d06b..14f51805 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java @@ -262,12 +262,12 @@ public void onBlockIgnite(BlockIgniteEvent event) { event.setCancelled(true); return; } - + /* if (wcfg.blockLighter && cause == IgniteCause.FLINT_AND_STEEL) { event.setCancelled(true); return; } - + */ if (wcfg.fireSpreadDisableToggle && isFireSpread) { event.setCancelled(true); return; diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java index 769c5ea1..a4c546ee 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java @@ -140,7 +140,14 @@ public void handleBlockRightClick(PlayerInteractEvent event) { ConfigurationManager cfg = plugin.getGlobalConfiguration(); WorldConfiguration wcfg = cfg.get(world); - + + if (wcfg.blockLighter && item.getType() == Material.FLINT_AND_STEEL) { + if (!plugin.hasPermission(player, "worldguard.lighter.override")) { + event.setCancelled(true); + return; + } + } + if (wcfg.useRegions) { Vector pt = toVector(block); RegionManager mgr = plugin.getGlobalRegionManager().get(world); @@ -170,7 +177,8 @@ public void handleBlockRightClick(PlayerInteractEvent event) { } if (item.getType() == Material.FLINT_AND_STEEL) { - if (!set.allows(DefaultFlag.LIGHTER)) { + if (!set.allows(DefaultFlag.LIGHTER) + && !plugin.hasPermission(player, "worldguard.lighter.override")) { event.setCancelled(true); return; } From ca8bb7f5f00bbd79984fa3c24d31060902806c4c Mon Sep 17 00:00:00 2001 From: Wizjany Date: Fri, 15 Apr 2011 00:20:15 -0400 Subject: [PATCH 2/5] Added config to stop players from trampling crops. Animals don't work yet (blame CraftBukkit) --- config_world.yml | 4 ++++ .../worldguard/bukkit/WorldConfiguration.java | 5 ++++ .../bukkit/WorldGuardEntityListener.java | 24 +++++++++++++------ .../bukkit/WorldGuardPlayerListener.java | 24 +++++++++++++++++-- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/config_world.yml b/config_world.yml index 7aecc33e..c323e821 100644 --- a/config_world.yml +++ b/config_world.yml @@ -88,6 +88,10 @@ iconomy: chest-protection: enable: off +crops: + disable-creature-trampling: off + disable-player-trampling: off + blacklist: use-as-whitelist: off logging: diff --git a/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java b/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java index 466d70cc..191b9ed1 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java +++ b/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java @@ -104,6 +104,8 @@ public class WorldConfiguration { public boolean antiWolfDumbness; public boolean signChestProtection; public boolean removeInfiniteStacks; + public boolean disableCreatureCropTrampling; + public boolean disablePlayerCropTrampling; /* Configuration data end */ @@ -182,6 +184,9 @@ private void loadConfiguration() { signChestProtection = config.getBoolean("chest-protection.enable", false); + disableCreatureCropTrampling = config.getBoolean("crops.disable-creature-trampling", false); + disablePlayerCropTrampling = config.getBoolean("crops.disable-player-trampling", false); + useRegions = config.getBoolean("regions.enable", true); highFreqFlags = config.getBoolean("regions.high-frequency-flags", false); regionWand = config.getInt("regions.wand", 287); diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java index b57e93e4..cead54d1 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java @@ -28,13 +28,7 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.CreatureType; -import org.bukkit.entity.Creeper; -import org.bukkit.entity.Skeleton; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Wolf; +import org.bukkit.entity.*; import org.bukkit.event.entity.*; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; @@ -70,8 +64,24 @@ public void registerEvents() { pm.registerEvent(Event.Type.ENTITY_DAMAGE, this, Priority.High, plugin); pm.registerEvent(Event.Type.ENTITY_EXPLODE, this, Priority.High, plugin); pm.registerEvent(Event.Type.CREATURE_SPAWN, this, Priority.High, plugin); + pm.registerEvent(Event.Type.ENTITY_INTERACT, this, Priority.High, plugin); } + @Override + public void onEntityInteract(EntityInteractEvent event) { + //bukkit doesn't actually throw this event yet, someone add a ticket to leaky + Entity entity = event.getEntity(); + Block block = event.getBlock(); + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(entity.getWorld()); + + if (block.getType() == Material.SOIL) { + if (entity instanceof Creature && wcfg.disableCreatureCropTrampling) { + event.setCancelled(true); + } + } + } public void onEntityDamageByBlock(EntityDamageByBlockEvent event) { diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java index a4c546ee..155c3f81 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java @@ -91,11 +91,13 @@ public void onPlayerInteract(PlayerInteractEvent event) { handleBlockRightClick(event); } else if (event.getAction() == Action.RIGHT_CLICK_AIR) { handleAirRightClick(event); + } else if (event.getAction() == Action.PHYSICAL) { + handlePhysicalInteract(event); } } /** - * Called when a block is damaged. + * Called when a player right clicks air. * * @param event */ @@ -123,7 +125,7 @@ public void handleAirRightClick(PlayerInteractEvent event) { } /** - * Called when a block is damaged. + * Called when a player right clicks a block. * * @param event */ @@ -314,6 +316,24 @@ public void handleBlockRightClick(PlayerInteractEvent event) { }*/ } + /** + * Called when a player steps on a pressure plate or tramples crops. + * + * @param event + */ + public void handlePhysicalInteract(PlayerInteractEvent event) { + if (event.isCancelled() == true) return; + + Player player = event.getPlayer(); + Block block = event.getClickedBlock(); //not actually clicked but whatever + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(player.getWorld()); + + if (block.getType() == Material.SOIL && wcfg.disablePlayerCropTrampling) { + event.setCancelled(true); + } + } /** * Called when a player joins a server * From 1cedf0e9a04516c620d49c9202cf84f0f138c627 Mon Sep 17 00:00:00 2001 From: Wizjany Date: Fri, 15 Apr 2011 20:26:24 -0400 Subject: [PATCH 3/5] Added a lot of missing things to player listener. --- .../bukkit/WorldGuardPlayerListener.java | 143 +++++++++++++++--- .../protection/flags/DefaultFlag.java | 5 +- 2 files changed, 129 insertions(+), 19 deletions(-) diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java index 155c3f81..ae798942 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java @@ -78,6 +78,7 @@ public void registerEvents() { pm.registerEvent(Event.Type.PLAYER_BUCKET_EMPTY, this, Priority.High, plugin); pm.registerEvent(Event.Type.PLAYER_RESPAWN, this, Priority.High, plugin); pm.registerEvent(Event.Type.PLAYER_ITEM_HELD, this, Priority.High, plugin); + pm.registerEvent(Event.Type.PLAYER_BED_ENTER, this, Priority.High, plugin); } /** @@ -91,20 +92,71 @@ public void onPlayerInteract(PlayerInteractEvent event) { handleBlockRightClick(event); } else if (event.getAction() == Action.RIGHT_CLICK_AIR) { handleAirRightClick(event); + } else if (event.getAction() == Action.LEFT_CLICK_BLOCK) { + handleBlockLeftClick(event); + } else if (event.getAction() == Action.LEFT_CLICK_AIR) { + handleAirLeftClick(event); } else if (event.getAction() == Action.PHYSICAL) { handlePhysicalInteract(event); } } - + + /** + * Called when a player left clicks air. + * + * @param event + */ + public void handleAirLeftClick(PlayerInteractEvent event) { + //I don't think we have to do anything here yet. + return; + } + + /** + * Called when a player left clicks a block. + * + * @param event + */ + public void handleBlockLeftClick(PlayerInteractEvent event) { + if (event.isCancelled()) return; + + Player player = event.getPlayer(); + Block block = event.getClickedBlock(); + Material type = block.getType(); + World world = player.getWorld(); + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(world); + + if (wcfg.useRegions) { + Vector pt = toVector(block); + RegionManager mgr = plugin.getGlobalRegionManager().get(world); + ApplicableRegionSet set = mgr.getApplicableRegions(pt); + LocalPlayer localPlayer = plugin.wrapPlayer(player); + + if (type == Material.STONE_BUTTON + || type == Material.LEVER + || type == Material.WOODEN_DOOR + || type == Material.NOTE_BLOCK) { + if (!plugin.getGlobalRegionManager().hasBypass(player, world) + && !set.allows(DefaultFlag.USE) + && !set.canBuild(localPlayer)) { + player.sendMessage(ChatColor.DARK_RED + "You don't have permission to use that in this area."); + event.setCancelled(true); + return; + } + } + } + } + /** * Called when a player right clicks air. * * @param event */ public void handleAirRightClick(PlayerInteractEvent event) { - /*if (event.isCancelled()) { + if (event.isCancelled()) { return; - }*/ + } Player player = event.getPlayer(); World world = player.getWorld(); @@ -179,40 +231,47 @@ public void handleBlockRightClick(PlayerInteractEvent event) { } if (item.getType() == Material.FLINT_AND_STEEL) { - if (!set.allows(DefaultFlag.LIGHTER) + if (!plugin.getGlobalRegionManager().hasBypass(player, world) + && !set.allows(DefaultFlag.LIGHTER) && !plugin.hasPermission(player, "worldguard.lighter.override")) { event.setCancelled(true); return; } } - if ((block.getType() == Material.CHEST - || block.getType() == Material.DISPENSER - || block.getType() == Material.FURNACE - || block.getType() == Material.BURNING_FURNACE - || block.getType() == Material.NOTE_BLOCK)) { - + if (type == Material.CHEST + || type == Material.JUKEBOX //stores the (arguably) most valuable item + || type == Material.DISPENSER + || type == Material.FURNACE + || type == Material.BURNING_FURNACE) { if (!plugin.getGlobalRegionManager().hasBypass(player, world) && !set.allows(DefaultFlag.CHEST_ACCESS) && !set.canBuild(localPlayer)) { - player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area."); + player.sendMessage(ChatColor.DARK_RED + "You don't have permission to open that in this area."); event.setCancelled(true); return; } } - if (type == Material.LEVER || type == Material.STONE_BUTTON) { + if (type == Material.LEVER + || type == Material.STONE_BUTTON + || type == Material.NOTE_BLOCK + || type == Material.DIODE_BLOCK_OFF + || type == Material.DIODE_BLOCK_ON + || type == Material.WOODEN_DOOR + || type == Material.WORKBENCH) { if (!plugin.getGlobalRegionManager().hasBypass(player, world) && !set.allows(DefaultFlag.USE) && !set.canBuild(localPlayer)) { - player.sendMessage(ChatColor.DARK_RED + "You don't have permission for this area."); + player.sendMessage(ChatColor.DARK_RED + "You don't have permission to use that in this area."); event.setCancelled(true); return; } } if (type == Material.CAKE_BLOCK) { - if (!set.canBuild(localPlayer)) { + if (!plugin.getGlobalRegionManager().hasBypass(player, world) + && !set.canBuild(localPlayer)) { player.sendMessage(ChatColor.DARK_RED + "You're not invited to this tea party!"); event.setCancelled(true); return; @@ -220,7 +279,8 @@ public void handleBlockRightClick(PlayerInteractEvent event) { } if (type == Material.RAILS && item.getType() == Material.MINECART) { - if (!set.canBuild(localPlayer) + if (!plugin.getGlobalRegionManager().hasBypass(player, world) + && !set.canBuild(localPlayer) && !set.allows(DefaultFlag.PLACE_VEHICLE)) { player.sendMessage(ChatColor.DARK_RED + "You don't have permission to place vehicles here."); event.setCancelled(true); @@ -229,7 +289,8 @@ public void handleBlockRightClick(PlayerInteractEvent event) { } if (item.getType() == Material.BOAT) { - if (!set.canBuild(localPlayer) + if (!plugin.getGlobalRegionManager().hasBypass(player, world) + && !set.canBuild(localPlayer) && !set.allows(DefaultFlag.PLACE_VEHICLE)) { player.sendMessage(ChatColor.DARK_RED + "You don't have permission to place vehicles here."); event.setCancelled(true); @@ -326,14 +387,36 @@ public void handlePhysicalInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); Block block = event.getClickedBlock(); //not actually clicked but whatever + Material type = block.getType(); + World world = player.getWorld(); ConfigurationManager cfg = plugin.getGlobalConfiguration(); - WorldConfiguration wcfg = cfg.get(player.getWorld()); + WorldConfiguration wcfg = cfg.get(world); if (block.getType() == Material.SOIL && wcfg.disablePlayerCropTrampling) { event.setCancelled(true); + return; + } + + if (wcfg.useRegions) { + Vector pt = toVector(block); + RegionManager mgr = plugin.getGlobalRegionManager().get(world); + ApplicableRegionSet set = mgr.getApplicableRegions(pt); + LocalPlayer localPlayer = plugin.wrapPlayer(player); + + if (type == Material.STONE_PLATE || type == Material.WOOD_PLATE) { + if (!plugin.getGlobalRegionManager().hasBypass(player, world) + && (!set.canBuild(localPlayer)) + && (!set.allows(DefaultFlag.USE))) { + player.sendMessage(ChatColor.DARK_RED + "You are not allowed" + + " to trigger pressure plates in this area."); + event.setCancelled(true); + return; + } + } } } + /** * Called when a player joins a server * @@ -632,4 +715,30 @@ public void onItemHeldChange(PlayerItemHeldEvent event) { } } } + + @Override + public void onPlayerBedEnter(PlayerBedEnterEvent event) { + if (event.isCancelled()) { + return; + } + + Player player = event.getPlayer(); + Location location = player.getLocation(); + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(player.getWorld()); + + if (wcfg.useRegions) { + Vector pt = toVector(location); + RegionManager mgr = plugin.getGlobalRegionManager().get(player.getWorld()); + ApplicableRegionSet set = mgr.getApplicableRegions(pt); + + if (!plugin.getGlobalRegionManager().hasBypass(player, player.getWorld()) + && !set.allows(DefaultFlag.SLEEP)) { + event.setCancelled(true); + player.sendMessage("This bed doesn't belong to you!"); + return; + } + } + } } diff --git a/src/com/sk89q/worldguard/protection/flags/DefaultFlag.java b/src/com/sk89q/worldguard/protection/flags/DefaultFlag.java index 992acfaf..49833080 100644 --- a/src/com/sk89q/worldguard/protection/flags/DefaultFlag.java +++ b/src/com/sk89q/worldguard/protection/flags/DefaultFlag.java @@ -29,8 +29,9 @@ public final class DefaultFlag { public static final StateFlag BUILD = new StateFlag("build", 'b', true); public static final StateFlag PVP = new StateFlag("pvp", 'p', true); public static final StateFlag MOB_DAMAGE = new StateFlag("mob-damage", 'm', true); - public static final StateFlag MOB_SPAWNING = new StateFlag("mob-spawning", 'M', true); + public static final StateFlag MOB_SPAWNING = new StateFlag("mob-spawning", true); public static final StateFlag CREEPER_EXPLOSION = new StateFlag("creeper-explosion", 'c', true); + public static final StateFlag SLEEP = new StateFlag("sleep", true); public static final StateFlag TNT = new StateFlag("tnt", 't', true); public static final StateFlag LIGHTER = new StateFlag("lighter", 'l', true); public static final StateFlag FIRE_SPREAD = new StateFlag("fire-spread", 'f', true); @@ -55,7 +56,7 @@ public final class DefaultFlag { public static final DoubleFlag PRICE = new DoubleFlag("price"); public static final Flag[] flagsList = new Flag[] { - PASSTHROUGH, BUILD, PVP, MOB_DAMAGE, MOB_SPAWNING, CREEPER_EXPLOSION, + PASSTHROUGH, BUILD, PVP, MOB_DAMAGE, MOB_SPAWNING, CREEPER_EXPLOSION, SLEEP, TNT, LIGHTER, FIRE_SPREAD, LAVA_FIRE, CHEST_ACCESS, WATER_FLOW, LAVA_FLOW, USE, PLACE_VEHICLE, GREET_MESSAGE, FAREWELL_MESSAGE, NOTIFY_GREET, NOTIFY_FAREWELL, DENY_SPAWN, HEAL_DELAY, HEAL_AMOUNT, TELE_LOC, From 925fa2ee1bfb49d0712b723c99ae835ecef6d175 Mon Sep 17 00:00:00 2001 From: Wizjany Date: Sun, 24 Apr 2011 15:53:32 -0400 Subject: [PATCH 4/5] Updated for 1.5 and added existing lightning protection. --- build.xml | 3 +-- config_world.yml | 11 +++++++++++ .../worldguard/bukkit/WorldConfiguration.java | 19 +++++++++++++++++++ .../bukkit/WorldGuardBlockListener.java | 5 +++++ .../bukkit/WorldGuardEntityListener.java | 5 +++++ .../bukkit/WorldGuardPlayerListener.java | 3 ++- 6 files changed, 43 insertions(+), 3 deletions(-) diff --git a/build.xml b/build.xml index e6e27f36..bb60fcfa 100644 --- a/build.xml +++ b/build.xml @@ -13,9 +13,8 @@ - + - diff --git a/config_world.yml b/config_world.yml index c323e821..96270441 100644 --- a/config_world.yml +++ b/config_world.yml @@ -47,6 +47,16 @@ fire: disable-lava-fire-spread: on lava-spread-blocks: [] +weather: + disable-weather: off + disable-thunderstorm: off + disable-pig-zombification: off + disable-powered-creepers: off + disable-lightning-strike-fire: off + prevent-lightning-strike-blocks: [] + always-raining: off + always-thundering: off + mobs: block-creeper-explosions: off block-creeper-block-damage: off @@ -64,6 +74,7 @@ player-damage: disable-fall-damage: off disable-lava-damage: off disable-fire-damage: off + disable-lightning-damage: off disable-drowning-damage: off disable-suffocation-damage: off disable-contact-damage: off diff --git a/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java b/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java index 191b9ed1..199c9f1a 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java +++ b/src/com/sk89q/worldguard/bukkit/WorldConfiguration.java @@ -86,6 +86,7 @@ public class WorldConfiguration { public boolean disableFallDamage; public boolean disableLavaDamage; public boolean disableFireDamage; + public boolean disableLightningDamage; public boolean disableDrowningDamage; public boolean disableSuffocationDamage; public boolean teleportOnSuffocation; @@ -106,6 +107,14 @@ public class WorldConfiguration { public boolean removeInfiniteStacks; public boolean disableCreatureCropTrampling; public boolean disablePlayerCropTrampling; + public boolean preventLightningFire; + public Set disallowedLightningBlocks; + public boolean disableThunder; + public boolean disableWeather; + public boolean alwaysRaining; + public boolean alwaysThundering; + public boolean disablePigZap; + public boolean disableCreeperPower; /* Configuration data end */ @@ -175,6 +184,7 @@ private void loadConfiguration() { disableFallDamage = config.getBoolean("player-damage.disable-fall-damage", false); disableLavaDamage = config.getBoolean("player-damage.disable-lava-damage", false); disableFireDamage = config.getBoolean("player-damage.disable-fire-damage", false); + disableLightningDamage = config.getBoolean("player-damage.disable-lightning-damage", false); disableDrowningDamage = config.getBoolean("player-damage.disable-drowning-damage", false); disableSuffocationDamage = config.getBoolean("player-damage.disable-suffocation-damage", false); disableContactDamage = config.getBoolean("player-damage.disable-contact-damage", false); @@ -187,6 +197,15 @@ private void loadConfiguration() { disableCreatureCropTrampling = config.getBoolean("crops.disable-creature-trampling", false); disablePlayerCropTrampling = config.getBoolean("crops.disable-player-trampling", false); + disallowedLightningBlocks = new HashSet(config.getIntList("weather.prevent-lightning-strike-blocks", null)); + preventLightningFire = config.getBoolean("weather.disable-lightning-strike-fire", false); + disableThunder = config.getBoolean("weather.disable-thunderstorm", false); + disableWeather = config.getBoolean("weather.disable-weather", false); + disablePigZap = config.getBoolean("weather.disable-pig-zombification", false); + disableCreeperPower = config.getBoolean("weather.disable-powered-creepers", false); + alwaysRaining = config.getBoolean("weather.always-raining", false); + alwaysThundering = config.getBoolean("weather.always-thundering", false); + useRegions = config.getBoolean("regions.enable", true); highFreqFlags = config.getBoolean("regions.high-frequency-flags", false); regionWand = config.getInt("regions.wand", 287); diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java index 14f51805..a5319ee8 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardBlockListener.java @@ -253,6 +253,11 @@ public void onBlockIgnite(BlockIgniteEvent event) { boolean isFireSpread = cause == IgniteCause.SPREAD; + if (wcfg.preventLightningFire && cause == IgniteCause.LIGHTNING) { + event.setCancelled(true); + return; + } + if (wcfg.preventLavaFire && cause == IgniteCause.LAVA) { event.setCancelled(true); return; diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java index cead54d1..ac79a413 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java @@ -143,6 +143,11 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { return; } + if (wcfg.disableLightningDamage && event.getCause() == DamageCause.LIGHTNING) { + event.setCancelled(true); + return; + } + if (attacker != null && attacker instanceof Player) { if (wcfg.useRegions) { Vector pt = toVector(defender.getLocation()); diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java index ae798942..c6fe8b84 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardPlayerListener.java @@ -278,7 +278,8 @@ public void handleBlockRightClick(PlayerInteractEvent event) { } } - if (type == Material.RAILS && item.getType() == Material.MINECART) { + if ((type == Material.RAILS || type == Material.POWERED_RAIL || type == Material.DETECTOR_RAIL) + && item.getType() == Material.MINECART) { if (!plugin.getGlobalRegionManager().hasBypass(player, world) && !set.canBuild(localPlayer) && !set.allows(DefaultFlag.PLACE_VEHICLE)) { From 19d447d67d0c4620368069a00c20812325916b2e Mon Sep 17 00:00:00 2001 From: Wizjany Date: Sun, 24 Apr 2011 15:55:26 -0400 Subject: [PATCH 5/5] Added handling for weather events. Depends on my craftbukkit pull request. --- .../bukkit/WorldGuardEntityListener.java | 33 +++++ .../worldguard/bukkit/WorldGuardPlugin.java | 1 + .../bukkit/WorldGuardWeatherListener.java | 134 ++++++++++++++++++ .../protection/flags/DefaultFlag.java | 14 +- 4 files changed, 176 insertions(+), 6 deletions(-) create mode 100644 src/com/sk89q/worldguard/bukkit/WorldGuardWeatherListener.java diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java index ac79a413..f1a4403e 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardEntityListener.java @@ -65,6 +65,8 @@ public void registerEvents() { pm.registerEvent(Event.Type.ENTITY_EXPLODE, this, Priority.High, plugin); pm.registerEvent(Event.Type.CREATURE_SPAWN, this, Priority.High, plugin); pm.registerEvent(Event.Type.ENTITY_INTERACT, this, Priority.High, plugin); + pm.registerEvent(Event.Type.CREEPER_POWER, this, Priority.High, plugin); + pm.registerEvent(Event.Type.PIG_ZAP, this, Priority.High, plugin); } @Override @@ -423,6 +425,37 @@ public void onCreatureSpawn(CreatureSpawnEvent event) { } } + /** + * Weather related entity events. + */ + @Override + public void onPigZap(PigZapEvent event) { + if (event.isCancelled()) { + return; + } + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld()); + + if (wcfg.disablePigZap) { + event.setCancelled(true); + } + } + + @Override + public void onCreeperPower(CreeperPowerEvent event) { + if (event.isCancelled()) { + return; + } + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(event.getEntity().getWorld()); + + if (wcfg.disableCreeperPower) { + event.setCancelled(true); + } + } + /** * Find a position for the player to stand that is not inside a block. * Blocks above the player will be iteratively tested until there is diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java b/src/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java index 0da9e506..a5ff0380 100644 --- a/src/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java @@ -132,6 +132,7 @@ public void onEnable() { (new WorldGuardPlayerListener(this)).registerEvents(); (new WorldGuardBlockListener(this)).registerEvents(); (new WorldGuardEntityListener(this)).registerEvents(); + (new WorldGuardWeatherListener(this)).registerEvents(); // 25 equals about 1s real time getServer().getScheduler().scheduleSyncRepeatingTask( diff --git a/src/com/sk89q/worldguard/bukkit/WorldGuardWeatherListener.java b/src/com/sk89q/worldguard/bukkit/WorldGuardWeatherListener.java new file mode 100644 index 00000000..d71a4645 --- /dev/null +++ b/src/com/sk89q/worldguard/bukkit/WorldGuardWeatherListener.java @@ -0,0 +1,134 @@ +// $Id$ +/* + * WorldGuard + * Copyright (C) 2010 sk89q + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.sk89q.worldguard.bukkit; + +import org.bukkit.block.Block; +import org.bukkit.event.Event.Priority; +import org.bukkit.event.Event; +import org.bukkit.plugin.PluginManager; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.*; +import org.bukkit.event.weather.*; +import org.bukkit.event.entity.*; +import org.bukkit.event.entity.PigZapEvent; +import org.bukkit.event.entity.CreeperPowerEvent; + +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BlockType; + +import static com.sk89q.worldguard.bukkit.BukkitUtil.*; + +import com.sk89q.worldguard.protection.flags.DefaultFlag; +import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.ApplicableRegionSet; + +public class WorldGuardWeatherListener extends WeatherListener { + + /** + * Plugin. + */ + private WorldGuardPlugin plugin; + + /** + * Construct the object; + * + * @param plugin + */ + public WorldGuardWeatherListener(WorldGuardPlugin plugin) { + this.plugin = plugin; + } + + public void registerEvents() { + PluginManager pm = plugin.getServer().getPluginManager(); + + pm.registerEvent(Event.Type.LIGHTNING_STRIKE, this, Priority.High, plugin); + pm.registerEvent(Event.Type.THUNDER_CHANGE, this, Priority.High, plugin); + pm.registerEvent(Event.Type.WEATHER_CHANGE, this, Priority.High, plugin); + } + + @Override + public void onWeatherChange(WeatherChangeEvent event) { + if (event.isCancelled()) { + return; + } + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(event.getWorld()); + + if (event.toWeatherState()) { + if (wcfg.disableWeather) { + event.setCancelled(true); + } + } else { + if (!wcfg.disableWeather && wcfg.alwaysRaining) { + event.setCancelled(true); + } + } + } + + @Override + public void onThunderChange(ThunderChangeEvent event) { + if (event.isCancelled()) { + return; + } + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(event.getWorld()); + + if (event.toThunderState()) { + if (wcfg.disableThunder) { + event.setCancelled(true); + } + } else { + if (!wcfg.disableWeather && wcfg.alwaysThundering) { + event.setCancelled(true); + } + } + } + + @Override + public void onLightningStrike(LightningStrikeEvent event) { + if (event.isCancelled()) { + return; + } + + ConfigurationManager cfg = plugin.getGlobalConfiguration(); + WorldConfiguration wcfg = cfg.get(event.getWorld()); + + if (wcfg.disallowedLightningBlocks.size() > 0) { + int targetId = event.getLightning().getLocation().getBlock().getTypeId(); + if (wcfg.disallowedLightningBlocks.contains(targetId)) { + event.setCancelled(true); + } + } + + Location loc = event.getLightning().getLocation(); + if (wcfg.useRegions) { + Vector pt = toVector(loc); + RegionManager mgr = plugin.getGlobalRegionManager().get(loc.getWorld()); + ApplicableRegionSet set = mgr.getApplicableRegions(pt); + + if (!set.allows(DefaultFlag.LIGHTNING)) { + event.setCancelled(true); + } + } + } + +} diff --git a/src/com/sk89q/worldguard/protection/flags/DefaultFlag.java b/src/com/sk89q/worldguard/protection/flags/DefaultFlag.java index 49833080..673cbb67 100644 --- a/src/com/sk89q/worldguard/protection/flags/DefaultFlag.java +++ b/src/com/sk89q/worldguard/protection/flags/DefaultFlag.java @@ -29,13 +29,14 @@ public final class DefaultFlag { public static final StateFlag BUILD = new StateFlag("build", 'b', true); public static final StateFlag PVP = new StateFlag("pvp", 'p', true); public static final StateFlag MOB_DAMAGE = new StateFlag("mob-damage", 'm', true); - public static final StateFlag MOB_SPAWNING = new StateFlag("mob-spawning", true); + public static final StateFlag MOB_SPAWNING = new StateFlag("mob-spawning", 'M', true); public static final StateFlag CREEPER_EXPLOSION = new StateFlag("creeper-explosion", 'c', true); public static final StateFlag SLEEP = new StateFlag("sleep", true); public static final StateFlag TNT = new StateFlag("tnt", 't', true); public static final StateFlag LIGHTER = new StateFlag("lighter", 'l', true); public static final StateFlag FIRE_SPREAD = new StateFlag("fire-spread", 'f', true); public static final StateFlag LAVA_FIRE = new StateFlag("lava-fire", 'F', true); + public static final StateFlag LIGHTNING = new StateFlag("lightning", true); public static final StateFlag CHEST_ACCESS = new StateFlag("chest-access", 'C', false); public static final StateFlag WATER_FLOW = new StateFlag("water-flow", true); public static final StateFlag LAVA_FLOW = new StateFlag("lava-flow", true); @@ -56,11 +57,12 @@ public final class DefaultFlag { public static final DoubleFlag PRICE = new DoubleFlag("price"); public static final Flag[] flagsList = new Flag[] { - PASSTHROUGH, BUILD, PVP, MOB_DAMAGE, MOB_SPAWNING, CREEPER_EXPLOSION, SLEEP, - TNT, LIGHTER, FIRE_SPREAD, LAVA_FIRE, CHEST_ACCESS, WATER_FLOW, LAVA_FLOW, - USE, PLACE_VEHICLE, GREET_MESSAGE, FAREWELL_MESSAGE, NOTIFY_GREET, - NOTIFY_FAREWELL, DENY_SPAWN, HEAL_DELAY, HEAL_AMOUNT, TELE_LOC, - TELE_PERM, SPAWN_LOC, SPAWN_PERM, BUYABLE, PRICE + PASSTHROUGH, BUILD, PVP, MOB_DAMAGE, MOB_SPAWNING, CREEPER_EXPLOSION, + TNT, LIGHTER, FIRE_SPREAD, LAVA_FIRE, LIGHTNING, CHEST_ACCESS, + WATER_FLOW, LAVA_FLOW, USE, PLACE_VEHICLE, GREET_MESSAGE, + FAREWELL_MESSAGE, NOTIFY_GREET, NOTIFY_FAREWELL, DENY_SPAWN, + HEAL_DELAY, HEAL_AMOUNT, TELE_LOC,TELE_PERM, SPAWN_LOC, SPAWN_PERM, + BUYABLE, PRICE, SLEEP }; private DefaultFlag() {