From 4599637c366ae1741ed92b040617e2cdef1b1fbd Mon Sep 17 00:00:00 2001 From: ishland Date: Thu, 16 Jan 2025 13:27:44 +0800 Subject: [PATCH] fix: full lithium 0.14.5+ compatibility --- .../LithiumChunkStatusTrackerInvoker.java | 59 +++++++++++++++++++ .../common/compat/package-info.java | 1 + .../common/statuses/ServerAccessible.java | 2 + 3 files changed, 62 insertions(+) create mode 100644 c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/compat/lithium/LithiumChunkStatusTrackerInvoker.java create mode 100644 c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/compat/package-info.java diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/compat/lithium/LithiumChunkStatusTrackerInvoker.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/compat/lithium/LithiumChunkStatusTrackerInvoker.java new file mode 100644 index 00000000..e6a1c51e --- /dev/null +++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/compat/lithium/LithiumChunkStatusTrackerInvoker.java @@ -0,0 +1,59 @@ +package com.ishland.c2me.rewrites.chunksystem.common.compat.lithium; + +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.ChunkPos; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; + +public class LithiumChunkStatusTrackerInvoker { + + private static final Logger LOGGER = LoggerFactory.getLogger(LithiumChunkStatusTrackerInvoker.class); + private static final MethodHandle MH_onChunkInaccessible; + + static { + MethodHandle mh_onChunkInaccessible = null; + + Class clazzChunkStatusTracker; + try { + clazzChunkStatusTracker = Class.forName("net.caffeinemc.mods.lithium.common.world.chunk.ChunkStatusTracker"); + } catch (ClassNotFoundException e) { + if (FabricLoader.getInstance().isModLoaded("lithium")) { + LOGGER.warn("Couldn't find net.caffeinemc.mods.lithium.common.world.chunk.ChunkStatusTracker, yet fabric claims lithium is there. Curious"); + } + clazzChunkStatusTracker = null; + } + if (clazzChunkStatusTracker != null) { + Method methodOnChunkInaccessible; + try { + methodOnChunkInaccessible = clazzChunkStatusTracker.getMethod("onChunkInaccessible", ServerWorld.class, ChunkPos.class); + } catch (NoSuchMethodException e) { + LOGGER.warn("Couldn't find net.caffeinemc.mods.lithium.common.world.chunk.ChunkStatusTracker#onChunkInaccessible(ServerWorld, ChunkPos), yet fabric claims lithium is there. Curious"); + methodOnChunkInaccessible = null; + } + if (methodOnChunkInaccessible != null) { + try { + mh_onChunkInaccessible = MethodHandles.lookup().unreflect(methodOnChunkInaccessible); + } catch (IllegalAccessException e) { + LOGGER.warn("Couldn't access net.caffeinemc.mods.lithium.common.world.chunk.ChunkStatusTracker#onChunkInaccessible(ServerWorld, ChunkPos), yet fabric claims lithium is there. Curious", e); + } + } + } + MH_onChunkInaccessible = mh_onChunkInaccessible; + } + + public static void invokeOnChunkInaccessible(ServerWorld world, ChunkPos pos) { + if (MH_onChunkInaccessible != null) { + try { + MH_onChunkInaccessible.invokeExact(world, pos); + } catch (Throwable e) { + LOGGER.error("net.caffeinemc.mods.lithium.common.world.chunk.ChunkStatusTracker#onChunkInaccessible(ServerWorld, ChunkPos) failed", e); + } + } + } + +} diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/compat/package-info.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/compat/package-info.java new file mode 100644 index 00000000..ebda1033 --- /dev/null +++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/compat/package-info.java @@ -0,0 +1 @@ +package com.ishland.c2me.rewrites.chunksystem.common.compat; \ No newline at end of file diff --git a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ServerAccessible.java b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ServerAccessible.java index 879645cc..4d879b3b 100644 --- a/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ServerAccessible.java +++ b/c2me-rewrites-chunk-system/src/main/java/com/ishland/c2me/rewrites/chunksystem/common/statuses/ServerAccessible.java @@ -8,6 +8,7 @@ import com.ishland.c2me.rewrites.chunksystem.common.ChunkLoadingContext; import com.ishland.c2me.rewrites.chunksystem.common.ChunkState; import com.ishland.c2me.rewrites.chunksystem.common.NewChunkStatus; +import com.ishland.c2me.rewrites.chunksystem.common.compat.lithium.LithiumChunkStatusTrackerInvoker; import com.ishland.c2me.rewrites.chunksystem.common.fapi.LifecycleEventInvoker; import com.ishland.c2me.rewrites.chunksystem.common.threadstate.ChunkTaskWork; import com.ishland.flowsched.scheduler.Cancellable; @@ -90,6 +91,7 @@ public CompletionStage downgradeFromThis(ChunkLoadingContext context, Canc worldChunk.setLevelTypeProvider(null); worldChunk.setUnsavedListener(pos -> { }); + LithiumChunkStatusTrackerInvoker.invokeOnChunkInaccessible(((IThreadedAnvilChunkStorage) context.tacs()).getWorld(), context.holder().getKey()); context.holder().getItem().set(new ChunkState(state.protoChunk(), state.protoChunk(), ChunkStatus.FULL)); }, ((IThreadedAnvilChunkStorage) context.tacs()).getMainThreadExecutor()); }