forked from github-mirror/CoreProtect
Fixed duplicate TNT prime events being logged
This commit is contained in:
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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user