Skip to content

Commit 0f3ea50

Browse files
authored
Merge pull request #2115 from EngineHub/feature/fix-breeze-stuff
Optimize and cleanup explosion events from entities Fixes #2099 and #2097
2 parents b73a0a7 + 679b569 commit 0f3ea50

7 files changed

Lines changed: 84 additions & 48 deletions

File tree

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/BukkitWorldConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ public void loadConfiguration() {
215215
blockEnderDragonPortalCreation = getBoolean("mobs.block-enderdragon-portal-creation", false);
216216
blockFireballExplosions = getBoolean("mobs.block-fireball-explosions", false);
217217
blockFireballBlockDamage = getBoolean("mobs.block-fireball-block-damage", false);
218+
blockWindChargeExplosions = getBoolean("mobs.block-windcharge-explosions", false);
218219
antiWolfDumbness = getBoolean("mobs.anti-wolf-dumbness", false);
219220
allowTamedSpawns = getBoolean("mobs.allow-tamed-spawns", true);
220221
disableEndermanGriefing = getBoolean("mobs.disable-enderman-griefing", false);

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/event/block/AbstractBlockEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
* This event is an internal event. We do not recommend handling or throwing
4646
* this event or its subclasses as the interface is highly subject to change.
4747
*/
48-
abstract class AbstractBlockEvent extends DelegateEvent implements BulkEvent {
48+
public abstract class AbstractBlockEvent extends DelegateEvent implements BulkEvent {
4949

5050
private final World world;
5151
private List<Block> blocks;

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
2626
import com.sk89q.worldguard.bukkit.cause.Cause;
2727
import com.sk89q.worldguard.bukkit.event.DelegateEvent;
28+
import com.sk89q.worldguard.bukkit.event.block.AbstractBlockEvent;
2829
import com.sk89q.worldguard.bukkit.event.block.BreakBlockEvent;
2930
import com.sk89q.worldguard.bukkit.event.block.PlaceBlockEvent;
3031
import com.sk89q.worldguard.bukkit.event.block.UseBlockEvent;
@@ -50,6 +51,7 @@
5051
import io.papermc.paper.event.player.PlayerOpenSignEvent;
5152
import org.bukkit.Bukkit;
5253
import org.bukkit.Effect;
54+
import org.bukkit.ExplosionResult;
5355
import org.bukkit.GameMode;
5456
import org.bukkit.Location;
5557
import org.bukkit.Material;
@@ -65,8 +67,8 @@
6567
import org.bukkit.block.data.BlockData;
6668
import org.bukkit.block.data.Waterlogged;
6769
import org.bukkit.block.data.type.Dispenser;
68-
import org.bukkit.entity.AbstractWindCharge;
6970
import org.bukkit.entity.AreaEffectCloud;
71+
import org.bukkit.entity.BreezeWindCharge;
7072
import org.bukkit.entity.Creeper;
7173
import org.bukkit.entity.Entity;
7274
import org.bukkit.entity.EntityType;
@@ -80,6 +82,7 @@
8082
import org.bukkit.entity.Player;
8183
import org.bukkit.entity.Tameable;
8284
import org.bukkit.entity.ThrownPotion;
85+
import org.bukkit.entity.WindCharge;
8386
import org.bukkit.entity.minecart.HopperMinecart;
8487
import org.bukkit.event.Cancellable;
8588
import org.bukkit.event.Event;
@@ -115,6 +118,7 @@
115118
import org.bukkit.event.entity.EntityDeathEvent;
116119
import org.bukkit.event.entity.EntityExplodeEvent;
117120
import org.bukkit.event.entity.EntityInteractEvent;
121+
import org.bukkit.event.entity.EntityKnockbackByEntityEvent;
118122
import org.bukkit.event.entity.EntityPickupItemEvent;
119123
import org.bukkit.event.entity.EntityTameEvent;
120124
import org.bukkit.event.entity.EntityUnleashEvent;
@@ -324,10 +328,10 @@ public void onEntityChangeBlock(EntityChangeBlockEvent event) {
324328

325329
// Fire two events: one as BREAK and one as PLACE
326330
if (toType != Material.AIR && fromType != Material.AIR) {
327-
BreakBlockEvent breakDelagate = new BreakBlockEvent(event, cause, block);
328-
setDelegateEventMaterialOptions(breakDelagate, fromType, toType);
331+
BreakBlockEvent breakDelegate = new BreakBlockEvent(event, cause, block);
332+
setDelegateEventMaterialOptions(breakDelegate, fromType, toType);
329333
boolean denied;
330-
if (!(denied = Events.fireToCancel(event, breakDelagate))) {
334+
if (!(denied = Events.fireToCancel(event, breakDelegate))) {
331335
PlaceBlockEvent placeDelegate = new PlaceBlockEvent(event, cause, block.getLocation(), toType);
332336
setDelegateEventMaterialOptions(placeDelegate, fromType, toType);
333337
denied = Events.fireToCancel(event, placeDelegate);
@@ -355,17 +359,37 @@ public void onEntityChangeBlock(EntityChangeBlockEvent event) {
355359

356360
}
357361

362+
@EventHandler(ignoreCancelled = true)
363+
public void onEntityKnockbackByEntity(EntityKnockbackByEntityEvent event) {
364+
Entity damager = event.getSourceEntity();
365+
366+
final DamageEntityEvent eventToFire = new DamageEntityEvent(event, create(damager), event.getEntity());
367+
if (damager instanceof BreezeWindCharge) {
368+
eventToFire.getRelevantFlags().add(Flags.BREEZE_WIND_CHARGE);
369+
} else if (damager instanceof WindCharge) {
370+
eventToFire.getRelevantFlags().add(Flags.WIND_CHARGE_BURST);
371+
}
372+
Events.fireToCancel(event, eventToFire);
373+
}
374+
358375
@EventHandler(ignoreCancelled = true)
359376
public void onEntityExplode(EntityExplodeEvent event) {
360377
Entity entity = event.getEntity();
361-
if (entity instanceof AbstractWindCharge) {
362-
UseBlockEvent useEvent = new UseBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR);
363-
useEvent.getRelevantFlags().add(Flags.WIND_CHARGE_BURST);
364-
useEvent.setSilent(true);
365-
Events.fireBulkEventToCancel(event, useEvent);
378+
AbstractBlockEvent wgEvent;
379+
380+
if (event.getExplosionResult() == ExplosionResult.TRIGGER_BLOCK) {
381+
wgEvent = new UseBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR);
382+
} else if (event.getExplosionResult() == ExplosionResult.DESTROY || event.getExplosionResult() == ExplosionResult.DESTROY_WITH_DECAY) {
383+
wgEvent = new BreakBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR);
384+
} else {
366385
return;
367386
}
368-
Events.fireBulkEventToCancel(event, new BreakBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR));
387+
388+
wgEvent.getRelevantFlags().add(Entities.getExplosionFlag(event.getEntity()));
389+
390+
wgEvent.setSilent(true);
391+
Events.fireBulkEventToCancel(event, wgEvent);
392+
369393
if (entity instanceof Creeper) {
370394
Cause.untrackParentCause(entity);
371395
}
@@ -584,7 +608,7 @@ public void onEntityInteract(EntityInteractEvent event) {
584608

585609
@EventHandler(ignoreCancelled = true)
586610
public void onBlockFertilize(BlockFertilizeEvent event) {
587-
if (event.getBlocks().isEmpty()) return;
611+
if (event.getBlocks().isEmpty()) return;
588612
Cause cause = create(event.getPlayer(), event.getBlock());
589613
Events.fireToCancel(event, new PlaceBlockEvent(event, cause, event.getBlock().getWorld(), event.getBlocks()));
590614
}
@@ -750,7 +774,7 @@ public void onHangingBreak(HangingBreakEvent event) {
750774
if (event.isCancelled() && remover instanceof Player) {
751775
playDenyEffect((Player) remover, event.getEntity().getLocation());
752776
}
753-
} else if (event.getCause() == HangingBreakEvent.RemoveCause.EXPLOSION){
777+
} else if (event.getCause() == HangingBreakEvent.RemoveCause.EXPLOSION) {
754778
DestroyEntityEvent destroyEntityEvent = new DestroyEntityEvent(event, Cause.unknown(), event.getEntity());
755779
destroyEntityEvent.getRelevantFlags().add(Flags.OTHER_EXPLOSION);
756780
if (event.getEntity() instanceof ItemFrame) {
@@ -1112,7 +1136,7 @@ public void onLingeringApply(AreaEffectCloudApplyEvent event) {
11121136
}
11131137

11141138
@EventHandler(ignoreCancelled = true)
1115-
public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event){
1139+
public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) {
11161140
onPlayerInteractEntity(event);
11171141
}
11181142

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/WorldGuardEntityListener.java

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.bukkit.World;
4545
import org.bukkit.block.Block;
4646
import org.bukkit.block.BlockState;
47+
import org.bukkit.entity.AbstractWindCharge;
4748
import org.bukkit.entity.ArmorStand;
4849
import org.bukkit.entity.Creeper;
4950
import org.bukkit.entity.EnderCrystal;
@@ -311,13 +312,17 @@ private void onEntityDamageByProjectile(EntityDamageByEntityEvent event) {
311312
return;
312313
}
313314
}
314-
if (event.getDamager() instanceof Fireball) {
315-
Fireball fireball = (Fireball) event.getDamager();
315+
if (event.getDamager() instanceof Fireball fireball) {
316316
if (fireball instanceof WitherSkull) {
317317
if (wcfg.blockWitherSkullExplosions) {
318318
event.setCancelled(true);
319319
return;
320320
}
321+
} else if (fireball instanceof AbstractWindCharge) {
322+
if (wcfg.blockWindChargeExplosions) {
323+
event.setCancelled(true);
324+
return;
325+
}
321326
} else {
322327
if (wcfg.blockFireballExplosions) {
323328
event.setCancelled(true);
@@ -326,7 +331,7 @@ private void onEntityDamageByProjectile(EntityDamageByEntityEvent event) {
326331
}
327332
if (wcfg.useRegions) {
328333
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
329-
if (!query.testState(localPlayer.getLocation(), localPlayer, Flags.GHAST_FIREBALL) && wcfg.explosionFlagCancellation) {
334+
if (!query.testState(localPlayer.getLocation(), localPlayer, Entities.getExplosionFlag(event.getDamager())) && wcfg.explosionFlagCancellation) {
330335
event.setCancelled(true);
331336
return;
332337
}
@@ -483,6 +488,11 @@ public void onEntityExplode(EntityExplodeEvent event) {
483488
event.blockList().clear();
484489
return;
485490
}
491+
} else if (ent instanceof AbstractWindCharge) {
492+
if (wcfg.blockWindChargeExplosions) {
493+
event.setCancelled(true);
494+
return;
495+
}
486496
} else {
487497
if (wcfg.blockFireballExplosions) {
488498
event.setCancelled(true);
@@ -493,16 +503,6 @@ public void onEntityExplode(EntityExplodeEvent event) {
493503
return;
494504
}
495505
}
496-
// allow wither skull blocking since there is no dedicated flag atm
497-
if (wcfg.useRegions) {
498-
for (Block block : event.blockList()) {
499-
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().getApplicableRegions(BukkitAdapter.adapt(block.getLocation())).testState(null, Flags.GHAST_FIREBALL)) {
500-
event.blockList().clear();
501-
if (wcfg.explosionFlagCancellation) event.setCancelled(true);
502-
return;
503-
}
504-
}
505-
}
506506
} else if (ent instanceof Wither) {
507507
if (wcfg.blockWitherExplosions) {
508508
event.setCancelled(true);
@@ -512,34 +512,14 @@ public void onEntityExplode(EntityExplodeEvent event) {
512512
event.blockList().clear();
513513
return;
514514
}
515-
if (wcfg.useRegions) {
516-
for (Block block : event.blockList()) {
517-
if (!StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().queryState(BukkitAdapter.adapt(block.getLocation()),
518-
(RegionAssociable) null, Flags.WITHER_DAMAGE))) {
519-
event.blockList().clear();
520-
event.setCancelled(true);
521-
return;
522-
}
523-
}
524-
}
525515
} else {
526516
// unhandled entity
527517
if (wcfg.blockOtherExplosions) {
528518
event.setCancelled(true);
529519
return;
530520
}
531-
if (wcfg.useRegions) {
532-
for (Block block : event.blockList()) {
533-
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().getApplicableRegions(BukkitAdapter.adapt(block.getLocation())).testState(null, Flags.OTHER_EXPLOSION)) {
534-
event.blockList().clear();
535-
if (wcfg.explosionFlagCancellation) event.setCancelled(true);
536-
return;
537-
}
538-
}
539-
}
540521
}
541522

542-
543523
if (wcfg.signChestProtection) {
544524
for (Block block : event.blockList()) {
545525
if (wcfg.isChestProtected(BukkitAdapter.adapt(block.getLocation()))) {
@@ -592,6 +572,11 @@ public void onExplosionPrime(ExplosionPrimeEvent event) {
592572
event.setCancelled(true);
593573
return;
594574
}
575+
} else if (event instanceof AbstractWindCharge) {
576+
if (wcfg.blockWindChargeExplosions) {
577+
event.setCancelled(true);
578+
return;
579+
}
595580
}
596581
}
597582

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Entities.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,20 @@
1919

2020
package com.sk89q.worldguard.bukkit.util;
2121

22+
import com.sk89q.worldguard.protection.flags.Flags;
23+
import com.sk89q.worldguard.protection.flags.StateFlag;
2224
import org.bukkit.entity.Allay;
2325
import org.bukkit.entity.Ambient;
2426
import org.bukkit.entity.ArmorStand;
2527
import org.bukkit.entity.Arrow;
28+
import org.bukkit.entity.BreezeWindCharge;
2629
import org.bukkit.entity.Creature;
2730
import org.bukkit.entity.EnderCrystal;
2831
import org.bukkit.entity.EnderDragon;
2932
import org.bukkit.entity.Entity;
3033
import org.bukkit.entity.EntityType;
34+
import org.bukkit.entity.Fireball;
35+
import org.bukkit.entity.Firework;
3136
import org.bukkit.entity.Flying;
3237
import org.bukkit.entity.Hanging;
3338
import org.bukkit.entity.LivingEntity;
@@ -43,11 +48,14 @@
4348
import org.bukkit.entity.TNTPrimed;
4449
import org.bukkit.entity.Tameable;
4550
import org.bukkit.entity.Vehicle;
51+
import org.bukkit.entity.WindCharge;
52+
import org.bukkit.entity.Wither;
4653
import org.bukkit.entity.minecart.ExplosiveMinecart;
4754
import org.bukkit.event.entity.CreatureSpawnEvent;
4855
import org.bukkit.inventory.InventoryHolder;
4956
import org.bukkit.projectiles.ProjectileSource;
5057

58+
import javax.annotation.Nonnull;
5159
import javax.annotation.Nullable;
5260

5361
public final class Entities {
@@ -245,4 +253,20 @@ public static boolean isPluginSpawning(CreatureSpawnEvent.SpawnReason spawnReaso
245253
default -> false;
246254
};
247255
}
256+
257+
/**
258+
* Get the explosion flag relevant for an entity type.
259+
* @param entity the entity
260+
* @return the relevant StateFlag or OTHER_EXPLOSION if none is matching
261+
*/
262+
public static @Nonnull StateFlag getExplosionFlag(Entity entity) {
263+
return switch (entity) {
264+
case BreezeWindCharge breezeWindCharge -> Flags.BREEZE_WIND_CHARGE;
265+
case WindCharge windCharge -> Flags.WIND_CHARGE_BURST;
266+
case Firework firework -> Flags.FIREWORK_DAMAGE;
267+
case Fireball fireball -> Flags.GHAST_FIREBALL;
268+
case Wither wither -> Flags.WITHER_DAMAGE;
269+
case null, default -> Flags.OTHER_EXPLOSION;
270+
};
271+
}
248272
}

worldguard-core/src/main/java/com/sk89q/worldguard/config/WorldConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public abstract class WorldConfiguration {
101101
public boolean blockEnderDragonPortalCreation;
102102
public boolean blockFireballExplosions;
103103
public boolean blockFireballBlockDamage;
104+
public boolean blockWindChargeExplosions;
104105
public boolean blockOtherExplosions;
105106
public boolean blockEntityPaintingDestroy;
106107
public boolean blockEntityItemFrameDestroy;

worldguard-core/src/main/java/com/sk89q/worldguard/protection/flags/Flags.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public final class Flags {
7474
public static final StateFlag FIREWORK_DAMAGE = register(new StateFlag("firework-damage", false));
7575
public static final StateFlag USE_ANVIL = register(new StateFlag("use-anvil", false));
7676
public static final StateFlag USE_DRIPLEAF = register(new StateFlag("use-dripleaf", false));
77+
public static final StateFlag WIND_CHARGE_BURST = register(new StateFlag("wind-charge-burst", false));
7778

7879
// These flags are similar to the ones above (used in tandem with BUILD),
7980
// but their defaults are set to TRUE because it is more user friendly.
@@ -93,7 +94,7 @@ public final class Flags {
9394
public static final StateFlag ENDERDRAGON_BLOCK_DAMAGE = register(new StateFlag("enderdragon-block-damage", true));
9495
public static final StateFlag GHAST_FIREBALL = register(new StateFlag("ghast-fireball", true));
9596
public static final StateFlag OTHER_EXPLOSION = register(new StateFlag("other-explosion", true));
96-
public static final StateFlag WIND_CHARGE_BURST = register(new StateFlag("wind-charge-burst", true));
97+
public static final StateFlag BREEZE_WIND_CHARGE = register(new StateFlag("breeze-charge-explosion", true));
9798
public static final StateFlag WITHER_DAMAGE = register(new StateFlag("wither-damage", true));
9899
public static final StateFlag ENDER_BUILD = register(new StateFlag("enderman-grief", true));
99100
public static final StateFlag SNOWMAN_TRAILS = register(new StateFlag("snowman-trails", true));

0 commit comments

Comments
 (0)