diff options
Diffstat (limited to 'src/main')
19 files changed, 245 insertions, 195 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilter.java index cdaadeda..f8af49ce 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilter.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AutopetFilter.java @@ -4,7 +4,7 @@ import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; -import net.minecraft.text.LiteralText; +import net.minecraft.text.LiteralTextContent; import net.minecraft.text.Text; import java.util.Objects; @@ -19,7 +19,7 @@ public class AutopetFilter extends ChatPatternListener { public boolean onMatch(Text _message, Matcher matcher) { if (SkyblockerConfig.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR) { Objects.requireNonNull(MinecraftClient.getInstance().player).sendMessage( - new LiteralText( + Text.literal( _message.getString().replace("§a§lVIEW RULE", "") ), true); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java index 7e5411aa..eabf0b53 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java @@ -4,9 +4,10 @@ import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.chat.ChatMessageListener; import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.hud.ChatHudListener; +import net.minecraft.client.gui.hud.ChatHud; +import net.minecraft.client.gui.hud.MessageIndicator; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.network.MessageType; +import net.minecraft.network.message.MessageSignatureData; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -15,17 +16,15 @@ 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.UUID; - -@Mixin(ChatHudListener.class) +@Mixin(ChatHud.class) public class ChatHudListenerMixin { @Shadow @Final private MinecraftClient client; - @Inject(method = "onChatMessage", at = @At("HEAD"), cancellable = true) - public void onMessage(MessageType messageType, Text message, UUID senderUuid, CallbackInfo ci) { + @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;ILnet/minecraft/client/gui/hud/MessageIndicator;Z)V", at = @At("HEAD"), cancellable = true) + public void onMessage(Text message, MessageSignatureData signature, int ticks, MessageIndicator indicator, boolean refresh, CallbackInfo ci) { if (!Utils.isOnSkyblock) return; String asString = message.getString(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java index 2d016459..437e10f9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java @@ -6,6 +6,7 @@ import me.xmrvizzy.skyblocker.utils.Utils; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.encryption.PlayerPublicKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -14,8 +15,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ClientPlayerEntity.class) public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { - public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { - super(world, profile); + public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile, PlayerPublicKey publicKey) { + super(world, profile, publicKey); } @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java index 00f32459..de4a25b6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/BackpackPreview.java @@ -31,7 +31,7 @@ public class BackpackPreview extends DrawableHelper { private static final BackpackPreview instance = new BackpackPreview(); private static final Pattern PROFILE_PATTERN = Pattern.compile("Profile: ([a-zA-Z]+)"); private static final Pattern ECHEST_PATTERN = Pattern.compile("Ender Chest.*\\((\\d+)/\\d+\\)"); - private static final Pattern BACKPACK_PATTERN = Pattern.compile("Backpack.*\\((\\d+)/\\d+\\)"); + private static final Pattern BACKPACK_PATTERN = Pattern.compile("Backpack.*\\(Slot #(\\d+)\\)"); private static final int STORAGE_SIZE = 27; private static final Inventory[] storage = new Inventory[STORAGE_SIZE]; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java index dd7ef478..70385e01 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java @@ -6,6 +6,7 @@ import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java index 0111f75a..134ec1f9 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java @@ -7,10 +7,10 @@ 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 static final Pattern STATUS_HEALTH = Pattern.compile("§[6c](\\d+(,\\d\\d\\d)*)/(\\d+(,\\d\\d\\d)*)❤(?:(\\+§c(\\d+(,\\d\\d\\d)*). *)| *)"); + private static final Pattern DEFENSE_STATUS = Pattern.compile("§a(\\d+(,\\d\\d\\d)*)§a❈ Defense *"); + private static final Pattern MANA_USE = Pattern.compile("§b-(\\d+(,\\d\\d\\d)*) Mana \\(§\\S+(?:\\s\\S+)* *"); + private static final Pattern MANA_STATUS = Pattern.compile("§b(\\d+(,\\d\\d\\d)*)/(\\d+(,\\d\\d\\d)*)✎ (?:Mana|§3(\\d+(,\\d\\d\\d)*)ʬ) *"); private Resource health = new Resource(100, 100, 0); private Resource mana = new Resource(100, 100, 0); @@ -29,19 +29,19 @@ public class StatusBarTracker { } private int parseInt(Matcher m, int group) { - return Integer.parseInt(m.group(group)); + return Integer.parseInt(m.group(group).replace(",", "")); } 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); + int max = parseInt(m, 3); + int overflow = m.group(5) == null ? 0 : parseInt(m, 5); this.mana = new Resource(value, max, overflow); } private void updateHealth(Matcher m) { int value = parseInt(m, 1); - int max = parseInt(m, 2); + int max = parseInt(m, 3); int overflow = 0; ClientPlayerEntity player = null; try { @@ -75,9 +75,9 @@ public class StatusBarTracker { if (!matcher.lookingAt()) return actionBar; updateHealth(matcher); - if (matcher.group(3) != null) { + if (matcher.group(5) != null) { sb.append("§c❤"); - sb.append(matcher.group(3)); + sb.append(matcher.group(5)); } actionBar = reset(actionBar, matcher); if (matcher.usePattern(MANA_STATUS).lookingAt()) { diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/ApiKeyListener.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/ApiKeyListener.java index 520229f6..679901cd 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/ApiKeyListener.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/ApiKeyListener.java @@ -6,8 +6,7 @@ import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; - +import net.minecraft.text.TranslatableTextContent; import java.util.regex.Matcher; public class ApiKeyListener extends ChatPatternListener { @@ -24,7 +23,7 @@ public class ApiKeyListener extends ChatPatternListener { protected boolean onMatch(Text message, Matcher matcher) { SkyblockerConfig.get().general.apiKey = matcher.group(1); AutoConfig.getConfigHolder(SkyblockerConfig.class).save(); - MinecraftClient.getInstance().player.sendMessage(new TranslatableText("skyblocker.api.got_key"), false); + MinecraftClient.getInstance().player.sendMessage(Text.translatable("skyblocker.api.got_key"), false); return false; } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/StatsCommand.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/StatsCommand.java index b401905f..4c4cdae1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/StatsCommand.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/api/StatsCommand.java @@ -3,25 +3,30 @@ package me.xmrvizzy.skyblocker.skyblock.api; import com.google.gson.GsonBuilder; import com.mojang.brigadier.arguments.StringArgumentType; import me.xmrvizzy.skyblocker.skyblock.api.records.PlayerProfiles; -import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.text.ClickEvent; -import net.minecraft.text.LiteralText; +import net.minecraft.text.LiteralTextContent; +import net.minecraft.text.Text; public class StatsCommand { public static void init(){ - ClientCommandManager.DISPATCHER.register(ClientCommandManager.literal("skyblocker") - .then(ClientCommandManager.literal("debug") - .then(ClientCommandManager.literal("stats").then(ClientCommandManager.argument("username", StringArgumentType.string()) - .executes(context -> { - new Thread(() -> { - PlayerProfiles playerProfiles = ProfileUtils.getProfiles(StringArgumentType.getString(context, "username")); - for (String profileId : playerProfiles.profiles().keySet()){ - MinecraftClient.getInstance().player.sendMessage(new LiteralText(playerProfiles.profiles().get(profileId).cuteName()) - .styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, new GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(playerProfiles.profiles().get(profileId))))), false); - } - }).start(); - return 1; - }))))); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { + dispatcher.register(ClientCommandManager.literal("skyblocker") + .then(ClientCommandManager.literal("debug") + .then(ClientCommandManager.literal("stats").then(ClientCommandManager.argument("username", StringArgumentType.string()) + .executes(context -> { + new Thread(() -> { + PlayerProfiles playerProfiles = ProfileUtils.getProfiles(StringArgumentType.getString(context, "username")); + for (String profileId : playerProfiles.profiles().keySet()){ + MinecraftClient.getInstance().player.sendMessage(Text.literal(playerProfiles.profiles().get(profileId).cuteName()) + .styled(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, new GsonBuilder().serializeNulls().setPrettyPrinting().create().toJson(playerProfiles.profiles().get(profileId))))), false); + } + }).start(); + return 1; + }))))); + }); + } } 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 3af82b6e..c06822de 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java @@ -4,7 +4,8 @@ import me.xmrvizzy.skyblocker.SkyblockerMod; import me.xmrvizzy.skyblocker.chat.ChatFilterResult; import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.utils.Utils; -import net.fabricmc.fabric.api.client.command.v1.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.text.Text; @@ -25,14 +26,17 @@ public class Reparty extends ChatPatternListener { public Reparty() { super("^(?:You are not currently in a party\\.|Party (?:Membe|Moderato)rs(?: \\(([0-9]+)\\)|:( .*)))$"); this.repartying = false; - ClientCommandManager.DISPATCHER.register( - ClientCommandManager.literal("rp").executes(context -> { - if (!Utils.isOnSkyblock || this.repartying || client.player == null) return 0; - this.repartying = true; - client.player.sendChatMessage("/p list"); - return 0; - }) - ); + ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { + dispatcher.register(ClientCommandManager.literal("rp").executes(context -> { + if (!Utils.isOnSkyblock || this.repartying || client.player == null) return 0; + this.repartying = true; + client.player.sendChatMessage("/p list", Text.of("/p list")); + return 0; + })); + }); + + + } @Override @@ -73,6 +77,6 @@ public class Reparty extends ChatPatternListener { } private void sendCommand(ClientPlayerEntity player, String command, int delay) { - skyblocker.scheduler.schedule(() -> player.sendChatMessage(command), delay * BASE_DELAY); + skyblocker.scheduler.schedule(() -> player.sendChatMessage(command, Text.of(command)), delay * BASE_DELAY); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java index 7f22f59b..73511c00 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java @@ -5,7 +5,6 @@ import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -32,7 +31,7 @@ public class Trivia extends ChatPatternListener { if (!solutions.contains(riddle)) { ClientPlayerEntity player = MinecraftClient.getInstance().player; if (player != null) - MinecraftClient.getInstance().player.sendMessage(new LiteralText(" " + Formatting.GOLD + matcher.group(2) + Formatting.RED + " " + riddle), false); + MinecraftClient.getInstance().player.sendMessage(Text.of(" " + Formatting.GOLD + matcher.group(2) + Formatting.RED + " " + riddle), false); return player != null; } } else diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java index de571130..a75ab412 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java @@ -4,7 +4,8 @@ import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.text.LiteralText; +import net.minecraft.text.LiteralTextContent; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; import java.util.ArrayList; @@ -55,7 +56,7 @@ public class DwarvenHud { DrawableHelper.fill(matrixStack, hudX, hudY, hudX + 200, hudY + (20 * commissions.size()), 0x64000000); int y = 0; for (Commission commission : commissions) { - client.textRenderer.drawWithShadow(matrixStack, new LiteralText(commission.commission).styled(style -> style.withColor(Formatting.AQUA)).append(new LiteralText(": " + commission.progression).styled(style -> style.withColor(Formatting.GREEN))), hudX + 5, hudY + y + 5, 0xFFFFFFFF); + client.textRenderer.drawWithShadow(matrixStack, Text.literal(commission.commission).styled(style -> style.withColor(Formatting.AQUA)).append(Text.literal(": " + commission.progression).styled(style -> style.withColor(Formatting.GREEN))), hudX + 5, hudY + y + 5, 0xFFFFFFFF); y += 20; } } 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 ccd47c5a..230f5abe 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java @@ -5,8 +5,7 @@ import me.xmrvizzy.skyblocker.chat.ChatPatternListener; import me.xmrvizzy.skyblocker.config.SkyblockerConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; - +import net.minecraft.text.TranslatableTextContent; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; @@ -35,18 +34,18 @@ public class Fetchur extends ChatPatternListener { 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("circular and sometimes moves", new TranslatableText("item.minecraft.compass").getString()); + answers.put("red and soft", Text.translatable("block.minecraft.red_wool").getString()); + answers.put("yellow and see through", Text.translatable("block.minecraft.yellow_stained_glass").getString()); + answers.put("circular and sometimes moves", Text.translatable("item.minecraft.compass").getString()); answers.put("expensive minerals", "Mithril"); - answers.put("useful during celebrations", new TranslatableText("item.minecraft.firework_rocket").getString()); + answers.put("useful during celebrations", Text.translatable("item.minecraft.firework_rocket").getString()); answers.put("hot and gives energy", "Cheap / Decent Coffee"); - answers.put("tall and can be opened", new TranslatableText("block.minecraft.oak_door").getString()); - answers.put("brown and fluffy", new TranslatableText("item.minecraft.rabbit_foot").getString()); + answers.put("tall and can be opened", Text.translatable("block.minecraft.oak_door").getString()); + answers.put("brown and fluffy", Text.translatable("item.minecraft.rabbit_foot").getString()); answers.put("explosive but more than usual", "Superboom TNT"); - answers.put("wearable and grows", new TranslatableText("block.minecraft.pumpkin").getString()); - answers.put("shiny and makes sparks", new TranslatableText("item.minecraft.flint_and_steel").getString()); - answers.put("red and white and you can mine it", new TranslatableText("block.minecraft.nether_quartz_ore").getString()); - answers.put("round and green, or purple", new TranslatableText("item.minecraft.ender_pearl").getString()); + answers.put("wearable and grows", Text.translatable("block.minecraft.pumpkin").getString()); + answers.put("shiny and makes sparks", Text.translatable("item.minecraft.flint_and_steel").getString()); + answers.put("red and white and you can mine it", Text.translatable("block.minecraft.nether_quartz_ore").getString()); + answers.put("round and green, or purple", Text.translatable("item.minecraft.ender_pearl").getString()); } }
\ No newline at end of file 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 06395898..0599b5b2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java @@ -33,7 +33,7 @@ public class Puzzler extends ChatPatternListener { } ClientWorld world = MinecraftClient.getInstance().world; if (world != null) - world.setBlockStateWithoutNeighborUpdates(new BlockPos(x, 195, z), Blocks.CRIMSON_PLANKS.getDefaultState()); + world.setBlockState(new BlockPos(x, 195, z), Blocks.CRIMSON_PLANKS.getDefaultState()); return false; } }
\ No newline at end of file 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 e328c8c1..9c681cb1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java @@ -9,9 +9,10 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.item.TooltipContext; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.LiteralText; +import net.minecraft.text.LiteralTextContent; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.TranslatableTextContent; import net.minecraft.util.Formatting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,7 +25,6 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.concurrent.CompletableFuture; @@ -34,12 +34,12 @@ public class PriceInfoTooltip { private static final Logger LOGGER = LoggerFactory.getLogger(PriceInfoTooltip.class.getName()); private static final SkyblockerMod skyblocker = SkyblockerMod.getInstance(); private static final MinecraftClient client = MinecraftClient.getInstance(); - private static JsonObject npcJson; - private static JsonObject bazaarJson; - private static JsonObject oneDayAvgJson; - private static JsonObject threeDayAvgJson; - private static JsonObject lowestBINJson; - private static JsonObject museumJson; + private static JsonObject npcPricesJson; + private static JsonObject bazaarPricesJson; + private static JsonObject oneDayAvgPricesJson; + private static JsonObject threeDayAvgPricesJson; + private static JsonObject lowestPricesJson; + private static JsonObject isMuseumJson; private static boolean nullMsgSend = false; private final static Gson gson = new Gson(); @@ -51,34 +51,39 @@ public class PriceInfoTooltip { int count = stack.getCount(); String timestamp = getTimestamp(stack); - boolean bazaarOpened = lines.stream().anyMatch(each -> - each.getString().contains("Buy price:") || each.getString().contains("Sell price:")); + boolean bazaarOpened = lines.stream().anyMatch(each -> each.getString().contains("Buy price:") || each.getString().contains("Sell price:")); if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice) { - if (npcJson == null) { - nullMessage(); - } else if (npcJson.has(name)) { - lines.add(new LiteralText(String.format("%-21s", "NPC Price:")) + if (npcPricesJson == null) { + if (!nullMsgSend) { + client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false); + nullMsgSend = true; + } + } else if (npcPricesJson.has(name)) { + lines.add(Text.literal(String.format("%-21s", "NPC Price:")) .formatted(Formatting.YELLOW) - .append(getCoinsMessage(npcJson.get(name).getAsDouble(), count))); + .append(getCoinsMessage(npcPricesJson.get(name).getAsDouble(), count))); } } boolean bazaarExist = false; if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice && !bazaarOpened) { - if (bazaarJson == null) { - nullMessage(); - } else if (bazaarJson.has(name)) { - JsonObject getItem = bazaarJson.getAsJsonObject(name); - lines.add(new LiteralText(String.format("%-18s", "Bazaar buy Price:")) + if (bazaarPricesJson == null) { + if (!nullMsgSend) { + client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false); + nullMsgSend = true; + } + } else if (bazaarPricesJson.has(name)) { + JsonObject getItem = bazaarPricesJson.getAsJsonObject(name); + lines.add(Text.literal(String.format("%-18s", "Bazaar buy Price:")) .formatted(Formatting.GOLD) .append(getItem.get("buyPrice").isJsonNull() - ? new TranslatableText("skyblocker.itemTooltip.noData") + ? Text.literal("No data").formatted(Formatting.RED) : getCoinsMessage(getItem.get("buyPrice").getAsDouble(), count))); - lines.add(new LiteralText(String.format("%-19s", "Bazaar sell Price:")) + lines.add(Text.literal(String.format("%-19s", "Bazaar sell Price:")) .formatted(Formatting.GOLD) .append(getItem.get("sellPrice").isJsonNull() - ? new TranslatableText("skyblocker.itemTooltip.noData") + ? Text.literal("No data").formatted(Formatting.RED) : getCoinsMessage(getItem.get("sellPrice").getAsDouble(), count))); bazaarExist = true; } @@ -86,19 +91,25 @@ public class PriceInfoTooltip { // bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN && !bazaarOpened && !bazaarExist) { - if (lowestBINJson == null) { - nullMessage(); - } else if (lowestBINJson.has(name)) { - lines.add(new LiteralText(String.format("%-19s", "Lowest BIN Price:")) + if (lowestPricesJson == null) { + if (!nullMsgSend) { + client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false); + nullMsgSend = true; + } + } else if (lowestPricesJson.has(name)) { + lines.add(Text.literal(String.format("%-19s", "Lowest BIN Price:")) .formatted(Formatting.GOLD) - .append(getCoinsMessage(lowestBINJson.get(name).getAsDouble(), count))); + .append(getCoinsMessage(lowestPricesJson.get(name).getAsDouble(), count))); } } if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN) { - if (threeDayAvgJson == null || oneDayAvgJson == null) { - nullMessage(); - } else if (threeDayAvgJson.has(name) || oneDayAvgJson.has(name)) { + if (threeDayAvgPricesJson == null || oneDayAvgPricesJson == null) { + if (!nullMsgSend) { + client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false); + nullMsgSend = true; + } + } else if (threeDayAvgPricesJson.has(name) || oneDayAvgPricesJson.has(name)) { /* We are skipping check average prices for potions and runes because there is no data for their in API. @@ -126,50 +137,46 @@ public class PriceInfoTooltip { // "No data" line because of API not keeping old data, it causes NullPointerException if (!name.isEmpty() && (type == SkyblockerConfig.Average.ONE_DAY || type == SkyblockerConfig.Average.BOTH)) { - lines.add(new LiteralText(String.format("%-19s", "1 Day Avg. Price:")) + lines.add(Text.literal(String.format("%-19s", "1 Day Avg. Price:")) .formatted(Formatting.GOLD) - .append(oneDayAvgJson.get(name) == null - ? new TranslatableText("skyblocker.itemTooltip.noData") - : getCoinsMessage(oneDayAvgJson.get(name).getAsDouble(), count))); + .append(oneDayAvgPricesJson.get(name) == null + ? Text.literal("No data").formatted(Formatting.RED) + : getCoinsMessage(oneDayAvgPricesJson.get(name).getAsDouble(), count))); } if (!name.isEmpty() && (type == SkyblockerConfig.Average.THREE_DAY || type == SkyblockerConfig.Average.BOTH)) { - lines.add(new LiteralText(String.format("%-19s", "3 Day Avg. Price:")) + lines.add(Text.literal(String.format("%-19s", "3 Day Avg. Price:")) .formatted(Formatting.GOLD) - .append(threeDayAvgJson.get(name) == null - ? new TranslatableText("skyblocker.itemTooltip.noData") - : getCoinsMessage(threeDayAvgJson.get(name).getAsDouble(), count))); + .append(threeDayAvgPricesJson.get(name) == null + ? Text.literal("No data").formatted(Formatting.RED) + : getCoinsMessage(threeDayAvgPricesJson.get(name).getAsDouble(), count))); } } } if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate && !bazaarOpened) { - if (museumJson == null) { - nullMessage(); - } else if (museumJson.has(name)) { - String itemCategory = museumJson.get(name).toString().replaceAll("\"", ""); + if (isMuseumJson == null) { + if (!nullMsgSend) { + client.player.sendMessage(Text.translatable("skyblocker.itemTooltip.nullMessage"), false); + nullMsgSend = true; + } + } else if (isMuseumJson.has(name)) { + String itemCategory = isMuseumJson.get(name).toString().replaceAll("\"", ""); String format = switch (itemCategory) { case "Weapons" -> "%-18s"; case "Armor" -> "%-19s"; default -> "%-20s"; }; - lines.add(new LiteralText(String.format(format, "Museum: (" + itemCategory + ")")) + lines.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) .formatted(Formatting.LIGHT_PURPLE) - .append(new LiteralText(timestamp != null ? timestamp : "").formatted(Formatting.RED))); + .append(Text.literal(timestamp != null ? timestamp : "").formatted(Formatting.RED))); } else if (timestamp != null) { - lines.add(new LiteralText(String.format("%-21s", "Obtained: ")) + lines.add(Text.literal(String.format("%-21s", "Obtained: ")) .formatted(Formatting.LIGHT_PURPLE) - .append(new LiteralText(timestamp).formatted(Formatting.RED))); + .append(Text.literal(timestamp).formatted(Formatting.RED))); } } } - public static void nullMessage() { - if (!nullMsgSend) { - client.player.sendMessage(new TranslatableText("skyblocker.itemTooltip.nullMessage"), false); - nullMsgSend = true; - } - } - public static NbtCompound getInternalNameForItem(ItemStack stack) { if (stack == null) return null; return stack.getNbt(); @@ -239,8 +246,7 @@ public class PriceInfoTooltip { String extended = ea.contains("extended") ? "-EXTENDED" : ""; String splash = ea.contains("splash") ? "-SPLASH" : ""; if (ea.contains("potion") && ea.contains("potion_level")) { - internalName += "-" + ea.getString("potion").toUpperCase(Locale.ENGLISH) - + "-" + ea.getInt("potion_level") + internalName += "-" + ea.getString("potion").toUpperCase(Locale.ENGLISH) + "-" + ea.getInt("potion_level") + enhanced + extended + splash; } } else if ("RUNE".equals(internalName)) { @@ -256,24 +262,21 @@ public class PriceInfoTooltip { } private static Text getCoinsMessage(double price, int count) { - String slotPrice = String.format(Locale.ENGLISH, "%1$,.1f", price * count); - LiteralText slotText = (LiteralText) new LiteralText(slotPrice + " Coins ").formatted(Formatting.DARK_AQUA); - - if (count != 1) { - String unitPrice = String.format(Locale.ENGLISH, "%1$,.1f", price); - slotText.append(new LiteralText( "(" + unitPrice + " each)").formatted(Formatting.GRAY)); + if (count == 1) { + String priceString = String.format(Locale.ENGLISH, "%1$,.1f", price); + return Text.literal(priceString + " Coins").formatted(Formatting.DARK_AQUA); + } else { + String priceString = String.format(Locale.ENGLISH, "%1$,.1f", price * count); + MutableText priceText = Text.literal(priceString + " Coins ").formatted(Formatting.DARK_AQUA); + priceString = String.format(Locale.ENGLISH, "%1$,.1f", price); + MutableText priceText2 = Text.literal( "(" + priceString + " each)").formatted(Formatting.GRAY); + return priceText.append(priceText2); } - return slotText; } - private final static HashMap<String, String> downloadList; - - private static int minute = -1; - - /** - * If these options is true beforehand, the client will get first data of these options while loading. - * After then, it will only fetch the data if it is on Skyblock. - */ + // If these options is true beforehand, the client will get first data of these options while loading. + // After then, it will only fetch the data if it is on Skyblock. + public static int minute = -1; public static void init() { skyblocker.scheduler.scheduleCyclic(() -> { if (!Utils.isOnSkyblock && 0 < minute++) { @@ -282,65 +285,105 @@ public class PriceInfoTooltip { } List<CompletableFuture<Void>> futureList = new ArrayList<>(); - - if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN - && (oneDayAvgJson == null || threeDayAvgJson == null || minute % 5 == 0)) { + if ((SkyblockerConfig.get().general.itemTooltip.enableAvgBIN) && (oneDayAvgPricesJson == null || threeDayAvgPricesJson == null || minute % 5 == 0)) { SkyblockerConfig.Average type = SkyblockerConfig.get().general.itemTooltip.avg; - if (oneDayAvgJson == null || type == SkyblockerConfig.Average.ONE_DAY || type == SkyblockerConfig.Average.BOTH) - futureList.add(CompletableFuture.runAsync(() -> - oneDayAvgJson = download("average BIN prices", "1day.json.gz"))); - - if (threeDayAvgJson == null || type == SkyblockerConfig.Average.THREE_DAY || type == SkyblockerConfig.Average.BOTH) - futureList.add(CompletableFuture.runAsync(() -> - threeDayAvgJson = download("average BIN prices", "3day.json.gz"))); + if (type == SkyblockerConfig.Average.BOTH || oneDayAvgPricesJson == null || threeDayAvgPricesJson == null) { + futureList.add(CompletableFuture.runAsync(() -> downloadAvgPrices(SkyblockerConfig.Average.THREE_DAY))); + futureList.add(CompletableFuture.runAsync(() -> downloadAvgPrices(SkyblockerConfig.Average.ONE_DAY))); + } else { + futureList.add(CompletableFuture.runAsync(() -> downloadAvgPrices(type))); + } } if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN) { - futureList.add(CompletableFuture.runAsync(() -> - lowestBINJson = download("lowest BIN prices", null))); + futureList.add(CompletableFuture.runAsync(PriceInfoTooltip::downloadLowestPrices)); } if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice) { - futureList.add(CompletableFuture.runAsync(() -> - bazaarJson = download("bazaar prices", null))); + futureList.add(CompletableFuture.runAsync(PriceInfoTooltip::downloadBazaarPrices)); } - if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice && npcJson == null) { - futureList.add(CompletableFuture.runAsync(() -> - npcJson = download("NPC prices", null))); + if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice && npcPricesJson == null) { + futureList.add(CompletableFuture.runAsync(PriceInfoTooltip::downloadNPCPrices)); } - if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate && museumJson == null) { - futureList.add(CompletableFuture.runAsync(() -> - museumJson = download("museum items", null))); + if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate && isMuseumJson == null) { + futureList.add(CompletableFuture.runAsync(PriceInfoTooltip::downloadIsMuseum)); } - minute++; CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])) .whenComplete((unused, throwable) -> nullMsgSend = false); }, 1200); } - private static JsonObject download(String key, String avgType) { - String rest = avgType == null ? "" : avgType; + private static void downloadAvgPrices(SkyblockerConfig.Average type) { + JsonObject result = null; + String avgDay = null; + switch (type) { + case ONE_DAY -> avgDay = "1day.json.gz"; + case THREE_DAY -> avgDay = "3day.json.gz"; + } try { - URL apiAddr = new URL(downloadList.get(key).concat(rest)); + URL apiAddr = new URL("https://moulberry.codes/auction_averages_lbin/" + avgDay); try (InputStream src = apiAddr.openStream()) { - GZIPInputStream gzipOutput = avgType == null ? null : new GZIPInputStream(src); - try (InputStreamReader reader = new InputStreamReader(avgType == null ? src : gzipOutput)) { - return new Gson().fromJson(reader, JsonObject.class); + try (GZIPInputStream gzipOutput = new GZIPInputStream(src)) { + try (InputStreamReader reader = new InputStreamReader(gzipOutput)) { + result = new Gson().fromJson(reader, JsonObject.class); + } } } } catch (IOException e) { - LOGGER.warn("[Skyblocker] Failed to download " + key + "!", e); - return null; + LOGGER.warn("[Skyblocker] Failed to download average BIN prices!", e); } + switch (type) { + case ONE_DAY -> oneDayAvgPricesJson = result; + case THREE_DAY -> threeDayAvgPricesJson = result; + } + } + + private static void downloadBazaarPrices() { + JsonObject result = null; + try { + URL apiAddr = new URL("https://hysky.de/api/bazaar"); + InputStreamReader reader = new InputStreamReader(apiAddr.openStream()); + result = new Gson().fromJson(reader, JsonObject.class); + } catch (IOException e) { + LOGGER.warn("[Skyblocker] Failed to download bazaar prices!", e); + } + bazaarPricesJson = result; } - static { - downloadList = new HashMap<>(); - downloadList.put("average BIN prices", "https://moulberry.codes/auction_averages_lbin/"); - downloadList.put("lowest BIN prices", "https://skytils.gg/api/auctions/lowestbins"); - downloadList.put("bazaar prices", "https://hysky.de/api/bazaar"); - downloadList.put("NPC prices", "https://hysky.de/api/npcprice"); - downloadList.put("museum items", "https://hysky.de/api/museum"); + private static void downloadLowestPrices() { + JsonObject result = null; + try { + URL apiAddr = new URL("https://skytils.gg/api/auctions/lowestbins"); + InputStreamReader reader = new InputStreamReader(apiAddr.openStream()); + result = new Gson().fromJson(reader, JsonObject.class); + } catch (IOException e) { + LOGGER.warn("[Skyblocker] Failed to download lowest BIN prices!", e); + } + lowestPricesJson = result; + } + + private static void downloadNPCPrices() { + JsonObject result = null; + try { + URL apiAddr = new URL("https://hysky.de/api/npcprice"); + InputStreamReader reader = new InputStreamReader(apiAddr.openStream()); + result = new Gson().fromJson(reader, JsonObject.class); + } catch (IOException e) { + LOGGER.warn("[Skyblocker] Failed to download NPC prices!", e); + } + npcPricesJson = result; + } + + private static void downloadIsMuseum() { + JsonObject result = null; + try { + URL apiAddr = new URL("https://hysky.de/api/museum"); + InputStreamReader reader = new InputStreamReader(apiAddr.openStream()); + result = new Gson().fromJson(reader, JsonObject.class); + } catch (IOException e) { + LOGGER.warn("[Skyblocker] Failed to download museum items!", e); + } + isMuseumJson = result; } -}
\ No newline at end of file +} diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java index a7adb4f7..a635cea2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ItemListWidget.java @@ -13,7 +13,7 @@ import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.screen.AbstractRecipeScreenHandler; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; +import net.minecraft.text.TranslatableTextContent; import net.minecraft.util.Formatting; @Environment(value= EnvType.CLIENT) @@ -57,7 +57,7 @@ public class ItemListWidget extends RecipeBookWidget implements Drawable, Select this.drawTexture(matrices, i, j, 1, 1, 147, 166); this.searchField = ((RecipeBookWidgetAccessor)this).getSearchField(); if (!this.searchField.isFocused() && this.searchField.getText().isEmpty()) { - Text hintText = (new TranslatableText("gui.recipebook.search_hint")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY); + Text hintText = (Text.translatable("gui.recipebook.search_hint")).formatted(Formatting.ITALIC).formatted(Formatting.GRAY); drawTextWithShadow(matrices, this.client.textRenderer, hintText, i + 25, j + 14, -1); } else { this.searchField.render(matrices, mouseX, mouseY, delta); diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java index c31fa653..ac381240 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNavButton.java @@ -11,7 +11,8 @@ import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; -import net.minecraft.text.LiteralText; +import net.minecraft.text.LiteralTextContent; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; @Environment(value=EnvType.CLIENT) @@ -32,7 +33,7 @@ public class QuickNavButton extends ClickableWidget { private final ItemStack icon; public QuickNavButton(int index, boolean toggled, String command, ItemStack icon) { - super(0, 0, 28, 32, LiteralText.EMPTY); + super(0, 0, 28, 32, Text.empty()); this.index = index; this.toggled = toggled; this.command = command; @@ -59,7 +60,7 @@ public class QuickNavButton extends ClickableWidget { public void onClick(double mouseX, double mouseY) { if (!this.toggled) { this.toggled = true; - CLIENT.player.sendChatMessage(command); + CLIENT.player.sendChatMessage(command, Text.of(command)); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtilsLiving.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtilsLiving.java index 962421b7..c1111b36 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtilsLiving.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtilsLiving.java @@ -72,7 +72,7 @@ public class RenderUtilsLiving { } else { matrices.push(); matrices.translate(1, 1, 0); - mc.textRenderer.draw(text.copy(), -halfWidth, 0f, 0x202020, false, matrices.peek().getPositionMatrix(), immediate, true, 0, 0xf000f0); + mc.textRenderer.draw(text.copyContentOnly(), -halfWidth, 0f, 0x202020, false, matrices.peek().getPositionMatrix(), immediate, true, 0, 0xf000f0); immediate.draw(); matrices.pop(); } diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java index ec028347..3a8f85f2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java +++ b/src/main/java/me/xmrvizzy/skyblocker/utils/UpdateChecker.java @@ -5,9 +5,7 @@ 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 net.minecraft.text.*; import org.spongepowered.asm.util.VersionNumber; import java.io.IOException; @@ -23,8 +21,7 @@ public class UpdateChecker { public static Matcher matcher; public static VersionNumber localVersion = null; public static VersionNumber latestVersion = null; - - public static void checkVersion(){ + public static boolean shouldUpdate(){ if (SkyblockerConfig.get().general.enableUpdateNotification){ new Thread(() -> { try{ @@ -48,17 +45,18 @@ public class UpdateChecker { } }).start(); } + return shouldUpdate; } public static void init(){ - checkVersion(); 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"); + if (shouldUpdate()) { + MutableText linkMessage = Text.translatable("skyblocker.update.update_message"); + MutableText linkMessageEnding = Text.translatable("skyblocker.update.update_message_end"); + MutableText link = Text.translatable("skyblocker.update.update_link"); + MutableText hoverText = Text.translatable("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/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 6358a234..6e9858b1 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -26,10 +26,10 @@ "skyblocker.mixins.json" ], "depends": { - "fabricloader": ">=0.13.3", + "fabricloader": ">=0.14.6", "fabric": "*", "cloth-config2": "*", - "minecraft": ["1.18.x"] + "minecraft": [">=1.19.1"] }, "custom": { "modmenu": { |