Fixed duplicate TNT prime events being logged

This commit is contained in:
Intelli committed 2026-04-24 13:15:55 -06:00
1 parent a1458a38be
commit eaae2afaf8
5 files changed
+60 -5

No files matched your search

@@ -17,6 +17,7 @@ import net.coreprotect.listener.block.BlockPlaceListener;
import net.coreprotect.listener.block.BlockSpreadListener;
import net.coreprotect.listener.block.CampfireStartListener;
import net.coreprotect.listener.block.TNTPrimeListener;
import net.coreprotect.listener.block.TNTPrimeUtil;
import net.coreprotect.listener.channel.PluginChannelHandshakeListener;
import net.coreprotect.listener.channel.PluginChannelListener;
import net.coreprotect.listener.entity.CreatureSpawnListener;
@@ -107,11 +108,13 @@ public final class ListenerHandler {
try {
Class.forName("org.bukkit.event.block.TNTPrimeEvent"); // Bukkit 1.20+
pluginManager.registerEvents(new TNTPrimeListener(), plugin);
TNTPrimeUtil.useTNTPrimeEvent = true;
}
catch (Exception e) {
try {
Class.forName("com.destroystokyo.paper.event.block.TNTPrimeEvent"); // Paper 1.16+
pluginManager.registerEvents(new LegacyTNTPrimeListener(), plugin);
TNTPrimeUtil.useTNTPrimeEvent = true;
}
catch (Exception ignored) {
// Ignore registration failures to remain compatible with older servers.
@@ -1,6 +1,8 @@
package net.coreprotect.listener.block;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -15,7 +17,12 @@ public final class BlockBurnListener extends Queue implements Listener {
protected void onBlockBurn(BlockBurnEvent event) {
World world = event.getBlock().getWorld();
if (!event.isCancelled() && Config.getConfig(world).BLOCK_BURN) {
BlockBreakListener.processBlockBreak(null, "#fire", event.getBlock(), true, BlockUtil.NONE);
Block block = event.getBlock();
if (block.getType() == Material.TNT && TNTPrimeUtil.useTNTPrimeEvent) {
return;
}
BlockBreakListener.processBlockBreak(null, "#fire", block, true, BlockUtil.NONE);
}
}
@@ -15,11 +15,17 @@ public final class TNTPrimeListener extends Queue implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
protected void onTNTPrime(TNTPrimeEvent event) {
Block block = event.getBlock();
if (event.isCancelled() || block.getType() != Material.TNT || !Config.getConfig(block.getWorld()).EXPLOSIONS || isAlreadyLogged(event.getCause())) {
boolean explosions = Config.getConfig(block.getWorld()).EXPLOSIONS;
boolean alreadyLogged = isAlreadyLogged(event.getCause());
String user = TNTPrimeUtil.getUser(event.getPrimingEntity());
if (event.isCancelled() || block.getType() != Material.TNT || !explosions || alreadyLogged) {
return;
}
else if (event.getCause() == TNTPrimeEvent.PrimeCause.FIRE) {
user = TNTPrimeUtil.getFireUser(block, user);
}
Queue.queueBlockBreak(TNTPrimeUtil.getUser(event.getPrimingEntity()), block.getState(), Material.TNT, block.getBlockData().getAsString(), 0);
Queue.queueBlockBreak(user, block.getState(), Material.TNT, block.getBlockData().getAsString(), 0);
}
private boolean isAlreadyLogged(TNTPrimeEvent.PrimeCause cause) {
@@ -2,17 +2,50 @@ package net.coreprotect.listener.block;
import java.util.Locale;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.projectiles.ProjectileSource;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.utility.WorldUtils;
public final class TNTPrimeUtil {
public static boolean useTNTPrimeEvent = false;
private TNTPrimeUtil() {
}
public static String getFireUser(Block block, String fallback) {
Block[] blocks = new Block[] {
block,
block.getRelative(BlockFace.UP),
block.getRelative(BlockFace.NORTH),
block.getRelative(BlockFace.SOUTH),
block.getRelative(BlockFace.EAST),
block.getRelative(BlockFace.WEST),
block.getRelative(BlockFace.DOWN)
};
int worldId = WorldUtils.getWorldId(block.getWorld().getName());
for (Block relative : blocks) {
Object[] data = CacheHandler.lookupCache.get(relative.getX() + "." + relative.getY() + "." + relative.getZ() + "." + worldId);
if (data != null && data[1] instanceof String && data[2] instanceof Material && data[1].toString().length() > 0 && !data[1].toString().startsWith("#")) {
Material type = (Material) data[2];
if (type == Material.FIRE || type == Material.SOUL_FIRE || type == Material.AIR || type == Material.CAVE_AIR) {
return data[1].toString();
}
}
}
return fallback;
}
public static String getUser(Entity entity) {
if (entity instanceof Player) {
return ((Player) entity).getName();
@@ -17,11 +17,17 @@ public final class LegacyTNTPrimeListener extends Queue implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
protected void onTNTPrime(TNTPrimeEvent event) {
Block block = event.getBlock();
if (event.isCancelled() || block.getType() != Material.TNT || !Config.getConfig(block.getWorld()).EXPLOSIONS || event.getReason() == TNTPrimeEvent.PrimeReason.EXPLOSION) {
boolean explosions = Config.getConfig(block.getWorld()).EXPLOSIONS;
boolean alreadyLogged = event.getReason() == TNTPrimeEvent.PrimeReason.EXPLOSION;
String user = TNTPrimeUtil.getUser(event.getPrimerEntity());
if (event.isCancelled() || block.getType() != Material.TNT || !explosions || alreadyLogged) {
return;
}
else if (event.getReason() == TNTPrimeEvent.PrimeReason.FIRE) {
user = TNTPrimeUtil.getFireUser(block, user);
}
Queue.queueBlockBreak(TNTPrimeUtil.getUser(event.getPrimerEntity()), block.getState(), Material.TNT, block.getBlockData().getAsString(), 0);
Queue.queueBlockBreak(user, block.getState(), Material.TNT, block.getBlockData().getAsString(), 0);
}
}