Skip to content

Commit dc4e9f8

Browse files
authored
Prevent logging of wind burst explosions and improve BlockExplodeListener (fixes #830)
1 parent c145fca commit dc4e9f8

6 files changed

Lines changed: 83 additions & 11 deletions

File tree

src/main/java/net/coreprotect/bukkit/BukkitAdapter.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.bukkit.entity.EntityType;
2323
import org.bukkit.entity.ItemFrame;
2424
import org.bukkit.entity.LivingEntity;
25+
import org.bukkit.event.Event;
26+
import org.bukkit.event.block.BlockExplodeEvent;
2527
import org.bukkit.event.block.SignChangeEvent;
2628
import org.bukkit.event.inventory.InventoryType;
2729
import org.bukkit.event.player.PlayerInteractEvent;
@@ -316,6 +318,17 @@ public boolean isWaxed(Sign sign) {
316318
return false;
317319
}
318320

321+
@Override
322+
public boolean shouldLogExplosion(Event event){
323+
return true;
324+
}
325+
326+
@Override
327+
public Material getExplodedBlock(BlockExplodeEvent event){
328+
// accoding to the Bukkit docs this will always return air
329+
return event.getBlock().getType();
330+
}
331+
319332
@Override
320333
public void setGlowing(Sign sign, boolean isFront, boolean isGlowing) {
321334
// Base implementation does nothing

src/main/java/net/coreprotect/bukkit/BukkitInterface.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.bukkit.entity.Entity;
1515
import org.bukkit.entity.EntityType;
1616
import org.bukkit.entity.LivingEntity;
17+
import org.bukkit.event.Event;
18+
import org.bukkit.event.block.BlockExplodeEvent;
1719
import org.bukkit.event.block.SignChangeEvent;
1820
import org.bukkit.event.inventory.InventoryType;
1921
import org.bukkit.event.player.PlayerInteractEvent;
@@ -413,6 +415,27 @@ public interface BukkitInterface {
413415
*/
414416
boolean isSignFront(SignChangeEvent event);
415417

418+
419+
420+
/**
421+
* Checks whether an explosion event should be logged or not. (i.e. wind charge explosions)
422+
*
423+
* @param event
424+
* The explosion event (Block or Entity ExplodeEvent)
425+
* @return true if the explosion should affect blocks
426+
*/
427+
boolean shouldLogExplosion(Event event);
428+
429+
430+
/**
431+
* Gets the material of the block that exploded
432+
*
433+
* @param event
434+
* The block explosion event
435+
* @return the material of the block that caused the explosion
436+
*/
437+
Material getExplodedBlock(BlockExplodeEvent event);
438+
416439
// --------------------------------------------------------------------------
417440
// Registry methods
418441
// --------------------------------------------------------------------------

src/main/java/net/coreprotect/bukkit/Bukkit_v1_20.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.bukkit.block.Sign;
1414
import org.bukkit.block.sign.Side;
1515
import org.bukkit.entity.Arrow;
16+
import org.bukkit.event.block.BlockExplodeEvent;
1617
import org.bukkit.event.block.SignChangeEvent;
1718
import org.bukkit.event.player.PlayerInteractEvent;
1819
import org.bukkit.inventory.ItemStack;
@@ -297,4 +298,10 @@ else if (Boolean.FALSE.equals(hasBasePotionType)) {
297298
return super.getArrowMeta(arrow, itemStack);
298299
}
299300
}
301+
302+
@Override
303+
public Material getExplodedBlock(BlockExplodeEvent event){
304+
// accoding to the Bukkit docs this will always return air
305+
return event.getExplodedBlockState().getType();
306+
}
300307
}

src/main/java/net/coreprotect/bukkit/Bukkit_v1_21.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,18 @@
66
import java.util.Set;
77

88
import org.bukkit.Bukkit;
9+
import org.bukkit.ExplosionResult;
910
import org.bukkit.Keyed;
1011
import org.bukkit.Material;
1112
import org.bukkit.NamespacedKey;
1213
import org.bukkit.Tag;
1314
import org.bukkit.entity.EntityType;
15+
import org.bukkit.event.Event;
16+
import org.bukkit.event.block.BlockExplodeEvent;
17+
import org.bukkit.event.entity.EntityExplodeEvent;
1418
import org.bukkit.event.inventory.InventoryType;
1519

20+
1621
import net.coreprotect.model.BlockGroup;
1722

1823
/**
@@ -218,4 +223,18 @@ public Set<Material> shelfMaterials() {
218223

219224
return SHELVES;
220225
}
226+
227+
@Override
228+
public boolean shouldLogExplosion(Event event){
229+
ExplosionResult result = null;
230+
231+
if (event instanceof EntityExplodeEvent){
232+
result = ((EntityExplodeEvent)event).getExplosionResult();
233+
} else if (event instanceof BlockExplodeEvent){
234+
result = ((BlockExplodeEvent)event).getExplosionResult();
235+
}
236+
return !(result == ExplosionResult.KEEP ||
237+
result == ExplosionResult.TRIGGER_BLOCK
238+
);
239+
}
221240
}

src/main/java/net/coreprotect/listener/block/BlockExplodeListener.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,18 +146,25 @@ else if (scanType.hasGravity() && Config.getConfig(world).BLOCK_MOVEMENT) {
146146

147147
@EventHandler(priority = EventPriority.MONITOR)
148148
protected void onBlockExplode(BlockExplodeEvent event) {
149-
Block eventBlock = event.getBlock();
150-
World world = eventBlock.getLocation().getWorld();
151-
String user = "";
152-
if (!eventBlock.getType().equals(Material.AIR) && !eventBlock.getType().equals(Material.CAVE_AIR)) {
153-
user = eventBlock.getType().name().toLowerCase(Locale.ROOT);
154-
}
155-
if (user.contains("tnt")) {
156-
user = "#tnt";
149+
Material eventMaterial = BukkitAdapter.ADAPTER.getExplodedBlock(event);
150+
World world = event.getBlock().getLocation().getWorld();
151+
152+
if (!BukkitAdapter.ADAPTER.shouldLogExplosion(event)){
153+
return;
157154
}
158-
else if (user.contains("end_crystal")) {
159-
user = "#end_crystal";
155+
156+
String user = "";
157+
if (!eventMaterial.equals(Material.AIR) && !eventMaterial.equals(Material.CAVE_AIR)) {
158+
user = eventMaterial.name().toLowerCase(Locale.ROOT);
159+
160+
if (user.contains("respawn_anchor")) {
161+
user = "#respawn_anchor";
162+
}
163+
else if (user.contains("_bed")) {
164+
user = "#bed";
165+
}
160166
}
167+
161168
if (!user.startsWith("#")) {
162169
user = "#explosion";
163170
}

src/main/java/net/coreprotect/listener/entity/EntityExplodeListener.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.coreprotect.listener.entity;
22

3+
import org.bukkit.ExplosionResult;
34
import org.bukkit.World;
45
import org.bukkit.entity.Creeper;
56
import org.bukkit.entity.EnderCrystal;
@@ -15,6 +16,7 @@
1516
import org.bukkit.event.Listener;
1617
import org.bukkit.event.entity.EntityExplodeEvent;
1718

19+
import net.coreprotect.bukkit.BukkitAdapter;
1820
import net.coreprotect.config.Config;
1921
import net.coreprotect.consumer.Queue;
2022
import net.coreprotect.listener.block.BlockExplodeListener;
@@ -24,7 +26,8 @@ public final class EntityExplodeListener extends Queue implements Listener {
2426
@EventHandler(priority = EventPriority.MONITOR)
2527
protected void onEntityExplode(EntityExplodeEvent event) {
2628
Entity entity = event.getEntity();
27-
if (entity.getType().name().equals("WIND_CHARGE") || entity.getType().name().equals("BREEZE_WIND_CHARGE")) {
29+
30+
if (!BukkitAdapter.ADAPTER.shouldLogExplosion(event)){
2831
return;
2932
}
3033

0 commit comments

Comments
 (0)