Skip to content

Commit 830472d

Browse files
committed
Revert previous changes to explosion event handling.
Event abstraction sucks and everything needs rewriting.
1 parent 03aac83 commit 830472d

File tree

4 files changed

+58
-20
lines changed

4 files changed

+58
-20
lines changed

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-
public abstract class AbstractBlockEvent extends DelegateEvent implements BulkEvent {
48+
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: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
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;
2928
import com.sk89q.worldguard.bukkit.event.block.BreakBlockEvent;
3029
import com.sk89q.worldguard.bukkit.event.block.PlaceBlockEvent;
3130
import com.sk89q.worldguard.bukkit.event.block.UseBlockEvent;
@@ -116,6 +115,7 @@
116115
import org.bukkit.event.entity.EntityDamageByEntityEvent;
117116
import org.bukkit.event.entity.EntityDamageEvent;
118117
import org.bukkit.event.entity.EntityDeathEvent;
118+
import org.bukkit.event.entity.EntityEvent;
119119
import org.bukkit.event.entity.EntityExplodeEvent;
120120
import org.bukkit.event.entity.EntityInteractEvent;
121121
import org.bukkit.event.entity.EntityKnockbackByEntityEvent;
@@ -181,9 +181,11 @@ public EventAbstractionListener(WorldGuardPlugin plugin) {
181181
public void registerEvents() {
182182
super.registerEvents();
183183

184+
PluginManager pm = getPlugin().getServer().getPluginManager();
184185
if (PaperLib.isPaper()) {
185-
PluginManager pm = getPlugin().getServer().getPluginManager();
186186
pm.registerEvents(new EventAbstractionListener.PaperListener(), getPlugin());
187+
} else {
188+
pm.registerEvents(new EventAbstractionListener.SpigotListener(), getPlugin());
187189
}
188190
}
189191

@@ -359,10 +361,7 @@ public void onEntityChangeBlock(EntityChangeBlockEvent event) {
359361

360362
}
361363

362-
@EventHandler(ignoreCancelled = true)
363-
public void onEntityKnockbackByEntity(EntityKnockbackByEntityEvent event) {
364-
Entity damager = event.getSourceEntity();
365-
364+
private static <T extends EntityEvent & Cancellable> void handleKnockback(T event, Entity damager) {
366365
final DamageEntityEvent eventToFire = new DamageEntityEvent(event, create(damager), event.getEntity());
367366
if (damager instanceof BreezeWindCharge) {
368367
eventToFire.getRelevantFlags().add(Flags.BREEZE_WIND_CHARGE);
@@ -372,24 +371,19 @@ public void onEntityKnockbackByEntity(EntityKnockbackByEntityEvent event) {
372371
Events.fireToCancel(event, eventToFire);
373372
}
374373

374+
@SuppressWarnings("UnstableApiUsage")
375375
@EventHandler(ignoreCancelled = true)
376376
public void onEntityExplode(EntityExplodeEvent event) {
377377
Entity entity = event.getEntity();
378-
AbstractBlockEvent wgEvent;
379-
380378
if (event.getExplosionResult() == ExplosionResult.TRIGGER_BLOCK) {
381-
wgEvent = new UseBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR);
379+
UseBlockEvent useEvent = new UseBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR);
380+
useEvent.getRelevantFlags().add(Entities.getExplosionFlag(entity));
381+
useEvent.setSilent(true);
382+
Events.fireBulkEventToCancel(event, useEvent);
382383
} 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 {
385-
return;
384+
Events.fireBulkEventToCancel(event, new BreakBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR));
386385
}
387386

388-
wgEvent.getRelevantFlags().add(Entities.getExplosionFlag(event.getEntity()));
389-
390-
wgEvent.setSilent(true);
391-
Events.fireBulkEventToCancel(event, wgEvent);
392-
393387
if (entity instanceof Creeper) {
394388
Cause.untrackParentCause(entity);
395389
}
@@ -1295,7 +1289,7 @@ private static void playDenyEffect(Location location) {
12951289
}
12961290
}
12971291

1298-
private class PaperListener implements Listener {
1292+
private static class PaperListener implements Listener {
12991293
@EventHandler(ignoreCancelled = true)
13001294
public void onEntityTransform(EntityZapEvent event) {
13011295
Events.fireToCancel(event, new DamageEntityEvent(event, create(event.getBolt()), event.getEntity()));
@@ -1308,5 +1302,18 @@ public void onSignOpen(PlayerOpenSignEvent event) {
13081302
Events.fireToCancel(event, new UseBlockEvent(event, create(event.getPlayer()), event.getSign().getBlock()));
13091303
}
13101304
}
1305+
1306+
@EventHandler(ignoreCancelled = true)
1307+
public void onEntityKnockbackByEntity(com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent event) {
1308+
handleKnockback(event, event.getHitBy());
1309+
}
1310+
}
1311+
1312+
@SuppressWarnings("removal")
1313+
private static class SpigotListener implements Listener {
1314+
@EventHandler(ignoreCancelled = true)
1315+
public void onEntityKnockbackByEntity(EntityKnockbackByEntityEvent event) {
1316+
handleKnockback(event, event.getSourceEntity());
1317+
}
13111318
}
13121319
}

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import org.bukkit.entity.Projectile;
6262
import org.bukkit.entity.TNTPrimed;
6363
import org.bukkit.entity.Tameable;
64+
import org.bukkit.entity.WindCharge;
6465
import org.bukkit.entity.Wither;
6566
import org.bukkit.entity.WitherSkull;
6667
import org.bukkit.entity.Wolf;
@@ -503,6 +504,16 @@ public void onEntityExplode(EntityExplodeEvent event) {
503504
return;
504505
}
505506
}
507+
if (wcfg.useRegions && !(ent instanceof WindCharge)) {
508+
for (Block block : event.blockList()) {
509+
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
510+
.testState(BukkitAdapter.adapt(block.getLocation()), null, Entities.getExplosionFlag(ent))) {
511+
event.blockList().clear();
512+
if (wcfg.explosionFlagCancellation) event.setCancelled(true);
513+
return;
514+
}
515+
}
516+
}
506517
} else if (ent instanceof Wither) {
507518
if (wcfg.blockWitherExplosions) {
508519
event.setCancelled(true);
@@ -512,12 +523,32 @@ public void onEntityExplode(EntityExplodeEvent event) {
512523
event.blockList().clear();
513524
return;
514525
}
526+
if (wcfg.useRegions) {
527+
for (Block block : event.blockList()) {
528+
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
529+
.testState(BukkitAdapter.adapt(block.getLocation()), null, Flags.WITHER_DAMAGE)) {
530+
event.blockList().clear();
531+
event.setCancelled(true);
532+
return;
533+
}
534+
}
535+
}
515536
} else {
516537
// unhandled entity
517538
if (wcfg.blockOtherExplosions) {
518539
event.setCancelled(true);
519540
return;
520541
}
542+
if (wcfg.useRegions) {
543+
for (Block block : event.blockList()) {
544+
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
545+
.testState(BukkitAdapter.adapt(block.getLocation()), null, Flags.OTHER_EXPLOSION)) {
546+
event.blockList().clear();
547+
if (wcfg.explosionFlagCancellation) event.setCancelled(true);
548+
return;
549+
}
550+
}
551+
}
521552
}
522553

523554
if (wcfg.signChestProtection) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ public static boolean isAoECloud(EntityType type) {
246246
* This is true for custom creations or the summon command.
247247
*
248248
* @param spawnReason the reason
249-
* @return true if considerd plugin spawning
249+
* @return true if considered plugin spawning
250250
*/
251251
public static boolean isPluginSpawning(CreatureSpawnEvent.SpawnReason spawnReason) {
252252
return switch (spawnReason) {

0 commit comments

Comments
 (0)