From c8ce82c7e5696a40663efd797da240290fca6135 Mon Sep 17 00:00:00 2001 From: ishland Date: Tue, 22 Oct 2024 23:28:36 +0800 Subject: [PATCH] fix: properly capture saving future for vanilla chunk serializer Fixes #371 --- .../MixinThreadedAnvilChunkStorage.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/mixin/serialization_sync/MixinThreadedAnvilChunkStorage.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/mixin/serialization_sync/MixinThreadedAnvilChunkStorage.java index 3a9119264..c929540f3 100644 --- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/mixin/serialization_sync/MixinThreadedAnvilChunkStorage.java +++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/mixin/serialization_sync/MixinThreadedAnvilChunkStorage.java @@ -1,16 +1,19 @@ package com.ishland.c2me.rewrites.chunksystem.mixin.serialization_sync; -import com.ishland.c2me.rewrites.chunksystem.common.NewChunkHolderVanillaInterface; +import com.ishland.c2me.base.mixin.access.IChunkHolder; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.nbt.NbtCompound; import net.minecraft.server.world.ChunkHolder; import net.minecraft.server.world.ServerChunkLoadingManager; -import net.minecraft.world.chunk.Chunk; +import net.minecraft.util.math.ChunkPos; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; @Mixin(ServerChunkLoadingManager.class) public abstract class MixinThreadedAnvilChunkStorage { @@ -18,13 +21,14 @@ public abstract class MixinThreadedAnvilChunkStorage { @Shadow protected abstract @Nullable ChunkHolder getCurrentChunkHolder(long pos); // it is the responsibility of the caller to make sure the chunk is accessible or in a safe state - @ModifyVariable(method = "save(Lnet/minecraft/world/chunk/Chunk;)Z", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/server/world/ServerChunkLoadingManager;setNbt(Lnet/minecraft/util/math/ChunkPos;Ljava/util/function/Supplier;)Ljava/util/concurrent/CompletableFuture;")) - private CompletableFuture submitSavingFuture(CompletableFuture future, Chunk chunk) { - ChunkHolder holder = this.getCurrentChunkHolder(chunk.getPos().toLong()); - if (holder instanceof NewChunkHolderVanillaInterface vif) { - vif.getBackingHolder().submitOp(future); + @WrapOperation(method = "save(Lnet/minecraft/world/chunk/Chunk;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerChunkLoadingManager;setNbt(Lnet/minecraft/util/math/ChunkPos;Ljava/util/function/Supplier;)Ljava/util/concurrent/CompletableFuture;")) + private CompletableFuture submitSavingFuture(ServerChunkLoadingManager instance, ChunkPos chunkPos, Supplier supplier, Operation> original) { + CompletableFuture ret = original.call(instance, chunkPos, supplier); + ChunkHolder holder = this.getCurrentChunkHolder(chunkPos.toLong()); + if (holder != null) { + ((IChunkHolder) holder).invokeCombineSavingFuture(ret); } - return future; + return ret; } }