diff options
27 files changed, 420 insertions, 206 deletions
diff --git a/gradle.properties b/gradle.properties index 41a9c7fc..f1e32644 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xmx1G +org.gradle.jvmargs=-Xmx1G -Dfile.encoding=UTF-8 -Duser.language=en -Duser.country=US # Fabric Properties (https://fabricmc.net/versions.html) minecraft_version=1.18.1 @@ -10,9 +10,9 @@ fabric_version=0.44.0+1.18 # Dependencies ## Cloth Api (https://www.curseforge.com/minecraft/mc-mods/cloth-config/files) -clothconfig_version=6.1.48 +clothconfig_version=6.1.50 ## Mod Menu (https://www.curseforge.com/minecraft/mc-mods/modmenu/files) -mod_menu_version=3.0.0 +mod_menu_version=3.0.1 # Mod Properties mod_version = 1.5.0 @@ -44,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m" "-Dfile.encoding=UTF-8" "-Duser.language=en" "-Duser.country=US"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" diff --git a/gradlew.bat b/gradlew.bat index 107acd32..afa9efaa 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -33,7 +33,7 @@ set APP_HOME=%DIRNAME% for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" "-Dfile.encoding=UTF-8" "-Duser.language=en" "-Duser.country=US" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java index 575a87d3..2c0a8ad6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java +++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java @@ -1,88 +1,31 @@ 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.BackpackPreview; 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()) { - BackpackPreview.tick(); - if (ticks % 4 == 0) - try { - if (Utils.isDungeons) { - DungeonBlaze.DungeonBlaze(); - } - } catch (Exception e) { - //System.out.println("Blazesolver: " + e); - } - if (ticks % 20 == 0) { - rpTimer++; - if (rpTimer == 5) { - if (discordRPCManager.isConnected && Utils.isSkyblock && SkyblockerConfig.get().richPresence.enableRichPresence) { - discordRPCManager.updatePresence(); - } - if (discordRPCManager.isConnected && Utils.isSkyblock && 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.isSkyblock && 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/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java index 9471620b..40b20b98 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java @@ -42,6 +42,12 @@ public class SkyblockerConfig implements ConfigData { @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) public Quicknav quicknav = new Quicknav(); + public boolean enableUpdateNotification = true; + + @ConfigEntry.Category("itemTooltip") + @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) + public ItemTooltip itemTooltip = new ItemTooltip(); + @ConfigEntry.Gui.Excluded public List<Integer> lockedSlots = new ArrayList<>(); } @@ -66,6 +72,14 @@ public class SkyblockerConfig implements ConfigData { public boolean enableQuicknav = true; } + public static class ItemTooltip { + public boolean enableNPCPrice = true; + public boolean enableAvgBIN = true; + public boolean enableLowestBIN = true; + public boolean enableBazaarPrice = true; + public boolean enableMuseumDate = true; + } + public static class Locations { @ConfigEntry.Category("dungeons") @ConfigEntry.Gui.CollapsibleObject(startExpanded = true) diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java index 96da1198..b854613a 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..."); @@ -66,10 +77,12 @@ public class DiscordRPCManager implements IPCListener{ } public void stop(){ - logger.info("Closing..."); - isConnected = false; - client.close(); - client = null; + if (client != null){ + logger.info("Closing..."); + isConnected = false; + client.close(); + client = null; + } } @Override diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java index 43103159..9170f1db 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java @@ -1,20 +1,15 @@ package me.xmrvizzy.skyblocker.mixin; import me.xmrvizzy.skyblocker.chat.ChatParser; -import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import me.xmrvizzy.skyblocker.utils.Utils; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.hud.ChatHudListener; -import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.network.MessageType; -import net.minecraft.text.ClickEvent; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.List; import java.util.UUID; @Mixin(ChatHudListener.class) @@ -24,7 +19,7 @@ public class ChatHudListenerMixin { @Inject(method = "onChatMessage", at = @At("HEAD"), cancellable = true) public void onMessage(MessageType messageType, Text message, UUID senderUuid, CallbackInfo ci) { - if (!Utils.isSkyblock) + if (!Utils.isOnSkyblock) return; if (parser.shouldFilter(message.getString())) ci.cancel(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index 5825b394..160c8078 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -29,6 +29,6 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) public void dropSelectedItem(boolean dropEntireStack, CallbackInfoReturnable<Boolean> cir) { - if (Utils.isSkyblock) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir); + if (Utils.isOnSkyblock) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir); } }
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java index 3e6bf16a..d63d17b8 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/GenericContainerScreenMixin.java @@ -25,7 +25,7 @@ public abstract class GenericContainerScreenMixin extends HandledScreen<GenericC @Override protected void drawForeground(MatrixStack matrices, int mouseX, int mouseY) { super.drawForeground(matrices, mouseX, mouseY); - if (Utils.isSkyblock) + if (Utils.isOnSkyblock) SkyblockerMod.getInstance().containerSolverManager.onDraw(matrices, this.handler.slots.subList(0, rows * 9)); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index 88676f08..cba87f48 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -35,7 +35,8 @@ public abstract class HandledScreenMixin extends Screen { @Inject(method = "init()V", at = @At("TAIL")) private void init(CallbackInfo ci) { - if (Utils.isSkyblock && SkyblockerConfig.get().general.quicknav.enableQuicknav) { + // quicknav + if (Utils.isOnSkyblock && SkyblockerConfig.get().general.quicknav.enableQuicknav) { String screenTitle = super.getTitle().getString().trim(); List<QuickNavButton> buttons = QuickNav.init(screenTitle); for (QuickNavButton button : buttons) super.addDrawableChild(button); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java index 2653aeef..19e0d79e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java @@ -43,7 +43,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "setOverlayMessage(Lnet/minecraft/text/Text;Z)V", at = @At("HEAD"), cancellable = true) private void onSetOverlayMessage(Text message, boolean tinted, CallbackInfo ci) { - if(!Utils.isSkyblock) + if(!Utils.isOnSkyblock) return; String msg = message.getString(); if(statusBars.update(msg)) @@ -52,7 +52,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderHotbar", at = @At("HEAD")) public void renderHotbar(float f, MatrixStack matrices, CallbackInfo ci) { - if (Utils.isSkyblock) { + if (Utils.isOnSkyblock) { hotbarMatrices = matrices; hotbarSlotIndex = 0; } @@ -60,7 +60,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderHotbarItem", at = @At("HEAD")) public void renderHotbarItem(int i, int j, float f, PlayerEntity player, ItemStack stack, int seed, CallbackInfo ci) { - if (Utils.isSkyblock) { + if (Utils.isOnSkyblock) { if (HotbarSlotLock.isLocked(hotbarSlotIndex)) { RenderSystem.setShaderTexture(0,SLOT_LOCK); this.drawTexture(hotbarMatrices, i, j, 0, 0,16, 16); @@ -71,18 +71,18 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true) private void renderExperienceBar(MatrixStack matrices, int x, CallbackInfo ci) { - if (Utils.isSkyblock && SkyblockerConfig.get().general.bars.enableBars) + if (Utils.isOnSkyblock && SkyblockerConfig.get().general.bars.enableBars) ci.cancel(); } @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true) private void renderStatusBars(MatrixStack matrices, CallbackInfo ci) { - if(!Utils.isSkyblock) + if(!Utils.isOnSkyblock) return; if(statusBars.render(matrices, scaledWidth, scaledHeight)) ci.cancel(); - if (Utils.isDungeons && SkyblockerConfig.get().locations.dungeons.enableMap) + if (Utils.isInDungeons && SkyblockerConfig.get().locations.dungeons.enableMap) DungeonMap.render(matrices); RenderSystem.setShaderTexture(0, GUI_ICONS_TEXTURE); @@ -90,7 +90,7 @@ public abstract class InGameHudMixin extends DrawableHelper { @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true) private void renderMountHealth(MatrixStack matrices, CallbackInfo ci) { - if (Utils.isSkyblock && SkyblockerConfig.get().general.bars.enableBars) + if (Utils.isOnSkyblock && SkyblockerConfig.get().general.bars.enableBars) ci.cancel(); } }
\ No newline at end of file diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java index fcdbf706..4bff2779 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java @@ -19,7 +19,7 @@ public class InventoryScreenMixin { ) ) RecipeBookWidget constructor() { - if (Utils.isSkyblock && SkyblockerConfig.get().general.itemList.enableItemList) + if (Utils.isOnSkyblock && SkyblockerConfig.get().general.itemList.enableItemList) return new ItemListWidget(); else return new RecipeBookWidget(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java index 002497ce..395027bc 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemRendererMixin.java @@ -28,7 +28,7 @@ public abstract class ItemRendererMixin { @Inject(method = "renderGuiItemOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) public void renderItemBar(TextRenderer renderer, ItemStack stack, int x, int y, @Nullable String countLabel, CallbackInfo ci) { - if (Utils.isSkyblock && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) { + if (Utils.isOnSkyblock && SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel) { if (!stack.isEmpty()) { NbtCompound tag = stack.getNbt(); if (tag != null && tag.contains("ExtraAttributes")) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java index f1c6661d..c3ff287e 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/LeverBlockMixin.java @@ -22,7 +22,7 @@ public abstract class LeverBlockMixin extends WallMountedBlock { @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true) public void onGetOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable<VoxelShape> cir) { - if (Utils.isSkyblock) { + if (Utils.isOnSkyblock) { VoxelShape shape = OldLever.getShape(state.get(FACE), state.get(FACING)); if (shape != null) cir.setReturnValue(shape); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java index 21730e69..6561eb5b 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/MinecraftClientMixin.java @@ -27,13 +27,13 @@ public class MinecraftClientMixin { @Inject(method = "handleInputEvents", at = @At("HEAD")) public void handleInputEvents(CallbackInfo ci) { - if (Utils.isSkyblock) HotbarSlotLock.handleInputEvents(player); + if (Utils.isOnSkyblock) HotbarSlotLock.handleInputEvents(player); } @Inject(method = "setScreen", at = @At("HEAD")) public void onSetScreen(Screen screen, CallbackInfo ci) { ContainerSolverManager manager = SkyblockerMod.getInstance().containerSolverManager; - if(Utils.isSkyblock && screen instanceof GenericContainerScreen) + if(Utils.isOnSkyblock && screen instanceof GenericContainerScreen) manager.onSetScreen((GenericContainerScreen) screen); else manager.clearScreen(); 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 69278023..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; @@ -23,7 +25,7 @@ public class Reparty extends ChatListener { repartying = false; ClientCommandManager.DISPATCHER.register( ClientCommandManager.literal("rp").executes(context -> { - if (!Utils.isSkyblock || repartying) + if (!Utils.isOnSkyblock || repartying) return 0; assert client.player != null; repartying = true; @@ -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/Fetchur.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java index c6b5be9e..266006b4 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java @@ -33,7 +33,7 @@ public class Fetchur extends ChatListener { static { answers = new HashMap<>(); answers.put("red and soft", new TranslatableText("block.minecraft.red_wool").getString()); - answers.put("yellow and see-through", new TranslatableText("block.minecraft.yellow_stained_glass").getString()); + answers.put("yellow and see through", new TranslatableText("block.minecraft.yellow_stained_glass").getString()); answers.put("circular and sometimes moves", new TranslatableText("item.minecraft.compass").getString()); answers.put("expensive minerals", "Mithril"); answers.put("useful during celebrations", new TranslatableText("item.minecraft.firework_rocket").getString()); 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/skyblock/item/PriceInfoTooltip.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java index ab24ff27..daad1d26 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java @@ -1,8 +1,8 @@ package me.xmrvizzy.skyblocker.skyblock.item; import com.google.gson.Gson; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; @@ -20,55 +20,104 @@ import java.net.URL; import java.time.Month; import java.util.List; import java.util.Locale; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.zip.GZIPInputStream; public class PriceInfoTooltip { - private static JsonObject shopPricesJson; + private static JsonObject npcPricesJson; private static JsonObject bazaarPricesJson; - private static JsonObject auctionPricesJson; - private static JsonObject lbAuctionPricesJson; + private static JsonObject avgPricesJson; + private static JsonObject lowestPricesJson; private static JsonObject isMuseumJson; - public static void onInjectTooltip(ItemStack stack, TooltipContext context, List<Text> list) { + public static void onInjectTooltip(ItemStack stack, TooltipContext context, List<Text> lines) { + int count = stack.getCount(); String name = getInternalNameFromNBT(stack); String timestamp = getTimestamp(stack); - List<String> listString = list.stream() + List<String> listString = lines.stream() .map(Text::getString) .collect(Collectors.toList()); + try { - if (!listString.contains("NPC Price") && shopPricesJson != null && shopPricesJson.has(name)) { - JsonElement getPrice = shopPricesJson.get(name); - list.add(new LiteralText(String.format("%-23s", "NPC Price:")).formatted(Formatting.YELLOW).append(getCoinsMessage(getPrice.getAsDouble()))); + if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice + && !listString.contains("NPC Price") && npcPricesJson != null && npcPricesJson.has(name)) { + + lines.add(new LiteralText(String.format("%-21s", "NPC Price:")) + .formatted(Formatting.YELLOW) + .append(getCoinsMessage(npcPricesJson.get(name).getAsDouble(), count))); } - if ((!listString.contains("Bazaar buy Price") || !listString.contains("Bazaar sell Price")) && bazaarPricesJson != null && bazaarPricesJson.has(name)) { - JsonObject getItem = bazaarPricesJson.getAsJsonObject(name); - list.add(new LiteralText(String.format("%-19s", "Bazaar buy Price:")).formatted(Formatting.GOLD).append(getCoinsMessage(getItem.get("buyPrice").getAsDouble()))); - list.add(new LiteralText(String.format("%-20s", "Bazaar sell Price:")).formatted(Formatting.GOLD).append(getCoinsMessage(getItem.get("sellPrice").getAsDouble()))); - } else if ((!listString.contains("Avg. BIN Price") && auctionPricesJson != null && auctionPricesJson.has(name)) || (!listString.contains("Lowest BIN Price") && lbAuctionPricesJson != null && lbAuctionPricesJson.has(name))) { - if (!listString.contains("Lowest BIN Price") && lbAuctionPricesJson != null && lbAuctionPricesJson.has(name)) { - JsonElement getPrice = lbAuctionPricesJson.get(name); - list.add(new LiteralText(String.format("%-21s", "Lowest BIN Price:")).formatted(Formatting.GOLD).append(getCoinsMessage(getPrice.getAsDouble()))); + + if ((!listString.contains("Avg. BIN Price") && avgPricesJson != null && avgPricesJson.has(name)) + || (!listString.contains("Lowest BIN Price") && lowestPricesJson != null && lowestPricesJson.has(name))) { + + if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN) { + lines.add(new LiteralText(String.format("%-19s", "Lowest BIN Price:")) + .formatted(Formatting.GOLD) + .append(getCoinsMessage(lowestPricesJson.get(name).getAsDouble(), count))); } - if (!listString.contains("Avg. BIN Price") && auctionPricesJson != null && auctionPricesJson.has(name)) { - JsonElement getPrice = auctionPricesJson.get(name); - list.add(new LiteralText(String.format("%-22s", "Avg. BIN Price:")).formatted(Formatting.GOLD).append(getCoinsMessage(getPrice.getAsDouble()))); + + // Change format from Skytils to Moulberry's for Avg. BIN + if (name.contains("PET-")) { + name = name.replace("PET-", "") + .replace("0", "COMMON") + .replace("1", "UNCOMMON") + .replace("2", "RARE") + .replace("3", "EPIC") + .replace("4", "LEGENDARY") + .replace("5", "MYTHIC") + .replace("-", ";"); + } else if (name.contains("ENCHANTED_BOOK-")) { + name = name.replace("ENCHANTED_BOOK-", "").replace("-", ";"); + } else { + name = name.replace(":", "-"); + } + + // has(name) check because Skytils keeps old data but Moulberry not + if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN && avgPricesJson.has(name)) { + lines.add(new LiteralText(String.format("%-21s", "Avg. BIN Price:")) + .formatted(Formatting.GOLD) + .append(getCoinsMessage(avgPricesJson.get(name).getAsDouble(), count))); } + } else if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice + && (!listString.contains("Bazaar buy Price") || !listString.contains("Bazaar sell Price")) + && bazaarPricesJson != null && bazaarPricesJson.has(name)) { + + JsonObject getItem = bazaarPricesJson.getAsJsonObject(name); + lines.add(new LiteralText(String.format("%-18s", "Bazaar buy Price:")) + .formatted(Formatting.GOLD) + .append(getCoinsMessage(getItem.get("buyPrice").getAsDouble(), count))); + lines.add(new LiteralText(String.format("%-19s", "Bazaar sell Price:")) + .formatted(Formatting.GOLD) + .append(getCoinsMessage(getItem.get("sellPrice").getAsDouble(), count))); } - if (!listString.contains("Museum") && isMuseumJson != null && isMuseumJson.has(name)) { + if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate + && !listString.contains("Museum") && isMuseumJson != null && isMuseumJson.has(name)) { + String itemCategory = isMuseumJson.get(name).toString().replaceAll("\"", ""); String format = switch (itemCategory) { - case "Weapons" -> "%-19s"; - case "Armor" -> "%-20s"; - default -> "%-21s"; + case "Weapons" -> "%-18s"; + case "Armor" -> "%-19s"; + default -> "%-20s"; }; - list.add(new LiteralText(String.format(format, "Museum: (" + itemCategory + ")")).formatted(Formatting.LIGHT_PURPLE).append(new LiteralText(timestamp != null ? timestamp : "").formatted(Formatting.RED))); - } else if (!listString.contains("Obtained") && timestamp != null) { - list.add(new LiteralText(String.format("%-23s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE).append(new LiteralText(timestamp).formatted(Formatting.RED))); + + lines.add(new LiteralText(String.format(format, "Museum: (" + itemCategory + ")")) + .formatted(Formatting.LIGHT_PURPLE) + .append(new LiteralText(timestamp != null ? timestamp : "").formatted(Formatting.RED))); + } else if (!listString.contains("Obtained") && timestamp != null + && SkyblockerConfig.get().general.itemTooltip.enableMuseumDate) { + + lines.add(new LiteralText(String.format("%-22s", "Obtained: ")) + .formatted(Formatting.LIGHT_PURPLE) + .append(new LiteralText(timestamp).formatted(Formatting.RED))); } } catch (Exception e) { - assert MinecraftClient.getInstance().player != null; + if (MinecraftClient.getInstance().player == null) { + throw new RuntimeException("[Skyblocker] client.player cannot be null!"); + } MinecraftClient.getInstance().player.sendMessage(new LiteralText(e.toString()), false); } @@ -101,15 +150,16 @@ public class PriceInfoTooltip { NbtCompound ea = tag.getCompound("ExtraAttributes"); if (ea.contains("id", 8)) { - internalName = ea.getString("id").replaceAll(":", "-"); + internalName = ea.getString("id"); } else { return null; } + if ("ENCHANTED_BOOK".equals(internalName)) { NbtCompound enchants = ea.getCompound("enchantments"); for (String enchName : enchants.getKeys()) { - internalName = enchName.toUpperCase() + ";" + enchants.getInt(enchName); + internalName += "-" + enchName.toUpperCase() + "-" + enchants.getInt(enchName); break; } } @@ -117,20 +167,42 @@ public class PriceInfoTooltip { return internalName; } - private static Text getCoinsMessage(double price) { - String priceString = String.format(Locale.ENGLISH, "%1$,.0f", price); - return new LiteralText(priceString + " Coins").formatted(Formatting.DARK_AQUA); + private static Text getCoinsMessage(double price, int count) { + if (count == 1) { + String priceString = String.format(Locale.ENGLISH, "%1$,.0f", price); + return new LiteralText(priceString + " Coins").formatted(Formatting.DARK_AQUA); + } else { + String priceString = String.format(Locale.ENGLISH, "%1$,.0f", price * count); + LiteralText priceText = (LiteralText) new LiteralText(priceString + " Coins ").formatted(Formatting.DARK_AQUA); + priceString = String.format(Locale.ENGLISH, "%1$,.0f", price); + LiteralText priceText2 = (LiteralText) new LiteralText( "(" + priceString + " each)").formatted(Formatting.GRAY); + return priceText.append(priceText2); + } } + public static boolean firstRun = true; public static void init() { - new Thread(PriceInfoTooltip::downloadPrices).start(); - new Thread(PriceInfoTooltip::downloadLBPrices).start(); - new Thread(PriceInfoTooltip::downloadBazaarPrices).start(); - new Thread(PriceInfoTooltip::downloadShopPrices).start(); - new Thread(PriceInfoTooltip::downloadIsMuseum).start(); + TimerTask repeatedTask = new TimerTask() { + public void run() { + if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN || PriceInfoTooltip.firstRun) + CompletableFuture.runAsync(PriceInfoTooltip::downloadAvgPrices); + if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN || PriceInfoTooltip.firstRun) + CompletableFuture.runAsync(PriceInfoTooltip::downloadLowestPrices); + if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice || PriceInfoTooltip.firstRun) + CompletableFuture.runAsync(PriceInfoTooltip::downloadBazaarPrices); + if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice || PriceInfoTooltip.firstRun) + CompletableFuture.runAsync(PriceInfoTooltip::downloadNPCPrices); + if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate || PriceInfoTooltip.firstRun) + CompletableFuture.runAsync(PriceInfoTooltip::downloadIsMuseum); + } + }; + + firstRun = false; + Timer timer = new Timer("PriceInfoDownloader"); + timer.scheduleAtFixedRate(repeatedTask, 0L, 1000L * 60L); } - private static void downloadPrices() { + private static void downloadAvgPrices() { JsonObject result = null; try { URL apiAddr = new URL("https://moulberry.codes/auction_averages_lbin/3day.json.gz"); @@ -144,7 +216,7 @@ public class PriceInfoTooltip { } catch (IOException e) { LogManager.getLogger(PriceInfoTooltip.class.getName()).warn("[Skyblocker] Failed to download auction item prices!", e); } - auctionPricesJson = result; + avgPricesJson = result; } private static void downloadBazaarPrices() { @@ -159,7 +231,7 @@ public class PriceInfoTooltip { bazaarPricesJson = result; } - private static void downloadLBPrices() { + private static void downloadLowestPrices() { JsonObject result = null; try { URL apiAddr = new URL("https://sbe-stole-skytils.design/api/auctions/lowestbins"); @@ -168,10 +240,10 @@ public class PriceInfoTooltip { } catch (IOException e) { LogManager.getLogger(PriceInfoTooltip.class.getName()).warn("[Skyblocker] Failed to download lb item prices!", e); } - lbAuctionPricesJson = result; + lowestPricesJson = result; } - private static void downloadShopPrices() { + private static void downloadNPCPrices() { JsonObject result = null; try { URL apiAddr = new URL("https://hysky.de/api/npcprice"); @@ -180,7 +252,7 @@ public class PriceInfoTooltip { } catch (IOException e) { LogManager.getLogger(PriceInfoTooltip.class.getName()).warn("[Skyblocker] Failed to download shop item prices!", e); } - shopPricesJson = result; + npcPricesJson = result; } private static void downloadIsMuseum() { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java index a0788126..4e5e7f32 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/WikiLookup.java @@ -5,7 +5,6 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import me.xmrvizzy.skyblocker.utils.Utils; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.KeyBinding; @@ -49,7 +48,7 @@ public class WikiLookup { } public static void openWiki(Slot slot){ - if (Utils.isSkyblock){ + if (Utils.isOnSkyblock){ id = getSkyblockId(slot); try { //Setting up a connection with the repo diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java new file mode 100644 index 00000000..e3aa4da4 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java @@ -0,0 +1,34 @@ +package me.xmrvizzy.skyblocker.utils; + +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Events { + public static MinecraftClient client = MinecraftClient.getInstance(); + public static Logger logger = LoggerFactory.getLogger(SkyblockerMod.NAMESPACE); + + public static void onSkyblockJoin(){ + Utils.isOnSkyblock = true; + logger.info("Joined Skyblock"); + if (UpdateChecker.shouldUpdate()){ + TranslatableText linkMessage = new TranslatableText("skyblocker.update.update_message"); + TranslatableText linkMessageEnding = new TranslatableText("skyblocker.update.update_message_end"); + TranslatableText link = new TranslatableText("skyblocker.update.update_link"); + TranslatableText hoverText = new TranslatableText("skyblocker.update.hover_text"); + linkMessage.append(link.styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://modrinth.com/mod/skyblocker-liap/versions")).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverText)))).append(linkMessageEnding); + + client.player.sendMessage(linkMessage, false); + } + } + + public static void onSkyblockDisconnect(){ + logger.info("Disconnected from Skyblock"); + SkyblockerMod.getInstance().discordRPCManager.stop(); + Utils.isOnSkyblock = false; + Utils.isInDungeons = false; + } +} 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/ToastBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java new file mode 100644 index 00000000..910c8a6c --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/ToastBuilder.java @@ -0,0 +1,34 @@ +package me.xmrvizzy.skyblocker.utils; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.toast.Toast; +import net.minecraft.client.toast.ToastManager; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; + +@Environment(value= EnvType.CLIENT) +public class ToastBuilder implements Toast { + private final Text title; + private final Text description; + + public ToastBuilder(Text title, Text description) { + this.title = title; + this.description = description; + } + + @Override + public Toast.Visibility draw(MatrixStack matrices, ToastManager manager, long startTime) { + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + + manager.drawTexture(matrices, 0, 0, 0, 0, this.getWidth(), this.getHeight()); + manager.getClient().textRenderer.draw(matrices, title, 7.0f, 7.0f, -11534256); + manager.getClient().textRenderer.draw(matrices, description, 7.0f, 18.0f, -16777216); + return startTime >= 3000L ? Toast.Visibility.HIDE : Toast.Visibility.SHOW; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java new file mode 100644 index 00000000..fd43d8e3 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java @@ -0,0 +1,55 @@ +package me.xmrvizzy.skyblocker.utils; + +import com.google.gson.*; +import me.xmrvizzy.skyblocker.SkyblockerMod; +import me.xmrvizzy.skyblocker.config.SkyblockerConfig; +import net.fabricmc.loader.api.FabricLoader; +import org.spongepowered.asm.util.VersionNumber; + +import javax.net.ssl.HttpsURLConnection; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class UpdateChecker { + public static boolean shouldUpdate = false; + public static Pattern pattern = Pattern.compile("v(\\d+)\\.(\\d+)\\.(\\d+)"); + public static Pattern localPattern = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)"); + public static Matcher matcher; + public static VersionNumber localVersion = null; + public static VersionNumber latestVersion = null; + public static boolean shouldUpdate(){ + if (SkyblockerConfig.get().general.enableUpdateNotification){ + new Thread(new Runnable() { + @Override + public void run() { + try{ + URL url = new URL("https://api.modrinth.com/v2/project/skyblocker-liap/version"); + + InputStreamReader reader = new InputStreamReader(url.openStream()); + JsonObject versionJson = new Gson().fromJson(reader, JsonElement.class).getAsJsonArray().get(0).getAsJsonObject(); + matcher = pattern.matcher(versionJson.get("version_number").getAsString()); + if (matcher.find()){ + latestVersion = VersionNumber.parse(matcher.group(1) + "." + matcher.group(2) + "." + matcher.group(3)); + } + matcher = localPattern.matcher(FabricLoader.getInstance().getModContainer(SkyblockerMod.NAMESPACE).get().getMetadata().getVersion().getFriendlyString()); + if (matcher.find()){ + localVersion = VersionNumber.parse(matcher.group(1) + "." + matcher.group(2) + "." + matcher.group(3)); + } + if (localVersion != null && latestVersion != null) + if (localVersion.compareTo(latestVersion) < 0) shouldUpdate = true; + + } catch (IOException e) { + e.printStackTrace(); + } + } + }).start(); + } + return shouldUpdate; + } +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java index a4736242..21c30ada 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java @@ -1,7 +1,5 @@ package me.xmrvizzy.skyblocker.utils; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.minecraft.client.MinecraftClient; @@ -12,49 +10,41 @@ import net.minecraft.scoreboard.Team; import net.minecraft.util.Formatting; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; public class Utils { - public static boolean isSkyblock = false; - public static boolean isDungeons = false; + public static boolean isOnSkyblock = false; + public static boolean isInDungeons = false; public static boolean isInjected = false; public static void sbChecker() { - List<String> sidebar = getSidebar(); - if (sidebar == null) { - isSkyblock = false; - isDungeons = false; + MinecraftClient client = MinecraftClient.getInstance(); + List<String> sidebar; + if (client.world == null || client.isInSingleplayer() || (sidebar = getSidebar()) == null) { + isOnSkyblock = false; + isInDungeons = false; return; } String string = sidebar.toString(); if (sidebar.isEmpty()) return; - if (sidebar.get(sidebar.size() - 1).equals("www.hypixel.net")) { - if (sidebar.get(0).contains("SKYBLOCK")){ - if(!isInjected){ - isInjected = true; - ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); - } - isSkyblock = true; - + if (sidebar.get(0).contains("SKYBLOCK") && !isOnSkyblock) { + if (!isInjected) { + isInjected = true; + ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip); } - else isSkyblock = false; + Events.onSkyblockJoin(); - isDungeons = isSkyblock && string.contains("The Catacombs"); - - } else { - isSkyblock = false; - isDungeons = false; } + 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; @@ -66,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; @@ -85,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) { diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 4e7d88bb..52a7b441 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -10,6 +10,12 @@ "text.autoconfig.skyblocker.option.general.bars.enableBars": "Enable Bars", "text.autoconfig.skyblocker.option.general.quicknav": "Quicknav", "text.autoconfig.skyblocker.option.general.quicknav.enableQuicknav": "Enable Quicknav", + "text.autoconfig.skyblocker.option.general.itemTooltip": "Item Tooltip", + "text.autoconfig.skyblocker.option.general.itemTooltip.enableNPCPrice": "Enable NPC Price", + "text.autoconfig.skyblocker.option.general.itemTooltip.enableAvgBIN": "Enable Avg. BIN Price", + "text.autoconfig.skyblocker.option.general.itemTooltip.enableLowestBIN": "Enable Lowest BIN Price", + "text.autoconfig.skyblocker.option.general.itemTooltip.enableBazaarPrice": "Enable Bazaar buy/sell Price", + "text.autoconfig.skyblocker.option.general.itemTooltip.enableMuseumDate": "Enable Museum & Date", "text.autoconfig.skyblocker.category.richPresence": "Discord Rich Presence", "text.autoconfig.skyblocker.option.richPresence.info": "Skyblock Info", @@ -43,5 +49,11 @@ "text.autoconfig.skyblocker.option.messages.hideAOTE": "Hide AOTE Messages", "text.autoconfig.skyblocker.option.messages.hideImplosion": "Hide Implosion Message", "text.autoconfig.skyblocker.option.messages.hideMoltenWave": "Hide Molten Wave Message", - "text.autoconfig.skyblocker.option.messages.hideAds": "Hide Ads From Public Chat" + "text.autoconfig.skyblocker.option.messages.hideAds": "Hide Ads From Public Chat", + + "skyblocker.update.update_message": "§b[§6Skyblocker§b] §2There is a new version available!", + "skyblocker.update.update_link": " §2§nClick here§r", + "skyblocker.update.update_message_end" : " §ato find out about latest features.", + "skyblocker.update.hover_text": "Open Modrinth", + "text.autoconfig.skyblocker.option.general.enableUpdateNotification": "Update Notification" }
\ No newline at end of file |