diff options
author | Spencer <75862693+TacoMonkey11@users.noreply.github.com> | 2022-05-03 08:10:17 -0400 |
---|---|---|
committer | Spencer <75862693+TacoMonkey11@users.noreply.github.com> | 2022-05-03 08:10:17 -0400 |
commit | 5f6085cc15b5275946cee290da75331529673820 (patch) | |
tree | 5b4a868b8a7a077baa185436f5d13a0bbd6c9240 | |
parent | b99e3a36f99cfb0a73248e53cb55c48995490b9c (diff) | |
parent | 50566cf7e402094f84ddef998f815ff7a37559db (diff) | |
download | Skyblocker-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
10 files changed, 348 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"); } diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTrackerTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTrackerTest.java new file mode 100644 index 00000000..da919699 --- /dev/null +++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTrackerTest.java @@ -0,0 +1,74 @@ +package me.xmrvizzy.skyblocker.skyblock; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class StatusBarTrackerTest { + private StatusBarTracker tracker; + + @BeforeEach + void setUp() { + tracker = new StatusBarTracker(); + } + + void assertStats(int hp, int maxHp, int def, int mana, int maxMana, int overflowMana) { + int absorption = 0; + if(hp > maxHp) { + absorption = hp - maxHp; + hp -= absorption; + if(absorption > maxHp) + absorption = maxHp; + } + assertEquals(new StatusBarTracker.Resource(hp, maxHp, absorption), tracker.getHealth()); + assertEquals(new StatusBarTracker.Resource(mana, maxMana, overflowMana), tracker.getMana()); + } + + @Test + void normalStatusBar() { + String res = tracker.update("§c934/1086❤ §a159§a❈ Defense §b562/516✎ Mana", false); + assertNull(res); + assertStats(934, 1086, 159, 562, 516, 0); + } + + @Test + void overflowMana() { + String res = tracker.update("§61605/1305❤ §a270§a❈ Defense §b548/548✎ §3200ʬ", false); + assertNull(res); + assertStats(1605, 1305, 270, 548, 548, 200); + } + + @Test + void regeneration() { + String res = tracker.update("§c2484/2484❤+§c120▄ §a642§a❈ Defense §b2557/2611✎ Mana", false); + assertEquals("§c❤+§c120▄", res); + } + + @Test + void instantTransmission() { + String actionBar = "§c2259/2259❤ §b-20 Mana (§6Instant Transmission§b) §b549/2676✎ Mana"; + assertEquals("§b-20 Mana (§6Instant Transmission§b)", tracker.update(actionBar, false)); + assertNull(tracker.update(actionBar, true)); + } + + @Test + void rapidFire() { + String actionBar = "§c2509/2509❤ §b-48 Mana (§6Rapid-fire§b) §b2739/2811✎ Mana"; + assertEquals("§b-48 Mana (§6Rapid-fire§b)", tracker.update(actionBar, false)); + assertNull(tracker.update(actionBar, true)); + } + + @Test + void zombieSword() { + String actionBar = "§c2509/2509❤ §b-56 Mana (§6Instant Heal§b) §b2674/2821✎ Mana §e§lⓩⓩⓩⓩ§6§lⓄ"; + assertEquals("§b-56 Mana (§6Instant Heal§b) §e§lⓩⓩⓩⓩ§6§lⓄ", tracker.update(actionBar, false)); + assertEquals("§e§lⓩⓩⓩⓩ§6§lⓄ", tracker.update(actionBar, true)); + } + + @Test + void campfire() { + String res = tracker.update("§c17070/25565❤+§c170▃ §65,625 DPS §c1 second §b590/626✎ §3106ʬ", false); + assertEquals("§c❤+§c170▃ §65,625 DPS §c1 second", res); + } +} |