diff --git a/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java b/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java index abce563187..2cbe51bd27 100644 --- a/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java +++ b/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java @@ -19,7 +19,6 @@ import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.level.ChunkEvent; import net.minecraftforge.event.network.ConnectionStartEvent; import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.event.TickEvent.ServerTickEvent; import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.eventbus.api.listener.Priority; import net.minecraftforge.eventbus.api.listener.SubscribeEvent; @@ -59,16 +58,6 @@ public final class ForgeInternalHandler { return false; } - @SubscribeEvent - static void onServerTick(ServerTickEvent.Pre event) { - WorldWorkerManager.tick(true); - } - - @SubscribeEvent - static void onServerTick(ServerTickEvent.Post event) { - WorldWorkerManager.tick(false); - } - // @SubscribeEvent // static void checkSettings(ClientTickEvent event) { // if (event.phase == Phase.END) diff --git a/src/main/java/net/minecraftforge/common/WorldWorkerManager.java b/src/main/java/net/minecraftforge/common/WorldWorkerManager.java index cd5834cd37..79e804280e 100644 --- a/src/main/java/net/minecraftforge/common/WorldWorkerManager.java +++ b/src/main/java/net/minecraftforge/common/WorldWorkerManager.java @@ -5,73 +5,82 @@ package net.minecraftforge.common; -import java.util.ArrayList; -import java.util.List; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.listener.EventListener; -public class WorldWorkerManager -{ - private static final List workers = new ArrayList<>(); +import java.util.ArrayList; + +public class WorldWorkerManager { + private static final ArrayList workers = new ArrayList<>(); private static long startTime = -1; private static int index = 0; + private static EventListener tickStartListener; + private static EventListener tickEndListener; - public static void tick(boolean start) - { - if (start) - { - startTime = System.currentTimeMillis(); - return; - } + private static void startTick() { + startTime = System.currentTimeMillis(); + } + private static void endTick() { index = 0; IWorker task = getNext(); - if (task == null) + if (task == null) { + clear(); return; + } long time = 50 - (System.currentTimeMillis() - startTime); if (time < 10) time = 10; //If ticks are lagging, give us at least 10ms to do something. time += System.currentTimeMillis(); - while (System.currentTimeMillis() < time && task != null) - { + while (System.currentTimeMillis() < time && task != null) { boolean again = task.doWork(); - if (!task.hasWork()) - { + if (!task.hasWork()) { remove(task); task = getNext(); - } - else if (!again) - { + } else if (!again) { task = getNext(); } } } - public static synchronized void addWorker(IWorker worker) - { - workers.add(worker); + @Deprecated(forRemoval = true, since = "1.21.8") + public static void tick(boolean start) { + if (start) startTick(); + else endTick(); } - private static synchronized IWorker getNext() - { + public static synchronized void addWorker(IWorker worker) { + workers.add(worker); + if (tickStartListener == null) { + tickStartListener = TickEvent.ServerTickEvent.Pre.BUS.addListener(event -> startTick()); + tickEndListener = TickEvent.ServerTickEvent.Post.BUS.addListener(event -> endTick()); + } + } + + private static synchronized IWorker getNext() { return workers.size() > index ? workers.get(index++) : null; } - private static synchronized void remove(IWorker worker) - { + private static synchronized void remove(IWorker worker) { workers.remove(worker); index--; } //Internal only, used to clear everything when the server shuts down. - public static synchronized void clear() - { + public static synchronized void clear() { workers.clear(); + if (tickStartListener != null) { + TickEvent.ServerTickEvent.Pre.BUS.removeListener(tickStartListener); + TickEvent.ServerTickEvent.Post.BUS.removeListener(tickEndListener); + tickStartListener = null; + tickEndListener = null; + } } - public static interface IWorker - { + public interface IWorker { boolean hasWork(); /**