From ea91716272f51c805b2df199773eb7439c5897cd Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 28 Jun 2023 20:05:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BA=86=E9=98=B2?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8A=91=E5=88=B6=E6=97=B6=E5=B4=A9=E6=9C=8D?= =?UTF-8?q?=E7=9A=84=E6=8E=AA=E6=96=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mixin/server/MixinMinecraftServer.java | 34 +++++++++++++++++++ .../MixinChainRestrictedNeighborUpdater.java | 5 ++- src/main/resources/slsaddition.mixins.json | 3 +- 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/github/zly2006/carpetslsaddition/mixin/server/MixinMinecraftServer.java diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/server/MixinMinecraftServer.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/server/MixinMinecraftServer.java new file mode 100644 index 0000000..b1f0210 --- /dev/null +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/server/MixinMinecraftServer.java @@ -0,0 +1,34 @@ +package com.github.zly2006.carpetslsaddition.mixin.server; + +import com.github.zly2006.carpetslsaddition.SLSCarpetSettings; +import net.minecraft.server.MinecraftServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.function.BooleanSupplier; + +@Mixin(MinecraftServer.class) +public abstract class MixinMinecraftServer { + @Redirect(method = "runServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;tick(Ljava/util/function/BooleanSupplier;)V")) + private void redirectTicking(MinecraftServer instance, BooleanSupplier shouldKeepTicking) { + if (SLSCarpetSettings.maxUpdateQueueSize != -1) { + try { + instance.tick(shouldKeepTicking); + } + catch (Throwable throwable) { + if (throwable instanceof OutOfMemoryError oom) { + if (!oom.getMessage().startsWith("Create by Carpet-SLS-Addition")) { + throw throwable; + } + } + else { + throw throwable; + } + } + } + else { + instance.tick(shouldKeepTicking); + } + } +} diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/world/MixinChainRestrictedNeighborUpdater.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/world/MixinChainRestrictedNeighborUpdater.java index 84abb02..d6e1689 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/world/MixinChainRestrictedNeighborUpdater.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/world/MixinChainRestrictedNeighborUpdater.java @@ -18,13 +18,12 @@ public class MixinChainRestrictedNeighborUpdater { @Final private ArrayDeque queue; - @Inject(method = "runQueuedUpdates", at = @At(value = "INVOKE", target = "Ljava/util/List;clear()V", ordinal = 0, shift = At.Shift.BEFORE), cancellable = true) + @Inject(method = "runQueuedUpdates", at = @At(value = "INVOKE", target = "Ljava/util/List;clear()V", ordinal = 0, shift = At.Shift.BEFORE)) public void injectRunQueuedUpdates(CallbackInfo ci) { int maxSize = SLSCarpetSettings.maxUpdateQueueSize; if (maxSize > 0) { if (this.queue.size() > maxSize) { - ci.cancel(); - // throw new OutOfMemoryError("The update queue exceeded the maximum allowed allocation of heap space set by SLS Addition!"); + throw new OutOfMemoryError("Create by Carpet-SLS-Addition: The update queue exceeded the maximum allowed allocation of heap space set by SLS Addition!"); } } } diff --git a/src/main/resources/slsaddition.mixins.json b/src/main/resources/slsaddition.mixins.json index a77e028..8fbe329 100644 --- a/src/main/resources/slsaddition.mixins.json +++ b/src/main/resources/slsaddition.mixins.json @@ -3,7 +3,7 @@ "minVersion": "0.8", "package": "com.github.zly2006.carpetslsaddition.mixin", "compatibilityLevel": "JAVA_17", - "mixins": [ + "server": [ "block.MixinBlock", "carpet.MixinFakePlayer", "carpet.MixinSettingsManager", @@ -32,6 +32,7 @@ "protocol.pcaSyncProtocol.entity.MixinStorageMinecartEntity", "screen.MixinScreenHandler", "screen.MixinSlot", + "server.MixinMinecraftServer", "server.MixinPlayerManager", "world.MixinChainRestrictedNeighborUpdater", "world.MixinSpawnHelper"