diff options
Diffstat (limited to 'src')
11 files changed, 141 insertions, 71 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 8533ddfa..1758026a 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -14,6 +14,7 @@ import de.hysky.skyblocker.skyblock.garden.VisitorHelper; import de.hysky.skyblocker.skyblock.item.ItemProtection; import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; import de.hysky.skyblocker.skyblock.item.WikiLookup; +import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextManager; import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview; @@ -314,16 +315,31 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V")) private void skyblocker$drawSlotText(DrawContext context, Slot slot, CallbackInfo ci) { - Text text = SlotTextManager.getText(slot); - if (text == null) return; + List<PositionedText> textList = SlotTextManager.getText(slot); + if (textList.isEmpty()) return; MatrixStack matrices = context.getMatrices(); - matrices.push(); - matrices.translate(0.0f, 0.0f, 200.0f); - int length = textRenderer.getWidth(text); - if (length > 16) { - matrices.scale(16.0f / length, 16.0f / length, 1.0f); //Make them fit in the slot. FYI, a slot is sized 16x16. + + for (PositionedText positionedText : textList) { + matrices.push(); + matrices.translate(0.0f, 0.0f, 200.0f); + int length = textRenderer.getWidth(positionedText.text()); + if (length > 16) { + matrices.scale(16.0f / length, 16.0f / length, 1.0f); //Make them fit in the slot. FYI, a slot is sized 16×16. + final float x = (slot.x * length / 16.0f) - slot.x; //Save in a variable to not recalculate + switch (positionedText.position()) { + case TOP_LEFT, TOP_RIGHT -> matrices.translate(x, (slot.y * length / 16.0f) - slot.y, 0.0f); + case BOTTOM_LEFT, BOTTOM_RIGHT -> matrices.translate(x, ((slot.y + 16f - textRenderer.fontHeight + 1.5f + 1f) * length / 16.0f) - slot.y, 0.0f); + } + } else { + switch (positionedText.position()) { + case TOP_LEFT -> { /*Do Nothing*/ } + case TOP_RIGHT -> matrices.translate(16f - length, 0.0f, 0.0f); + case BOTTOM_LEFT -> matrices.translate(0.0f, 16f - textRenderer.fontHeight + 1.5f, 0.0f); + case BOTTOM_RIGHT -> matrices.translate(16f - length, 16f - textRenderer.fontHeight + 1.5f, 0.0f); + } + } + context.drawText(textRenderer, positionedText.text(), slot.x, slot.y, 0xFFFFFF, true); + matrices.pop(); } - context.drawText(textRenderer, text, length > 16 ? (int) (slot.x * length / 16f) : slot.x, length > 16 ? (int) ((slot.y + 9) * length / 16f) + 1 : slot.y + 9, 0xFFFFFF, true); - matrices.pop(); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/PositionedText.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/PositionedText.java new file mode 100644 index 00000000..4738038a --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/PositionedText.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.skyblock.item.slottext; + +import net.minecraft.text.Text; + +public record PositionedText(Text text, TextPosition position) { + public static PositionedText BOTTOM_LEFT(Text text) { + return new PositionedText(text, TextPosition.BOTTOM_LEFT); + } + + public static PositionedText BOTTOM_RIGHT(Text text) { + return new PositionedText(text, TextPosition.BOTTOM_RIGHT); + } + + public static PositionedText TOP_LEFT(Text text) { + return new PositionedText(text, TextPosition.TOP_LEFT); + } + + public static PositionedText TOP_RIGHT(Text text) { + return new PositionedText(text, TextPosition.TOP_RIGHT); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java index 8db4cde5..71659430 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java @@ -2,9 +2,10 @@ package de.hysky.skyblocker.skyblock.item.slottext; import de.hysky.skyblocker.skyblock.ChestValue; import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.regex.Pattern; /** @@ -16,18 +17,28 @@ public abstract class SlotTextAdder { * @implNote Don't end your regex with a {@code $} as {@link ChestValue} appends text to the end of the title, * so the regex will stop matching if the player uses it. */ - public final Pattern titlePattern; + public final @Nullable Pattern titlePattern; - protected SlotTextAdder(String titlePattern) { + /** + * Utility constructor that will compile the given string into a pattern. + * + * @see #SlotTextAdder(Pattern) + */ + protected SlotTextAdder(@NotNull String titlePattern) { this(Pattern.compile(titlePattern)); } - protected SlotTextAdder(Pattern titlePattern) { + /** + * Creates a SlotTextAdder that will be applied to screens with titles that match the given pattern. + * + * @param titlePattern The pattern to match the screen title against. + */ + protected SlotTextAdder(@NotNull Pattern titlePattern) { this.titlePattern = titlePattern; } /** - * Creates a SlotTextRenderer that will be applied to all screens. + * Creates a SlotTextAdder that will be applied to all screens. */ protected SlotTextAdder() { this.titlePattern = null; @@ -36,10 +47,10 @@ public abstract class SlotTextAdder { /** * This method will be called for each rendered slot. Consider using a switch statement on {@link Slot#id} if you wish to add different text to different slots. * - * @return The text to be rendered. Return null if no text should be rendered. + * @return A list of positioned text to be rendered. Return {@link List#of()} if no text should be rendered. * @implNote By minecraft's design, scaled text inexplicably moves around. * So, limit your text to 3 characters (or roughly less than 20 width) if you want it to not look horrible. */ - @Nullable - public abstract Text getText(Slot slot); + public abstract @NotNull List<PositionedText> getText(Slot slot); + } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java index 710d780c..c7ca2ea6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java @@ -5,10 +5,10 @@ import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.List; public class SlotTextManager { private static final SlotTextAdder[] adders = new SlotTextAdder[]{ @@ -51,13 +51,13 @@ public class SlotTextManager { * @implNote Only the first adder that returns a non-null text will be used. * The order of the adders remains the same as they were added to the {@link SlotTextManager#adders} array. */ - @Nullable - public static Text getText(Slot slot) { - if (currentScreenAdders.isEmpty()) return null; + @NotNull + public static List<PositionedText> getText(Slot slot) { + if (currentScreenAdders.isEmpty()) return List.of(); for (SlotTextAdder adder : currentScreenAdders) { - Text text = adder.getText(slot); - if (text != null) return text; + List<PositionedText> text = adder.getText(slot); + if (!text.isEmpty()) return text; } - return null; + return List.of(); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/TextPosition.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/TextPosition.java new file mode 100644 index 00000000..052b228d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/TextPosition.java @@ -0,0 +1,8 @@ +package de.hysky.skyblocker.skyblock.item.slottext; + +public enum TextPosition { + TOP_LEFT, + TOP_RIGHT, + BOTTOM_LEFT, + BOTTOM_RIGHT +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CatacombsLevelAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CatacombsLevelAdder.java index 00a96f1a..90aa5d3e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CatacombsLevelAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CatacombsLevelAdder.java @@ -1,12 +1,15 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; +import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import org.apache.commons.lang3.math.NumberUtils; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; + +import java.util.List; //This class is split into 3 inner classes as there are multiple screens for showing catacombs levels, each with different slot ids or different style of showing the level. //It's still kept in 1 main class for organization purposes. @@ -20,18 +23,18 @@ public class CatacombsLevelAdder { } @Override - public @Nullable Text getText(Slot slot) { + public @NotNull List<PositionedText> getText(Slot slot) { switch (slot.id) { case 12, 29, 30, 31, 32, 33 -> { String name = slot.getStack().getName().getString(); int lastIndex = name.lastIndexOf(' '); - if (lastIndex == -1) return Text.literal("0").formatted(Formatting.RED); + if (lastIndex == -1) return List.of(PositionedText.BOTTOM_LEFT(Text.literal("0").formatted(Formatting.RED))); String level = name.substring(lastIndex + 1); - if (!NumberUtils.isDigits(level)) return null; //Sanity check, just in case. - return Text.literal(level).formatted(Formatting.RED); + if (!NumberUtils.isDigits(level)) return List.of(); //Sanity check, just in case. + return List.of(PositionedText.BOTTOM_RIGHT(Text.literal(level).formatted(Formatting.RED))); } default -> { - return null; + return List.of(); } } } @@ -44,15 +47,15 @@ public class CatacombsLevelAdder { } @Override - public @Nullable Text getText(Slot slot) { + public @NotNull List<PositionedText> getText(Slot slot) { switch (slot.id) { case 11, 12, 13, 14, 15 -> { String level = getBracketedLevelFromName(slot.getStack()); - if (!NumberUtils.isDigits(level)) return null; - return Text.literal(level).formatted(Formatting.RED); + if (!NumberUtils.isDigits(level)) return List.of(); + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(level).formatted(Formatting.RED))); } default -> { - return null; + return List.of(); } } } @@ -65,15 +68,15 @@ public class CatacombsLevelAdder { } @Override - public @Nullable Text getText(Slot slot) { + public @NotNull List<PositionedText> getText(Slot slot) { switch (slot.id) { case 29, 30, 31, 32, 33 -> { String level = getBracketedLevelFromName(slot.getStack()); - if (!NumberUtils.isDigits(level)) return null; - return Text.literal(level).formatted(Formatting.RED); + if (!NumberUtils.isDigits(level)) return List.of(); + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(level).formatted(Formatting.RED))); } default -> { - return null; + return List.of(); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java index 44b12a7e..46be2a7f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; +import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RomanNumerals; @@ -8,7 +9,7 @@ import net.minecraft.item.Items; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -18,20 +19,20 @@ public class EnchantmentLevelAdder extends SlotTextAdder { } @Override - public @Nullable Text getText(Slot slot) { + public @NotNull List<PositionedText> getText(Slot slot) { final ItemStack itemStack = slot.getStack(); - if (!itemStack.isOf(Items.ENCHANTED_BOOK)) return null; + if (!itemStack.isOf(Items.ENCHANTED_BOOK)) return List.of(); String name = itemStack.getName().getString(); if (name.equals("Enchanted Book")) { List<Text> lore = ItemUtils.getLore(itemStack); - if (lore.isEmpty()) return null; + if (lore.isEmpty()) return List.of(); int level = getEnchantLevelFromString(lore.getFirst().getString()); - if (level == 0) return null; - return Text.literal(String.valueOf(level)).formatted(Formatting.GREEN); + if (level == 0) return List.of(); + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(level)).formatted(Formatting.GREEN))); } else { //In bazaar, the books have the enchantment name in the name int level = getEnchantLevelFromString(name); - if (level == 0) return null; - return Text.literal(String.valueOf(level)).formatted(Formatting.GREEN); + if (level == 0) return List.of(); + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(level)).formatted(Formatting.GREEN))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/MinionLevelAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/MinionLevelAdder.java index 3a27c022..95e6beb8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/MinionLevelAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/MinionLevelAdder.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; +import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.RomanNumerals; import net.minecraft.item.ItemStack; @@ -7,7 +8,9 @@ import net.minecraft.item.Items; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class MinionLevelAdder extends SlotTextAdder { public MinionLevelAdder() { @@ -15,14 +18,14 @@ public class MinionLevelAdder extends SlotTextAdder { } @Override - public @Nullable Text getText(Slot slot) { + public @NotNull List<PositionedText> getText(Slot slot) { ItemStack itemStack = slot.getStack(); - if (!itemStack.isOf(Items.PLAYER_HEAD)) return null; + if (!itemStack.isOf(Items.PLAYER_HEAD)) return List.of(); String name = itemStack.getName().getString(); - if (!name.contains("Minion")) return null; + if (!name.contains("Minion")) return List.of(); String romanNumeral = name.substring(name.lastIndexOf(' ') + 1); //+1 because we don't need the space itself int level = RomanNumerals.romanToDecimal(romanNumeral); - if (level == 0) return null; - return Text.literal(String.valueOf(level)).formatted(Formatting.DARK_PURPLE); + if (level == 0) return List.of(); + return List.of(PositionedText.TOP_RIGHT(Text.literal(String.valueOf(level)).formatted(Formatting.DARK_PURPLE))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PetLevelAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PetLevelAdder.java index c4632d8e..9c3eef08 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PetLevelAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PetLevelAdder.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; +import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -7,7 +8,9 @@ import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import org.apache.commons.lang3.math.NumberUtils; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class PetLevelAdder extends SlotTextAdder { public PetLevelAdder() { @@ -15,11 +18,11 @@ public class PetLevelAdder extends SlotTextAdder { } @Override - public @Nullable Text getText(Slot slot) { + public @NotNull List<PositionedText> getText(Slot slot) { ItemStack itemStack = slot.getStack(); - if (!itemStack.isOf(Items.PLAYER_HEAD)) return null; + if (!itemStack.isOf(Items.PLAYER_HEAD)) return List.of(); String level = CatacombsLevelAdder.getBracketedLevelFromName(itemStack); - if (!NumberUtils.isDigits(level)) return null; - return Text.literal(level).formatted(Formatting.GOLD); + if (!NumberUtils.isDigits(level)) return List.of(); + return List.of(PositionedText.TOP_LEFT(Text.literal(level).formatted(Formatting.GOLD))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkillLevelAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkillLevelAdder.java index 03f9fbd0..b84de4d3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkillLevelAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkillLevelAdder.java @@ -1,11 +1,14 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; +import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.RomanNumerals; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class SkillLevelAdder extends SlotTextAdder { public SkillLevelAdder() { @@ -13,18 +16,18 @@ public class SkillLevelAdder extends SlotTextAdder { } @Override - public @Nullable Text getText(Slot slot) { + public @NotNull List<PositionedText> getText(Slot slot) { switch (slot.id) { case 19, 20, 21, 22, 23, 24, 25, 29, 30, 31, 32 -> { //These are the slots that contain the skill items. Note that they aren't continuous, as there are 2 rows. String name = slot.getStack().getName().getString(); int lastIndex = name.lastIndexOf(' '); - if (lastIndex == -1) return Text.literal("0").formatted(Formatting.LIGHT_PURPLE); //Skills without any levels don't display any roman numerals. Probably because 0 doesn't exist. + if (lastIndex == -1) return List.of(PositionedText.BOTTOM_LEFT(Text.literal("0").formatted(Formatting.LIGHT_PURPLE))); //Skills without any levels don't display any roman numerals. Probably because 0 doesn't exist. String romanNumeral = name.substring(lastIndex + 1); //+1 because we don't need the space itself - if (!RomanNumerals.isValidRomanNumeral(romanNumeral)) return null; - return Text.literal(String.valueOf(RomanNumerals.romanToDecimal(romanNumeral))).formatted(Formatting.LIGHT_PURPLE); + if (!RomanNumerals.isValidRomanNumeral(romanNumeral)) return List.of(); + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(RomanNumerals.romanToDecimal(romanNumeral))).formatted(Formatting.LIGHT_PURPLE))); } default -> { - return null; + return List.of(); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkyblockLevelAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkyblockLevelAdder.java index bab88372..f1e9f52c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkyblockLevelAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkyblockLevelAdder.java @@ -1,11 +1,12 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; +import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import org.apache.commons.lang3.math.NumberUtils; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -15,14 +16,14 @@ public class SkyblockLevelAdder extends SlotTextAdder { } @Override - public @Nullable Text getText(Slot slot) { - if (slot.getIndex() != 22) return null; + public @NotNull List<PositionedText> getText(Slot slot) { + if (slot.getIndex() != 22) return List.of(); List<Text> lore = ItemUtils.getLore(slot.getStack()); - if (lore.isEmpty()) return null; + if (lore.isEmpty()) return List.of(); List<Text> siblings = lore.getFirst().getSiblings(); - if (siblings.size() < 3) return null; + if (siblings.size() < 3) return List.of(); Text levelText = siblings.get(2); //The 3rd child is the level text itself - if (!NumberUtils.isDigits(levelText.getString())) return null; - return levelText; + if (!NumberUtils.isDigits(levelText.getString())) return List.of(); + return List.of(PositionedText.BOTTOM_LEFT(levelText)); } } |