From c764d5330bdec8f4f3e0e0e8f14f90ccd9550c96 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi <88063803+Suisuroru@users.noreply.github.com> Date: Fri, 2 May 2025 00:24:36 +0800 Subject: [PATCH] Add config to enable tick command (#94) * feat: tick command support * feat: use exp-config to enable tick command --- ...59-Add-config-to-enable-tick-command.patch | 167 ++++++++++++++++++ .../experiment/CommandTickConfig.java.patch | 25 +++ 2 files changed, 192 insertions(+) create mode 100644 luminol-server/minecraft-patches/features/0059-Add-config-to-enable-tick-command.patch create mode 100644 luminol-server/paper-patches/files/src/main/java/me/earthme/luminol/config/modules/experiment/CommandTickConfig.java.patch diff --git a/luminol-server/minecraft-patches/features/0059-Add-config-to-enable-tick-command.patch b/luminol-server/minecraft-patches/features/0059-Add-config-to-enable-tick-command.patch new file mode 100644 index 0000000..f13e308 --- /dev/null +++ b/luminol-server/minecraft-patches/features/0059-Add-config-to-enable-tick-command.patch @@ -0,0 +1,167 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Thu, 1 May 2025 22:43:08 +0800 +Subject: [PATCH] Add config to enable tick command + + +diff --git a/io/papermc/paper/threadedregions/RegionizedServer.java b/io/papermc/paper/threadedregions/RegionizedServer.java +index 1382c695c4991488b113401e231875ddc74f6b01..68280b07a71dcdb42eaee6f62fbda074813a22e4 100644 +--- a/io/papermc/paper/threadedregions/RegionizedServer.java ++++ b/io/papermc/paper/threadedregions/RegionizedServer.java +@@ -286,6 +286,11 @@ public final class RegionizedServer { + this.randomWalk(); + */ + ++this.tickCount; ++ // Luminol start - Add a config to enable tick command ++ if (me.earthme.luminol.config.modules.experiment.CommandTickConfig.enabled) { ++ MinecraftServer.tickRateManager.tick(); ++ } ++ // Luminol end - Add a config to enable tick command + // expire invalid click command callbacks + io.papermc.paper.adventure.providers.ClickCallbackProviderImpl.CALLBACK_MANAGER.handleQueue((int)this.tickCount); + +@@ -308,6 +313,13 @@ public final class RegionizedServer { + this.globalTick(world, tickCount); + } + ++ // Luminol start - Add a config to enable tick command ++ if (me.earthme.luminol.config.modules.experiment.CommandTickConfig.enabled) { ++ MinecraftServer.tickRateManager.reduceSprintTicks(); ++ MinecraftServer.tickRateManager.endTickWork(); ++ } ++ // Luminol end - Add a config to enable tick command ++ + // tick connections + this.tickConnections(); + +@@ -441,7 +453,7 @@ public final class RegionizedServer { + } + + private void tickTime(final ServerLevel world, final int tickCount) { +- if (world.tickTime) { ++ if ((!me.earthme.luminol.config.modules.experiment.CommandTickConfig.enabled || world.tickRateManager().runsNormally()) && world.tickTime) { // Luminol - Add a config to enable tick command + if (world.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { + world.setDayTime(world.levelData.getDayTime() + (long)tickCount); + } +diff --git a/io/papermc/paper/threadedregions/TickRegionScheduler.java b/io/papermc/paper/threadedregions/TickRegionScheduler.java +index 7123b3eb2f2e52946b8ef9de993a6828eb0bb6f7..82948984404a183711588932a4a026dc4c241feb 100644 +--- a/io/papermc/paper/threadedregions/TickRegionScheduler.java ++++ b/io/papermc/paper/threadedregions/TickRegionScheduler.java +@@ -31,8 +31,8 @@ public final class TickRegionScheduler { + } + } + +- public static final int TICK_RATE = 20; +- public static final long TIME_BETWEEN_TICKS = 1_000_000_000L / TICK_RATE; // ns ++ public static float TICK_RATE = 20; // Luminol - Add tick command support ++ public static long TIME_BETWEEN_TICKS = (long) (1_000_000_000L / TICK_RATE); // ns // Luminol - Add tick command support + + // Folia start - watchdog + public static final FoliaWatchdogThread WATCHDOG_THREAD = new FoliaWatchdogThread(); +@@ -375,8 +375,23 @@ public final class TickRegionScheduler { + final long cpuStart = MEASURE_CPU_TIME ? THREAD_MX_BEAN.getCurrentThreadCpuTime() : 0L; + final long tickStart = System.nanoTime(); + +- // use max(), don't assume that tickStart >= scheduledStart +- final int tickCount = Math.max(1, this.tickSchedule.getPeriodsAhead(TIME_BETWEEN_TICKS, tickStart)); ++ // Luminol start - Add a config to enable tick command ++ final int tickCount; ++ if (me.earthme.luminol.config.modules.experiment.CommandTickConfig.enabled) { ++ if (MinecraftServer.tickRateManager.isSprinting() && MinecraftServer.tickRateManager.checkShouldSprintThisTick()) { ++ TICK_RATE = net.minecraft.server.commands.TickCommand.MAX_TICKRATE; ++ TIME_BETWEEN_TICKS = (long) (1_000_000_000L / TICK_RATE); ++ tickCount = 1; ++ } else { ++ TICK_RATE = MinecraftServer.tickRateManager.tickrate(); ++ TIME_BETWEEN_TICKS = (long) (1_000_000_000L / TICK_RATE); ++ tickCount = Math.max(1, this.tickSchedule.getPeriodsAhead(TIME_BETWEEN_TICKS, tickStart)); ++ } ++ } else { ++ // use max(), don't assume that tickStart >= scheduledStart ++ tickCount = Math.max(1, this.tickSchedule.getPeriodsAhead(TIME_BETWEEN_TICKS, tickStart)); ++ } ++ // Luminol end - Add tick command support + + if (!this.tryMarkTicking()) { + if (!this.cancelled.get()) { +@@ -416,6 +431,11 @@ public final class TickRegionScheduler { + try { + // next start isn't updated until the end of this tick + this.tickRegion(tickCount, tickStart, scheduledEnd); ++ // Luminol start - Add a config to enable tick command ++ if (me.earthme.luminol.config.modules.experiment.CommandTickConfig.enabled) { ++ MinecraftServer.tickRateManager.endTickWork(); ++ } ++ // Luminol end - Add a config to enable tick command + } catch (final Throwable thr) { + this.scheduler.regionFailed(this, false, thr); + // regionFailed will schedule a shutdown, so we should avoid letting this region tick further +diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java +index cfb37f2e428605965a37dc1eb83f302fe1bd6299..8f7b28e5688252207ad8ce9f3fb6f9c3b65d1adc 100644 +--- a/net/minecraft/commands/Commands.java ++++ b/net/minecraft/commands/Commands.java +@@ -213,7 +213,11 @@ public class Commands { + //TeamMsgCommand.register(this.dispatcher); // Folia - region threading - TODO later + TeleportCommand.register(this.dispatcher); + TellRawCommand.register(this.dispatcher, context); +- //TickCommand.register(this.dispatcher); // Folia - region threading - TODO later ++ // Luminol start - Add a config to enable tick command ++ if (me.earthme.luminol.config.modules.experiment.CommandTickConfig.enabled) { ++ TickCommand.register(this.dispatcher); // Folia - region threading - TODO later ++ } ++ // Luminol end - Add a config to enable tick command + TimeCommand.register(this.dispatcher); + TitleCommand.register(this.dispatcher, context); + //TriggerCommand.register(this.dispatcher); // Folia - region threading - TODO later +diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java +index 330af9f4de1c72387326816065350e71fe546efe..e62e8b9af7ad3e4454702ac86ad2b27973eba66f 100644 +--- a/net/minecraft/server/MinecraftServer.java ++++ b/net/minecraft/server/MinecraftServer.java +@@ -267,7 +267,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0L) { + this.sprintTickStartTime = System.nanoTime(); +- this.remainingSprintTicks--; ++ // this.remainingSprintTicks--; // Luminol - Add tick command support + return true; + } else { + this.finishTickSprint(); +@@ -113,6 +113,12 @@ public class ServerTickRateManager extends TickRateManager { + } + } + ++ // Luminol start - Add tick command support ++ public void reduceSprintTicks() { ++ this.remainingSprintTicks--; ++ } ++ // Luminol end - Add tick command support ++ + public void endTickWork() { + this.sprintTimeSpend = this.sprintTimeSpend + (System.nanoTime() - this.sprintTickStartTime); + } +diff --git a/net/minecraft/server/commands/TickCommand.java b/net/minecraft/server/commands/TickCommand.java +index 6b6c8ce49eda6806c8288d70848dd143ba2c4703..5d09d2c8bb45cc10b2a13100793249adc7b5a7e9 100644 +--- a/net/minecraft/server/commands/TickCommand.java ++++ b/net/minecraft/server/commands/TickCommand.java +@@ -14,7 +14,7 @@ import net.minecraft.server.ServerTickRateManager; + import net.minecraft.util.TimeUtil; + + public class TickCommand { +- private static final float MAX_TICKRATE = 10000.0F; ++ public static final float MAX_TICKRATE = 10000.0F; // Luminol - Add tick command support + private static final String DEFAULT_TICKRATE = String.valueOf(20); + + public static void register(CommandDispatcher dispatcher) { diff --git a/luminol-server/paper-patches/files/src/main/java/me/earthme/luminol/config/modules/experiment/CommandTickConfig.java.patch b/luminol-server/paper-patches/files/src/main/java/me/earthme/luminol/config/modules/experiment/CommandTickConfig.java.patch new file mode 100644 index 0000000..1df39a4 --- /dev/null +++ b/luminol-server/paper-patches/files/src/main/java/me/earthme/luminol/config/modules/experiment/CommandTickConfig.java.patch @@ -0,0 +1,25 @@ +--- /dev/null ++++ b/src/main/java/me/earthme/luminol/config/modules/experiment/CommandTickConfig.java +@@ -1,0 +_,22 @@ ++package me.earthme.luminol.config.modules.experiment; ++ ++import me.earthme.luminol.config.ConfigInfo; ++import me.earthme.luminol.config.EnumConfigCategory; ++import me.earthme.luminol.config.IConfigModule; ++ ++public class CommandTickConfig implements IConfigModule { ++ @ConfigInfo(baseName = "enabled", comments = ++ """ ++ Allow to use tick command""") ++ public static boolean enabled = false; ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.EXPERIMENT; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "enable_tick_command"; ++ } ++}