diff --git a/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java b/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java index 347b4d6..06c5ea0 100644 --- a/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java +++ b/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java @@ -23,13 +23,14 @@ import xyz.etztech.minealert.MineAlert; import java.time.OffsetDateTime; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; public class OreAlertListener implements Listener { private final MineAlert plugin; - private static final HashSet cache = new HashSet<>(); - private static final Map> map = new HashMap<>(); + private static final Set cache = Collections.synchronizedSet(new HashSet<>()); + private static final Map> map = new ConcurrentHashMap<>(); private static final Queue queue = new ConcurrentLinkedQueue<>(); public OreAlertListener(MineAlert plugin) { @@ -43,6 +44,8 @@ public class OreAlertListener implements Listener { @EventHandler public void onBlockBreak(BlockBreakEvent event) { if (cache.contains(event.getBlock().getLocation())) return; + if (!isMaterialTracked(event.getBlock().getType())) return; + queue.add(new BlockEvent(event.getPlayer(), event.getBlock().getType(), event.getBlock().getLocation(), true)); int radius = this.plugin.getConfig().getInt("ore.radius", 3); @@ -51,7 +54,8 @@ public class OreAlertListener implements Listener { for (int z = -radius; z < radius; z++) { if (x == 0 && y == 0 && z == 0) continue; Block block = event.getBlock().getRelative(x, y, z); - if (cache.contains(block.getLocation())) return; + if (cache.contains(block.getLocation())) continue; + if (!isMaterialTracked(block.getType())) continue; queue.add(new BlockEvent(event.getPlayer(), block.getType(), block.getLocation(), false)); } } @@ -80,20 +84,19 @@ public class OreAlertListener implements Listener { if (event != null) { if (cache.contains(event.getLocation())) continue; cache.add(event.getLocation()); - if (isMaterialTracked(event.getMaterial())) { + if (event.isParent()) { addStrike(event); - if (event.isParent()) { - check(event); - } + check(event); } } } } private void addStrike(BlockEvent event) { - List events = map.getOrDefault(event.getPlayer(), new ArrayList<>()); + List events = map.getOrDefault(event.getPlayer().getUniqueId(), new ArrayList<>()); + events.add(event); - map.put(event.getPlayer(), events); + map.put(event.getPlayer().getUniqueId(), events); } private void check(BlockEvent event) { @@ -113,10 +116,10 @@ public class OreAlertListener implements Listener { String.format("ore.blocks.%s.ping", blockKey), "ore.ping" ); - purge(map.getOrDefault(event.getPlayer(), new ArrayList<>()).iterator()); + purge(map.getOrDefault(event.getPlayer().getUniqueId(), new ArrayList<>()).iterator()); int strikes = 0; - for (BlockEvent e : map.getOrDefault(event.getPlayer(), new ArrayList<>())) { + for (BlockEvent e : map.getOrDefault(event.getPlayer().getUniqueId(), new ArrayList<>())) { if (e.isParent() && e.getMaterial().name().equals(event.getMaterial().name())) { strikes++; } @@ -135,10 +138,10 @@ public class OreAlertListener implements Listener { } private void cleanup() { - for (Iterator it = map.keySet().iterator(); it.hasNext(); ) { - Player player = it.next(); - purge(map.get(player).iterator()); - if (map.get(player).isEmpty()) { + for (Iterator it = map.keySet().iterator(); it.hasNext(); ) { + UUID playerUUID = it.next(); + purge(map.get(playerUUID).iterator()); + if (map.get(playerUUID).isEmpty()) { it.remove(); } } @@ -213,11 +216,11 @@ public class OreAlertListener implements Listener { } } - public static HashSet getCache() { + public static Set getCache() { return cache; } - public static Map> getMap() { + public static Map> getMap() { return map; }