From da68e9a162645c90e0ae816f178f25819b81652f Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sun, 10 Sep 2023 19:01:57 -0400 Subject: Add SchedulerTest --- .../skyblocker/utils/scheduler/Scheduler.java | 6 +- .../skyblocker/utils/scheduler/SchedulerTest.java | 90 ++++++++++++++++++++++ 2 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java index 76112e0d..cf285316 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java @@ -51,7 +51,7 @@ public class Scheduler { if (period <= 0) { LOGGER.error("Attempted to schedule a cyclic task with period lower than 1"); } else { - new CyclicTask(task, period).run(); + schedule(new CyclicTask(this, task, period), 0); } } @@ -95,10 +95,10 @@ public class Scheduler { * @param inner the task to run * @param period the period in ticks */ - protected record CyclicTask(Runnable inner, int period) implements Runnable { + protected record CyclicTask(Scheduler scheduler, Runnable inner, int period) implements Runnable { @Override public void run() { - SkyblockerMod.getInstance().scheduler.schedule(this, period); + scheduler.schedule(this, period); inner.run(); } } diff --git a/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java b/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java new file mode 100644 index 00000000..93cd7720 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java @@ -0,0 +1,90 @@ +package me.xmrvizzy.skyblocker.utils.scheduler; + +import org.apache.commons.lang3.mutable.MutableInt; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class SchedulerTest { + @SuppressWarnings("deprecation") + private final Scheduler scheduler = new Scheduler(); + private final MutableInt currentTick = new MutableInt(0); + private final MutableInt cycleCount1 = new MutableInt(1); + private final MutableInt cycleCount2 = new MutableInt(0); + private final MutableInt cycleCount3 = new MutableInt(0); + private final MutableInt cycleCount4 = new MutableInt(0); + private final MutableInt cycleCount5 = new MutableInt(0); + private final MutableInt cycleCount6 = new MutableInt(0); + private final MutableInt cycleCount7 = new MutableInt(0); + private final MutableInt cycleCount8 = new MutableInt(0); + + @Test + public void testSchedule() { + scheduler.schedule(() -> Assertions.assertEquals(1, currentTick.intValue()), 0); + scheduler.schedule(() -> Assertions.assertEquals(1, currentTick.intValue()), 1); + scheduler.schedule(() -> Assertions.assertEquals(2, currentTick.intValue()), 2); + scheduler.schedule(() -> Assertions.assertEquals(10, currentTick.intValue()), 10); + scheduler.schedule(() -> Assertions.assertEquals(20, currentTick.intValue()), 20); + scheduler.schedule(() -> Assertions.assertEquals(50, currentTick.intValue()), 50); + scheduler.schedule(() -> Assertions.assertEquals(100, currentTick.intValue()), 100); + scheduler.schedule(() -> Assertions.assertEquals(123, currentTick.intValue()), 123); + scheduler.scheduleCyclic(() -> {}, 1); + scheduler.scheduleCyclic(() -> {}, 1); + scheduler.scheduleCyclic(() -> {}, 1); + scheduler.scheduleCyclic(() -> {}, 1); + scheduler.scheduleCyclic(() -> { + Assertions.assertEquals(cycleCount1.intValue(), currentTick.intValue()); + cycleCount1.increment(); + }, 1); + scheduler.scheduleCyclic(() -> { + Assertions.assertEquals(1, currentTick.intValue() % 10); + Assertions.assertEquals(cycleCount2.intValue(), currentTick.intValue() / 10); + cycleCount2.increment(); + }, 10); + scheduler.scheduleCyclic(() -> { + Assertions.assertEquals(1, currentTick.intValue() % 55); + Assertions.assertEquals(cycleCount3.intValue(), currentTick.intValue() / 55); + cycleCount3.increment(); + }, 55); + scheduler.schedule(() -> scheduler.scheduleCyclic(() -> { + Assertions.assertEquals(7, currentTick.intValue() % 10); + Assertions.assertEquals(cycleCount4.intValue(), currentTick.intValue() / 10); + cycleCount4.increment(); + }, 10), 7); + scheduler.schedule(() -> scheduler.scheduleCyclic(() -> { + Assertions.assertEquals(1, currentTick.intValue() % 75); + Assertions.assertEquals(cycleCount5.intValue(), currentTick.intValue() / 75); + cycleCount5.increment(); + }, 75), 0); + scheduler.schedule(() -> scheduler.scheduleCyclic(() -> { + Assertions.assertEquals(1, currentTick.intValue() % 99); + Assertions.assertEquals(cycleCount6.intValue(), currentTick.intValue() / 99); + cycleCount6.increment(); + }, 99), 1); + scheduler.scheduleCyclic(() -> scheduler.schedule(() -> { + Assertions.assertEquals(6, currentTick.intValue() % 10); + Assertions.assertEquals(cycleCount7.intValue(), currentTick.intValue() / 10); + cycleCount7.increment(); + }, 5), 10); + scheduler.scheduleCyclic(() -> scheduler.schedule(() -> { + Assertions.assertEquals(11, currentTick.intValue() % 55); + Assertions.assertEquals(cycleCount8.intValue(), currentTick.intValue() / 55); + cycleCount8.increment(); + }, 10), 55); + while (currentTick.intValue() < 10_000_000) { + tick(); + } + Assertions.assertEquals(10000001, cycleCount1.intValue()); + Assertions.assertEquals(1000000, cycleCount2.intValue()); + Assertions.assertEquals(181819, cycleCount3.intValue()); + Assertions.assertEquals(1000000, cycleCount4.intValue()); + Assertions.assertEquals(133334, cycleCount5.intValue()); + Assertions.assertEquals(101011, cycleCount6.intValue()); + Assertions.assertEquals(1000000, cycleCount7.intValue()); + Assertions.assertEquals(181818, cycleCount8.intValue()); + } + + private void tick() { + currentTick.increment(); + scheduler.tick(); + } +} -- cgit From 659b73aefd8d9f5d7e60c4d222b7934121703df1 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sun, 10 Sep 2023 20:53:07 -0400 Subject: Remove ScheduledTask allocations --- .../skyblocker/utils/scheduler/Scheduler.java | 37 ++++++++++++++-------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java index cf285316..3f578899 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java @@ -37,8 +37,7 @@ public class Scheduler { if (delay < 0) { LOGGER.warn("Scheduled a task with negative delay"); } - ScheduledTask tmp = new ScheduledTask(task, currentTick + delay); - tasks.add(tmp); + tasks.add(new ScheduledTask(task, currentTick + delay)); } /** @@ -51,7 +50,7 @@ public class Scheduler { if (period <= 0) { LOGGER.error("Attempted to schedule a cyclic task with period lower than 1"); } else { - schedule(new CyclicTask(this, task, period), 0); + tasks.add(new CyclicTask(this, task, period)); } } @@ -75,6 +74,7 @@ public class Scheduler { ScheduledTask task; while ((task = tasks.peek()) != null && task.schedule <= currentTick && runTask(task)) { tasks.poll(); + if (task instanceof CyclicTask) tasks.add(task); } } @@ -91,25 +91,36 @@ public class Scheduler { /** * A task that runs every period ticks. More specifically, this task reschedules itself to run again after period ticks every time it runs. - * - * @param inner the task to run - * @param period the period in ticks */ - protected record CyclicTask(Scheduler scheduler, Runnable inner, int period) implements Runnable { + protected static class CyclicTask extends ScheduledTask { + private final Scheduler scheduler; + private final int period; + + CyclicTask(Scheduler scheduler, Runnable inner, int period) { + super(inner, scheduler.currentTick); + this.scheduler = scheduler; + this.period = period; + } + @Override public void run() { - scheduler.schedule(this, period); - inner.run(); + super.run(); + schedule = scheduler.currentTick + period; } } /** * A task that runs at a specific tick, relative to {@link #currentTick}. - * - * @param inner the task to run - * @param schedule the tick to run at */ - protected record ScheduledTask(Runnable inner, int schedule) implements Comparable, Runnable { + protected static class ScheduledTask implements Comparable, Runnable { + private final Runnable inner; + protected int schedule; + + public ScheduledTask(Runnable inner, int schedule) { + this.inner = inner; + this.schedule = schedule; + } + @Override public int compareTo(ScheduledTask o) { return schedule - o.schedule; -- cgit From b81599c5f82e347b7709d538376fc895d77ba501 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sun, 10 Sep 2023 22:23:56 -0400 Subject: Use AVLTreeMap --- .../skyblocker/utils/scheduler/Scheduler.java | 54 ++++++++++++++-------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java index 3f578899..1d61edd3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java @@ -1,6 +1,10 @@ package me.xmrvizzy.skyblocker.utils.scheduler; import com.mojang.brigadier.Command; +import it.unimi.dsi.fastutil.ints.AbstractInt2ObjectSortedMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectRBTreeMap; import me.xmrvizzy.skyblocker.SkyblockerMod; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.MinecraftClient; @@ -8,7 +12,8 @@ import net.minecraft.client.gui.screen.Screen; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.PriorityQueue; +import java.util.ArrayList; +import java.util.List; import java.util.function.Supplier; /** @@ -17,7 +22,7 @@ import java.util.function.Supplier; public class Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); private int currentTick = 0; - private final PriorityQueue tasks = new PriorityQueue<>(); + private final AbstractInt2ObjectSortedMap> tasks = new Int2ObjectAVLTreeMap<>(); /** * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. @@ -37,7 +42,7 @@ public class Scheduler { if (delay < 0) { LOGGER.warn("Scheduled a task with negative delay"); } - tasks.add(new ScheduledTask(task, currentTick + delay)); + tasks.computeIfAbsent(currentTick + delay, key -> new ArrayList<>()).add(new ScheduledTask(task)); } /** @@ -50,7 +55,7 @@ public class Scheduler { if (period <= 0) { LOGGER.error("Attempted to schedule a cyclic task with period lower than 1"); } else { - tasks.add(new CyclicTask(this, task, period)); + tasks.computeIfAbsent(currentTick, key -> new ArrayList<>()).add(new CyclicTask(this, task, period)); } } @@ -71,10 +76,26 @@ public class Scheduler { public void tick() { currentTick += 1; - ScheduledTask task; - while ((task = tasks.peek()) != null && task.schedule <= currentTick && runTask(task)) { - tasks.poll(); - if (task instanceof CyclicTask) tasks.add(task); + if (tasks.containsKey(currentTick - 1)) { + List currentTickTasks = tasks.get(currentTick - 1); + for (int i = 0; i < currentTickTasks.size(); i++) { + ScheduledTask task = currentTickTasks.get(i); + if (!runTask(task)) { + tasks.computeIfAbsent(currentTick + 1, key -> new ArrayList<>()).add(task); + } + } + tasks.remove(currentTick - 1); + } + + if (tasks.containsKey(currentTick)) { + List currentTickTasks = tasks.get(currentTick); + for (int i = 0; i < currentTickTasks.size(); i++) { + ScheduledTask task = currentTickTasks.get(i); + if (!runTask(task)) { + tasks.computeIfAbsent(currentTick + 1, key -> new ArrayList<>()).add(task); + } + } + tasks.remove(currentTick); } } @@ -92,12 +113,12 @@ public class Scheduler { /** * A task that runs every period ticks. More specifically, this task reschedules itself to run again after period ticks every time it runs. */ - protected static class CyclicTask extends ScheduledTask { + protected class CyclicTask extends ScheduledTask { private final Scheduler scheduler; private final int period; CyclicTask(Scheduler scheduler, Runnable inner, int period) { - super(inner, scheduler.currentTick); + super(inner); this.scheduler = scheduler; this.period = period; } @@ -105,25 +126,18 @@ public class Scheduler { @Override public void run() { super.run(); - schedule = scheduler.currentTick + period; + tasks.computeIfAbsent(scheduler.currentTick + period, key -> new ArrayList<>()).add(this); } } /** * A task that runs at a specific tick, relative to {@link #currentTick}. */ - protected static class ScheduledTask implements Comparable, Runnable { + protected static class ScheduledTask implements Runnable { private final Runnable inner; - protected int schedule; - public ScheduledTask(Runnable inner, int schedule) { + public ScheduledTask(Runnable inner) { this.inner = inner; - this.schedule = schedule; - } - - @Override - public int compareTo(ScheduledTask o) { - return schedule - o.schedule; } @Override -- cgit From 44904d03f992b46b96ecc7283d054e7b92b7fe50 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sun, 10 Sep 2023 23:35:26 -0400 Subject: Optimize Scheduler --- .../xmrvizzy/skyblocker/utils/scheduler/Scheduler.java | 18 +++--------------- .../skyblocker/utils/scheduler/SchedulerTest.java | 18 +++++++++--------- 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java index 1d61edd3..1bc8829b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java @@ -2,9 +2,7 @@ package me.xmrvizzy.skyblocker.utils.scheduler; import com.mojang.brigadier.Command; import it.unimi.dsi.fastutil.ints.AbstractInt2ObjectSortedMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap; import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectRBTreeMap; import me.xmrvizzy.skyblocker.SkyblockerMod; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.MinecraftClient; @@ -22,7 +20,7 @@ import java.util.function.Supplier; public class Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); private int currentTick = 0; - private final AbstractInt2ObjectSortedMap> tasks = new Int2ObjectAVLTreeMap<>(); + private final AbstractInt2ObjectSortedMap> tasks = new Int2ObjectLinkedOpenHashMap<>(); /** * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. @@ -75,20 +73,9 @@ public class Scheduler { } public void tick() { - currentTick += 1; - if (tasks.containsKey(currentTick - 1)) { - List currentTickTasks = tasks.get(currentTick - 1); - for (int i = 0; i < currentTickTasks.size(); i++) { - ScheduledTask task = currentTickTasks.get(i); - if (!runTask(task)) { - tasks.computeIfAbsent(currentTick + 1, key -> new ArrayList<>()).add(task); - } - } - tasks.remove(currentTick - 1); - } - if (tasks.containsKey(currentTick)) { List currentTickTasks = tasks.get(currentTick); + //noinspection ForLoopReplaceableByForEach (or else we get a ConcurrentModificationException) for (int i = 0; i < currentTickTasks.size(); i++) { ScheduledTask task = currentTickTasks.get(i); if (!runTask(task)) { @@ -97,6 +84,7 @@ public class Scheduler { } tasks.remove(currentTick); } + currentTick += 1; } /** diff --git a/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java b/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java index 93cd7720..3bc12337 100644 --- a/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java +++ b/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java @@ -8,7 +8,7 @@ public class SchedulerTest { @SuppressWarnings("deprecation") private final Scheduler scheduler = new Scheduler(); private final MutableInt currentTick = new MutableInt(0); - private final MutableInt cycleCount1 = new MutableInt(1); + private final MutableInt cycleCount1 = new MutableInt(0); private final MutableInt cycleCount2 = new MutableInt(0); private final MutableInt cycleCount3 = new MutableInt(0); private final MutableInt cycleCount4 = new MutableInt(0); @@ -19,7 +19,7 @@ public class SchedulerTest { @Test public void testSchedule() { - scheduler.schedule(() -> Assertions.assertEquals(1, currentTick.intValue()), 0); + scheduler.schedule(() -> Assertions.assertEquals(0, currentTick.intValue()), 0); scheduler.schedule(() -> Assertions.assertEquals(1, currentTick.intValue()), 1); scheduler.schedule(() -> Assertions.assertEquals(2, currentTick.intValue()), 2); scheduler.schedule(() -> Assertions.assertEquals(10, currentTick.intValue()), 10); @@ -36,12 +36,12 @@ public class SchedulerTest { cycleCount1.increment(); }, 1); scheduler.scheduleCyclic(() -> { - Assertions.assertEquals(1, currentTick.intValue() % 10); + Assertions.assertEquals(0, currentTick.intValue() % 10); Assertions.assertEquals(cycleCount2.intValue(), currentTick.intValue() / 10); cycleCount2.increment(); }, 10); scheduler.scheduleCyclic(() -> { - Assertions.assertEquals(1, currentTick.intValue() % 55); + Assertions.assertEquals(0, currentTick.intValue() % 55); Assertions.assertEquals(cycleCount3.intValue(), currentTick.intValue() / 55); cycleCount3.increment(); }, 55); @@ -51,7 +51,7 @@ public class SchedulerTest { cycleCount4.increment(); }, 10), 7); scheduler.schedule(() -> scheduler.scheduleCyclic(() -> { - Assertions.assertEquals(1, currentTick.intValue() % 75); + Assertions.assertEquals(0, currentTick.intValue() % 75); Assertions.assertEquals(cycleCount5.intValue(), currentTick.intValue() / 75); cycleCount5.increment(); }, 75), 0); @@ -61,19 +61,19 @@ public class SchedulerTest { cycleCount6.increment(); }, 99), 1); scheduler.scheduleCyclic(() -> scheduler.schedule(() -> { - Assertions.assertEquals(6, currentTick.intValue() % 10); + Assertions.assertEquals(5, currentTick.intValue() % 10); Assertions.assertEquals(cycleCount7.intValue(), currentTick.intValue() / 10); cycleCount7.increment(); }, 5), 10); scheduler.scheduleCyclic(() -> scheduler.schedule(() -> { - Assertions.assertEquals(11, currentTick.intValue() % 55); + Assertions.assertEquals(10, currentTick.intValue() % 55); Assertions.assertEquals(cycleCount8.intValue(), currentTick.intValue() / 55); cycleCount8.increment(); }, 10), 55); while (currentTick.intValue() < 10_000_000) { tick(); } - Assertions.assertEquals(10000001, cycleCount1.intValue()); + Assertions.assertEquals(10000000, cycleCount1.intValue()); Assertions.assertEquals(1000000, cycleCount2.intValue()); Assertions.assertEquals(181819, cycleCount3.intValue()); Assertions.assertEquals(1000000, cycleCount4.intValue()); @@ -84,7 +84,7 @@ public class SchedulerTest { } private void tick() { - currentTick.increment(); scheduler.tick(); + currentTick.increment(); } } -- cgit From a99e3f21b31d6b9cfc28d207b4bed51c525dab12 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:06:04 -0400 Subject: Switch to HashMap --- .../skyblocker/utils/scheduler/Scheduler.java | 33 ++++++++++++++-------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java index 1bc8829b..e3b590c7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.utils.scheduler; import com.mojang.brigadier.Command; -import it.unimi.dsi.fastutil.ints.AbstractInt2ObjectSortedMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.AbstractInt2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import me.xmrvizzy.skyblocker.SkyblockerMod; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.MinecraftClient; @@ -20,7 +20,7 @@ import java.util.function.Supplier; public class Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); private int currentTick = 0; - private final AbstractInt2ObjectSortedMap> tasks = new Int2ObjectLinkedOpenHashMap<>(); + private final AbstractInt2ObjectMap> tasks = new Int2ObjectOpenHashMap<>(); /** * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. @@ -37,10 +37,11 @@ public class Scheduler { * @param delay the delay in ticks */ public void schedule(Runnable task, int delay) { - if (delay < 0) { + if (delay >= 0) { + addTask(new ScheduledTask(task), currentTick + delay); + } else { LOGGER.warn("Scheduled a task with negative delay"); } - tasks.computeIfAbsent(currentTick + delay, key -> new ArrayList<>()).add(new ScheduledTask(task)); } /** @@ -50,10 +51,10 @@ public class Scheduler { * @param period the period in ticks */ public void scheduleCyclic(Runnable task, int period) { - if (period <= 0) { - LOGGER.error("Attempted to schedule a cyclic task with period lower than 1"); + if (period > 0) { + addTask(new CyclicTask(task, period), currentTick); } else { - tasks.computeIfAbsent(currentTick, key -> new ArrayList<>()).add(new CyclicTask(this, task, period)); + LOGGER.error("Attempted to schedule a cyclic task with period lower than 1"); } } @@ -98,23 +99,31 @@ public class Scheduler { return true; } + private void addTask(ScheduledTask scheduledTask, int schedule) { + if (tasks.containsKey(schedule)) { + tasks.get(schedule).add(scheduledTask); + } else { + List list = new ArrayList<>(); + list.add(scheduledTask); + tasks.put(schedule, list); + } + } + /** * A task that runs every period ticks. More specifically, this task reschedules itself to run again after period ticks every time it runs. */ protected class CyclicTask extends ScheduledTask { - private final Scheduler scheduler; private final int period; - CyclicTask(Scheduler scheduler, Runnable inner, int period) { + CyclicTask(Runnable inner, int period) { super(inner); - this.scheduler = scheduler; this.period = period; } @Override public void run() { super.run(); - tasks.computeIfAbsent(scheduler.currentTick + period, key -> new ArrayList<>()).add(this); + addTask(this, currentTick + period); } } -- cgit From 059385f9dd070beae77a77bebae34f0ca06b664a Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Mon, 11 Sep 2023 22:57:08 -0400 Subject: Make Scheduler and MessageScheduler singletons --- .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java | 22 +++++------ .../skyblocker/skyblock/QuiverWarning.java | 4 +- .../skyblocker/skyblock/dungeon/DungeonBlaze.java | 4 +- .../skyblocker/skyblock/dungeon/LividColor.java | 6 +-- .../skyblocker/skyblock/dungeon/Reparty.java | 11 +++--- .../skyblock/dungeon/secrets/DungeonSecrets.java | 3 +- .../skyblocker/skyblock/dungeon/secrets/Room.java | 4 +- .../skyblocker/skyblock/item/PriceInfoTooltip.java | 5 +-- .../skyblock/quicknav/QuickNavButton.java | 4 +- .../xmrvizzy/skyblocker/skyblock/rift/TheRift.java | 10 ++--- .../skyblock/rift/TwinClawsIndicator.java | 4 +- .../java/me/xmrvizzy/skyblocker/utils/Utils.java | 4 +- .../utils/render/title/TitleContainer.java | 3 +- .../utils/scheduler/MessageScheduler.java | 7 +++- .../skyblocker/utils/scheduler/Scheduler.java | 13 ++----- .../skyblocker/utils/scheduler/SchedulerTest.java | 44 +++++++++++----------- 16 files changed, 70 insertions(+), 78 deletions(-) diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index cdf78d73..53e57e83 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -45,10 +45,6 @@ public class SkyblockerMod implements ClientModInitializer { public static final Path CONFIG_DIR = FabricLoader.getInstance().getConfigDir().resolve(NAMESPACE); public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static SkyblockerMod INSTANCE; - - @SuppressWarnings("deprecation") - public final Scheduler scheduler = new Scheduler(); - public final MessageScheduler messageScheduler = new MessageScheduler(); public final ContainerSolverManager containerSolverManager = new ContainerSolverManager(); public final StatusBarTracker statusBarTracker = new StatusBarTracker(); @@ -105,13 +101,13 @@ public class SkyblockerMod implements ClientModInitializer { SpecialEffects.init(); containerSolverManager.init(); statusBarTracker.init(); - scheduler.scheduleCyclic(Utils::update, 20); - scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); - scheduler.scheduleCyclic(TicTacToe::tick, 4); - scheduler.scheduleCyclic(LividColor::update, 10); - scheduler.scheduleCyclic(BackpackPreview::tick, 50); - scheduler.scheduleCyclic(DwarvenHud::update, 40); - scheduler.scheduleCyclic(PlayerListMgr::updateList, 20); + Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20); + Scheduler.INSTANCE.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100); + Scheduler.INSTANCE.scheduleCyclic(TicTacToe::tick, 4); + Scheduler.INSTANCE.scheduleCyclic(LividColor::update, 10); + Scheduler.INSTANCE.scheduleCyclic(BackpackPreview::tick, 50); + Scheduler.INSTANCE.scheduleCyclic(DwarvenHud::update, 40); + Scheduler.INSTANCE.scheduleCyclic(PlayerListMgr::updateList, 20); } /** @@ -121,7 +117,7 @@ public class SkyblockerMod implements ClientModInitializer { * @param client the Minecraft client. */ public void tick(MinecraftClient client) { - scheduler.tick(); - messageScheduler.tick(); + Scheduler.INSTANCE.tick(); + MessageScheduler.INSTANCE.tick(); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/QuiverWarning.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/QuiverWarning.java index cf793461..381bf94c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/QuiverWarning.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/QuiverWarning.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.hud.InGameHud; @@ -16,7 +16,7 @@ public class QuiverWarning { public static void init() { ClientReceiveMessageEvents.ALLOW_GAME.register(QuiverWarning::onChatMessage); - SkyblockerMod.getInstance().scheduler.scheduleCyclic(QuiverWarning::update, 10); + Scheduler.INSTANCE.scheduleCyclic(QuiverWarning::update, 10); } public static boolean onChatMessage(Text text, boolean overlay) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java index 6e354ddc..8d676d0b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java @@ -1,10 +1,10 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import it.unimi.dsi.fastutil.objects.ObjectIntPair; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; import me.xmrvizzy.skyblocker.utils.render.RenderHelper; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.minecraft.client.MinecraftClient; @@ -35,7 +35,7 @@ public class DungeonBlaze { private static ArmorStandEntity nextLowestBlaze = null; public static void init() { - SkyblockerMod.getInstance().scheduler.scheduleCyclic(DungeonBlaze::update, 4); + Scheduler.INSTANCE.scheduleCyclic(DungeonBlaze::update, 4); WorldRenderEvents.BEFORE_DEBUG_RENDER.register(DungeonBlaze::blazeRenderer); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java index 4701c485..e5d8a720 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.scheduler.MessageScheduler; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; @@ -23,13 +23,13 @@ public class LividColor { if (tenTicks != 0) { if (SkyblockerConfig.get().locations.dungeons.lividColor.enableLividColor && Utils.isInDungeons() && client.world != null) { if (tenTicks == 1) { - SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown(SkyblockerConfig.get().locations.dungeons.lividColor.lividColorText.replace("[color]", "red")); + MessageScheduler.INSTANCE.sendMessageAfterCooldown(SkyblockerConfig.get().locations.dungeons.lividColor.lividColorText.replace("[color]", "red")); tenTicks = 0; return; } String key = client.world.getBlockState(new BlockPos(5, 110, 42)).getBlock().getTranslationKey(); if (key.startsWith("block.minecraft.") && key.endsWith("wool") && !key.endsWith("red_wool")) { - SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown(SkyblockerConfig.get().locations.dungeons.lividColor.lividColorText.replace("[color]", key.substring(16, key.length() - 5))); + MessageScheduler.INSTANCE.sendMessageAfterCooldown(SkyblockerConfig.get().locations.dungeons.lividColor.lividColorText.replace("[color]", key.substring(16, key.length() - 5))); tenTicks = 0; return; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java index e1194632..8d8a840a 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -1,10 +1,11 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener; +import me.xmrvizzy.skyblocker.utils.scheduler.MessageScheduler; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.MinecraftClient; @@ -35,7 +36,7 @@ public class Reparty extends ChatPatternListener { ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("rp").executes(context -> { if (!Utils.isOnSkyblock() || this.repartying || client.player == null) return 0; this.repartying = true; - SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown("/p list"); + MessageScheduler.INSTANCE.sendMessageAfterCooldown("/p list"); return 0; }))); } @@ -57,7 +58,7 @@ public class Reparty extends ChatPatternListener { } } else if (matcher.group("disband") != null && !matcher.group("disband").equals(client.getSession().getUsername())) { partyLeader = matcher.group("disband"); - SkyblockerMod.getInstance().scheduler.schedule(() -> partyLeader = null, 61); + Scheduler.INSTANCE.schedule(() -> partyLeader = null, 61); return false; } else if (matcher.group("invite") != null && matcher.group("invite").equals(partyLeader)) { String command = "/party accept " + partyLeader; @@ -84,10 +85,10 @@ public class Reparty extends ChatPatternListener { String command = "/p invite " + this.players[i]; sendCommand(command, i + 2); } - SkyblockerMod.getInstance().scheduler.schedule(() -> this.repartying = false, this.players.length + 2); + Scheduler.INSTANCE.schedule(() -> this.repartying = false, this.players.length + 2); } private void sendCommand(String command, int delay) { - SkyblockerMod.getInstance().messageScheduler.queueMessage(command, delay * BASE_DELAY); + MessageScheduler.INSTANCE.queueMessage(command, delay * BASE_DELAY); } } \ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java index a7420bf5..18b63793 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java @@ -13,6 +13,7 @@ import it.unimi.dsi.fastutil.objects.ObjectIntPair; import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; @@ -140,7 +141,7 @@ public class DungeonSecrets { LOGGER.error("[Skyblocker] Failed to load dungeon secrets", e); return null; }); - SkyblockerMod.getInstance().scheduler.scheduleCyclic(DungeonSecrets::update, 10); + Scheduler.INSTANCE.scheduleCyclic(DungeonSecrets::update, 10); WorldRenderEvents.AFTER_TRANSLUCENT.register(DungeonSecrets::render); ClientReceiveMessageEvents.GAME.register(DungeonSecrets::onChatMessage); ClientReceiveMessageEvents.GAME_CANCELED.register(DungeonSecrets::onChatMessage); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/Room.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/Room.java index 6825d779..ae5afaa3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/Room.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/Room.java @@ -8,7 +8,7 @@ import com.google.gson.JsonObject; import it.unimi.dsi.fastutil.ints.IntRBTreeSet; import it.unimi.dsi.fastutil.ints.IntSortedSet; import it.unimi.dsi.fastutil.ints.IntSortedSets; -import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; import net.fabricmc.fabric.api.util.TriState; import net.minecraft.block.BlockState; @@ -249,7 +249,7 @@ public class Room { // If no rooms match, reset the fields and scan again after 50 ticks. matched = TriState.FALSE; DungeonSecrets.LOGGER.warn("[Skyblocker] No dungeon room matches after checking {} block(s)", checkedBlocks.size()); - SkyblockerMod.getInstance().scheduler.schedule(() -> matched = TriState.DEFAULT, 50); + Scheduler.INSTANCE.schedule(() -> matched = TriState.DEFAULT, 50); reset(); return true; } else if (matchingRoomsSize == 1 && ++doubleCheckBlocks >= 10) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java index 60c39ca6..06a642b6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java @@ -2,9 +2,9 @@ package me.xmrvizzy.skyblocker.skyblock.item; import com.google.gson.Gson; import com.google.gson.JsonObject; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.minecraft.client.MinecraftClient; import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; @@ -33,7 +33,6 @@ import java.util.zip.GZIPInputStream; public class PriceInfoTooltip { private static final Logger LOGGER = LoggerFactory.getLogger(PriceInfoTooltip.class.getName()); - private static final SkyblockerMod skyblocker = SkyblockerMod.getInstance(); private static final MinecraftClient client = MinecraftClient.getInstance(); private static JsonObject npcPricesJson; private static JsonObject bazaarPricesJson; @@ -355,7 +354,7 @@ public class PriceInfoTooltip { public static int minute = -1; public static void init() { - skyblocker.scheduler.scheduleCyclic(() -> { + Scheduler.INSTANCE.scheduleCyclic(() -> { if (!Utils.isOnSkyblock() && 0 < minute++) { nullMsgSend = false; return; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java index fe229a44..e41ea768 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -2,8 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.quicknav; import com.mojang.blaze3d.systems.RenderSystem; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.mixin.accessor.HandledScreenAccessor; +import me.xmrvizzy.skyblocker.utils.scheduler.MessageScheduler; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; @@ -54,7 +54,7 @@ public class QuickNavButton extends ClickableWidget { public void onClick(double mouseX, double mouseY) { if (!this.toggled) { this.toggled = true; - SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown(command); + MessageScheduler.INSTANCE.sendMessageAfterCooldown(command); // TODO : add null check with log error } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java index 5ca89dcf..4b11fcb0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java @@ -1,7 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.rift; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; public class TheRift { @@ -13,9 +13,9 @@ public class TheRift { public static void init() { WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render); WorldRenderEvents.AFTER_TRANSLUCENT.register(EffigyWaypoints::render); - SkyblockerMod.getInstance().scheduler.scheduleCyclic(EffigyWaypoints::updateEffigies, SkyblockerConfig.get().slayer.vampireSlayer.effigyUpdateFrequency); - SkyblockerMod.getInstance().scheduler.scheduleCyclic(TwinClawsIndicator::updateIce, SkyblockerConfig.get().slayer.vampireSlayer.holyIceUpdateFrequency); - SkyblockerMod.getInstance().scheduler.scheduleCyclic(ManiaIndicator::updateMania, SkyblockerConfig.get().slayer.vampireSlayer.maniaUpdateFrequency); - SkyblockerMod.getInstance().scheduler.scheduleCyclic(StakeIndicator::updateStake, SkyblockerConfig.get().slayer.vampireSlayer.steakStakeUpdateFrequency); + Scheduler.INSTANCE.scheduleCyclic(EffigyWaypoints::updateEffigies, SkyblockerConfig.get().slayer.vampireSlayer.effigyUpdateFrequency); + Scheduler.INSTANCE.scheduleCyclic(TwinClawsIndicator::updateIce, SkyblockerConfig.get().slayer.vampireSlayer.holyIceUpdateFrequency); + Scheduler.INSTANCE.scheduleCyclic(ManiaIndicator::updateMania, SkyblockerConfig.get().slayer.vampireSlayer.maniaUpdateFrequency); + Scheduler.INSTANCE.scheduleCyclic(StakeIndicator::updateStake, SkyblockerConfig.get().slayer.vampireSlayer.steakStakeUpdateFrequency); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java index e141b6a8..6e6fad2d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java @@ -1,12 +1,12 @@ package me.xmrvizzy.skyblocker.skyblock.rift; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.SlayerUtils; import me.xmrvizzy.skyblocker.utils.Utils; import me.xmrvizzy.skyblocker.utils.render.RenderHelper; import me.xmrvizzy.skyblocker.utils.render.title.Title; import me.xmrvizzy.skyblocker.utils.render.title.TitleContainer; +import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.minecraft.entity.Entity; import net.minecraft.util.Formatting; @@ -29,7 +29,7 @@ public class TwinClawsIndicator { anyClaws = true; if (!TitleContainer.containsTitle(title) && !scheduled) { scheduled = true; - SkyblockerMod.getInstance().scheduler.schedule(() -> { + Scheduler.INSTANCE.schedule(() -> { RenderHelper.displayInTitleContainerAndPlaySound(title); scheduled = false; }, SkyblockerConfig.get().slayer.vampireSlayer.holyIceIndicatorTickDelay); diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index 1e8e7ffa..149004c4 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -2,9 +2,9 @@ package me.xmrvizzy.skyblocker.utils; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import me.xmrvizzy.skyblocker.skyblock.rift.TheRift; +import me.xmrvizzy.skyblocker.utils.scheduler.MessageScheduler; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; @@ -294,7 +294,7 @@ public class Utils { if (isOnSkyblock) { long currentTime = System.currentTimeMillis(); if (!sentLocRaw && currentTime > clientWorldJoinTime + 1000 && currentTime > lastLocRaw + 15000) { - SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown("/locraw"); + MessageScheduler.INSTANCE.sendMessageAfterCooldown("/locraw"); sentLocRaw = true; lastLocRaw = currentTime; } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java index 6e15c871..2555572c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java @@ -1,6 +1,5 @@ package me.xmrvizzy.skyblocker.utils.render.title; -import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; @@ -66,7 +65,7 @@ public class TitleContainer { */ public static boolean addTitle(Title title, int ticks) { if (addTitle(title)) { - SkyblockerMod.getInstance().scheduler.schedule(() -> TitleContainer.removeTitle(title), ticks); + Scheduler.INSTANCE.schedule(() -> TitleContainer.removeTitle(title), ticks); return true; } return false; diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/MessageScheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/MessageScheduler.java index bde29c13..b8ffa548 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/MessageScheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/MessageScheduler.java @@ -3,19 +3,22 @@ package me.xmrvizzy.skyblocker.utils.scheduler; import net.minecraft.client.MinecraftClient; /** - * A scheduler for sending chat messages or commands. Use the instance in {@link me.xmrvizzy.skyblocker.SkyblockerMod#messageScheduler SkyblockerMod.messageScheduler}. Do not instantiate this class. + * A scheduler for sending chat messages or commands. Use the instance in {@link #INSTANCE}. Do not instantiate this class. */ -@SuppressWarnings("deprecation") public class MessageScheduler extends Scheduler { /** * The minimum delay that the server will accept between chat messages. */ private static final int MIN_DELAY = 200; + public static final MessageScheduler INSTANCE = new MessageScheduler(); /** * The timestamp of the last message send, */ private long lastMessage = 0; + protected MessageScheduler() { + } + /** * Sends a chat message or command after the minimum cooldown. Prefer this method to send messages or commands to the server. * diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java index e3b590c7..700bdce3 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/scheduler/Scheduler.java @@ -3,7 +3,6 @@ package me.xmrvizzy.skyblocker.utils.scheduler; import com.mojang.brigadier.Command; import it.unimi.dsi.fastutil.ints.AbstractInt2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import me.xmrvizzy.skyblocker.SkyblockerMod; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; @@ -15,19 +14,15 @@ import java.util.List; import java.util.function.Supplier; /** - * A scheduler for running tasks at a later time. Tasks will be run synchronously on the main client thread. Use the instance stored in {@link SkyblockerMod#scheduler}. Do not instantiate this class. + * A scheduler for running tasks at a later time. Tasks will be run synchronously on the main client thread. Use the instance stored in {@link #INSTANCE}. Do not instantiate this class. */ public class Scheduler { private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class); + public static final Scheduler INSTANCE = new Scheduler(); private int currentTick = 0; private final AbstractInt2ObjectMap> tasks = new Int2ObjectOpenHashMap<>(); - /** - * Do not instantiate this class. Use {@link SkyblockerMod#scheduler} instead. - */ - @SuppressWarnings("DeprecatedIsStillUsed") - @Deprecated - public Scheduler() { + protected Scheduler() { } /** @@ -59,7 +54,7 @@ public class Scheduler { } public static Command queueOpenScreenCommand(Supplier screenSupplier) { - return context -> SkyblockerMod.getInstance().scheduler.queueOpenScreen(screenSupplier); + return context -> INSTANCE.queueOpenScreen(screenSupplier); } /** diff --git a/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java b/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java index 3bc12337..3ec63df1 100644 --- a/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java +++ b/src/test/java/me/xmrvizzy/skyblocker/utils/scheduler/SchedulerTest.java @@ -5,8 +5,6 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class SchedulerTest { - @SuppressWarnings("deprecation") - private final Scheduler scheduler = new Scheduler(); private final MutableInt currentTick = new MutableInt(0); private final MutableInt cycleCount1 = new MutableInt(0); private final MutableInt cycleCount2 = new MutableInt(0); @@ -19,53 +17,53 @@ public class SchedulerTest { @Test public void testSchedule() { - scheduler.schedule(() -> Assertions.assertEquals(0, currentTick.intValue()), 0); - scheduler.schedule(() -> Assertions.assertEquals(1, currentTick.intValue()), 1); - scheduler.schedule(() -> Assertions.assertEquals(2, currentTick.intValue()), 2); - scheduler.schedule(() -> Assertions.assertEquals(10, currentTick.intValue()), 10); - scheduler.schedule(() -> Assertions.assertEquals(20, currentTick.intValue()), 20); - scheduler.schedule(() -> Assertions.assertEquals(50, currentTick.intValue()), 50); - scheduler.schedule(() -> Assertions.assertEquals(100, currentTick.intValue()), 100); - scheduler.schedule(() -> Assertions.assertEquals(123, currentTick.intValue()), 123); - scheduler.scheduleCyclic(() -> {}, 1); - scheduler.scheduleCyclic(() -> {}, 1); - scheduler.scheduleCyclic(() -> {}, 1); - scheduler.scheduleCyclic(() -> {}, 1); - scheduler.scheduleCyclic(() -> { + Scheduler.INSTANCE.schedule(() -> Assertions.assertEquals(0, currentTick.intValue()), 0); + Scheduler.INSTANCE.schedule(() -> Assertions.assertEquals(1, currentTick.intValue()), 1); + Scheduler.INSTANCE.schedule(() -> Assertions.assertEquals(2, currentTick.intValue()), 2); + Scheduler.INSTANCE.schedule(() -> Assertions.assertEquals(10, currentTick.intValue()), 10); + Scheduler.INSTANCE.schedule(() -> Assertions.assertEquals(20, currentTick.intValue()), 20); + Scheduler.INSTANCE.schedule(() -> Assertions.assertEquals(50, currentTick.intValue()), 50); + Scheduler.INSTANCE.schedule(() -> Assertions.assertEquals(100, currentTick.intValue()), 100); + Scheduler.INSTANCE.schedule(() -> Assertions.assertEquals(123, currentTick.intValue()), 123); + Scheduler.INSTANCE.scheduleCyclic(() -> {}, 1); + Scheduler.INSTANCE.scheduleCyclic(() -> {}, 1); + Scheduler.INSTANCE.scheduleCyclic(() -> {}, 1); + Scheduler.INSTANCE.scheduleCyclic(() -> {}, 1); + Scheduler.INSTANCE.scheduleCyclic(() -> { Assertions.assertEquals(cycleCount1.intValue(), currentTick.intValue()); cycleCount1.increment(); }, 1); - scheduler.scheduleCyclic(() -> { + Scheduler.INSTANCE.scheduleCyclic(() -> { Assertions.assertEquals(0, currentTick.intValue() % 10); Assertions.assertEquals(cycleCount2.intValue(), currentTick.intValue() / 10); cycleCount2.increment(); }, 10); - scheduler.scheduleCyclic(() -> { + Scheduler.INSTANCE.scheduleCyclic(() -> { Assertions.assertEquals(0, currentTick.intValue() % 55); Assertions.assertEquals(cycleCount3.intValue(), currentTick.intValue() / 55); cycleCount3.increment(); }, 55); - scheduler.schedule(() -> scheduler.scheduleCyclic(() -> { + Scheduler.INSTANCE.schedule(() -> Scheduler.INSTANCE.scheduleCyclic(() -> { Assertions.assertEquals(7, currentTick.intValue() % 10); Assertions.assertEquals(cycleCount4.intValue(), currentTick.intValue() / 10); cycleCount4.increment(); }, 10), 7); - scheduler.schedule(() -> scheduler.scheduleCyclic(() -> { + Scheduler.INSTANCE.schedule(() -> Scheduler.INSTANCE.scheduleCyclic(() -> { Assertions.assertEquals(0, currentTick.intValue() % 75); Assertions.assertEquals(cycleCount5.intValue(), currentTick.intValue() / 75); cycleCount5.increment(); }, 75), 0); - scheduler.schedule(() -> scheduler.scheduleCyclic(() -> { + Scheduler.INSTANCE.schedule(() -> Scheduler.INSTANCE.scheduleCyclic(() -> { Assertions.assertEquals(1, currentTick.intValue() % 99); Assertions.assertEquals(cycleCount6.intValue(), currentTick.intValue() / 99); cycleCount6.increment(); }, 99), 1); - scheduler.scheduleCyclic(() -> scheduler.schedule(() -> { + Scheduler.INSTANCE.scheduleCyclic(() -> Scheduler.INSTANCE.schedule(() -> { Assertions.assertEquals(5, currentTick.intValue() % 10); Assertions.assertEquals(cycleCount7.intValue(), currentTick.intValue() / 10); cycleCount7.increment(); }, 5), 10); - scheduler.scheduleCyclic(() -> scheduler.schedule(() -> { + Scheduler.INSTANCE.scheduleCyclic(() -> Scheduler.INSTANCE.schedule(() -> { Assertions.assertEquals(10, currentTick.intValue() % 55); Assertions.assertEquals(cycleCount8.intValue(), currentTick.intValue() / 55); cycleCount8.increment(); @@ -84,7 +82,7 @@ public class SchedulerTest { } private void tick() { - scheduler.tick(); + Scheduler.INSTANCE.tick(); currentTick.increment(); } } -- cgit