From 0c9543d63e13fdebe1815ccfedf20cf4a02ba22e Mon Sep 17 00:00:00 2001 From: youpaishidifu <1@ypshidifu.cn> Date: Sun, 18 Oct 2026 18:31:08 +0800 Subject: [PATCH] =?UTF-8?q?33=E6=89=B9=E4=BA=8C=E5=8D=81=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9A=E7=A9=BA=E6=B0=94=E4=BD=8D=E6=91=86?= =?UTF-8?q?=E7=AE=B1applyPhysics=3Dtrue+=E6=9C=AA=E8=BF=9E=E6=88=90?= =?UTF-8?q?=E6=94=B927=E6=A0=BC=E5=9B=9E=E5=A1=AB=E5=89=A9=E4=BD=99?= =?UTF-8?q?=E5=AF=84=E5=9B=9E(=E4=BF=AE=E5=A4=A7=E7=AE=B1=E5=BF=85?= =?UTF-8?q?=E7=82=B8/=E5=BF=85=E9=A1=BB=E6=8C=A8=E7=8E=B0=E6=9C=89?= =?UTF-8?q?=E7=AE=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/Sdf1_login/ChestCarryManager.java | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/src/main/java/Sdf1_login/ChestCarryManager.java b/src/main/java/Sdf1_login/ChestCarryManager.java index d4b7e84..6b6f71a 100644 --- a/src/main/java/Sdf1_login/ChestCarryManager.java +++ b/src/main/java/Sdf1_login/ChestCarryManager.java @@ -512,15 +512,20 @@ public class ChestCarryManager implements Listener { // + applyPhysics=true 触发引擎双箱检测。 // 之前 air.setType(CHEST,false)+update(true,false) 全程跳过物理, // 引擎从不做合并检测 → 主箱永远 27 格(生产服日志实锤)。 - air.setType(org.bukkit.Material.CHEST, false); + // ★ 33批二十一次修正:applyPhysics=true —— setType 时立即通知邻居 placed + // 触发双箱合并检测(十八/二十次失败根因:setType(false) 不传播物理, + // placed.update(true,true) 只从 placed 侧触发,引擎双箱检测需被摆方块 + // 自身也走物理传播才能建 54 格连接——生产服 18:11 实锤双半 LEFT 仍 27 格)。 + air.setType(org.bukkit.Material.CHEST, true); try { org.bukkit.block.data.type.Chest bdP = (org.bukkit.block.data.type.Chest) placed.getBlockData(); org.bukkit.block.data.type.Chest bdA = (org.bukkit.block.data.type.Chest) air.getBlockData(); bdA.setFacing(bdP.getFacing()); - air.setBlockData(bdA); - // ★ 关键:applyPhysics=true 触发引擎双箱合并检测 + // ★ applyPhysics=true:再从 air 侧传播一次物理(双保险) + air.setBlockData(bdA, true); + // ★ 关键:placed/air 双侧 update(true,true) 触发引擎双箱检测 placed.getState().update(true, true); air.getState().update(true, true); } catch (Exception ign) { @@ -597,31 +602,55 @@ public class ChestCarryManager implements Listener { plugin.getLogger().info("[箱子搬运][诊断] 接双箱立即实测 placed=" + placedSize + "格(需" + slotCountFinal + ")"); if (placedSize < 54) { - // 没连成:清双箱 + 全部物品重新打包寄玩家(不残地) - plugin.getLogger().info("[箱子搬运][诊断] 双箱未连 → 清方块 + 全部物品重新打包寄玩家(" + slotCountFinal + " 件)"); - placedFinal.setType(org.bukkit.Material.AIR, false); + // ★ 33批二十一次修正:没连成不再清方块+全量寄玩家(消灭「2个不完整箱子被撤回 + // +散落一地」观感,生产服 18:11 实锤双半 LEFT 仍 27 格 → 清方块+寄 44 件散落)。 + // 改为:placed 保持 27 格回填前 27 件,剩余第 28+ 件打包寄玩家(不残地、不散落)。 + // twin(代码摆的第二只箱)清掉避免残留空箱。 + plugin.getLogger().info("[箱子搬运][诊断] 双箱未连 → 保持27格回填前27件 + 剩余寄玩家(" + slotCountFinal + " 件)"); if (twinFinal != null && twinFinal.getType() != org.bukkit.Material.AIR) { twinFinal.setType(org.bukkit.Material.AIR, false); } org.bukkit.entity.Player placerB = Bukkit.getPlayer(placerUuid); - List allListB = new ArrayList<>(); - for (ItemStack x : items0) { - if (x != null && !x.getType().isAir()) allListB.add(x); - } - if (!allListB.isEmpty()) { - ItemStack[] allArrB = allListB.toArray(new ItemStack[0]); - try { - ItemStack packedB = buildPackedChest(Material.CHEST, "双箱未连回退箱", allArrB); - if (placerB != null && placerB.isOnline()) { - HashMap remB = placerB.getInventory().addItem(packedB); - if (!remB.isEmpty()) remB.values().forEach(x -> placerB.getWorld().dropItemNaturally(placerB.getLocation(), x)); - placerB.sendMessage("§e[箱子搬运] §7双箱未连成(环境不安全),已重新打包 " + allArrB.length + " 件寄给你,请再放一次"); - } else { - placedFinal.getWorld().dropItemNaturally(new Location(placedFinal.getWorld(), placedFinal.getX()+0.5, placedFinal.getY()+1, placedFinal.getZ()+0.5), packedB); + try { + org.bukkit.block.BlockState stFB = placedFinal.getState(); + if (stFB instanceof org.bukkit.block.Container) { + Inventory invFB = ((org.bukkit.block.Container) stFB).getInventory(); + int capFB = invFB.getSize(); + invFB.clear(); + List restList = new ArrayList<>(); + int filledFB = 0; + for (ItemStack x : items0) { + if (x == null || x.getType().isAir()) continue; + if (filledFB < capFB) { + invFB.setItem(filledFB, x); + filledFB++; + } else { + restList.add(x); + } } - } catch (Exception exB) { plugin.getLogger().warning("[箱子搬运] 双箱未连回退异常: " + exB.getMessage()); } + plugin.getLogger().info("[箱子搬运][诊断] 未连成回填 cap=" + capFB + " filled=" + filledFB + " 剩余=" + restList.size()); + if (!restList.isEmpty()) { + ItemStack[] restArr = restList.toArray(new ItemStack[0]); + try { + ItemStack packedB = buildPackedChest(Material.CHEST, "双箱未连剩余箱", restArr); + if (placerB != null && placerB.isOnline()) { + HashMap remB = placerB.getInventory().addItem(packedB); + if (!remB.isEmpty()) remB.values().forEach(remIt -> placerB.getWorld().dropItemNaturally(placerB.getLocation(), remIt)); + placerB.sendMessage("§e[箱子搬运] §7未能连成双箱(需紧挨现有箱子),已回填 " + filledFB + " 件,剩余 " + restArr.length + " 件寄给你"); + } else { + placedFinal.getWorld().dropItemNaturally(new Location(placedFinal.getWorld(), placedFinal.getX()+0.5, placedFinal.getY()+1, placedFinal.getZ()+0.5), packedB); + } + } catch (Exception exB) { plugin.getLogger().warning("[箱子搬运] 未连成剩余打包异常: " + exB.getMessage()); } + } else { + if (placerB != null && placerB.isOnline()) { + placerB.sendMessage("§e[箱子搬运] §7未能连成双箱(需紧挨现有箱子),已回填 " + filledFB + " 件"); + } + } + } + } catch (Exception exF) { + plugin.getLogger().warning("[箱子搬运] 未连成回填异常: " + exF.getMessage()); } - return; // 回退已处理,不再回填 + return; // 已处理,不再走 doBackfillDouble } // ★ 33批十九次修正:双箱已连 → 双半独立 54 格全量回填 // (双半各自 clear + 双半各自 setItem,杜绝原版残留 → 消灭双倍掉落)