diff --git a/vane-admin/src/main/java/org/oddlama/vane/admin/WorldProtection.java b/vane-admin/src/main/java/org/oddlama/vane/admin/WorldProtection.java index f30a58074..714351040 100644 --- a/vane-admin/src/main/java/org/oddlama/vane/admin/WorldProtection.java +++ b/vane-admin/src/main/java/org/oddlama/vane/admin/WorldProtection.java @@ -1,6 +1,8 @@ package org.oddlama.vane.admin; +import org.bukkit.entity.Creeper; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -11,6 +13,7 @@ import org.bukkit.event.entity.EntityCombustByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingPlaceEvent; @@ -57,6 +60,23 @@ public boolean deny_modify_world(final Entity entity) { return !entity.hasPermission(permission); } + private Player causing_player(final Creeper creeper) { + final var target = creeper.getTarget(); + if (target instanceof Player) { + return (Player) target; + } + + final var cause = creeper.getLastDamageCause(); + if (cause instanceof EntityDamageByEntityEvent) { + final var damage_event = (EntityDamageByEntityEvent) cause; + if (damage_event.getDamager() instanceof Player) { + return (Player) damage_event.getDamager(); + } + } + + return null; + } + /* ************************ blocks ************************ */ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @@ -98,6 +118,18 @@ public void on_entity_combust_by_entity(EntityCombustByEntityEvent event) { } } + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void on_entity_explode(EntityExplodeEvent event) { + if (event.getEntityType() != EntityType.CREEPER) { + return; + } + + final var player = causing_player((Creeper) event.getEntity()); + if (player != null && deny_modify_world(player)) { + event.blockList().clear(); + } + } + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void on_entity_damage(EntityDamageEvent event) { if (event instanceof EntityDamageByEntityEvent) {