Merge 1.18 into 1.19.2

This commit is contained in:
embeddedt 2024-05-30 19:06:39 -04:00
commit e9ffa69412
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
3 changed files with 43 additions and 8 deletions

View File

@ -0,0 +1,24 @@
package org.embeddedt.modernfix.common.mixin.core;
import net.minecraft.Util;
import net.minecraft.server.MinecraftServer;
import org.embeddedt.modernfix.duck.ITimeTrackingServer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(MinecraftServer.class)
public class MinecraftServerMixin implements ITimeTrackingServer {
private long mfix$lastTickStartTime = -1L;
@Override
public long mfix$getLastTickStartTime() {
return mfix$lastTickStartTime;
}
@Inject(method = "runServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;tickServer(Ljava/util/function/BooleanSupplier;)V"))
private void trackTickTime(CallbackInfo ci) {
mfix$lastTickStartTime = Util.getMillis();
}
}

View File

@ -0,0 +1,5 @@
package org.embeddedt.modernfix.duck;
public interface ITimeTrackingServer {
long mfix$getLastTickStartTime();
}

View File

@ -4,9 +4,11 @@ import com.mojang.logging.LogUtils;
import net.minecraft.DefaultUncaughtExceptionHandlerWithName;
import net.minecraft.Util;
import net.minecraft.server.MinecraftServer;
import org.embeddedt.modernfix.duck.ITimeTrackingServer;
import org.slf4j.Logger;
import java.lang.ref.WeakReference;
import java.util.OptionalLong;
public class IntegratedWatchdog extends Thread {
private static final Logger LOGGER = LogUtils.getLogger();
@ -22,23 +24,27 @@ public class IntegratedWatchdog extends Thread {
this.setName("ModernFix integrated server watchdog");
}
private OptionalLong getLastTickStart() {
MinecraftServer server = this.server.get();
if(server == null || !server.isRunning())
return OptionalLong.empty();
return OptionalLong.of(((ITimeTrackingServer)server).mfix$getLastTickStartTime());
}
public void run() {
while(true) {
MinecraftServer server = this.server.get();
if(server == null || !server.isRunning())
OptionalLong lastTickStart = getLastTickStart();
if(!lastTickStart.isPresent()) {
return;
long nextTick = server.getNextTickTime();
}
long curTime = Util.getMillis();
long delta = curTime - nextTick;
long delta = curTime - lastTickStart.getAsLong();
if(delta > MAX_TICK_DELTA) {
LOGGER.error("A single server tick has taken {}, more than {} milliseconds", delta, MAX_TICK_DELTA);
LOGGER.error(ThreadDumper.obtainThreadDump());
nextTick = 0;
curTime = 0;
}
server = null; /* allow GC */
try {
Thread.sleep(nextTick + MAX_TICK_DELTA - curTime);
Thread.sleep(MAX_TICK_DELTA - delta);
} catch(InterruptedException ignored) {
}
}