Skip to content

Commit afb619d

Browse files
Joo200wizjany
authored andcommitted
Fix breeze damage flags
1 parent b73a0a7 commit afb619d

7 files changed

Lines changed: 64 additions & 44 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: 19 additions & 10 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;
@@ -46,10 +47,12 @@
4647
import com.sk89q.worldguard.bukkit.util.Materials;
4748
import com.sk89q.worldguard.config.WorldConfiguration;
4849
import com.sk89q.worldguard.protection.flags.Flags;
50+
import com.sk89q.worldguard.protection.flags.StateFlag;
4951
import io.papermc.lib.PaperLib;
5052
import io.papermc.paper.event.player.PlayerOpenSignEvent;
5153
import org.bukkit.Bukkit;
5254
import org.bukkit.Effect;
55+
import org.bukkit.ExplosionResult;
5356
import org.bukkit.GameMode;
5457
import org.bukkit.Location;
5558
import org.bukkit.Material;
@@ -65,7 +68,6 @@
6568
import org.bukkit.block.data.BlockData;
6669
import org.bukkit.block.data.Waterlogged;
6770
import org.bukkit.block.data.type.Dispenser;
68-
import org.bukkit.entity.AbstractWindCharge;
6971
import org.bukkit.entity.AreaEffectCloud;
7072
import org.bukkit.entity.Creeper;
7173
import org.bukkit.entity.Entity;
@@ -358,14 +360,21 @@ public void onEntityChangeBlock(EntityChangeBlockEvent event) {
358360
@EventHandler(ignoreCancelled = true)
359361
public void onEntityExplode(EntityExplodeEvent event) {
360362
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);
363+
AbstractBlockEvent wgEvent;
364+
365+
if (event.getExplosionResult() == ExplosionResult.TRIGGER_BLOCK) {
366+
wgEvent = new UseBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR);
367+
} else if (event.getExplosionResult() == ExplosionResult.DESTROY || event.getExplosionResult() == ExplosionResult.DESTROY_WITH_DECAY) {
368+
wgEvent = new BreakBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR);
369+
} else {
366370
return;
367371
}
368-
Events.fireBulkEventToCancel(event, new BreakBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR));
372+
373+
wgEvent.getRelevantFlags().add(Entities.getExplosionFlag(event.getEntity()));
374+
375+
wgEvent.setSilent(true);
376+
Events.fireBulkEventToCancel(event, wgEvent);
377+
369378
if (entity instanceof Creeper) {
370379
Cause.untrackParentCause(entity);
371380
}
@@ -584,7 +593,7 @@ public void onEntityInteract(EntityInteractEvent event) {
584593

585594
@EventHandler(ignoreCancelled = true)
586595
public void onBlockFertilize(BlockFertilizeEvent event) {
587-
if (event.getBlocks().isEmpty()) return;
596+
if (event.getBlocks().isEmpty()) return;
588597
Cause cause = create(event.getPlayer(), event.getBlock());
589598
Events.fireToCancel(event, new PlaceBlockEvent(event, cause, event.getBlock().getWorld(), event.getBlocks()));
590599
}
@@ -750,7 +759,7 @@ public void onHangingBreak(HangingBreakEvent event) {
750759
if (event.isCancelled() && remover instanceof Player) {
751760
playDenyEffect((Player) remover, event.getEntity().getLocation());
752761
}
753-
} else if (event.getCause() == HangingBreakEvent.RemoveCause.EXPLOSION){
762+
} else if (event.getCause() == HangingBreakEvent.RemoveCause.EXPLOSION) {
754763
DestroyEntityEvent destroyEntityEvent = new DestroyEntityEvent(event, Cause.unknown(), event.getEntity());
755764
destroyEntityEvent.getRelevantFlags().add(Flags.OTHER_EXPLOSION);
756765
if (event.getEntity() instanceof ItemFrame) {
@@ -1112,7 +1121,7 @@ public void onLingeringApply(AreaEffectCloudApplyEvent event) {
11121121
}
11131122

11141123
@EventHandler(ignoreCancelled = true)
1115-
public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event){
1124+
public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) {
11161125
onPlayerInteractEntity(event);
11171126
}
11181127

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

Lines changed: 19 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,22 +312,27 @@ 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);
324329
return;
325330
}
326331
}
327332
if (wcfg.useRegions) {
333+
WorldGuardPlugin.inst().getLogger().info("Getting damager type " + event.getDamager().getType());
328334
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
329-
if (!query.testState(localPlayer.getLocation(), localPlayer, Flags.GHAST_FIREBALL) && wcfg.explosionFlagCancellation) {
335+
if (!query.testState(localPlayer.getLocation(), localPlayer, Entities.getExplosionFlag(event.getDamager())) && wcfg.explosionFlagCancellation) {
330336
event.setCancelled(true);
331337
return;
332338
}
@@ -483,6 +489,11 @@ public void onEntityExplode(EntityExplodeEvent event) {
483489
event.blockList().clear();
484490
return;
485491
}
492+
} else if (ent instanceof AbstractWindCharge) {
493+
if (wcfg.blockWindChargeExplosions) {
494+
event.setCancelled(true);
495+
return;
496+
}
486497
} else {
487498
if (wcfg.blockFireballExplosions) {
488499
event.setCancelled(true);
@@ -493,16 +504,6 @@ public void onEntityExplode(EntityExplodeEvent event) {
493504
return;
494505
}
495506
}
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-
}
506507
} else if (ent instanceof Wither) {
507508
if (wcfg.blockWitherExplosions) {
508509
event.setCancelled(true);
@@ -512,34 +513,14 @@ public void onEntityExplode(EntityExplodeEvent event) {
512513
event.blockList().clear();
513514
return;
514515
}
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-
}
525516
} else {
526517
// unhandled entity
527518
if (wcfg.blockOtherExplosions) {
528519
event.setCancelled(true);
529520
return;
530521
}
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-
}
540522
}
541523

