From ddc2233a280e9680858047cc016df1baa5e7d2fa Mon Sep 17 00:00:00 2001 From: andriihorpenko Date: Sat, 5 Sep 2026 15:04:32 +0300 Subject: [PATCH] Fix concurrent modification errors when serializing item/fluid storage off-thread --- .../lowdraglib2/misc/FluidStorage.java | 5 +++-- .../lowdraglib2/misc/ItemStackTransfer.java | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/lowdragmc/lowdraglib2/misc/FluidStorage.java b/src/main/java/com/lowdragmc/lowdraglib2/misc/FluidStorage.java index aaa428b8e..f09a42192 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/misc/FluidStorage.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/misc/FluidStorage.java @@ -53,8 +53,9 @@ public FluidStorage copy() { @Override public CompoundTag serializeNBT(@NotNull HolderLookup.Provider provider) { var tag = new CompoundTag(); - if (!fluid.isEmpty()) { - tag.put("fluid", fluid.save(provider)); + var snapshot = fluid.copy(); + if (!snapshot.isEmpty()) { + tag.put("fluid", snapshot.save(provider)); } tag.putInt("capacity", capacity); return tag; diff --git a/src/main/java/com/lowdragmc/lowdraglib2/misc/ItemStackTransfer.java b/src/main/java/com/lowdragmc/lowdraglib2/misc/ItemStackTransfer.java index 8bfade918..c0d210369 100644 --- a/src/main/java/com/lowdragmc/lowdraglib2/misc/ItemStackTransfer.java +++ b/src/main/java/com/lowdragmc/lowdraglib2/misc/ItemStackTransfer.java @@ -4,7 +4,10 @@ import com.lowdragmc.lowdraglib2.syncdata.IContentChangeAware; import lombok.Getter; import lombok.Setter; +import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.ItemStackHandler; @@ -53,6 +56,23 @@ protected void onContentsChanged(int slot) { onContentsChanged.run(); } + @Override + public CompoundTag serializeNBT(HolderLookup.Provider provider) { + var snapshot = stacks; + var list = new ListTag(); + for (int i = 0; i < snapshot.size(); i++) { + var stack = snapshot.get(i).copy(); + if (stack.isEmpty()) continue; + var itemTag = new CompoundTag(); + itemTag.putInt("Slot", i); + list.add(stack.save(provider, itemTag)); + } + var tag = new CompoundTag(); + tag.put("Items", list); + tag.putInt("Size", snapshot.size()); + return tag; + } + public ItemStackTransfer copy() { var copiedStack = NonNullList.withSize(stacks.size(), ItemStack.EMPTY); for (int i = 0; i < stacks.size(); i++) {