diff --git a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java index 6b439543..1de58c84 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java @@ -199,6 +199,7 @@ public void run() { (new EventAbstractionListener(this)).registerEvents(); (new PlayerModesListener(this)).registerEvents(); (new BuildPermissionListener(this)).registerEvents(); + (new InvincibilityListener(this)).registerEvents(); if ("true".equalsIgnoreCase(System.getProperty("worldguard.debug.listener"))) { (new DebuggingListener(this, log)).registerEvents(); } diff --git a/src/main/java/com/sk89q/worldguard/bukkit/listener/InvincibilityListener.java b/src/main/java/com/sk89q/worldguard/bukkit/listener/InvincibilityListener.java new file mode 100644 index 00000000..85153644 --- /dev/null +++ b/src/main/java/com/sk89q/worldguard/bukkit/listener/InvincibilityListener.java @@ -0,0 +1,105 @@ +/* + * WorldGuard, a suite of tools for Minecraft + * Copyright (C) sk89q + * Copyright (C) WorldGuard team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser 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 Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldguard.bukkit.listener; + +import com.sk89q.worldguard.bukkit.WorldConfiguration; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Tameable; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityCombustEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; + +public class InvincibilityListener extends AbstractListener { + + /** + * Construct the listener. + * + * @param plugin an instance of WorldGuardPlugin + */ + public InvincibilityListener(WorldGuardPlugin plugin) { + super(plugin); + } + + /** + * Test whether a player should be invincible. + * + * @param player The player + * @return True if invincible + */ + private boolean isInvincible(Player player) { + return getPlugin().getSessionManager().get(player).isInvincible(player); + } + + @EventHandler(ignoreCancelled = true) + public void onEntityDamage(EntityDamageEvent event) { + Entity victim = event.getEntity(); + WorldConfiguration worldConfig = getPlugin().getGlobalStateManager().get(victim.getWorld()); + + if (victim instanceof Player) { + Player player = (Player) victim; + + if (isInvincible(player)) { + player.setFireTicks(0); + event.setCancelled(true); + + if (event instanceof EntityDamageByEntityEvent) { + EntityDamageByEntityEvent byEntityEvent = (EntityDamageByEntityEvent) event; + Entity attacker = byEntityEvent.getDamager(); + + if (worldConfig.regionInvinciblityRemovesMobs + && attacker instanceof LivingEntity && !(attacker instanceof Player) + && !(attacker instanceof Tameable && ((Tameable) attacker).isTamed())) { + attacker.remove(); + } + } + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onEntityCombust(EntityCombustEvent event) { + Entity entity = event.getEntity(); + + if (entity instanceof Player) { + Player player = (Player) entity; + + if (isInvincible(player)) { + event.setCancelled(true); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onFoodLevelChange(FoodLevelChangeEvent event) { + if (event.getEntity() instanceof Player) { + Player player = (Player) event.getEntity(); + + if (event.getFoodLevel() < player.getFoodLevel() && isInvincible(player)) { + event.setCancelled(true); + } + } + } + +} diff --git a/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java b/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java index 9fa63334..17b24402 100644 --- a/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java +++ b/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java @@ -106,11 +106,6 @@ private void onEntityDamageByBlock(EntityDamageByBlockEvent event) { } else if (defender instanceof Player) { Player player = (Player) defender; - if (plugin.getSessionManager().get(player).isInvincible(player)) { - event.setCancelled(true); - return; - } - if (wcfg.disableLavaDamage && type == DamageCause.LAVA) { event.setCancelled(true); player.setFireTicks(0); @@ -178,17 +173,6 @@ private void onEntityDamageByEntity(EntityDamageByEntityEvent event) { ConfigurationManager cfg = plugin.getGlobalStateManager(); WorldConfiguration wcfg = cfg.get(player.getWorld()); - if (plugin.getSessionManager().get(player).isInvincible(player)) { - if (wcfg.regionInvinciblityRemovesMobs - && attacker instanceof LivingEntity && !(attacker instanceof Player) - && !(attacker instanceof Tameable && ((Tameable) attacker).isTamed())) { - attacker.remove(); - } - - event.setCancelled(true); - return; - } - if (wcfg.disableLightningDamage && event.getCause() == DamageCause.LIGHTNING) { event.setCancelled(true); return; @@ -284,12 +268,6 @@ private void onEntityDamageByProjectile(EntityDamageByEntityEvent event) { ConfigurationManager cfg = plugin.getGlobalStateManager(); WorldConfiguration wcfg = cfg.get(player.getWorld()); - // Check Invincible - if (plugin.getSessionManager().get(player).isInvincible(player)) { - event.setCancelled(true); - return; - } - // Check Mob if (attacker != null && !(attacker instanceof Player)) { if (wcfg.disableMobDamage) { @@ -337,12 +315,6 @@ public void onEntityDamage(EntityDamageEvent event) { } else if (defender instanceof Player) { Player player = (Player) defender; - if (plugin.getSessionManager().get(player).isInvincible(player)) { - event.setCancelled(true); - player.setFireTicks(0); - return; - } - if (type == DamageCause.WITHER) { // wither boss DoT tick if (wcfg.disableMobDamage) { @@ -407,22 +379,6 @@ public void onEntityDamage(EntityDamageEvent event) { } } - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void onEntityCombust(EntityCombustEvent event) { - Entity entity = event.getEntity(); - - ConfigurationManager cfg = plugin.getGlobalStateManager(); - WorldConfiguration wcfg = cfg.get(entity.getWorld()); - - if (entity instanceof Player) { - Player player = (Player) entity; - - if (plugin.getSessionManager().get(player).isInvincible(player)) { - event.setCancelled(true); - } - } - } - /* * Called on entity explode. */ @@ -719,16 +675,6 @@ public void onEntityChangeBlock(EntityChangeBlockEvent event) { } } - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void onFoodLevelChange(FoodLevelChangeEvent event) { - if (event.getEntity() instanceof Player) { - Player player = (Player) event.getEntity(); - if (event.getFoodLevel() < player.getFoodLevel() && plugin.getSessionManager().get(player).isInvincible(player)) { - event.setCancelled(true); - } - } - } - /** * Checks regions and config settings to protect items from being knocked * out of item frames.