From db3838ccfe3bda13db117706a98b18d2596ee567 Mon Sep 17 00:00:00 2001 From: wizjany Date: Thu, 9 Jan 2020 20:00:26 -0500 Subject: [PATCH] Add flag to prevent natural health regen and hunger drain. --- .../listener/WorldGuardEntityListener.java | 32 +++++++++++++++++++ .../worldguard/protection/flags/Flags.java | 2 ++ 2 files changed, 34 insertions(+) diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java index e4f8f2bd..677e3060 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java @@ -48,6 +48,7 @@ import org.bukkit.entity.Enderman; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Fireball; +import org.bukkit.entity.HumanEntity; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -74,8 +75,10 @@ import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityInteractEvent; import org.bukkit.event.entity.EntityRegainHealthEvent; +import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; import org.bukkit.event.entity.EntityTransformEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.entity.PigZapEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.world.PortalCreateEvent; @@ -748,6 +751,10 @@ public class WorldGuardEntityListener implements Listener { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityRegainHealth(EntityRegainHealthEvent event) { + RegainReason regainReason = event.getRegainReason(); + if (regainReason != RegainReason.REGEN && regainReason != RegainReason.SATIATED) { + return; + } Entity ent = event.getEntity(); World world = ent.getWorld(); @@ -759,6 +766,31 @@ public class WorldGuardEntityListener implements Listener { event.setCancelled(true); return; } + if (wcfg.useRegions && ent instanceof Player + && !WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().testState( + BukkitAdapter.adapt(ent.getLocation()), + WorldGuardPlugin.inst().wrapPlayer((Player) ent), + Flags.HEALTH_REGEN)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true) + public void onFoodChange(FoodLevelChangeEvent event) { + if (event.getItem() != null) return; + HumanEntity ent = event.getEntity(); + if (!(ent instanceof Player)) return; + LocalPlayer player = WorldGuardPlugin.inst().wrapPlayer((Player) ent); + if (event.getFoodLevel() > player.getFoodLevel()) return; + + ConfigurationManager cfg = WorldGuard.getInstance().getPlatform().getGlobalStateManager(); + WorldConfiguration wcfg = cfg.get(player.getWorld()); + + if (wcfg.useRegions + && !WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().testState( + player.getLocation(), player, Flags.HUNGER_DRAIN)) { + event.setCancelled(true); + } } /** diff --git a/worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/Flags.java b/worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/Flags.java index 507e6a09..02d25357 100644 --- a/worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/Flags.java +++ b/worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/Flags.java @@ -137,6 +137,8 @@ public final class Flags { // idk? public static final StateFlag INVINCIBILITY = register(new StateFlag("invincible", false)); public static final StateFlag FALL_DAMAGE = register(new StateFlag("fall-damage", true)); + public static final StateFlag HEALTH_REGEN = register(new StateFlag("natural-health-regen", true)); + public static final StateFlag HUNGER_DRAIN = register(new StateFlag("natural-hunger-drain", true)); // session and movement based flags public static final StateFlag ENTRY = register(new StateFlag("entry", true, RegionGroup.NON_MEMBERS));