From 275efd5dfaa47c60ea12e26d67efac82d4961641 Mon Sep 17 00:00:00 2001 From: Dmitry Rendov Date: Mon, 5 Jan 2026 13:59:31 +0100 Subject: [PATCH 1/5] 5 - Fixed LogBlock was being shaded to jar --- pom.xml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index fd6918f..468298d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ me.drendov.xRayMonitor XRayMonitor - 1.1.0 + 1.1.1 jar XRayMonitor Let's fight X-Ray cheat with simple Math! @@ -17,17 +17,18 @@ - org.spigotmc spigot-api 1.21.9-R0.1-SNAPSHOT provided + de.diddiz logblock 1.20.0.0-SNAPSHOT + provided @@ -59,7 +60,7 @@ - + papermc https://repo.papermc.io/repository/maven-public/ @@ -81,6 +82,14 @@ logblock-repo https://www.iani.de/nexus/content/repositories/snapshots/ + + bukkit-repo + http://repo.md-5.net/content/repositories/snapshots/ + + + spigot-repo-new + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + From 86884db1ed24644ed8cb4a4340812e26ff17ed7b Mon Sep 17 00:00:00 2001 From: Dmitry Rendov Date: Mon, 5 Jan 2026 14:00:26 +0100 Subject: [PATCH 2/5] Typo in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b3d292..30f9e17 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Let's fight X-Ray cheat with simple Math! -This simple plugin monitors players' mining activity and detects possible X-Ray cheeting based on statistical analysis. When a player mines significantly more valuable ores (like diamonds, gold, emeralds) compared to common blocks (like stone, coal), the plugin flags them for potential cheating. Thedetection is based on configurable thresholds, allowing server admins to customize sensitivity according to their needs. Used [LogBlock](https://www.spigotmc.org/resources/logblock.67333/) data to analyze mining patterns over time. +This simple plugin monitors players' mining activity and detects possible X-Ray cheeting based on statistical analysis. When a player mines significantly more valuable ores (like diamonds, gold, emeralds) compared to common blocks (like stone, coal), the plugin flags them for potential cheating. The detection is based on configurable thresholds, allowing server admins to customize sensitivity according to their needs. Used [LogBlock](https://www.spigotmc.org/resources/logblock.67333/) data to analyze mining patterns over time. This plugin requires Java 21 or higher and is compatible with Minecraft server versions 1.20.x and above. Also, it supports both Paper and Spigot server implementations. From 6e8c8153b5c5ec407cd2ad115c3537773cdbe1ce Mon Sep 17 00:00:00 2001 From: Dmitry Rendov Date: Mon, 5 Jan 2026 14:04:58 +0100 Subject: [PATCH 3/5] Added deepslate variants and calcite to stone-like blocks --- src/main/java/me/drendov/XRayMonitor/Listeners.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/drendov/XRayMonitor/Listeners.java b/src/main/java/me/drendov/XRayMonitor/Listeners.java index dcdb52f..17f5c93 100644 --- a/src/main/java/me/drendov/XRayMonitor/Listeners.java +++ b/src/main/java/me/drendov/XRayMonitor/Listeners.java @@ -46,6 +46,11 @@ public void run() { int count_diorite = 0; int count_granite = 0; int count_deepslate = 0; + int count_deepslate_bricks = 0; + int count_deepslate_tiles = 0; + int count_polished_deepslate = 0; + int count_chiseled_deepslate = 0; + int count_calcite = 0; int count_blackstone = 0; int diamond_count = 0; @@ -67,8 +72,13 @@ public void run() { count_diorite = Listeners.this.lb.oreLookup(playerName, "diorite", world, hours); count_granite = Listeners.this.lb.oreLookup(playerName, "granite", world, hours); count_deepslate = Listeners.this.lb.oreLookup(playerName, "deepslate", world, hours); + count_deepslate_bricks = Listeners.this.lb.oreLookup(playerName, "deepslate_bricks", world, hours); + count_deepslate_tiles = Listeners.this.lb.oreLookup(playerName, "deepslate_tiles", world, hours); + count_polished_deepslate = Listeners.this.lb.oreLookup(playerName, "polished_deepslate", world, hours); + count_chiseled_deepslate = Listeners.this.lb.oreLookup(playerName, "chiseled_deepslate", world, hours); + count_calcite = Listeners.this.lb.oreLookup(playerName, "calcite", world, hours); count_blackstone = Listeners.this.lb.oreLookup(playerName, "blackstone", world, hours); - count_stones = count_stone + count_andesite + count_diorite + count_granite + count_deepslate + count_blackstone; + count_stones = count_stone + count_andesite + count_diorite + count_granite + count_deepslate + count_deepslate_bricks + count_deepslate_tiles + count_polished_deepslate + count_chiseled_deepslate + count_calcite + count_blackstone; diamond_count = Listeners.this.lb.oreLookup(playerName, "diamond_ore", world, hours); diamond_count += Listeners.this.lb.oreLookup(playerName, "deepslate_diamond_ore", world, hours); From 6554b5fa24cb904c1324ca3b7a015ab41f524300 Mon Sep 17 00:00:00 2001 From: Dmitry Rendov Date: Mon, 5 Jan 2026 14:14:51 +0100 Subject: [PATCH 4/5] 5 - Add more Unit tests before refactoring ore break scenarios. Fixed one issue --- .../me/drendov/XRayMonitor/Listeners.java | 10 +- .../me/drendov/XRayMonitor/ListenersTest.java | 456 ++++++++++++++++++ 2 files changed, 461 insertions(+), 5 deletions(-) create mode 100644 src/test/java/me/drendov/XRayMonitor/ListenersTest.java diff --git a/src/main/java/me/drendov/XRayMonitor/Listeners.java b/src/main/java/me/drendov/XRayMonitor/Listeners.java index 17f5c93..69b5648 100644 --- a/src/main/java/me/drendov/XRayMonitor/Listeners.java +++ b/src/main/java/me/drendov/XRayMonitor/Listeners.java @@ -246,7 +246,7 @@ public void onOreBreak(BlockBreakEvent event) { if ( ((block == Material.COPPER_ORE) || (block == Material.DEEPSLATE_COPPER_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.copper"))) { for (Player staff : this.plugin.getServer().getOnlinePlayers()) { if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined an iron ore."); + staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a copper ore."); } } } @@ -285,10 +285,10 @@ public void onOreBreak(BlockBreakEvent event) { } } } - if ((block == Material.ANCIENT_DEBRIS) && (this.plugin.getConfig().getBoolean("logOreBreaks.ancient_debris"))) { + if ((block == Material.ANCIENT_DEBRIS) && (this.plugin.getConfig().getBoolean("logOreBreaks.ancient"))) { for (Player staff : this.plugin.getServer().getOnlinePlayers()) { if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a ancient_debris ore."); + staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined an ancient debris."); } } } @@ -306,10 +306,10 @@ public void onOreBreak(BlockBreakEvent event) { } } } - if ((block == Material.SPAWNER) && (this.plugin.getConfig().getBoolean("logOreBreaks.spawners"))) { + if ((block == Material.SPAWNER) && (this.plugin.getConfig().getBoolean("logOreBreaks.spawner"))) { for (Player staff : this.plugin.getServer().getOnlinePlayers()) { if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a monster spawner."); + staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a spawner."); } } } diff --git a/src/test/java/me/drendov/XRayMonitor/ListenersTest.java b/src/test/java/me/drendov/XRayMonitor/ListenersTest.java new file mode 100644 index 0000000..d7b9af7 --- /dev/null +++ b/src/test/java/me/drendov/XRayMonitor/ListenersTest.java @@ -0,0 +1,456 @@ +package me.drendov.XRayMonitor; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.block.Block; +import org.bukkit.Server; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.Collection; + +import static org.mockito.ArgumentMatchers.contains; +import static org.mockito.Mockito.*; + +@DisplayName("Listeners onOreBreak Tests") +class ListenersTest { + + @Mock + private XRayMonitor mockPlugin; + + @Mock + private Server mockServer; + + @Mock + private org.bukkit.configuration.file.FileConfiguration mockConfig; + + private Listeners listeners; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + + // Mock the singleton + try (MockedStatic mockedXray = mockStatic(XRayMonitor.class)) { + mockedXray.when(XRayMonitor::getInstance).thenReturn(mockPlugin); + listeners = new Listeners(); + } + + // Set up plugin instance + when(mockPlugin.getServer()).thenReturn(mockServer); + when(mockPlugin.getConfig()).thenReturn(mockConfig); + } + + private BlockBreakEvent createBlockBreakEvent(String playerName, Material blockType) { + Player mockPlayer = mock(Player.class); + when(mockPlayer.getName()).thenReturn(playerName); + + Block mockBlock = mock(Block.class); + when(mockBlock.getType()).thenReturn(blockType); + + BlockBreakEvent event = mock(BlockBreakEvent.class); + when(event.getPlayer()).thenReturn(mockPlayer); + when(event.getBlock()).thenReturn(mockBlock); + + return event; + } + + private Player createStaffPlayer(boolean hasPermission) { + Player staffPlayer = mock(Player.class); + when(staffPlayer.hasPermission("xcheck.receive")).thenReturn(hasPermission); + return staffPlayer; + } + + @SuppressWarnings("unchecked") + private void mockOnlinePlayers(Collection players) { + doReturn(players).when(mockServer).getOnlinePlayers(); + } + + @Test + @DisplayName("Should return early for non-ore blocks") + void testNonOreBlockReturnsEarly() { + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DIRT); + + listeners.onOreBreak(event); + + // Verify no interaction with server + verify(mockServer, never()).getOnlinePlayers(); + } + + @Test + @DisplayName("Should notify staff when iron ore is broken and config enabled") + void testIronOreBrokenWithConfigEnabled() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.iron")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.IRON_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("iron ore")); + } + + @Test + @DisplayName("Should not notify staff when iron ore broken with config disabled") + void testIronOreBrokenWithConfigDisabled() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.iron")).thenReturn(false); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.IRON_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer, never()).sendMessage(any(String.class)); + } + + @Test + @DisplayName("Should notify staff when deepslate iron ore is broken") + void testDeepslateIronOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.iron")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DEEPSLATE_IRON_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("iron ore")); + } + + @Test + @DisplayName("Should notify staff when copper ore is broken") + void testCopperOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.copper")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.COPPER_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("copper ore")); + } + + @Test + @DisplayName("Should notify staff when coal ore is broken") + void testCoalOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.coal")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.COAL_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("coal ore")); + } + + @Test + @DisplayName("Should notify staff when redstone ore is broken") + void testRedstoneOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.redstone")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.REDSTONE_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("redstone ore")); + } + + @Test + @DisplayName("Should notify staff when gold ore is broken") + void testGoldOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.gold")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.GOLD_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("gold ore")); + } + + @Test + @DisplayName("Should notify staff when nether gold ore is broken") + void testNetherGoldOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.gold")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.NETHER_GOLD_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("gold ore")); + } + + @Test + @DisplayName("Should notify staff when lapis ore is broken") + void testLapisOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.lapis")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.LAPIS_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("lapis ore")); + } + + @Test + @DisplayName("Should notify staff when emerald ore is broken") + void testEmeraldOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.emerald")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.EMERALD_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("emerald ore")); + } + + @Test + @DisplayName("Should notify staff when diamond ore is broken") + void testDiamondOreBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.diamond")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DIAMOND_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("diamond ore")); + } + + @Test + @DisplayName("Should notify staff when ancient debris is broken") + void testAncientDebrisBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.ancient")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.ANCIENT_DEBRIS); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("ancient debris")); + } + + @Test + @DisplayName("Should notify staff when spawner is broken") + void testSpawnerBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.spawner")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.SPAWNER); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("spawner")); + } + + @Test + @DisplayName("Should notify staff when mossy cobblestone is broken") + void testMossyCobbleStoneBroken() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.mossy")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.MOSSY_COBBLESTONE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("mossy cobblestone")); + } + + @Test + @DisplayName("Should not notify players without xcheck.receive permission") + void testNoNotificationWithoutPermission() { + Player unprivilegedPlayer = createStaffPlayer(false); + Collection players = new ArrayList<>(); + players.add(unprivilegedPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.iron")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.IRON_ORE); + listeners.onOreBreak(event); + + verify(unprivilegedPlayer, never()).sendMessage(any(String.class)); + } + + @Test + @DisplayName("Should notify multiple staff members") + void testNotifyMultipleStaffMembers() { + Player staff1 = createStaffPlayer(true); + Player staff2 = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staff1); + players.add(staff2); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.diamond")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DIAMOND_ORE); + listeners.onOreBreak(event); + + verify(staff1).sendMessage(contains("diamond ore")); + verify(staff2).sendMessage(contains("diamond ore")); + } + + @Test + @DisplayName("Should notify deepslate coal ore") + void testDeepslateCoal() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.coal")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DEEPSLATE_COAL_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("coal ore")); + } + + @Test + @DisplayName("Should notify deepslate diamond ore") + void testDeepslateDiamond() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.diamond")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DEEPSLATE_DIAMOND_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("diamond ore")); + } + + @Test + @DisplayName("Should notify deepslate lapis ore") + void testDeepslateLapis() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.lapis")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DEEPSLATE_LAPIS_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("lapis ore")); + } + + @Test + @DisplayName("Should notify deepslate copper ore") + void testDeepslateCopper() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.copper")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DEEPSLATE_COPPER_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("copper ore")); + } + + @Test + @DisplayName("Should notify deepslate redstone ore") + void testDeepslateRedstone() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.redstone")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DEEPSLATE_REDSTONE_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("redstone ore")); + } + + @Test + @DisplayName("Should notify deepslate gold ore") + void testDeepslateGold() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.gold")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DEEPSLATE_GOLD_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("gold ore")); + } + + @Test + @DisplayName("Should notify deepslate emerald ore") + void testDeepslateEmerald() { + Player staffPlayer = createStaffPlayer(true); + Collection players = new ArrayList<>(); + players.add(staffPlayer); + + mockOnlinePlayers(players); + when(mockConfig.getBoolean("logOreBreaks.emerald")).thenReturn(true); + + BlockBreakEvent event = createBlockBreakEvent("TestPlayer", Material.DEEPSLATE_EMERALD_ORE); + listeners.onOreBreak(event); + + verify(staffPlayer).sendMessage(contains("emerald ore")); + } +} From c79a70f1f8672c9d10bd387bff09be8d43940aa6 Mon Sep 17 00:00:00 2001 From: Dmitry Rendov Date: Mon, 5 Jan 2026 14:19:01 +0100 Subject: [PATCH 5/5] 5 - Refactored onOreBreak --- .../me/drendov/XRayMonitor/Listeners.java | 122 ++++++++---------- 1 file changed, 56 insertions(+), 66 deletions(-) diff --git a/src/main/java/me/drendov/XRayMonitor/Listeners.java b/src/main/java/me/drendov/XRayMonitor/Listeners.java index 69b5648..c72a3c7 100644 --- a/src/main/java/me/drendov/XRayMonitor/Listeners.java +++ b/src/main/java/me/drendov/XRayMonitor/Listeners.java @@ -221,10 +221,31 @@ public void run() { } } + private void notifyStaffOfOreBreak(String player, String message) { + for (Player staff : this.plugin.getServer().getOnlinePlayers()) { + if (staff.hasPermission("xcheck.receive")) { + staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + message); + } + } + } + + private void checkAndNotifyOre(Material block, String configKey, String message, + Material... materials) { + if (this.plugin.getConfig().getBoolean(configKey)) { + for (Material material : materials) { + if (block == material) { + notifyStaffOfOreBreak(null, message); + return; + } + } + } + } + @EventHandler public void onOreBreak(BlockBreakEvent event) { String player = event.getPlayer().getName(); Material block = event.getBlock().getType(); + if ((block != Material.DIAMOND_ORE) && (block != Material.DEEPSLATE_DIAMOND_ORE) && (block != Material.IRON_ORE) && (block != Material.DEEPSLATE_IRON_ORE) && (block != Material.COPPER_ORE) && (block != Material.DEEPSLATE_COPPER_ORE) && @@ -236,82 +257,51 @@ public void onOreBreak(BlockBreakEvent event) { (block != Material.ANCIENT_DEBRIS) && (block != Material.SPAWNER) && (block != Material.MOSSY_COBBLESTONE)) { return; } - if ( ((block == Material.IRON_ORE) || (block == Material.DEEPSLATE_IRON_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.iron"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined an iron ore."); - } - } + + // Check each ore type and notify staff + if ((block == Material.IRON_ORE || block == Material.DEEPSLATE_IRON_ORE) && + this.plugin.getConfig().getBoolean("logOreBreaks.iron")) { + notifyStaffOfOreBreak(player, player + " has just mined an iron ore."); } - if ( ((block == Material.COPPER_ORE) || (block == Material.DEEPSLATE_COPPER_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.copper"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a copper ore."); - } - } + if ((block == Material.COPPER_ORE || block == Material.DEEPSLATE_COPPER_ORE) && + this.plugin.getConfig().getBoolean("logOreBreaks.copper")) { + notifyStaffOfOreBreak(player, player + " has just mined a copper ore."); } - if ( ((block == Material.COAL_ORE) || (block == Material.DEEPSLATE_COAL_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.coal"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a coal ore."); - } - } + if ((block == Material.COAL_ORE || block == Material.DEEPSLATE_COAL_ORE) && + this.plugin.getConfig().getBoolean("logOreBreaks.coal")) { + notifyStaffOfOreBreak(player, player + " has just mined a coal ore."); } - if ( ((block == Material.REDSTONE_ORE) || (block == Material.DEEPSLATE_REDSTONE_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.redstone"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a redstone ore."); - } - } + if ((block == Material.REDSTONE_ORE || block == Material.DEEPSLATE_REDSTONE_ORE) && + this.plugin.getConfig().getBoolean("logOreBreaks.redstone")) { + notifyStaffOfOreBreak(player, player + " has just mined a redstone ore."); } - if ( ((block == Material.GOLD_ORE) || (block == Material.DEEPSLATE_GOLD_ORE) || (block == Material.NETHER_GOLD_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.gold"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a gold ore."); - } - } + if ((block == Material.GOLD_ORE || block == Material.DEEPSLATE_GOLD_ORE || block == Material.NETHER_GOLD_ORE) && + this.plugin.getConfig().getBoolean("logOreBreaks.gold")) { + notifyStaffOfOreBreak(player, player + " has just mined a gold ore."); } - if ( ((block == Material.LAPIS_ORE) || (block == Material.DEEPSLATE_LAPIS_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.lapis"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a lapis ore."); - } - } + if ((block == Material.LAPIS_ORE || block == Material.DEEPSLATE_LAPIS_ORE) && + this.plugin.getConfig().getBoolean("logOreBreaks.lapis")) { + notifyStaffOfOreBreak(player, player + " has just mined a lapis ore."); } - if ( ((block == Material.EMERALD_ORE) || (block == Material.DEEPSLATE_EMERALD_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.emerald"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a emerald ore."); - } - } + if ((block == Material.EMERALD_ORE || block == Material.DEEPSLATE_EMERALD_ORE) && + this.plugin.getConfig().getBoolean("logOreBreaks.emerald")) { + notifyStaffOfOreBreak(player, player + " has just mined a emerald ore."); } - if ((block == Material.ANCIENT_DEBRIS) && (this.plugin.getConfig().getBoolean("logOreBreaks.ancient"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined an ancient debris."); - } - } + if (block == Material.ANCIENT_DEBRIS && + this.plugin.getConfig().getBoolean("logOreBreaks.ancient")) { + notifyStaffOfOreBreak(player, player + " has just mined an ancient debris."); } - if ( ((block == Material.DIAMOND_ORE) || (block == Material.DEEPSLATE_DIAMOND_ORE)) && (this.plugin.getConfig().getBoolean("logOreBreaks.diamond"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a diamond ore."); - } - } + if ((block == Material.DIAMOND_ORE || block == Material.DEEPSLATE_DIAMOND_ORE) && + this.plugin.getConfig().getBoolean("logOreBreaks.diamond")) { + notifyStaffOfOreBreak(player, player + " has just mined a diamond ore."); } - if ((block == Material.MOSSY_COBBLESTONE) && (this.plugin.getConfig().getBoolean("logOreBreaks.mossy"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a mossy cobblestone block."); - } - } + if (block == Material.MOSSY_COBBLESTONE && + this.plugin.getConfig().getBoolean("logOreBreaks.mossy")) { + notifyStaffOfOreBreak(player, player + " has just mined a mossy cobblestone block."); } - if ((block == Material.SPAWNER) && (this.plugin.getConfig().getBoolean("logOreBreaks.spawner"))) { - for (Player staff : this.plugin.getServer().getOnlinePlayers()) { - if (staff.hasPermission("xcheck.receive")) { - staff.sendMessage(ChatColor.RED + "[XRayMonitor] " + ChatColor.AQUA + player + " has just mined a spawner."); - } - } + if (block == Material.SPAWNER && + this.plugin.getConfig().getBoolean("logOreBreaks.spawner")) { + notifyStaffOfOreBreak(player, player + " has just mined a spawner."); } } }