diff options
author | ExternalTime <84183548+ExternalTime@users.noreply.github.com> | 2022-02-20 14:15:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-20 14:15:56 +0100 |
commit | 42017d856cd4306dcff58a54fc401d22b85e2441 (patch) | |
tree | 30971dede247ab76d88c162c161d335eb0a7aa84 /src/main/java | |
parent | af48b7f7d1ddd4983f985a705c7daacf2db30b84 (diff) | |
download | Skyblocker-42017d856cd4306dcff58a54fc401d22b85e2441.tar.gz Skyblocker-42017d856cd4306dcff58a54fc401d22b85e2441.tar.bz2 Skyblocker-42017d856cd4306dcff58a54fc401d22b85e2441.zip |
Added simple scheduler for recurring and delayed tasks (#39)
Diffstat (limited to 'src/main/java')
7 files changed, 121 insertions, 113 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index e33e9c2d..6ebaa5b2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -1,86 +1,30 @@ package me.xmrvizzy.skyblocker; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.container.ContainerSolverManager; import me.xmrvizzy.skyblocker.discord.DiscordRPCManager; import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze; +import me.xmrvizzy.skyblocker.utils.Scheduler; import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.MinecraftClient; - -import java.util.Objects; public class SkyblockerMod { public static final String NAMESPACE = "skyblocker"; private static final SkyblockerMod instance = new SkyblockerMod(); + + public final Scheduler scheduler = new Scheduler(); public final ContainerSolverManager containerSolverManager = new ContainerSolverManager(); - public DiscordRPCManager discordRPCManager = new DiscordRPCManager(); + public final DiscordRPCManager discordRPCManager = new DiscordRPCManager(); private SkyblockerMod() { + scheduler.scheduleCyclic(Utils::sbChecker, 20); + scheduler.scheduleCyclic(discordRPCManager::update, 100); + scheduler.scheduleCyclic(DungeonBlaze::update, 4); } public static SkyblockerMod getInstance() { return instance; } - private int ticks = 0; - private int rpTimer = 0; - public void onTick() { - MinecraftClient client = MinecraftClient.getInstance(); - if (client == null) return; - ticks++; - if(onHypxiel()) { - if (ticks % 4 == 0) - try { - if (Utils.isInDungeons) { - DungeonBlaze.DungeonBlaze(); - } - } catch (Exception e) { - //System.out.println("Blazesolver: " + e); - } - if (ticks % 20 == 0) { - rpTimer++; - if (rpTimer == 5) { - if (discordRPCManager.isConnected && Utils.isOnSkyblock && SkyblockerConfig.get().richPresence.enableRichPresence) { - discordRPCManager.updatePresence(); - } - if (discordRPCManager.isConnected && Utils.isOnSkyblock && SkyblockerConfig.get().richPresence.cycleMode) { - discordRPCManager.cycleCount++; - if (discordRPCManager.cycleCount == 3) discordRPCManager.cycleCount = 0; - } - rpTimer = 0; - } - if (client.world != null && !client.isInSingleplayer()) - Utils.sbChecker(); - if (!discordRPCManager.isConnected && Utils.isOnSkyblock && SkyblockerConfig.get().richPresence.enableRichPresence) - discordRPCManager.start(); - if (discordRPCManager.isConnected && !SkyblockerConfig.get().richPresence.enableRichPresence) - discordRPCManager.stop(); - ticks = 0; - } - } else { - if (ticks % 20 == 0) { - if (discordRPCManager.isConnected) { - discordRPCManager.stop(); - } - Utils.sbChecker(); - ticks = 0; - } - } - } - public static MinecraftClient client() { - try { - return MinecraftClient.getInstance(); - } - catch(NullPointerException e) { - return null; - } - } - public static boolean onHypxiel() { - try { - return client() != null && !client().isInSingleplayer() && Objects.requireNonNull(client().getCurrentServerEntry()).address != null && client().getCurrentServerEntry().address.contains("hypixel.net"); - } catch (NullPointerException exception) { - return false; - } + scheduler.tick(); } -}
\ No newline at end of file +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 96da1198..d537b3d0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java +++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java @@ -20,6 +20,17 @@ public class DiscordRPCManager implements IPCListener{ public static DecimalFormat dFormat = new DecimalFormat("###,###.##"); public int cycleCount = 0; + public void update() { + if (!SkyblockerConfig.get().richPresence.enableRichPresence || !Utils.isOnSkyblock) { + if (isConnected) stop(); + return; + } + if (!isConnected) start(); + if (SkyblockerConfig.get().richPresence.cycleMode) + cycleCount = (cycleCount + 1) % 3; + updatePresence(); + } + public void start(){ try { logger.info("Starting..."); 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 ab81cd75..d4f7fec5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import me.xmrvizzy.skyblocker.utils.Utils; import me.xmrvizzy.skyblocker.utils.color.QuadColor; import me.xmrvizzy.skyblocker.utils.RenderUtils; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; @@ -14,13 +15,15 @@ public class DungeonBlaze { static Entity lowestBlaze = null; static boolean renderHooked = false; - public static void DungeonBlaze() { + public static void update() { + if (!Utils.isInDungeons) return; MinecraftClient client = MinecraftClient.getInstance(); if(!renderHooked){ WorldRenderEvents.END.register(DungeonBlaze::blazeRenderer); renderHooked = true; } + assert client.world != null; Iterable<Entity> entities = client.world.getEntities(); int highestHealth = 0; int lowestHealth = 99999999; 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 d4dd7fb0..65b9648f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon; +import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.chat.ChatListener; import me.xmrvizzy.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager; @@ -11,8 +12,9 @@ import java.util.regex.Pattern; public class Reparty extends ChatListener { private static final MinecraftClient client = MinecraftClient.getInstance(); + private static final SkyblockerMod skyblocker = SkyblockerMod.getInstance(); public static final Pattern PLAYER = Pattern.compile(" ([a-zA-Z0-9_]{2,16}) ●"); - private static final int SLEEP_TIME = 600; + private static final int BASE_DELAY = 20; private String[] players; private int playersSoFar; @@ -53,45 +55,31 @@ public class Reparty extends ChatListener { return false; } if (playersSoFar == players.length) - new Thread(this::reparty).start(); + reparty(); return false; } private void reparty() { ClientPlayerEntity playerEntity = client.player; assert playerEntity != null; - StringBuilder sb = new StringBuilder("/p disband"); - for (int i = 0; i < players.length; i++) { - if (i % 5 == 0) { - sleep(); - playerEntity.sendChatMessage(sb.toString()); - sb.setLength(0); - sb.append("/p invite"); + sendCommand(playerEntity, "/p disband", 1); + StringBuilder sb = new StringBuilder(); + int invites = (players.length - 1) / 5 + 1; + for(int i = 0; i < invites; i++) { + sb.setLength(0); + sb.append("/p invite"); + for(int j = 0; j < 5 && i * 5 + j < players.length; j++) { + sb.append(' '); + sb.append(players[i * 5 + j]); } - sb.append(' '); - sb.append(players[i]); + sendCommand(playerEntity, sb.toString(), i + 2); } - if (players.length % 5 != 0) { - sleep(); - playerEntity.sendChatMessage(sb.toString()); - } - repartying = false; + skyblocker.scheduler.schedule(() -> repartying = false, invites + 2); } - private void sleep() { - long sleepStart = System.currentTimeMillis(); - boolean interrupted = false; - long sleepLeft = SLEEP_TIME; - do { - if (interrupted) { - sleepLeft = sleepStart + SLEEP_TIME - System.currentTimeMillis(); - interrupted = false; - } - try { - Thread.sleep(sleepLeft); - } catch (InterruptedException e) { - interrupted = true; - } - } while (interrupted); + private void sendCommand(ClientPlayerEntity player, String command, int delay) { + skyblocker.scheduler.schedule(() -> + player.sendChatMessage(command), delay * BASE_DELAY + ); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java index e95a7507..3e117955 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java @@ -21,7 +21,6 @@ public class Puzzler extends ChatListener { public boolean onMessage(String[] groups) { int x = 181; int z = 135; - System.out.println(groups[1]); for (char c : groups[1].toCharArray()) { if (c == '▲') z++; else if (c == '▼') z--; diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java new file mode 100644 index 00000000..0fdf4892 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java @@ -0,0 +1,60 @@ +package me.xmrvizzy.skyblocker.utils; + +import java.util.PriorityQueue; + +public class Scheduler { + private int currentTick; + private final PriorityQueue<ScheduledTask> tasks; + + public Scheduler() { + currentTick = 0; + tasks = new PriorityQueue<>(); + } + + public void schedule(Runnable task, int delay) { + assert delay > 0; + ScheduledTask tmp = new ScheduledTask(currentTick + delay, task); + tasks.add(tmp); + } + + public void scheduleCyclic(Runnable task, int period) { + new CyclicTask(task, period).run(); + } + + public void tick() { + currentTick += 1; + ScheduledTask task; + while ((task = tasks.peek()) != null && task.schedule <= currentTick) { + task.run(); + tasks.poll(); + } + } + + private class CyclicTask implements Runnable { + private final Runnable inner; + private final int period; + + public CyclicTask(Runnable task, int period) { + this.inner = task; + this.period = period; + } + + @Override + public void run() { + schedule(this, period); + inner.run(); + } + } + + private record ScheduledTask(int schedule, Runnable inner) implements Comparable<ScheduledTask>, Runnable { + @Override + public int compareTo(ScheduledTask o) { + return schedule - o.schedule; + } + + @Override + public void run() { + inner.run(); + } + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index e3623bb4..21c30ada 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -19,8 +19,9 @@ public class Utils { public static boolean isInjected = false; public static void sbChecker() { - List<String> sidebar = getSidebar(); - if (sidebar == null) { + MinecraftClient client = MinecraftClient.getInstance(); + List<String> sidebar; + if (client.world == null || client.isInSingleplayer() || (sidebar = getSidebar()) == null) { isOnSkyblock = false; isInDungeons = false; return; @@ -28,22 +29,22 @@ public class Utils { String string = sidebar.toString(); if (sidebar.isEmpty()) return; - if (sidebar.get(0).contains("SKYBLOCK") && !isOnSkyblock){ - if(!isInjected){ - isInjected = true; - ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); - } - Events.onSkyblockJoin(); - + if (sidebar.get(0).contains("SKYBLOCK") && !isOnSkyblock) { + if (!isInjected) { + isInjected = true; + ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); } - if (!sidebar.get(0).contains("SKYBLOCK") && isOnSkyblock) Events.onSkyblockDisconnect(); - isInDungeons = isOnSkyblock && string.contains("The Catacombs"); + Events.onSkyblockJoin(); + } + if (!sidebar.get(0).contains("SKYBLOCK") && isOnSkyblock) Events.onSkyblockDisconnect(); + isInDungeons = isOnSkyblock && string.contains("The Catacombs"); + } public static String getLocation() { String location = null; List<String> sidebarLines = getSidebar(); - try{ + try { assert sidebarLines != null; for (String sidebarLine : sidebarLines) { if (sidebarLine.contains("⏣")) location = sidebarLine; @@ -55,12 +56,13 @@ public class Utils { } return location; } + public static double getPurse() { String purseString = null; double purse = 0; List<String> sidebarLines = getSidebar(); - try{ + try { assert sidebarLines != null; for (String sidebarLine : sidebarLines) { if (sidebarLine.contains("Piggy:")) purseString = sidebarLine; @@ -74,16 +76,17 @@ public class Utils { } return purse; } + public static int getBits() { int bits = 0; String bitsString = null; List<String> sidebarLines = getSidebar(); - try{ + try { assert sidebarLines != null; for (String sidebarLine : sidebarLines) { if (sidebarLine.contains("Bits")) bitsString = sidebarLine; } - if (bitsString !=null) { + if (bitsString != null) { bits = Integer.parseInt(bitsString.replaceAll("[^0-9.]", "").strip()); } } catch (IndexOutOfBoundsException e) { |