From 1ea84fe7d7293445d472cc56994159e1618abb98 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 15 Dec 2025 20:44:00 +0000 Subject: [PATCH] Clear turtle player inventory when syncing Fixes #2332. I *think* what's going on here is: - When we place a block with the turtle, we copy items between the turtle's inventory and the fake player's inventory. We *don't* clear items from the fake player's inventory after placing, as we'll do it next time we use the fake player. - At the start of the next tick, Stack Refill then loops over the fake player's inventory and moves some items around. However, because we just set the items directly (rather than using .copy()), this mutates the items in the turtle's inventory too! To fix this, we just clear the player's inventory after finishing with it, so Stack Refill never sees these items. --- .../dan200/computercraft/shared/turtle/core/TurtlePlayer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java index fd9401aa7..87fad78a3 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/turtle/core/TurtlePlayer.java @@ -129,6 +129,7 @@ public final class TurtlePlayer { // Load up the fake inventory inventory.selected = 0; + inventory.clearContent(); for (var i = 0; i < slots; i++) { inventory.setItem(i, turtleInventory.getItem((currentSlot + i) % slots)); } @@ -154,7 +155,8 @@ public final class TurtlePlayer { TurtleUtil.storeItemOrDrop(turtle, inventory.getItem(i)); } - inventory.setChanged(); + inventory.clearContent(); + turtleInventory.setChanged(); } public boolean isBlockProtected(ServerLevel level, BlockPos pos) {