aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/xmrvizzy/skyblocker
diff options
context:
space:
mode:
authorSpencer <75862693+TacoMonkey11@users.noreply.github.com>2022-05-03 08:10:17 -0400
committerSpencer <75862693+TacoMonkey11@users.noreply.github.com>2022-05-03 08:10:17 -0400
commit5f6085cc15b5275946cee290da75331529673820 (patch)
tree5b4a868b8a7a077baa185436f5d13a0bbd6c9240 /src/main/java/me/xmrvizzy/skyblocker
parentb99e3a36f99cfb0a73248e53cb55c48995490b9c (diff)
parent50566cf7e402094f84ddef998f815ff7a37559db (diff)
downloadSkyblocker-5f6085cc15b5275946cee290da75331529673820.tar.gz
Skyblocker-5f6085cc15b5275946cee290da75331529673820.tar.bz2
Skyblocker-5f6085cc15b5275946cee290da75331529673820.zip
Merge remote-tracking branch 'upstream/master' into discord
# Conflicts: # src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java3
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java17
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java215
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java110
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Events.java35
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java33
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java59
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java10
9 files changed, 274 insertions, 210 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java
index a15b3a96..e9af52f6 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerInitializer.java
@@ -8,6 +8,7 @@ import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud;
import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip;
import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup;
import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry;
+import me.xmrvizzy.skyblocker.utils.UpdateChecker;
import net.fabricmc.api.ClientModInitializer;
public class SkyblockerInitializer implements ClientModInitializer {
@@ -21,5 +22,7 @@ public class SkyblockerInitializer implements ClientModInitializer {
StatsCommand.init();
DwarvenHud.init();
ChatMessageListener.init();
+ UpdateChecker.init();
+ SkyblockerMod.getInstance().discordRPCManager.init();
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
index f3c851f1..f729019f 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
@@ -3,6 +3,7 @@ package me.xmrvizzy.skyblocker;
import me.xmrvizzy.skyblocker.container.ContainerSolverManager;
import me.xmrvizzy.skyblocker.discord.DiscordRPCManager;
import me.xmrvizzy.skyblocker.skyblock.BackpackPreview;
+import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker;
import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonBlaze;
import me.xmrvizzy.skyblocker.utils.Scheduler;
import me.xmrvizzy.skyblocker.utils.Utils;
@@ -14,6 +15,7 @@ public class SkyblockerMod {
public final Scheduler scheduler = new Scheduler();
public final ContainerSolverManager containerSolverManager = new ContainerSolverManager();
public final DiscordRPCManager discordRPCManager = new DiscordRPCManager();
+ public final StatusBarTracker statusBarTracker = new StatusBarTracker();
private SkyblockerMod() {
scheduler.scheduleCyclic(Utils::sbChecker, 20);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
index b9e80bd6..9ceebf9f 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
@@ -5,6 +5,7 @@ import me.xmrvizzy.skyblocker.SkyblockerMod;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import me.xmrvizzy.skyblocker.skyblock.FancyStatusBars;
import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock;
+import me.xmrvizzy.skyblocker.skyblock.StatusBarTracker;
import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap;
import me.xmrvizzy.skyblocker.utils.Utils;
import net.fabricmc.api.EnvType;
@@ -24,14 +25,12 @@ 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.regex.Matcher;
-import java.util.regex.Pattern;
-
@Environment(EnvType.CLIENT)
@Mixin(InGameHud.class)
public abstract class InGameHudMixin extends DrawableHelper {
private static final Identifier SLOT_LOCK = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/slot_lock.png");
+ private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker;
private final FancyStatusBars statusBars = new FancyStatusBars();
private MatrixStack hotbarMatrices;
private int hotbarSlotIndex;
@@ -44,13 +43,21 @@ public abstract class InGameHudMixin extends DrawableHelper {
@Shadow
private int scaledWidth;
+ @Shadow
+ private void setOverlayMessage(Text message, boolean tinted) {
+ }
+
@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.isOnSkyblock)
+ if (!Utils.isOnSkyblock || !SkyblockerConfig.get().general.bars.enableBars)
return;
String msg = message.getString();
- if(statusBars.update(msg))
+ String res = statusBarTracker.update(msg, SkyblockerConfig.get().messages.hideMana);
+ if (msg != res) {
+ if (res != null)
+ setOverlayMessage(Text.of(res), tinted);
ci.cancel();
+ }
}
@Inject(method = "renderHotbar", at = @At("HEAD"))
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java
index 5d3cf9c4..c463ecb5 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java
@@ -7,164 +7,93 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
public class FancyStatusBars extends DrawableHelper {
- private static final MinecraftClient client = MinecraftClient.getInstance();
private static final Identifier BARS = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/bars.png");
- private static final Pattern ACTION_BAR_MANA = Pattern.compile("§b-\\d+ Mana \\(.*\\) +");
- private static final Pattern ACTION_BAR_STATUS = Pattern.compile("^§[6c](\\d+)/(\\d+)❤(\\+§c\\d+.)? +(?:§a(\\d+)§a❈ Defense|([^✎]*?))?(?: +§b(\\d+)/(\\d+)✎ +(?:Mana|§3(\\d+)ʬ))?(?: +(§[27].*))?$");
-
- private final Resource[] resources = new Resource[]{
- // Health
- new Resource(16733525),
- // Mana
- new Resource(5636095),
- // Defense
- new Resource(12106180),
- // Experience
- new Resource(8453920),
- };
-
- public boolean update(String actionBar) {
- if (!SkyblockerConfig.get().general.bars.enableBars) {
- if (SkyblockerConfig.get().messages.hideMana) {
- Matcher mana = ACTION_BAR_MANA.matcher(actionBar);
- if (mana.find()) {
- assert client.player != null;
- client.player.sendMessage(Text.of(actionBar.replace(mana.group(), "")), true);
- return true;
- }
- }
- return false;
- }
-
- Matcher matcher = ACTION_BAR_STATUS.matcher(actionBar);
- if (!matcher.matches())
- return false;
-
- resources[0].setMax(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)));
- if (matcher.group(4) != null) {
- int def = Integer.parseInt(matcher.group(4));
- resources[2].setFillLevel(def, (double) def / ((double) def + 100D));
- }
- if (matcher.group(6) != null) {
- int m = Integer.parseInt(matcher.group(6));
- if (matcher.group(8) != null)
- m += Integer.parseInt(matcher.group(8));
- resources[1].setMax(m, Integer.parseInt(matcher.group(7)));
- }
- assert client.player != null;
- resources[3].setFillLevel(client.player.experienceLevel, client.player.experienceProgress);
- StringBuilder sb = new StringBuilder();
- if (matcher.group(3) != null) {
- sb.append("§c").append(matcher.group(3));
- }
- if (SkyblockerConfig.get().messages.hideMana) {
- Matcher mana = ACTION_BAR_MANA.matcher(actionBar);
- if (!mana.find())
- appendIfNotNull(sb, matcher.group(5));
- } else {
- appendIfNotNull(sb, matcher.group(5));
- }
- appendIfNotNull(sb, matcher.group(9));
+ private final MinecraftClient client = MinecraftClient.getInstance();
+ private final StatusBarTracker statusBarTracker = SkyblockerMod.getInstance().statusBarTracker;
- if (!sb.isEmpty()) {
- assert client.player != null;
- client.player.sendMessage(Text.of(sb.toString()), true);
- }
+ private final StatusBar[] bars = new StatusBar[]{
+ new StatusBar(0, 16733525, 2),
+ new StatusBar(1, 5636095, 2),
+ new StatusBar(2, 12106180, 1),
+ new StatusBar(3, 8453920, 1),
+ };
- return true;
- }
+ private int left;
+ private int top;
- private void appendIfNotNull(StringBuilder sb, String str) {
- if (str == null)
- return;
- if (!sb.isEmpty())
- sb.append(" ");
- sb.append(str);
+ private int fill(int value, int max) {
+ return (32 * value - 1) / max;
}
- private static final int BAR_SPACING = 46;
-
public boolean render(MatrixStack matrices, int scaledWidth, int scaledHeight) {
- if (!SkyblockerConfig.get().general.bars.enableBars)
+ var player = client.player;
+ if (!SkyblockerConfig.get().general.bars.enableBars || player == null)
return false;
- int left = scaledWidth / 2 - 91;
- int top = scaledHeight - 35;
- RenderSystem.setShaderTexture(0, BARS);
- for (int i = 0; i < 4; i++) {
- this.drawTexture(matrices, left + i * BAR_SPACING, top, 0, 9 * i, 43, 9);
- int fillCount = resources[i].getFillCount();
- for (int j = 0; j < fillCount; j++) {
- this.drawTexture(matrices, left + 11 + i * BAR_SPACING, top, 43 + 31 * j, 9 * i, Resource.INNER_WIDTH, 9);
- }
- int fillLevel = resources[i].getFillLevel();
- if (0 < fillLevel)
- this.drawTexture(matrices, left + 11 + i * BAR_SPACING, top, 43 + 31 * fillCount, 9 * i, fillLevel, 9);
- }
- for (int i = 0; i < 4; i++) {
- renderText(matrices, resources[i].getValue(), left + 11 + i * BAR_SPACING, top, resources[i].getTextColor());
- }
- return true;
- }
+ left = scaledWidth / 2 - 91;
+ top = scaledHeight - 35;
- private void renderText(MatrixStack matrices, int value, int left, int top, int color) {
- TextRenderer textRenderer = client.textRenderer;
- String text = Integer.toString(value);
- int x = left + (33 - textRenderer.getWidth(text)) / 2;
- int y = top - 3;
+ bars[0].update(statusBarTracker.getHealth());
+ bars[1].update(statusBarTracker.getMana());
+ int def = statusBarTracker.getDefense();
+ bars[2].fill[0] = fill(def, def + 100);
+ bars[2].text = def;
+ bars[3].fill[0] = (int) (32 * player.experienceProgress);
+ bars[3].text = player.experienceLevel;
- // for i in [-1, 1]
- for (int i = -1; i < 2; i += 2) {
- textRenderer.draw(matrices, text, (float) (x + i), (float) y, 0);
- textRenderer.draw(matrices, text, (float) x, (float) (y + i), 0);
- }
-
- textRenderer.draw(matrices, text, (float) x, (float) y, color);
+ RenderSystem.setShaderTexture(0, BARS);
+ for (var bar : bars)
+ bar.draw(matrices);
+ for (var bar : bars)
+ bar.drawText(matrices);
+ return true;
}
- private static class Resource {
- static final int INNER_WIDTH = 31;
- private int value;
- private int fillLevel;
- private final int textColor;
-
- public Resource(int textColor) {
- this.value = 0;
- this.fillLevel = INNER_WIDTH;
- this.textColor = textColor;
- }
-
- public void setMax(int value, int max) {
- this.value = value;
- this.fillLevel = value * INNER_WIDTH / max;
- }
-
- public void setFillLevel(int value, double fillLevel) {
- this.value = value;
- this.fillLevel = (int) (INNER_WIDTH * fillLevel);
- }
-
- public int getValue() {
- return value;
- }
-
- public int getFillCount() {
- return fillLevel / INNER_WIDTH;
- }
-
- public int getFillLevel() {
- return fillLevel % INNER_WIDTH;
- }
-
- public int getTextColor() {
- return textColor;
+ private class StatusBar {
+ public final int[] fill;
+ private final int offsetX;
+ private final int v;
+ private final int text_color;
+ public Object text;
+
+ private StatusBar(int i, int textColor, int fillNum) {
+ this.offsetX = i * 46;
+ this.v = i * 9;
+ this.text_color = textColor;
+ this.fill = new int[fillNum];
+ this.fill[0] = 33;
+ this.text = "";
+ }
+
+ public void update(StatusBarTracker.Resource resource) {
+ int max = resource.max();
+ int val = resource.value();
+ this.fill[0] = fill(val, max);
+ this.fill[1] = fill(resource.overflow(), max);
+ this.text = val;
+ }
+
+ public void draw(MatrixStack matrices) {
+ drawTexture(matrices, left + offsetX, top, 0, v, 43, 9);
+ for (int i = 0; i < fill.length; i++)
+ drawTexture(matrices, left + offsetX + 11, top, 43 + i * 31, v, fill[i], 9);
+ }
+
+ public void drawText(MatrixStack matrices) {
+ TextRenderer textRenderer = client.textRenderer;
+ String text = this.text.toString();
+ int x = left + this.offsetX + 11 + (33 - textRenderer.getWidth(text)) / 2;
+ int y = top - 3;
+
+ final int[] offsets = new int[]{-1, 1};
+ for (int i : offsets) {
+ textRenderer.draw(matrices, text, (float) (x + i), (float) y, 0);
+ textRenderer.draw(matrices, text, (float) x, (float) (y + i), 0);
+ }
+ textRenderer.draw(matrices, text, (float) x, (float) y, text_color);
}
}
-} \ No newline at end of file
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java
new file mode 100644
index 00000000..0111f75a
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java
@@ -0,0 +1,110 @@
+package me.xmrvizzy.skyblocker.skyblock;
+
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.network.ClientPlayerEntity;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class StatusBarTracker {
+ private static final Pattern STATUS_HEALTH = Pattern.compile("§[6c](\\d+)/(\\d+)❤(?:(\\+§c\\d+. *)| *)");
+ private static final Pattern DEFENSE_STATUS = Pattern.compile("§a(\\d+)§a❈ Defense *");
+ private static final Pattern MANA_USE = Pattern.compile("§b-\\d+ Mana \\(§\\S+(?:\\s\\S+)* *");
+ private static final Pattern MANA_STATUS = Pattern.compile("§b(\\d+)/(\\d+)✎ (?:Mana|§3(\\d+)ʬ) *");
+
+ private Resource health = new Resource(100, 100, 0);
+ private Resource mana = new Resource(100, 100, 0);
+ private int defense = 0;
+
+ public Resource getHealth() {
+ return this.health;
+ }
+
+ public Resource getMana() {
+ return this.mana;
+ }
+
+ public int getDefense() {
+ return this.defense;
+ }
+
+ private int parseInt(Matcher m, int group) {
+ return Integer.parseInt(m.group(group));
+ }
+
+ private void updateMana(Matcher m) {
+ int value = parseInt(m, 1);
+ int max = parseInt(m, 2);
+ int overflow = m.group(3) == null ? 0 : parseInt(m, 3);
+ this.mana = new Resource(value, max, overflow);
+ }
+
+ private void updateHealth(Matcher m) {
+ int value = parseInt(m, 1);
+ int max = parseInt(m, 2);
+ int overflow = 0;
+ ClientPlayerEntity player = null;
+ try {
+ player = MinecraftClient.getInstance().player;
+ }
+ // Is triggered by tests. Couldn't come up with a better solution.
+ catch (NullPointerException ignored) {
+ }
+ if (player != null) {
+ int hp = (int) (player.getHealth() * max / player.getMaxHealth());
+ overflow = value - hp;
+ value = hp;
+ } else if (value > max) {
+ overflow = value - max;
+ value = max;
+ }
+ if (overflow > max)
+ overflow = max;
+ this.health = new Resource(value, max, overflow);
+ }
+
+ private String reset(String str, Matcher m) {
+ str = str.substring(m.end());
+ m.reset(str);
+ return str;
+ }
+
+ public String update(String actionBar, boolean filterManaUse) {
+ var sb = new StringBuilder();
+ Matcher matcher = STATUS_HEALTH.matcher(actionBar);
+ if (!matcher.lookingAt())
+ return actionBar;
+ updateHealth(matcher);
+ if (matcher.group(3) != null) {
+ sb.append("§c❤");
+ sb.append(matcher.group(3));
+ }
+ actionBar = reset(actionBar, matcher);
+ if (matcher.usePattern(MANA_STATUS).lookingAt()) {
+ defense = 0;
+ updateMana(matcher);
+ actionBar = reset(actionBar, matcher);
+ } else {
+ if (matcher.usePattern(DEFENSE_STATUS).lookingAt()) {
+ defense = parseInt(matcher, 1);
+ actionBar = reset(actionBar, matcher);
+ } else if (filterManaUse && matcher.usePattern(MANA_USE).lookingAt()) {
+ actionBar = reset(actionBar, matcher);
+ }
+ if (matcher.usePattern(MANA_STATUS).find()) {
+ updateMana(matcher);
+ matcher.appendReplacement(sb, "");
+ }
+ }
+ matcher.appendTail(sb);
+ String res = sb.toString().trim();
+ return res.isEmpty() ? null : res;
+ }
+
+ public record Resource(
+ int value,
+ int max,
+ int overflow
+ ) {
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java
deleted file mode 100644
index 9c488f34..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/Events.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package me.xmrvizzy.skyblocker.utils;
-
-import me.xmrvizzy.skyblocker.SkyblockerMod;
-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("[Skyblocker] 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);
-
- if (client.player != null) {
- client.player.sendMessage(linkMessage, false);
- }
- }
- }
-
- public static void onSkyblockDisconnect(){
- LOGGER.info("[Skyblocker] Disconnected from Skyblock");
- SkyblockerMod.getInstance().discordRPCManager.stop();
- Utils.isOnSkyblock = false;
- Utils.isInDungeons = false;
- }
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java b/src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java
new file mode 100644
index 00000000..2dd83ffa
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/SkyblockEvents.java
@@ -0,0 +1,33 @@
+package me.xmrvizzy.skyblocker.utils;
+
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.fabricmc.fabric.api.event.Event;
+import net.fabricmc.fabric.api.event.EventFactory;
+
+@Environment(EnvType.CLIENT)
+public final class SkyblockEvents {
+ public static final Event<SkyblockEvents.SkyblockJoin> JOIN = EventFactory.createArrayBacked(SkyblockEvents.SkyblockJoin.class, callbacks -> () -> {
+ for (SkyblockEvents.SkyblockJoin callback : callbacks) {
+ callback.onSkyblockJoin();
+ }
+ });
+
+ public static final Event<SkyblockEvents.SkyblockLeave> LEAVE = EventFactory.createArrayBacked(SkyblockEvents.SkyblockLeave.class, callbacks -> () -> {
+ for (SkyblockEvents.SkyblockLeave callback : callbacks) {
+ callback.onSkyblockLeave();
+ }
+ });
+
+ @Environment(EnvType.CLIENT)
+ @FunctionalInterface
+ public interface SkyblockJoin {
+ void onSkyblockJoin();
+ }
+
+ @Environment(EnvType.CLIENT)
+ @FunctionalInterface
+ public interface SkyblockLeave {
+ void onSkyblockLeave();
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java
index fd43d8e3..8909b5a9 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java
@@ -4,15 +4,15 @@ import com.google.gson.*;
import me.xmrvizzy.skyblocker.SkyblockerMod;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import net.fabricmc.loader.api.FabricLoader;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.text.ClickEvent;
+import net.minecraft.text.HoverEvent;
+import net.minecraft.text.TranslatableText;
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;
@@ -25,31 +25,42 @@ public class UpdateChecker {
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");
+ new Thread(() -> {
+ 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();
+ 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;
}
+
+ public static void init(){
+ SkyblockEvents.JOIN.register(() -> {
+ if (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);
+
+ MinecraftClient.getInstance().player.sendMessage(linkMessage, false);
+ }
+ });
+ }
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
index 5894c9df..46f3a7e1 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
@@ -35,10 +35,14 @@ public class Utils {
isInjected = true;
ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip);
}
- Events.onSkyblockJoin();
-
+ SkyblockEvents.JOIN.invoker().onSkyblockJoin();
+ isOnSkyblock = true;
+ }
+ if (!sidebar.get(0).contains("SKYBLOCK") && isOnSkyblock) {
+ SkyblockEvents.LEAVE.invoker().onSkyblockLeave();
+ Utils.isOnSkyblock = false;
+ Utils.isInDungeons = false;
}
- if (!sidebar.get(0).contains("SKYBLOCK") && isOnSkyblock) Events.onSkyblockDisconnect();
isInDungeons = isOnSkyblock && string.contains("The Catacombs");
}