From df4ef5a55c799f88dd7063b8e19e31eb8d8a53bf Mon Sep 17 00:00:00 2001 From: Yang120231 Date: Mon, 26 Oct 2026 20:02:54 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=9B=E9=80=A0=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E7=A0=B4=E5=9D=8F=E7=B4=A7=E5=87=91=E6=9C=BA=E5=99=A8=E6=97=B6?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E5=B8=A6=E6=95=B0=E6=8D=AE=E7=9A=84=E6=8E=89?= =?UTF-8?q?=E8=90=BD=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为紧凑 C9、F9、L9 补充创造模式破坏入口,在方块实体和集群拆除前调用原有掉落链路,保留机器设置、L9 无限存储域和 F9 外置样板引用。 共享逻辑仅在服务端创造模式执行,避免客户端重复生成及生存模式额外掉落;继续沿用现有掉落规则和内容物拆除逻辑。 新增三项回归测试,验证传递原方块实体、正常采集不重复掉落、客户端不读取或生成掉落。定向测试、完整源码编译及 JAR 构建通过,未进行游戏内实测。 --- .../compact/block/CompactC9Block.java | 6 ++ .../compact/block/CompactF9Block.java | 6 ++ .../compact/block/CompactL9Block.java | 6 ++ .../compact/block/CompactMachineDrops.java | 21 ++++++ .../block/CompactMachineDropsTest.java | 74 +++++++++++++++++++ 5 files changed, 113 insertions(+) create mode 100644 src/main/java/com/sorrowmist/useless/compat/neoecoae/compact/block/CompactMachineDrops.java create mode 100644 src/test/java/com/sorrowmist/useless/compat/neoecoae/compact/block/CompactMachineDropsTest.java diff --git a/src/main/java/com/sorrowmist/useless/compat/neoecoae/compact/block/CompactC9Block.java b/src/main/java/com/sorrowmist/useless/compat/neoecoae/compact/block/CompactC9Block.java index f5a70d6d..a00646e1 100644 --- a/src/main/java/com/sorrowmist/useless/compat/neoecoae/compact/block/CompactC9Block.java +++ b/src/main/java/com/sorrowmist/useless/compat/neoecoae/compact/block/CompactC9Block.java @@ -30,6 +30,12 @@ protected void createBlockStateDefinition(StateDefinition.Builder Block.dropResources(state, level, pos, blockEntity, player, ItemStack.EMPTY)); + drops.verifyNoMoreInteractions(); + verify(level).isClientSide(); + verify(level).getBlockEntity(pos); + verifyNoMoreInteractions(level); + } + } + + @Test + void survivalBreakLeavesDropsToTheNormalHarvestPath() { + Level level = mock(Level.class); + Player player = mock(Player.class); + BlockState state = mock(BlockState.class); + + try (var drops = mockStatic(Block.class)) { + CompactMachineDrops.dropForCreativePlayer(level, BlockPos.ZERO, state, player); + + drops.verifyNoInteractions(); + verify(level).isClientSide(); + verifyNoMoreInteractions(level); + } + } + + @Test + void clientDoesNotReadTheBlockEntityOrSpawnDuplicateDrops() { + Level level = mock(Level.class); + when(level.isClientSide()).thenReturn(true); + Player player = mock(Player.class); + BlockState state = mock(BlockState.class); + + try (var drops = mockStatic(Block.class)) { + CompactMachineDrops.dropForCreativePlayer(level, BlockPos.ZERO, state, player); + + drops.verifyNoInteractions(); + verify(level).isClientSide(); + verifyNoMoreInteractions(level); + verifyNoInteractions(player); + } + } +}