From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Mon, 1 Nov 2077 00:00:00 +0800 Subject: [PATCH] TT20 Lag compensation Original license: AGPL-3.0 Original project: https://github.com/snackbag/TT20 diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 9dce5c34f67799285ee395a9c5d0db5ee6319536..6b9b3d366343a0bef76036b2b150691787f93db6 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1627,6 +1627,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 ? newTicks : 1; + else return newTicks; + } + + public static int tt20(int ticks, boolean limitZero) { + int newTicks = (int) Math.ceil(rawTT20(ticks)); + + if (limitZero) return newTicks > 0 ? newTicks : 1; + else return newTicks; + } + + public static double tt20(double ticks, boolean limitZero) { + double newTicks = rawTT20(ticks); + + if (limitZero) return newTicks > 0 ? newTicks : 1; + else return newTicks; + } + + public static double rawTT20(double ticks) { + return ticks == 0 ? 0 : ticks * TPSCalculator.getMostAccurateTPS() / TPSCalculator.MAX_TPS; + } + + public static class TPSCalculator { + public static Long lastTick; + public static Long currentTick; + private static double allMissedTicks = 0; + private static final List tpsHistory = Collections.synchronizedList(new DoubleArrayList()); + private static final int historyLimit = 40; + + public static final int MAX_TPS = 20; + public static final int FULL_TICK = 50; + + private TPSCalculator() {} + + public static void onTick() { + if (currentTick != null) { + lastTick = currentTick; + } + + currentTick = System.currentTimeMillis(); + addToHistory(getTPS()); + clearMissedTicks(); + missedTick(); + } + + private static void addToHistory(double tps) { + if (tpsHistory.size() >= historyLimit) { + tpsHistory.removeFirst(); + } + + tpsHistory.add(tps); + } + + public static long getMSPT() { + return currentTick - lastTick; + } + + public static double getAverageTPS() { + double sum = 0.0; + for (double value : tpsHistory) { + sum += value; + } + return tpsHistory.isEmpty() ? 0.1 : sum / tpsHistory.size(); + } + + public static double getTPS() { + if (lastTick == null) return -1; + if (getMSPT() <= 0) return 0.1; + + double tps = 1000 / (double) getMSPT(); + return tps > MAX_TPS ? MAX_TPS : tps; + } + + public static void missedTick() { + if (lastTick == null) return; + + long mspt = getMSPT() <= 0 ? 50 : getMSPT(); + double missedTicks = (mspt / (double) FULL_TICK) - 1; + allMissedTicks += missedTicks <= 0 ? 0 : missedTicks; + } + + public static double getMostAccurateTPS() { + return Math.min(getTPS(), getAverageTPS()); + } + + public double getAllMissedTicks() { + return allMissedTicks; + } + + public static int applicableMissedTicks() { + return (int) Math.floor(allMissedTicks); + } + + public static void clearMissedTicks() { + allMissedTicks -= applicableMissedTicks(); + } + + public void resetMissedTicks() { + allMissedTicks = 0; + } + } +} \ No newline at end of file