From f427cc69b4a28825c16d7e5492946c23f3d112ae Mon Sep 17 00:00:00 2001 From: IllTamer Date: Thu, 12 Feb 2026 23:10:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E4=B8=AD=EF=BC=8CMagicBlock=E8=A2=AB?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E7=9A=84=E5=90=8C=E6=97=B6=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E6=89=8B=E6=8C=81=E7=89=A9=E5=93=81=EF=BC=8C=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E7=9A=84=E6=96=B9=E5=9D=97=E8=A2=AB=E9=98=B2?= =?UTF-8?q?=E5=88=B7=E6=9C=BA=E5=88=B6=E5=88=A0=E9=99=A4=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../magicblock/util/DuplicateBlockDetector.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/github/syferie/magicblock/util/DuplicateBlockDetector.java b/src/main/java/io/github/syferie/magicblock/util/DuplicateBlockDetector.java index a01457b..6f18fb6 100644 --- a/src/main/java/io/github/syferie/magicblock/util/DuplicateBlockDetector.java +++ b/src/main/java/io/github/syferie/magicblock/util/DuplicateBlockDetector.java @@ -49,7 +49,7 @@ public void onPlayerItemHeld(PlayerItemHeldEvent event) { if (blockId != null) { // 异步检测重复方块 plugin.getFoliaLib().getScheduler().runAsync(task -> { - detectAndRemoveDuplicates(player, blockId); + detectAndRemoveDuplicates(player, blockId, event.getNewSlot()); }); } } @@ -68,7 +68,8 @@ public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { if (blockId != null) { // 异步检测重复方块 plugin.getFoliaLib().getScheduler().runAsync(task -> { - detectAndRemoveDuplicates(player, blockId); + // 副手不在Contents内 + detectAndRemoveDuplicates(player, blockId, -1); }); } } @@ -76,8 +77,9 @@ public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { /** * 检测并移除重复的魔法方块 + * @param activeSlot 触发检测的无限方块,此方块不应该被删除 */ - private void detectAndRemoveDuplicates(Player currentPlayer, String blockId) { + private void detectAndRemoveDuplicates(Player currentPlayer, String blockId, int activeSlot) { long startTime = System.nanoTime(); duplicateChecks.incrementAndGet(); @@ -85,7 +87,7 @@ private void detectAndRemoveDuplicates(Player currentPlayer, String blockId) { // 🆕 首先检查使用者自己背包中的重复方块(除了当前手持的) duplicatesRemovedInThisCheck += removeDuplicatesFromCurrentPlayerInventory( - currentPlayer, blockId + currentPlayer, blockId, activeSlot ); // 然后检查其他在线玩家的背包 @@ -164,7 +166,7 @@ private int removeDuplicatesFromInventory(Player player, String targetBlockId, S /** * 从当前玩家背包中移除重复方块(除了当前手持的方块) */ - private int removeDuplicatesFromCurrentPlayerInventory(Player player, String targetBlockId) { + private int removeDuplicatesFromCurrentPlayerInventory(Player player, String targetBlockId, int activeSlot) { int removedCount = 0; ItemStack[] contents = player.getInventory().getContents(); ItemStack mainHandItem = player.getInventory().getItemInMainHand(); @@ -173,6 +175,9 @@ private int removeDuplicatesFromCurrentPlayerInventory(Player player, String tar for (int i = 0; i < contents.length; i++) { ItemStack item = contents[i]; if (item != null && plugin.getBlockManager().isMagicBlock(item)) { + if (i == activeSlot) { + continue; + } // 跳过当前手持的方块(主手和副手) if (item.equals(mainHandItem) || item.equals(offHandItem)) { continue;