542-
543524
if (wcfg.signChestProtection) {
544525
for (Block block : event.blockList()) {
545526
if (wcfg.isChestProtected(BukkitAdapter.adapt(block.getLocation()))) {
@@ -592,6 +573,11 @@ public void onExplosionPrime(ExplosionPrimeEvent event) {
592573
event.setCancelled(true);
593574
return;
594575
}
576+
} else if (event instanceof AbstractWindCharge) {
577+
if (wcfg.blockWindChargeExplosions) {
578+
event.setCancelled(true);
579+
return;
580+
}
595581
}
596582
}
597583

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
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;
24+
import org.bukkit.entity.AbstractWindCharge;
2225
import org.bukkit.entity.Allay;
2326
import org.bukkit.entity.Ambient;
2427
import org.bukkit.entity.ArmorStand;
@@ -28,6 +31,8 @@
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,13 @@
4348
import org.bukkit.entity.TNTPrimed;
4449
import org.bukkit.entity.Tameable;
4550
import org.bukkit.entity.Vehicle;
51+
import org.bukkit.entity.Wither;
4652
import org.bukkit.entity.minecart.ExplosiveMinecart;
4753
import org.bukkit.event.entity.CreatureSpawnEvent;
4854
import org.bukkit.inventory.InventoryHolder;
4955
import org.bukkit.projectiles.ProjectileSource;
5056

57+
import javax.annotation.Nonnull;
5158
import javax.annotation.Nullable;
5259

5360
public final class Entities {
@@ -245,4 +252,19 @@ public static boolean isPluginSpawning(CreatureSpawnEvent.SpawnReason spawnReaso
245252
default -> false;
246253
};
247254
}
255+
256+
/**
257+
* Get the explosion flag relevant for an entity type.
258+
* @param entity the entity
259+
* @return the relevant StateFlag or OTHER_EXPLOSION if none is matching
260+
*/
261+
public static @Nonnull StateFlag getExplosionFlag(Entity entity) {
262+
return switch (entity) {
263+
case AbstractWindCharge abstractWindCharge -> Flags.WIND_CHARGE_BURST;
264+
case Firework firework -> Flags.FIREWORK_DAMAGE;
265+
case Fireball fireball -> Flags.GHAST_FIREBALL;
266+
case Wither wither -> Flags.WITHER_DAMAGE;
267+
case null, default -> Flags.OTHER_EXPLOSION;
268+
};
269+
}
248270
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.common.collect.BiMap;
2323
import com.google.common.collect.HashBiMap;
2424
import com.sk89q.worldguard.protection.flags.Flags;
25+
import org.bukkit.Bukkit;
2526
import org.bukkit.Material;
2627
import org.bukkit.Tag;
2728
import org.bukkit.entity.EntityType;

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;

0 commit comments

Comments
 (0)