From 7769de8c37ca43da2fed332effddbe284f601b32 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 28 May 2024 19:05:25 +0300 Subject: Tooltip manager initial commit --- .../java/de/hysky/skyblocker/SkyblockerMod.java | 3 +- .../skyblocker/mixins/HandledScreenMixin.java | 506 +++++++++++---------- .../skyblocker/utils/tooltip/TooltipAdder.java | 35 ++ .../skyblocker/utils/tooltip/TooltipManager.java | 56 +++ 4 files changed, 352 insertions(+), 248 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index 19eb395a..5243ff46 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -35,7 +35,6 @@ import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; -import de.hysky.skyblocker.skyblock.quicknav.QuickNav; import de.hysky.skyblocker.skyblock.rift.TheRift; import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager; import de.hysky.skyblocker.skyblock.shortcut.Shortcuts; @@ -56,6 +55,7 @@ import de.hysky.skyblocker.utils.render.gui.ContainerSolverManager; import de.hysky.skyblocker.utils.render.title.TitleContainer; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import de.hysky.skyblocker.utils.scheduler.Scheduler; +import de.hysky.skyblocker.utils.tooltip.TooltipManager; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.loader.api.FabricLoader; @@ -187,6 +187,7 @@ public class SkyblockerMod implements ClientModInitializer { EggFinder.init(); TimeTowerReminder.init(); SkyblockTime.init(); + TooltipManager.init(); Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20); Scheduler.INSTANCE.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 200); diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index f662be7c..a5f8c5cd 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -1,5 +1,7 @@ package de.hysky.skyblocker.mixins; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.SkyblockerMod; @@ -19,9 +21,12 @@ import de.hysky.skyblocker.skyblock.quicknav.QuickNavButton; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; +import de.hysky.skyblocker.utils.tooltip.TooltipManager; +import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.item.TooltipData; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -45,256 +50,263 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.regex.Matcher; @Mixin(HandledScreen.class) public abstract class HandledScreenMixin extends Screen { - /** - * This is the slot id returned for when a click is outside the screen's bounds - */ - @Unique - private static final int OUT_OF_BOUNDS_SLOT = -999; - - @Unique - private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png"); - - @Unique - private static final Set FILLER_ITEMS = Set.of( - " ", // Empty menu item - "Locked Page", - "Quick Crafting Slot", - "Locked Backpack Slot 2", //Regular expressions won't be utilized here since the search by contains is based on plain text rather than regex syntax - "Locked Backpack Slot 3", - "Locked Backpack Slot 4", - "Locked Backpack Slot 5", - "Locked Backpack Slot 6", - "Locked Backpack Slot 7", - "Locked Backpack Slot 8", - "Locked Backpack Slot 9", - "Locked Backpack Slot 10", - "Locked Backpack Slot 11", - "Locked Backpack Slot 12", - "Locked Backpack Slot 13", - "Locked Backpack Slot 14", - "Locked Backpack Slot 15", - "Locked Backpack Slot 16", - "Locked Backpack Slot 17", - "Locked Backpack Slot 18", - "Preparing" - ); - - @Shadow - @Nullable - protected Slot focusedSlot; - - @Shadow - @Final - protected T handler; - - @Unique - private List quickNavButtons; - - protected HandledScreenMixin(Text title) { - super(title); - } - - @Inject(method = "init", at = @At("RETURN")) - private void skyblocker$initQuickNav(CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().quickNav.enableQuickNav && client != null && client.player != null && !client.player.isCreative()) { - for (QuickNavButton quickNavButton : quickNavButtons = QuickNav.init(getTitle().getString().trim())) { - addSelectableChild(quickNavButton); - } - } - } - - @Inject(at = @At("HEAD"), method = "keyPressed") - public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { - if (this.client != null && this.focusedSlot != null && keyCode != 256) { - //wiki lookup - if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode) && client.player != null) { - WikiLookup.openWiki(this.focusedSlot, client.player); - } - //item protection - if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && ItemProtection.itemProtection.matchesKey(keyCode, scanCode)) { - ItemProtection.handleKeyPressed(this.focusedSlot.getStack()); - } - } - } - - @Inject(at = @At("HEAD"), method = "mouseClicked") - public void skyblocker$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - if (SkyblockerConfigManager.get().farming.garden.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar"))) { - VisitorHelper.onMouseClicked(mouseX, mouseY, button, this.textRenderer); - } - } - - /** - * Draws the unselected tabs in front of the background blur, but behind the main inventory, similar to creative inventory tabs - */ - @Inject(method = "renderBackground", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawBackground(Lnet/minecraft/client/gui/DrawContext;FII)V")) - private void skyblocker$drawUnselectedQuickNavButtons(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (quickNavButtons != null) for (QuickNavButton quickNavButton : quickNavButtons) { - if (!quickNavButton.toggled()) { - quickNavButton.render(context, mouseX, mouseY, delta); - } - } - } - - /** - * Draws the selected tab in front of the background blur and the main inventory, similar to creative inventory tabs - */ - @Inject(method = "renderBackground", at = @At("RETURN")) - private void skyblocker$drawSelectedQuickNavButtons(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - if (quickNavButtons != null) for (QuickNavButton quickNavButton : quickNavButtons) { - if (quickNavButton.toggled()) { - quickNavButton.render(context, mouseX, mouseY, delta); - } - } - } - - @SuppressWarnings("DataFlowIssue") - // makes intellij be quiet about this.focusedSlot maybe being null. It's already null checked in mixined method. - @Inject(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V"), cancellable = true) - public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci, @Local(ordinal = 0) ItemStack stack) { - if (!Utils.isOnSkyblock()) return; - - // Hide Empty Tooltips - if (SkyblockerConfigManager.get().uiAndVisuals.hideEmptyTooltips && stack.getName().getString().equals(" ")) { - ci.cancel(); - } - - // Backpack Preview - boolean shiftDown = SkyblockerConfigManager.get().uiAndVisuals.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); - if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, this, focusedSlot.getIndex(), x, y)) { - ci.cancel(); - } - - // Compactor Preview - if (SkyblockerConfigManager.get().uiAndVisuals.compactorDeletorPreview) { - Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemUtils.getItemId(stack)); - if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) { - ci.cancel(); - } - } - } - - @ModifyVariable(method = "drawMouseoverTooltip", at = @At(value = "LOAD", ordinal = 0)) - private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(ItemStack stack) { - return skyblocker$experimentSolvers$getStack(focusedSlot, stack); - } - - @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 3), ordinal = 0) - private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) { - return skyblocker$experimentSolvers$getStack(slot, stack); - } - - /** - * Redirects getStack calls to account for different stacks in experiment solvers. - */ - @Unique - private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, @NotNull ItemStack stack) { - ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); - if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { - ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex()); - return itemStack == null ? stack : itemStack; - } - return stack; - } - - /** - * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks) - * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item - * - * @implNote This runs before {@link ScreenHandler#onSlotClick(int, int, SlotActionType, net.minecraft.entity.player.PlayerEntity)} - */ - @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true) - private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { - if (!Utils.isOnSkyblock()) return; - - // Item Protection - // When you try and drop the item by picking it up then clicking outside the screen - if (slotId == OUT_OF_BOUNDS_SLOT && ItemProtection.isItemProtected(this.handler.getCursorStack())) { - ci.cancel(); - return; - } - - if (slot == null) return; - String title = getTitle().getString(); - ItemStack stack = skyblocker$experimentSolvers$getStack(slot, slot.getStack()); - ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); - - // Prevent clicks on filler items - if (SkyblockerConfigManager.get().uiAndVisuals.hideEmptyTooltips && FILLER_ITEMS.contains(stack.getName().getString()) && - // Allow clicks in Ultrasequencer and Superpairs - (!UltrasequencerSolver.INSTANCE.getName().matcher(title).matches() || SkyblockerConfigManager.get().helpers.experiments.enableUltrasequencerSolver)) { - ci.cancel(); - return; - } - // Item Protection - // When you click your drop key while hovering over an item - if (actionType == SlotActionType.THROW && ItemProtection.isItemProtected(stack)) { - ci.cancel(); - return; - } - // Prevent salvaging - if (title.equals("Salvage Items") && ItemProtection.isItemProtected(stack)) { - ci.cancel(); - return; - } - if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) { - VisitorHelper.onSlotClick(slot, slotId, title, genericContainerScreenHandler.getSlot(13).getStack()); - - // Prevent selling to NPC shops - ItemStack sellStack = this.handler.slots.get(49).getStack(); - if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) { - if (slotId != 49 && ItemProtection.isItemProtected(stack)) { - ci.cancel(); - return; - } - } - } - - if (currentSolver != null) { - boolean disallowed = SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack); - - if (disallowed) ci.cancel(); - } - - // Experiment Solvers - if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { - switch (experimentSolver) { - case ChronomatronSolver chronomatronSolver -> { - Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal()); - if ((stack.isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { - chronomatronSolver.setState(ExperimentSolver.State.END); - } - } - - case SuperpairsSolver superpairsSolver -> { - superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex()); - superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); - } - - case UltrasequencerSolver ultrasequencerSolver when slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot() -> { - int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; - ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); - } - - default -> { /*Do Nothing*/ } - } - } - } - - @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V")) - private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) { - if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) - ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y); - // Item protection - if (ItemProtection.isItemProtected(slot.getStack())) { - RenderSystem.enableBlend(); - context.drawTexture(ITEM_PROTECTION, slot.x, slot.y, 0, 0, 16, 16, 16, 16); - RenderSystem.disableBlend(); - } - } + /** + * This is the slot id returned for when a click is outside the screen's bounds + */ + @Unique + private static final int OUT_OF_BOUNDS_SLOT = -999; + + @Unique + private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png"); + + @Unique + private static final Set FILLER_ITEMS = Set.of( + " ", // Empty menu item + "Locked Page", + "Quick Crafting Slot", + "Locked Backpack Slot 2", //Regular expressions won't be utilized here since the search by contains is based on plain text rather than regex syntax + "Locked Backpack Slot 3", + "Locked Backpack Slot 4", + "Locked Backpack Slot 5", + "Locked Backpack Slot 6", + "Locked Backpack Slot 7", + "Locked Backpack Slot 8", + "Locked Backpack Slot 9", + "Locked Backpack Slot 10", + "Locked Backpack Slot 11", + "Locked Backpack Slot 12", + "Locked Backpack Slot 13", + "Locked Backpack Slot 14", + "Locked Backpack Slot 15", + "Locked Backpack Slot 16", + "Locked Backpack Slot 17", + "Locked Backpack Slot 18", + "Preparing" + ); + + @Shadow + @Nullable + protected Slot focusedSlot; + + @Shadow + @Final + protected T handler; + + @Unique + private List quickNavButtons; + + protected HandledScreenMixin(Text title) { + super(title); + } + + @Inject(method = "init", at = @At("RETURN")) + private void skyblocker$initQuickNav(CallbackInfo ci) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().quickNav.enableQuickNav && client != null && client.player != null && !client.player.isCreative()) { + for (QuickNavButton quickNavButton : quickNavButtons = QuickNav.init(getTitle().getString().trim())) { + addSelectableChild(quickNavButton); + } + } + } + + @Inject(at = @At("HEAD"), method = "keyPressed") + public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { + if (this.client != null && this.focusedSlot != null && keyCode != 256) { + //wiki lookup + if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode) && client.player != null) { + WikiLookup.openWiki(this.focusedSlot, client.player); + } + //item protection + if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && ItemProtection.itemProtection.matchesKey(keyCode, scanCode)) { + ItemProtection.handleKeyPressed(this.focusedSlot.getStack()); + } + } + } + + @Inject(at = @At("HEAD"), method = "mouseClicked") + public void skyblocker$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { + if (SkyblockerConfigManager.get().farming.garden.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar"))) { + VisitorHelper.onMouseClicked(mouseX, mouseY, button, this.textRenderer); + } + } + + /** + * Draws the unselected tabs in front of the background blur, but behind the main inventory, similar to creative inventory tabs + */ + @Inject(method = "renderBackground", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawBackground(Lnet/minecraft/client/gui/DrawContext;FII)V")) + private void skyblocker$drawUnselectedQuickNavButtons(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { + if (quickNavButtons != null) for (QuickNavButton quickNavButton : quickNavButtons) { + if (!quickNavButton.toggled()) { + quickNavButton.render(context, mouseX, mouseY, delta); + } + } + } + + /** + * Draws the selected tab in front of the background blur and the main inventory, similar to creative inventory tabs + */ + @Inject(method = "renderBackground", at = @At("RETURN")) + private void skyblocker$drawSelectedQuickNavButtons(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { + if (quickNavButtons != null) for (QuickNavButton quickNavButton : quickNavButtons) { + if (quickNavButton.toggled()) { + quickNavButton.render(context, mouseX, mouseY, delta); + } + } + } + + @SuppressWarnings("DataFlowIssue") + // makes intellij be quiet about this.focusedSlot maybe being null. It's already null checked in mixined method. + @Inject(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V"), cancellable = true) + public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci, @Local(ordinal = 0) ItemStack stack) { + if (!Utils.isOnSkyblock()) return; + + // Hide Empty Tooltips + if (SkyblockerConfigManager.get().uiAndVisuals.hideEmptyTooltips && stack.getName().getString().equals(" ")) { + ci.cancel(); + } + + // Backpack Preview + boolean shiftDown = SkyblockerConfigManager.get().uiAndVisuals.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); + if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, this, focusedSlot.getIndex(), x, y)) { + ci.cancel(); + } + + // Compactor Preview + if (SkyblockerConfigManager.get().uiAndVisuals.compactorDeletorPreview) { + Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemUtils.getItemId(stack)); + if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) { + ci.cancel(); + } + } + } + + @ModifyVariable(method = "drawMouseoverTooltip", at = @At(value = "LOAD", ordinal = 0)) + private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(ItemStack stack) { + return skyblocker$experimentSolvers$getStack(focusedSlot, stack); + } + + @SuppressWarnings("deprecation") + @WrapOperation(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V")) + private void skyblocker$tooltips$drawMouseoverTooltip(DrawContext context, TextRenderer textRenderer, List text, Optional data, int x, int y, Operation original) { + original.call(context, textRenderer, TooltipManager.addToTooltip(text, focusedSlot), data, x, y); + } + + @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 3), ordinal = 0) + private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) { + return skyblocker$experimentSolvers$getStack(slot, stack); + } + + /** + * Redirects getStack calls to account for different stacks in experiment solvers. + */ + @Unique + private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, @NotNull ItemStack stack) { + ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); + if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { + ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex()); + return itemStack == null ? stack : itemStack; + } + return stack; + } + + /** + * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks) + * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item + * + * @implNote This runs before {@link ScreenHandler#onSlotClick(int, int, SlotActionType, net.minecraft.entity.player.PlayerEntity)} + */ + @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true) + private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) { + if (!Utils.isOnSkyblock()) return; + + // Item Protection + // When you try and drop the item by picking it up then clicking outside the screen + if (slotId == OUT_OF_BOUNDS_SLOT && ItemProtection.isItemProtected(this.handler.getCursorStack())) { + ci.cancel(); + return; + } + + if (slot == null) return; + String title = getTitle().getString(); + ItemStack stack = skyblocker$experimentSolvers$getStack(slot, slot.getStack()); + ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver(); + + // Prevent clicks on filler items + if (SkyblockerConfigManager.get().uiAndVisuals.hideEmptyTooltips && FILLER_ITEMS.contains(stack.getName().getString()) && + // Allow clicks in Ultrasequencer and Superpairs + (!UltrasequencerSolver.INSTANCE.getName().matcher(title).matches() || SkyblockerConfigManager.get().helpers.experiments.enableUltrasequencerSolver)) { + ci.cancel(); + return; + } + // Item Protection + // When you click your drop key while hovering over an item + if (actionType == SlotActionType.THROW && ItemProtection.isItemProtected(stack)) { + ci.cancel(); + return; + } + // Prevent salvaging + if (title.equals("Salvage Items") && ItemProtection.isItemProtected(stack)) { + ci.cancel(); + return; + } + if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) { + VisitorHelper.onSlotClick(slot, slotId, title, genericContainerScreenHandler.getSlot(13).getStack()); + + // Prevent selling to NPC shops + ItemStack sellStack = this.handler.slots.get(49).getStack(); + if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) { + if (slotId != 49 && ItemProtection.isItemProtected(stack)) { + ci.cancel(); + return; + } + } + } + + if (currentSolver != null) { + boolean disallowed = SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack); + + if (disallowed) ci.cancel(); + } + + // Experiment Solvers + if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) { + switch (experimentSolver) { + case ChronomatronSolver chronomatronSolver -> { + Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal()); + if ((stack.isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) { + chronomatronSolver.setState(ExperimentSolver.State.END); + } + } + + case SuperpairsSolver superpairsSolver -> { + superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex()); + superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY); + } + + case UltrasequencerSolver ultrasequencerSolver when slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot() -> { + int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1; + ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END)); + } + + default -> { /*Do Nothing*/ } + } + } + } + + @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V")) + private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) { + if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) + ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y); + // Item protection + if (ItemProtection.isItemProtected(slot.getStack())) { + RenderSystem.enableBlend(); + context.drawTexture(ITEM_PROTECTION, slot.x, slot.y, 0, 0, 16, 16, 16, 16); + RenderSystem.disableBlend(); + } + } } diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java new file mode 100644 index 00000000..1e628e99 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java @@ -0,0 +1,35 @@ +package de.hysky.skyblocker.utils.tooltip; + +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Extend this class and add it to {@link TooltipManager#adders} to add additional text to tooltips. + */ +public abstract class TooltipAdder { + public final Pattern titlePattern; + //Lower priority means it will be applied first + public final int priority; + + protected TooltipAdder(String titlePattern, int priority) { + this(Pattern.compile(titlePattern), priority); + } + + protected TooltipAdder(Pattern titlePattern, int priority) { + this.titlePattern = titlePattern; + this.priority = priority; + } + + /** + * Creates a TooltipAdder that will be applied to all screens. + */ + protected TooltipAdder(int priority) { + this.titlePattern = null; + this.priority = priority; + } + + public abstract void addToTooltip(List lore, Slot focusedSlot); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java new file mode 100644 index 00000000..6a744283 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -0,0 +1,56 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class TooltipManager { + private static final TooltipAdder[] adders = new TooltipAdder[]{}; + private static final ArrayList currentScreenAdders = new ArrayList<>(); + + private TooltipManager() { + } + + public static void init() { + ScreenEvents.AFTER_INIT.register((client, screen, width, height) -> { + onScreenChange(screen); + ScreenEvents.remove(screen).register(ignored -> currentScreenAdders.clear()); + }); + } + + private static void onScreenChange(Screen screen) { + final String title = screen.getTitle().getString(); + for (TooltipAdder adder : adders) { + if (adder.titlePattern == null || adder.titlePattern.matcher(title).matches()) { + currentScreenAdders.add(adder); + } + } + currentScreenAdders.sort(Comparator.comparingInt(adder -> adder.priority)); + } + + /** + *

Adds additional text from all adders that are applicable to the current screen. + * This method is run on each tooltip render, so don't do any heavy calculations here.

+ * + *

If you want to add info to the tooltips of multiple items, consider using a switch statement with {@code focusedSlot.getIndex()}

+ * + * @param lore The lore of the focused item. + * @param focusedSlot The slot that is currently focused by the cursor. + * @return The lore itself after all adders have added their text. + * @deprecated This method is public only for the sake of the mixin. Don't call directly, not that there is any point to it. + */ + @Deprecated + public static List addToTooltip(List lore, Slot focusedSlot) { + if (!Utils.isOnSkyblock()) return lore; + for (TooltipAdder adder : currentScreenAdders) { + adder.addToTooltip(lore, focusedSlot); + } + return lore; + } +} -- cgit From a6148c72d4d53c916a73de979519109a378f2451 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 28 May 2024 19:28:52 +0300 Subject: Refactor line smoothener --- .../chocolatefactory/ChocolateFactorySolver.java | 4 +-- .../skyblock/item/tooltip/ItemTooltip.java | 20 -------------- .../skyblocker/utils/tooltip/LineSmoothener.java | 31 ++++++++++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 4 ++- 4 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/LineSmoothener.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index e04e632a..cd622934 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -1,11 +1,11 @@ package de.hysky.skyblocker.skyblock.chocolatefactory; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RegexUtils; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; +import de.hysky.skyblocker.utils.tooltip.LineSmoothener; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; @@ -182,7 +182,7 @@ public class ChocolateFactorySolver extends ContainerSolver { } //This is an ArrayList, so this operation is probably not very efficient, but logically it's pretty much the only way I can think of - if (shouldAddLine) lines.add(lineIndex, ItemTooltip.createSmoothLine()); + if (shouldAddLine) lines.add(lineIndex, LineSmoothener.createSmoothLine()); } private static boolean addUpgradeTimerToLore(List lines, long cost) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 031817ac..505c4c8b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -22,7 +22,6 @@ import net.minecraft.nbt.NbtElement; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; - import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,8 +38,6 @@ public class ItemTooltip { public static void getTooltip(ItemStack stack, Item.TooltipContext tooltipContext, TooltipType tooltipType, List lines) { if (!Utils.isOnSkyblock() || client.player == null) return; - smoothenLines(lines); - String name = getInternalNameFromNBT(stack, false); String internalID = getInternalNameFromNBT(stack, true); String neuName = name; @@ -394,23 +391,6 @@ public class ItemTooltip { return message; } - //This is static to not create a new text object for each line in every item - private static final Text BUMPY_LINE = Text.literal("-----------------").formatted(Formatting.DARK_GRAY, Formatting.STRIKETHROUGH); - - private static void smoothenLines(List lines) { - for (int i = 0; i < lines.size(); i++) { - List lineSiblings = lines.get(i).getSiblings(); - //Compare the first sibling rather than the whole object as the style of the root object can change while visually staying the same - if (lineSiblings.size() == 1 && lineSiblings.getFirst().equals(BUMPY_LINE)) { - lines.set(i, createSmoothLine()); - } - } - } - - public static Text createSmoothLine() { - return Text.literal(" ").formatted(Formatting.DARK_GRAY, Formatting.STRIKETHROUGH, Formatting.BOLD); - } - // 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 = 0; diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/LineSmoothener.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/LineSmoothener.java new file mode 100644 index 00000000..1096f7b0 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/LineSmoothener.java @@ -0,0 +1,31 @@ +package de.hysky.skyblocker.utils.tooltip; + +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class LineSmoothener extends TooltipAdder { + //This is static to not create a new text object for each line in every item + private static final Text BUMPY_LINE = Text.literal("-----------------").formatted(Formatting.DARK_GRAY, Formatting.STRIKETHROUGH); + + public static Text createSmoothLine() { + return Text.literal(" ").formatted(Formatting.DARK_GRAY, Formatting.STRIKETHROUGH, Formatting.BOLD); + } + + protected LineSmoothener() { + super(Integer.MIN_VALUE); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + for (int i = 0; i < lore.size(); i++) { + List lineSiblings = lore.get(i).getSiblings(); + //Compare the first sibling rather than the whole object as the style of the root object can change while visually staying the same + if (lineSiblings.size() == 1 && lineSiblings.getFirst().equals(BUMPY_LINE)) { + lore.set(i, createSmoothLine()); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index 6a744283..7d32e3cd 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -11,7 +11,9 @@ import java.util.Comparator; import java.util.List; public class TooltipManager { - private static final TooltipAdder[] adders = new TooltipAdder[]{}; + private static final TooltipAdder[] adders = new TooltipAdder[]{ + new LineSmoothener() + }; private static final ArrayList currentScreenAdders = new ArrayList<>(); private TooltipManager() { -- cgit From a0bc7dc00f47cf1986120b47ccb23f6116660dda Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 28 May 2024 19:58:47 +0300 Subject: Refactor dungeon quality tooltip --- .../skyblock/item/tooltip/ItemTooltip.java | 41 ++-------------- .../utils/tooltip/DungeonQualityTooltip.java | 55 ++++++++++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 3 +- 3 files changed, 62 insertions(+), 37 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/DungeonQualityTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 505c4c8b..5183e901 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -26,7 +26,10 @@ import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class ItemTooltip { @@ -125,40 +128,6 @@ public class ItemTooltip { } } - final Map itemTierFloors = Map.ofEntries( - Map.entry(0, "E"), - Map.entry(1, "F1"), - Map.entry(2, "F2"), - Map.entry(3, "F3"), - Map.entry(4, "F4/M1"), - Map.entry(5, "F5/M2"), - Map.entry(6, "F6/M3"), - Map.entry(7, "F7/M4"), - Map.entry(8, "M5"), - Map.entry(9, "M6"), - Map.entry(10, "M7") - ); - - if (SkyblockerConfigManager.get().general.itemTooltip.dungeonQuality) { - NbtCompound customData = ItemUtils.getCustomData(stack); - if (customData != null && customData.contains("baseStatBoostPercentage")) { - int baseStatBoostPercentage = customData.getInt("baseStatBoostPercentage"); - boolean maxQuality = baseStatBoostPercentage == 50; - if (maxQuality) { - lines.add(Text.literal(String.format("%-17s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.RED).formatted(Formatting.BOLD)); - } else { - lines.add(Text.literal(String.format("%-21s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.BLUE)); - } - if (customData.contains("item_tier")) { // sometimes it just isn't here? - int itemTier = customData.getInt("item_tier"); - if (maxQuality) { - lines.add(Text.literal(String.format("%-17s", "Floor Tier:") + itemTier + " (" + itemTierFloors.get(itemTier) + ")").formatted(Formatting.RED).formatted(Formatting.BOLD)); - } else { - lines.add(Text.literal(String.format("%-21s", "Floor Tier:") + itemTier + " (" + itemTierFloors.get(itemTier) + ")").formatted(Formatting.BLUE)); - } - } - } - } if (TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { lines.add(Text.literal(String.format("%-20s", "Motes Price:")) @@ -436,4 +405,4 @@ public class ItemTooltip { }); }, 1200, true); } -} +} \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/DungeonQualityTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/DungeonQualityTooltip.java new file mode 100644 index 00000000..f7be590e --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/DungeonQualityTooltip.java @@ -0,0 +1,55 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class DungeonQualityTooltip extends TooltipAdder { + protected DungeonQualityTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + if (!SkyblockerConfigManager.get().general.itemTooltip.dungeonQuality) return; + NbtCompound customData = ItemUtils.getCustomData(focusedSlot.getStack()); + if (customData == null || !customData.contains("baseStatBoostPercentage")) return; + int baseStatBoostPercentage = customData.getInt("baseStatBoostPercentage"); + boolean maxQuality = baseStatBoostPercentage == 50; + if (maxQuality) { + lore.add(Text.literal(String.format("%-17s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.RED).formatted(Formatting.BOLD)); + } else { + lore.add(Text.literal(String.format("%-21s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.BLUE)); + } + + if (customData.contains("item_tier")) { // sometimes it just isn't here? + int itemTier = customData.getInt("item_tier"); + if (maxQuality) { + lore.add(Text.literal(String.format("%-17s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.RED).formatted(Formatting.BOLD)); + } else { + lore.add(Text.literal(String.format("%-21s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.BLUE)); + } + } + } + + final String getItemTierFloor(int tier) { + return switch (tier) { + case 1 -> "F1"; + case 2 -> "F2"; + case 3 -> "F3"; + case 4 -> "F4/M1"; + case 5 -> "F5/M2"; + case 6 -> "F6/M3"; + case 7 -> "F7/M4"; + case 8 -> "M5"; + case 9 -> "M6"; + case 10 -> "M7"; + default -> "Unknown"; + }; + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index 7d32e3cd..82f02445 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -12,7 +12,8 @@ import java.util.List; public class TooltipManager { private static final TooltipAdder[] adders = new TooltipAdder[]{ - new LineSmoothener() + new LineSmoothener(), + new DungeonQualityTooltip(0) }; private static final ArrayList currentScreenAdders = new ArrayList<>(); -- cgit From 4015ba2f5d79ece643a97c457d2c663f8ef519e7 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 28 May 2024 20:06:50 +0300 Subject: Refactor obtained date tooltip --- .../skyblock/item/tooltip/ItemTooltip.java | 9 --- .../java/de/hysky/skyblocker/utils/ItemUtils.java | 41 ------------- .../skyblocker/utils/tooltip/ObtainedTooltip.java | 71 ++++++++++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 3 +- .../de/hysky/skyblocker/utils/ItemUtilsTest.java | 9 +-- 5 files changed, 78 insertions(+), 55 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/ObtainedTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 5183e901..a008fcf9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -135,15 +135,6 @@ public class ItemTooltip { .append(getMotesMessage(TooltipInfoType.MOTES.getData().get(internalID).getAsInt(), count))); } - if (TooltipInfoType.OBTAINED.isTooltipEnabled()) { - String timestamp = ItemUtils.getTimestamp(stack); - - if (!timestamp.isEmpty()) { - lines.add(Text.literal(String.format("%-21s", "Obtained: ")) - .formatted(Formatting.LIGHT_PURPLE) - .append(Text.literal(timestamp).formatted(Formatting.RED))); - } - } if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID) && !bazaarOpened) { String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); diff --git a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java index 13b28808..fbc9bddc 100644 --- a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java @@ -20,7 +20,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; import net.minecraft.registry.Registries; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.Text; @@ -29,13 +28,7 @@ import net.minecraft.util.dynamic.Codecs; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.time.temporal.TemporalAccessor; -import java.util.Iterator; import java.util.List; -import java.util.Locale; import java.util.Optional; import java.util.function.Predicate; import java.util.regex.Matcher; @@ -46,8 +39,6 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.lit public class ItemUtils { public static final String ID = "id"; public static final String UUID = "uuid"; - private static final DateTimeFormatter OBTAINED_DATE_FORMATTER = DateTimeFormatter.ofPattern("MMMM d, yyyy").withZone(ZoneId.systemDefault()).localizedBy(Locale.ENGLISH); - private static final DateTimeFormatter OLD_OBTAINED_DATE_FORMAT = DateTimeFormatter.ofPattern("M/d/yy h:m a").withZone(ZoneId.of("UTC")).localizedBy(Locale.ENGLISH); public static final Pattern NOT_DURABILITY = Pattern.compile("[^0-9 /]"); public static final Predicate FUEL_PREDICATE = line -> line.contains("Fuel: "); private static final Codec> EMPTY_ALLOWING_ITEM_CODEC = Registries.ITEM.getEntryCodec(); @@ -111,38 +102,6 @@ public class ItemUtils { return getCustomData(stack).getString(UUID); } - /** - * This method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum. - * Currently, there are two types of string timestamps the legacy which is built like this - * "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this - * "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without - * taking into account of their formats, we do the same. The final result looks like this - * "MMMM dd, yyyy" (December 24, 2020). - * Since the legacy format has a 25 as "month" SimpleDateFormat converts the 25 into 2 years and 1 month and makes - * "25/04/20 16:38" -> "January 04, 2022" instead of "April 25, 2020". - * This causes the museum rank to be much worse than it should be. - *

- * This also handles the long timestamp format introduced in January 2024 where the timestamp is in epoch milliseconds. - * - * @param stack the item under the pointer - * @return if the item have a "Timestamp" it will be shown formated on the tooltip - */ - public static String getTimestamp(ItemStack stack) { - NbtCompound customData = getCustomData(stack); - - if (customData != null && customData.contains("timestamp", NbtElement.LONG_TYPE)) { - Instant date = Instant.ofEpochMilli(customData.getLong("timestamp")); - return OBTAINED_DATE_FORMATTER.format(date); - } - - if (customData != null && customData.contains("timestamp", NbtElement.STRING_TYPE)) { - TemporalAccessor date = OLD_OBTAINED_DATE_FORMAT.parse(customData.getString("timestamp")); - return OBTAINED_DATE_FORMATTER.format(date); - } - - return ""; - } - public static boolean hasCustomDurability(@NotNull ItemStack stack) { NbtCompound customData = getCustomData(stack); return customData != null && (customData.contains("drill_fuel") || customData.getString(ID).equals("PICKONIMBUS")); diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/ObtainedTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/ObtainedTooltip.java new file mode 100644 index 00000000..f6bcd2f2 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/ObtainedTooltip.java @@ -0,0 +1,71 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; +import java.util.List; +import java.util.Locale; + +public class ObtainedTooltip extends TooltipAdder { + private static final DateTimeFormatter OBTAINED_DATE_FORMATTER = DateTimeFormatter.ofPattern("MMMM d, yyyy").withZone(ZoneId.systemDefault()).localizedBy(Locale.ENGLISH); + private static final DateTimeFormatter OLD_OBTAINED_DATE_FORMAT = DateTimeFormatter.ofPattern("M/d/yy h:m a").withZone(ZoneId.of("UTC")).localizedBy(Locale.ENGLISH); + + protected ObtainedTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + if (TooltipInfoType.OBTAINED.isTooltipEnabled()) { + String timestamp = getTimestamp(focusedSlot.getStack()); + + if (!timestamp.isEmpty()) { + lore.add(Text.empty() + .append(Text.literal(String.format("%-21s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE)) + .append(Text.literal(timestamp).formatted(Formatting.RED))); + } + } + } + + /** + * This method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum. + * Currently, there are two types of string timestamps the legacy which is built like this + * "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this + * "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without + * taking into account of their formats, we do the same. The final result looks like this + * "MMMM dd, yyyy" (December 24, 2020). + * Since the legacy format has a 25 as "month" SimpleDateFormat converts the 25 into 2 years and 1 month and makes + * "25/04/20 16:38" -> "January 04, 2022" instead of "April 25, 2020". + * This causes the museum rank to be much worse than it should be. + *

+ * This also handles the long timestamp format introduced in January 2024 where the timestamp is in epoch milliseconds. + * + * @param stack the item under the pointer + * @return if the item have a "Timestamp" it will be shown formated on the tooltip + */ + public static String getTimestamp(ItemStack stack) { + NbtCompound customData = ItemUtils.getCustomData(stack); + + if (customData != null && customData.contains("timestamp", NbtElement.LONG_TYPE)) { + Instant date = Instant.ofEpochMilli(customData.getLong("timestamp")); + return OBTAINED_DATE_FORMATTER.format(date); + } + + if (customData != null && customData.contains("timestamp", NbtElement.STRING_TYPE)) { + TemporalAccessor date = OLD_OBTAINED_DATE_FORMAT.parse(customData.getString("timestamp")); + return OBTAINED_DATE_FORMATTER.format(date); + } + + return ""; + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index 82f02445..e71ec115 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -13,7 +13,8 @@ import java.util.List; public class TooltipManager { private static final TooltipAdder[] adders = new TooltipAdder[]{ new LineSmoothener(), - new DungeonQualityTooltip(0) + new DungeonQualityTooltip(0), + new ObtainedTooltip(1), }; private static final ArrayList currentScreenAdders = new ArrayList<>(); diff --git a/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java b/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java index 0f9f0e56..92419624 100644 --- a/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java +++ b/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.utils; import com.google.gson.JsonParser; import com.mojang.serialization.JsonOps; +import de.hysky.skyblocker.utils.tooltip.ObtainedTooltip; import it.unimi.dsi.fastutil.ints.IntIntPair; import net.minecraft.Bootstrap; import net.minecraft.SharedConstants; @@ -48,10 +49,10 @@ public class ItemUtilsTest { @Test void testGetTimestamp() { - Assertions.assertEquals("February 5, 2022", ItemUtils.getTimestamp(DARK_CLAYMORE_OLD)); - Assertions.assertEquals("December 16, 2022", ItemUtils.getTimestamp(DARK_CLAYMORE)); // The timestamp is 1671157200000 which is December 16, 2022 in UTC - Assertions.assertEquals("April 12, 2024", ItemUtils.getTimestamp(TITANIUM_DRILL_DR_X655)); - Assertions.assertEquals("March 1, 2021", ItemUtils.getTimestamp(ASTRAEA)); + Assertions.assertEquals("February 5, 2022", ObtainedTooltip.getTimestamp(DARK_CLAYMORE_OLD)); + Assertions.assertEquals("December 16, 2022", ObtainedTooltip.getTimestamp(DARK_CLAYMORE)); // The timestamp is 1671157200000 which is December 16, 2022 in UTC + Assertions.assertEquals("April 12, 2024", ObtainedTooltip.getTimestamp(TITANIUM_DRILL_DR_X655)); + Assertions.assertEquals("March 1, 2021", ObtainedTooltip.getTimestamp(ASTRAEA)); } @Test -- cgit From 6969632aacfefebcffaa676e51b6b0b929d961d7 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 28 May 2024 21:01:39 +0300 Subject: Refactor motes tooltip --- .../skyblock/item/tooltip/ItemTooltip.java | 27 ------------ .../skyblocker/utils/tooltip/MotesTooltip.java | 50 ++++++++++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 1 + 3 files changed, 51 insertions(+), 27 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/MotesTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index a008fcf9..04764a79 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -129,13 +129,6 @@ public class ItemTooltip { } - if (TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { - lines.add(Text.literal(String.format("%-20s", "Motes Price:")) - .formatted(Formatting.LIGHT_PURPLE) - .append(getMotesMessage(TooltipInfoType.MOTES.getData().get(internalID).getAsInt(), count))); - } - - if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID) && !bazaarOpened) { String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); String format = switch (itemCategory) { @@ -331,26 +324,6 @@ public class ItemTooltip { return message; } - private static Text getMotesMessage(int price, int count) { - float motesMultiplier = SkyblockerConfigManager.get().otherLocations.rift.mcGrubberStacks * 0.05f + 1; - - // Calculate the total price - int totalPrice = price * count; - String totalPriceString = String.format(Locale.ENGLISH, "%1$,.1f", totalPrice * motesMultiplier); - - // If count is 1, return a simple message - if (count == 1) { - return Text.literal(totalPriceString.replace(".0", "") + " Motes").formatted(Formatting.DARK_AQUA); - } - - // If count is greater than 1, include the "each" information - String eachPriceString = String.format(Locale.ENGLISH, "%1$,.1f", price * motesMultiplier); - MutableText message = Text.literal(totalPriceString.replace(".0", "") + " Motes ").formatted(Formatting.DARK_AQUA); - message.append(Text.literal("(" + eachPriceString.replace(".0", "") + " each)").formatted(Formatting.GRAY)); - - return message; - } - // 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 = 0; diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/MotesTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/MotesTooltip.java new file mode 100644 index 00000000..79a58a62 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/MotesTooltip.java @@ -0,0 +1,50 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; +import java.util.Locale; + +public class MotesTooltip extends TooltipAdder { + protected MotesTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (internalID != null && TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { + lore.add(Text.literal(String.format("%-20s", "Motes Price:")) + .formatted(Formatting.LIGHT_PURPLE) + .append(getMotesMessage(TooltipInfoType.MOTES.getData().get(internalID).getAsInt(), itemStack.getCount()))); + } + } + + private static Text getMotesMessage(int price, int count) { + float motesMultiplier = SkyblockerConfigManager.get().otherLocations.rift.mcGrubberStacks * 0.05f + 1; + + // Calculate the total price + int totalPrice = price * count; + String totalPriceString = String.format(Locale.ENGLISH, "%1$,.1f", totalPrice * motesMultiplier); + + // If count is 1, return a simple message + if (count == 1) { + return Text.literal(totalPriceString.replace(".0", "") + " Motes").formatted(Formatting.DARK_AQUA); + } + + // If count is greater than 1, include the "each" information + String eachPriceString = String.format(Locale.ENGLISH, "%1$,.1f", price * motesMultiplier); + MutableText message = Text.literal(totalPriceString.replace(".0", "") + " Motes ").formatted(Formatting.DARK_AQUA); + message.append(Text.literal("(" + eachPriceString.replace(".0", "") + " each)").formatted(Formatting.GRAY)); + + return message; + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index e71ec115..4def0a04 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -15,6 +15,7 @@ public class TooltipManager { new LineSmoothener(), new DungeonQualityTooltip(0), new ObtainedTooltip(1), + new MotesTooltip(0) }; private static final ArrayList currentScreenAdders = new ArrayList<>(); -- cgit From f559aa2b0a945d27fb5e78076e55f4e3b31e016e Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 09:08:08 +0300 Subject: Refactor npc price tooltip --- .../skyblock/item/tooltip/ItemTooltip.java | 20 +++++----------- .../skyblocker/utils/tooltip/NpcPriceTooltip.java | 27 ++++++++++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 5 ++-- 3 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/NpcPriceTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 04764a79..776e301d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -56,17 +56,10 @@ public class ItemTooltip { } int count = stack.getCount(); - boolean bazaarOpened = lines.stream().anyMatch(each -> each.getString().contains("Buy price:") || each.getString().contains("Sell price:")); - - if (TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { - lines.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) - .formatted(Formatting.YELLOW) - .append(getCoinsMessage(TooltipInfoType.NPC.getData().get(internalID).getAsDouble(), count))); - } boolean bazaarExist = false; - if (TooltipInfoType.BAZAAR.isTooltipEnabledAndHasOrNullWarning(name) && !bazaarOpened) { + if (TooltipInfoType.BAZAAR.isTooltipEnabledAndHasOrNullWarning(name)) { JsonObject getItem = TooltipInfoType.BAZAAR.getData().getAsJsonObject(name); lines.add(Text.literal(String.format("%-18s", "Bazaar buy Price:")) .formatted(Formatting.GOLD) @@ -83,7 +76,7 @@ public class ItemTooltip { // bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api boolean lbinExist = false; - if (TooltipInfoType.LOWEST_BINS.isTooltipEnabledAndHasOrNullWarning(name) && !bazaarOpened && !bazaarExist) { + if (TooltipInfoType.LOWEST_BINS.isTooltipEnabledAndHasOrNullWarning(name) && !bazaarExist) { lines.add(Text.literal(String.format("%-19s", "Lowest BIN Price:")) .formatted(Formatting.GOLD) .append(getCoinsMessage(TooltipInfoType.LOWEST_BINS.getData().get(name).getAsDouble(), count))); @@ -129,7 +122,7 @@ public class ItemTooltip { } - if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID) && !bazaarOpened) { + if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); String format = switch (itemCategory) { case "Weapons" -> "%-18s"; @@ -307,7 +300,7 @@ public class ItemTooltip { return internalName; } - private static Text getCoinsMessage(double price, int count) { + public static Text getCoinsMessage(double price, int count) { // Format the price string once String priceString = String.format(Locale.ENGLISH, "%1$,.1f", price); @@ -318,10 +311,9 @@ public class ItemTooltip { // If count is greater than 1, include the "each" information String priceStringTotal = String.format(Locale.ENGLISH, "%1$,.1f", price * count); - MutableText message = Text.literal(priceStringTotal + " Coins ").formatted(Formatting.DARK_AQUA); - message.append(Text.literal("(" + priceString + " each)").formatted(Formatting.GRAY)); - return message; + return Text.literal(priceStringTotal + " Coins ").formatted(Formatting.DARK_AQUA) + .append(Text.literal("(" + priceString + " each)").formatted(Formatting.GRAY)); } // If these options is true beforehand, the client will get first data of these options while loading. diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/NpcPriceTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/NpcPriceTooltip.java new file mode 100644 index 00000000..0e8d4bf7 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/NpcPriceTooltip.java @@ -0,0 +1,27 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class NpcPriceTooltip extends TooltipAdder { + protected NpcPriceTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack stack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(stack, true); + if (internalID != null && TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { + lore.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) + .formatted(Formatting.YELLOW) + .append(ItemTooltip.getCoinsMessage(TooltipInfoType.NPC.getData().get(internalID).getAsDouble(), stack.getCount()))); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index 4def0a04..05f16487 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -14,8 +14,9 @@ public class TooltipManager { private static final TooltipAdder[] adders = new TooltipAdder[]{ new LineSmoothener(), new DungeonQualityTooltip(0), - new ObtainedTooltip(1), - new MotesTooltip(0) + new ObtainedTooltip(3), + new MotesTooltip(0), + new NpcPriceTooltip(1) }; private static final ArrayList currentScreenAdders = new ArrayList<>(); -- cgit From 6911d4f963ddd0e2f420b586ca673000c62da31e Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 09:11:50 +0300 Subject: Refactor museum tooltip --- .../skyblock/item/tooltip/ItemTooltip.java | 24 ----------- .../skyblock/item/tooltip/MuseumTooltip.java | 48 ++++++++++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 2 + 3 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/MuseumTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 776e301d..1f1412d4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.GeneralConfig; -import de.hysky.skyblocker.skyblock.item.MuseumItemCache; import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper.AccessoryReport; import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.ItemUtils; @@ -122,30 +121,7 @@ public class ItemTooltip { } - if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { - String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); - String format = switch (itemCategory) { - case "Weapons" -> "%-18s"; - case "Armor" -> "%-19s"; - default -> "%-20s"; - }; - //Special case the special category so that it doesn't always display not donated - if (itemCategory.equals("Special")) { - lines.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) - .formatted(Formatting.LIGHT_PURPLE)); - } else { - NbtCompound customData = ItemUtils.getCustomData(stack); - boolean isInMuseum = (customData.contains("donated_museum") && customData.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID); - - Formatting donatedIndicatorFormatting = isInMuseum ? Formatting.GREEN : Formatting.RED; - - lines.add(Text.literal(String.format(format, "Museum (" + itemCategory + "):")) - .formatted(Formatting.LIGHT_PURPLE) - .append(Text.literal(isInMuseum ? "✔" : "✖").formatted(donatedIndicatorFormatting, Formatting.BOLD)) - .append(Text.literal(isInMuseum ? " Donated" : " Not Donated").formatted(donatedIndicatorFormatting))); - } - } if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && stack.contains(DataComponentTypes.DYED_COLOR)) { String uuid = ItemUtils.getItemUuid(stack); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/MuseumTooltip.java new file mode 100644 index 00000000..727c83db --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/MuseumTooltip.java @@ -0,0 +1,48 @@ +package de.hysky.skyblocker.skyblock.item.tooltip; + +import de.hysky.skyblocker.skyblock.item.MuseumItemCache; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.tooltip.TooltipAdder; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class MuseumTooltip extends TooltipAdder { + public MuseumTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { + String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); + String format = switch (itemCategory) { + case "Weapons" -> "%-18s"; + case "Armor" -> "%-19s"; + default -> "%-20s"; + }; + + //Special case the special category so that it doesn't always display not donated + if (itemCategory.equals("Special")) { + lore.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) + .formatted(Formatting.LIGHT_PURPLE)); + } else { + NbtCompound customData = ItemUtils.getCustomData(itemStack); + boolean isInMuseum = (customData.contains("donated_museum") && customData.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID); + + Formatting donatedIndicatorFormatting = isInMuseum ? Formatting.GREEN : Formatting.RED; + + lore.add(Text.literal(String.format(format, "Museum (" + itemCategory + "):")) + .formatted(Formatting.LIGHT_PURPLE) + .append(Text.literal(isInMuseum ? "✔" : "✖").formatted(donatedIndicatorFormatting, Formatting.BOLD)) + .append(Text.literal(isInMuseum ? " Donated" : " Not Donated").formatted(donatedIndicatorFormatting))); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index 05f16487..dcad236f 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.utils.tooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.MuseumTooltip; import de.hysky.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; @@ -15,6 +16,7 @@ public class TooltipManager { new LineSmoothener(), new DungeonQualityTooltip(0), new ObtainedTooltip(3), + new MuseumTooltip(4), new MotesTooltip(0), new NpcPriceTooltip(1) }; -- cgit From 32983875c94ff7a62e5041cfeaafa6b15216ff4b Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 09:31:38 +0300 Subject: Refactor color tooltip I can't test this as I don't know what it does and what to look for --- .../skyblock/item/tooltip/ExoticTooltip.java | 94 -------------- .../skyblock/item/tooltip/ItemTooltip.java | 35 ------ .../skyblocker/utils/tooltip/ColorTooltip.java | 135 +++++++++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 1 + 4 files changed, 136 insertions(+), 129 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/ColorTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java index 46babc8b..ac028918 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java @@ -1,96 +1,2 @@ package de.hysky.skyblocker.skyblock.item.tooltip; -import de.hysky.skyblocker.utils.Constants; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.StringIdentifiable; - -public class ExoticTooltip { - public static String getExpectedHex(String id) { - String color = TooltipInfoType.COLOR.getData().get(id).getAsString(); - if (color != null) { - String[] RGBValues = color.split(","); - return String.format("%02X%02X%02X", Integer.parseInt(RGBValues[0]), Integer.parseInt(RGBValues[1]), Integer.parseInt(RGBValues[2])); - } else { - ItemTooltip.LOGGER.warn("[Skyblocker Exotics] No expected color data found for id {}", id); - return null; - } - } - - public static boolean isException(String id, String hex) { - if (id.startsWith("LEATHER") || id.equals("GHOST_BOOTS") || Constants.SEYMOUR_IDS.contains(id)) { - return true; - } - if (id.startsWith("RANCHER")) { - return Constants.RANCHERS.contains(hex); - } - if (id.contains("ADAPTIVE_CHESTPLATE")) { - return Constants.ADAPTIVE_CHEST.contains(hex); - } else if (id.contains("ADAPTIVE")) { - return Constants.ADAPTIVE.contains(hex); - } - if (id.startsWith("REAPER")) { - return Constants.REAPER.contains(hex); - } - if (id.startsWith("FAIRY")) { - return Constants.FAIRY_HEXES.contains(hex); - } - if (id.startsWith("CRYSTAL")) { - return Constants.CRYSTAL_HEXES.contains(hex); - } - if (id.contains("SPOOK")) { - return Constants.SPOOK.contains(hex); - } - return false; - } - - public static DyeType checkDyeType(String hex) { - if (Constants.CRYSTAL_HEXES.contains(hex)) { - return DyeType.CRYSTAL; - } - if (Constants.FAIRY_HEXES.contains(hex)) { - return DyeType.FAIRY; - } - if (Constants.OG_FAIRY_HEXES.contains(hex)) { - return DyeType.OG_FAIRY; - } - if (Constants.SPOOK.contains(hex)) { - return DyeType.SPOOK; - } - if (Constants.GLITCHED.contains(hex)) { - return DyeType.GLITCHED; - } - return DyeType.EXOTIC; - } - - public static boolean intendedDyed(NbtCompound customData) { - return customData.contains("dye_item"); - } - - public enum DyeType implements StringIdentifiable { - CRYSTAL("crystal", Formatting.AQUA), - FAIRY("fairy", Formatting.LIGHT_PURPLE), - OG_FAIRY("og_fairy", Formatting.DARK_PURPLE), - SPOOK("spook", Formatting.RED), - GLITCHED("glitched", Formatting.BLUE), - EXOTIC("exotic", Formatting.GOLD); - private final String name; - private final Formatting formatting; - - DyeType(String name, Formatting formatting) { - this.name = name; - this.formatting = formatting; - } - - @Override - public String asString() { - return name; - } - - public MutableText getTranslatedText() { - return Text.translatable("skyblocker.exotic." + name).formatted(formatting); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 1f1412d4..041e9762 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -12,8 +12,6 @@ import de.hysky.skyblocker.utils.scheduler.Scheduler; import it.unimi.dsi.fastutil.Pair; import net.minecraft.client.MinecraftClient; import net.minecraft.client.item.TooltipType; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.DyedColorComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; @@ -123,34 +121,7 @@ public class ItemTooltip { - if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && stack.contains(DataComponentTypes.DYED_COLOR)) { - String uuid = ItemUtils.getItemUuid(stack); - boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); - //DyedColorComponent#getColor returns ARGB so we mask out the alpha bits - int dyeColor = DyedColorComponent.getColor(stack, 0); - // dyeColor will have alpha = 255 if it's dyed, and alpha = 0 if it's not dyed, - if (!hasCustomDye && dyeColor != 0) { - dyeColor = dyeColor & 0x00FFFFFF; - String colorHex = String.format("%06X", dyeColor); - String expectedHex = ExoticTooltip.getExpectedHex(internalID); - - boolean correctLine = false; - for (Text text : lines) { - String existingTooltip = text.getString() + " "; - if (existingTooltip.startsWith("Color: ")) { - correctLine = true; - - addExoticTooltip(lines, internalID, ItemUtils.getCustomData(stack), colorHex, expectedHex, existingTooltip); - break; - } - } - - if (!correctLine) { - addExoticTooltip(lines, internalID, ItemUtils.getCustomData(stack), colorHex, expectedHex, ""); - } - } - } if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); @@ -200,12 +171,6 @@ public class ItemTooltip { return neuName; } - private static void addExoticTooltip(List lines, String internalID, NbtCompound customData, String colorHex, String expectedHex, String existingTooltip) { - if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !ExoticTooltip.isException(internalID, colorHex) && !ExoticTooltip.intendedDyed(customData)) { - final ExoticTooltip.DyeType type = ExoticTooltip.checkDyeType(colorHex); - lines.add(1, Text.literal(existingTooltip + Formatting.DARK_GRAY + "(").append(type.getTranslatedText()).append(Formatting.DARK_GRAY + ")")); - } - } public static void nullWarning() { if (!sentNullWarning && client.player != null) { diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/ColorTooltip.java new file mode 100644 index 00000000..5908f4e8 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/ColorTooltip.java @@ -0,0 +1,135 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import de.hysky.skyblocker.utils.Constants; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.DyedColorComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.StringIdentifiable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class ColorTooltip extends TooltipAdder { + private static final Logger LOGGER = LoggerFactory.getLogger(ColorTooltip.class); + + public ColorTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && itemStack.contains(DataComponentTypes.DYED_COLOR)) { + String uuid = ItemUtils.getItemUuid(itemStack); + boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); + //DyedColorComponent#getColor returns ARGB so we mask out the alpha bits + int dyeColor = DyedColorComponent.getColor(itemStack, 0); + + // dyeColor will have alpha = 255 if it's dyed, and alpha = 0 if it's not dyed, + if (!hasCustomDye && dyeColor != 0) { + dyeColor = dyeColor & 0x00FFFFFF; + String colorHex = String.format("%06X", dyeColor); + String expectedHex = getExpectedHex(internalID); + + boolean correctLine = false; + for (Text text : lore) { + String existingTooltip = text.getString() + " "; + if (existingTooltip.startsWith("Color: ")) { + correctLine = true; + + addExoticTooltip(lore, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, existingTooltip); + break; + } + } + + if (!correctLine) { + addExoticTooltip(lore, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, ""); + } + } + } + } + + private static void addExoticTooltip(List lines, String internalID, NbtCompound customData, String colorHex, String expectedHex, String existingTooltip) { + if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !isException(internalID, colorHex) && !intendedDyed(customData)) { + final DyeType type = checkDyeType(colorHex); + lines.add(1, Text.literal(existingTooltip + Formatting.DARK_GRAY + "(").append(type.getTranslatedText()).append(Formatting.DARK_GRAY + ")")); + } + } + + public static String getExpectedHex(String id) { + String color = TooltipInfoType.COLOR.getData().get(id).getAsString(); + if (color != null) { + String[] RGBValues = color.split(","); + return String.format("%02X%02X%02X", Integer.parseInt(RGBValues[0]), Integer.parseInt(RGBValues[1]), Integer.parseInt(RGBValues[2])); + } else { + LOGGER.warn("[Skyblocker Exotics] No expected color data found for id {}", id); + return null; + } + } + + public static boolean isException(String id, String hex) { + return switch (id) { + case String it when it.startsWith("LEATHER") || it.equals("GHOST_BOOTS") || Constants.SEYMOUR_IDS.contains(it) -> true; + case String it when it.startsWith("RANCHER") -> Constants.RANCHERS.contains(hex); + case String it when it.contains("ADAPTIVE_CHESTPLATE") -> Constants.ADAPTIVE_CHEST.contains(hex); + case String it when it.contains("ADAPTIVE") -> Constants.ADAPTIVE.contains(hex); + case String it when it.contains("REAPER") -> Constants.REAPER.contains(hex); + case String it when it.contains("FAIRY") -> Constants.FAIRY_HEXES.contains(hex); + case String it when it.contains("CRYSTAL") -> Constants.CRYSTAL_HEXES.contains(hex); + case String it when it.contains("SPOOK") -> Constants.SPOOK.contains(hex); + default -> false; + }; + } + + public static DyeType checkDyeType(String hex) { + return switch (hex) { + case String it when Constants.CRYSTAL_HEXES.contains(it) -> DyeType.CRYSTAL; + case String it when Constants.FAIRY_HEXES.contains(it) -> DyeType.FAIRY; + case String it when Constants.OG_FAIRY_HEXES.contains(it) -> DyeType.OG_FAIRY; + case String it when Constants.SPOOK.contains(it) -> DyeType.SPOOK; + case String it when Constants.GLITCHED.contains(it) -> DyeType.GLITCHED; + default -> DyeType.EXOTIC; + }; + } + + public static boolean intendedDyed(NbtCompound customData) { + return customData.contains("dye_item"); + } + + public enum DyeType implements StringIdentifiable { + CRYSTAL("crystal", Formatting.AQUA), + FAIRY("fairy", Formatting.LIGHT_PURPLE), + OG_FAIRY("og_fairy", Formatting.DARK_PURPLE), + SPOOK("spook", Formatting.RED), + GLITCHED("glitched", Formatting.BLUE), + EXOTIC("exotic", Formatting.GOLD); + private final String name; + private final Formatting formatting; + + DyeType(String name, Formatting formatting) { + this.name = name; + this.formatting = formatting; + } + + @Override + public String asString() { + return name; + } + + public MutableText getTranslatedText() { + return Text.translatable("skyblocker.exotic." + name).formatted(formatting); + } + } + +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index dcad236f..b5f44405 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -17,6 +17,7 @@ public class TooltipManager { new DungeonQualityTooltip(0), new ObtainedTooltip(3), new MuseumTooltip(4), + new ColorTooltip(5), new MotesTooltip(0), new NpcPriceTooltip(1) }; -- cgit From d46c6474503bea7f08d0df8f7f36f305c8ed002c Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 09:32:12 +0300 Subject: Remove ExoticTooltip.java --- .../java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java deleted file mode 100644 index ac028918..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ExoticTooltip.java +++ /dev/null @@ -1,2 +0,0 @@ -package de.hysky.skyblocker.skyblock.item.tooltip; - -- cgit From c9f41e98f51bab9be6472f8943ac3d6d8fffe471 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 09:35:52 +0300 Subject: Refactor accessory tooltip --- .../skyblock/item/tooltip/AccessoryTooltip.java | 41 ++++++++++++++++++++++ .../skyblock/item/tooltip/ItemTooltip.java | 29 --------------- .../skyblocker/utils/tooltip/TooltipManager.java | 4 ++- 3 files changed, 44 insertions(+), 30 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoryTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoryTooltip.java new file mode 100644 index 00000000..a0a0559b --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoryTooltip.java @@ -0,0 +1,41 @@ +package de.hysky.skyblocker.skyblock.item.tooltip; + +import de.hysky.skyblocker.utils.tooltip.TooltipAdder; +import it.unimi.dsi.fastutil.Pair; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class AccessoryTooltip extends TooltipAdder { + public AccessoryTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final String internalID = ItemTooltip.getInternalNameFromNBT(focusedSlot.getStack(), true); + if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { + Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); + + if (report.left() != AccessoriesHelper.AccessoryReport.INELIGIBLE) { + MutableText title = Text.literal(String.format("%-19s", "Accessory: ")).withColor(0xf57542); + + Text stateText = switch (report.left()) { + case HAS_HIGHEST_TIER -> Text.literal("✔ Collected").formatted(Formatting.GREEN); + case IS_GREATER_TIER -> Text.literal("✦ Upgrade ").withColor(0x218bff).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case HAS_GREATER_TIER -> Text.literal("↑ Upgradable ").withColor(0xf8d048).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case OWNS_BETTER_TIER -> Text.literal("↓ Downgrade ").formatted(Formatting.GRAY).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case MISSING -> Text.literal("✖ Missing ").formatted(Formatting.RED).append(Text.literal(report.right()).withColor(0xf8f8ff)); + + //Should never be the case + default -> Text.literal("? Unknown").formatted(Formatting.GRAY); + }; + + lore.add(title.append(stateText)); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index 041e9762..bc79bf76 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -4,19 +4,16 @@ import com.google.gson.JsonObject; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.GeneralConfig; -import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper.AccessoryReport; import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.Scheduler; -import it.unimi.dsi.fastutil.Pair; import net.minecraft.client.MinecraftClient; import net.minecraft.client.item.TooltipType; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; -import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import org.jetbrains.annotations.NotNull; @@ -117,32 +114,6 @@ public class ItemTooltip { } } } - - - - - - - if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { - Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); - - if (report.left() != AccessoryReport.INELIGIBLE) { - MutableText title = Text.literal(String.format("%-19s", "Accessory: ")).withColor(0xf57542); - - Text stateText = switch (report.left()) { - case HAS_HIGHEST_TIER -> Text.literal("✔ Collected").formatted(Formatting.GREEN); - case IS_GREATER_TIER -> Text.literal("✦ Upgrade ").withColor(0x218bff).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case HAS_GREATER_TIER -> Text.literal("↑ Upgradable ").withColor(0xf8d048).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case OWNS_BETTER_TIER -> Text.literal("↓ Downgrade ").formatted(Formatting.GRAY).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case MISSING -> Text.literal("✖ Missing ").formatted(Formatting.RED).append(Text.literal(report.right()).withColor(0xf8f8ff)); - - //Should never be the case - default -> Text.literal("? Unknown").formatted(Formatting.GRAY); - }; - - lines.add(title.append(stateText)); - } - } } @NotNull diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index b5f44405..8b9898a2 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.utils.tooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.AccessoryTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.MuseumTooltip; import de.hysky.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; @@ -15,11 +16,12 @@ public class TooltipManager { private static final TooltipAdder[] adders = new TooltipAdder[]{ new LineSmoothener(), new DungeonQualityTooltip(0), + new NpcPriceTooltip(1), new ObtainedTooltip(3), new MuseumTooltip(4), new ColorTooltip(5), + new AccessoryTooltip(6), new MotesTooltip(0), - new NpcPriceTooltip(1) }; private static final ArrayList currentScreenAdders = new ArrayList<>(); -- cgit From b42644da30168189a21260eb67dde29f45ade510 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 09:40:35 +0300 Subject: Move AccessoryTooltip and MuseumTooltip --- .../skyblock/item/tooltip/AccessoriesHelper.java | 4 +- .../skyblock/item/tooltip/AccessoryTooltip.java | 41 ------------------ .../skyblock/item/tooltip/MuseumTooltip.java | 48 --------------------- .../skyblocker/utils/tooltip/AccessoryTooltip.java | 43 +++++++++++++++++++ .../skyblocker/utils/tooltip/MuseumTooltip.java | 49 ++++++++++++++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 2 - 6 files changed, 94 insertions(+), 93 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoryTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/MuseumTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/AccessoryTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/MuseumTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java index 8798a139..992206ad 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoriesHelper.java @@ -108,7 +108,7 @@ public class AccessoriesHelper { .put(page, new ObjectOpenHashSet<>(accessoryIds)); } - static Pair calculateReport4Accessory(String accessoryId) { + public static Pair calculateReport4Accessory(String accessoryId) { if (!ACCESSORY_DATA.containsKey(accessoryId) || Utils.getProfileId().isEmpty()) return Pair.of(AccessoryReport.INELIGIBLE, null); Accessory accessory = ACCESSORY_DATA.get(accessoryId); @@ -208,7 +208,7 @@ public class AccessoriesHelper { } } - enum AccessoryReport { + public enum AccessoryReport { HAS_HIGHEST_TIER, //You've collected the highest tier - Collected IS_GREATER_TIER, //This accessory is an upgrade from the one in the same family that you already have - Upgrade -- Shows you what tier this accessory is in its family HAS_GREATER_TIER, //This accessory has a higher tier upgrade - Upgradable -- Shows you the highest tier accessory you've collected in that family diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoryTooltip.java deleted file mode 100644 index a0a0559b..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/AccessoryTooltip.java +++ /dev/null @@ -1,41 +0,0 @@ -package de.hysky.skyblocker.skyblock.item.tooltip; - -import de.hysky.skyblocker.utils.tooltip.TooltipAdder; -import it.unimi.dsi.fastutil.Pair; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class AccessoryTooltip extends TooltipAdder { - public AccessoryTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - final String internalID = ItemTooltip.getInternalNameFromNBT(focusedSlot.getStack(), true); - if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { - Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); - - if (report.left() != AccessoriesHelper.AccessoryReport.INELIGIBLE) { - MutableText title = Text.literal(String.format("%-19s", "Accessory: ")).withColor(0xf57542); - - Text stateText = switch (report.left()) { - case HAS_HIGHEST_TIER -> Text.literal("✔ Collected").formatted(Formatting.GREEN); - case IS_GREATER_TIER -> Text.literal("✦ Upgrade ").withColor(0x218bff).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case HAS_GREATER_TIER -> Text.literal("↑ Upgradable ").withColor(0xf8d048).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case OWNS_BETTER_TIER -> Text.literal("↓ Downgrade ").formatted(Formatting.GRAY).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case MISSING -> Text.literal("✖ Missing ").formatted(Formatting.RED).append(Text.literal(report.right()).withColor(0xf8f8ff)); - - //Should never be the case - default -> Text.literal("? Unknown").formatted(Formatting.GRAY); - }; - - lore.add(title.append(stateText)); - } - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/MuseumTooltip.java deleted file mode 100644 index 727c83db..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/MuseumTooltip.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.hysky.skyblocker.skyblock.item.tooltip; - -import de.hysky.skyblocker.skyblock.item.MuseumItemCache; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.tooltip.TooltipAdder; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class MuseumTooltip extends TooltipAdder { - public MuseumTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); - if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { - String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); - String format = switch (itemCategory) { - case "Weapons" -> "%-18s"; - case "Armor" -> "%-19s"; - default -> "%-20s"; - }; - - //Special case the special category so that it doesn't always display not donated - if (itemCategory.equals("Special")) { - lore.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) - .formatted(Formatting.LIGHT_PURPLE)); - } else { - NbtCompound customData = ItemUtils.getCustomData(itemStack); - boolean isInMuseum = (customData.contains("donated_museum") && customData.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID); - - Formatting donatedIndicatorFormatting = isInMuseum ? Formatting.GREEN : Formatting.RED; - - lore.add(Text.literal(String.format(format, "Museum (" + itemCategory + "):")) - .formatted(Formatting.LIGHT_PURPLE) - .append(Text.literal(isInMuseum ? "✔" : "✖").formatted(donatedIndicatorFormatting, Formatting.BOLD)) - .append(Text.literal(isInMuseum ? " Donated" : " Not Donated").formatted(donatedIndicatorFormatting))); - } - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/AccessoryTooltip.java new file mode 100644 index 00000000..6650adee --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/AccessoryTooltip.java @@ -0,0 +1,43 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import it.unimi.dsi.fastutil.Pair; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class AccessoryTooltip extends TooltipAdder { + public AccessoryTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final String internalID = ItemTooltip.getInternalNameFromNBT(focusedSlot.getStack(), true); + if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { + Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); + + if (report.left() != AccessoriesHelper.AccessoryReport.INELIGIBLE) { + MutableText title = Text.literal(String.format("%-19s", "Accessory: ")).withColor(0xf57542); + + Text stateText = switch (report.left()) { + case HAS_HIGHEST_TIER -> Text.literal("✔ Collected").formatted(Formatting.GREEN); + case IS_GREATER_TIER -> Text.literal("✦ Upgrade ").withColor(0x218bff).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case HAS_GREATER_TIER -> Text.literal("↑ Upgradable ").withColor(0xf8d048).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case OWNS_BETTER_TIER -> Text.literal("↓ Downgrade ").formatted(Formatting.GRAY).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case MISSING -> Text.literal("✖ Missing ").formatted(Formatting.RED).append(Text.literal(report.right()).withColor(0xf8f8ff)); + + //Should never be the case + default -> Text.literal("? Unknown").formatted(Formatting.GRAY); + }; + + lore.add(title.append(stateText)); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/MuseumTooltip.java new file mode 100644 index 00000000..038cbbe8 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/MuseumTooltip.java @@ -0,0 +1,49 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.skyblock.item.MuseumItemCache; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class MuseumTooltip extends TooltipAdder { + public MuseumTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { + String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); + String format = switch (itemCategory) { + case "Weapons" -> "%-18s"; + case "Armor" -> "%-19s"; + default -> "%-20s"; + }; + + //Special case the special category so that it doesn't always display not donated + if (itemCategory.equals("Special")) { + lore.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) + .formatted(Formatting.LIGHT_PURPLE)); + } else { + NbtCompound customData = ItemUtils.getCustomData(itemStack); + boolean isInMuseum = (customData.contains("donated_museum") && customData.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID); + + Formatting donatedIndicatorFormatting = isInMuseum ? Formatting.GREEN : Formatting.RED; + + lore.add(Text.literal(String.format(format, "Museum (" + itemCategory + "):")) + .formatted(Formatting.LIGHT_PURPLE) + .append(Text.literal(isInMuseum ? "✔" : "✖").formatted(donatedIndicatorFormatting, Formatting.BOLD)) + .append(Text.literal(isInMuseum ? " Donated" : " Not Donated").formatted(donatedIndicatorFormatting))); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index 8b9898a2..dca81389 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -1,7 +1,5 @@ package de.hysky.skyblocker.utils.tooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.AccessoryTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.MuseumTooltip; import de.hysky.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; -- cgit From 72988890442db5566287ec5adc8c6dc01676cdda Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 10:01:19 +0300 Subject: Refactor bz, lbin, avgbin tooltips --- .../skyblock/item/tooltip/ItemTooltip.java | 88 +--------------------- src/main/java/de/hysky/skyblocker/utils/Utils.java | 3 - .../skyblocker/utils/tooltip/AvgBinTooltip.java | 66 ++++++++++++++++ .../utils/tooltip/BazaarPriceTooltip.java | 46 +++++++++++ .../skyblocker/utils/tooltip/LBinTooltip.java | 39 ++++++++++ .../skyblocker/utils/tooltip/TooltipManager.java | 15 ++-- 6 files changed, 161 insertions(+), 96 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/AvgBinTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/BazaarPriceTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/LBinTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java index bc79bf76..00ca80e6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java @@ -9,8 +9,6 @@ import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.Scheduler; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipType; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; @@ -29,93 +27,9 @@ import java.util.concurrent.CompletableFuture; public class ItemTooltip { protected static final Logger LOGGER = LoggerFactory.getLogger(ItemTooltip.class.getName()); private static final MinecraftClient client = MinecraftClient.getInstance(); - protected static final GeneralConfig.ItemTooltip config = SkyblockerConfigManager.get().general.itemTooltip; + public static final GeneralConfig.ItemTooltip config = SkyblockerConfigManager.get().general.itemTooltip; private static volatile boolean sentNullWarning = false; - public static void getTooltip(ItemStack stack, Item.TooltipContext tooltipContext, TooltipType tooltipType, List lines) { - if (!Utils.isOnSkyblock() || client.player == null) return; - - String name = getInternalNameFromNBT(stack, false); - String internalID = getInternalNameFromNBT(stack, true); - String neuName = name; - if (name == null || internalID == null) return; - - if (name.startsWith("ISSHINY_")) { - name = "SHINY_" + internalID; - neuName = internalID; - } - - if (lines.isEmpty()) { - return; - } - - int count = stack.getCount(); - - boolean bazaarExist = false; - - if (TooltipInfoType.BAZAAR.isTooltipEnabledAndHasOrNullWarning(name)) { - JsonObject getItem = TooltipInfoType.BAZAAR.getData().getAsJsonObject(name); - lines.add(Text.literal(String.format("%-18s", "Bazaar buy Price:")) - .formatted(Formatting.GOLD) - .append(getItem.get("buyPrice").isJsonNull() - ? Text.literal("No data").formatted(Formatting.RED) - : getCoinsMessage(getItem.get("buyPrice").getAsDouble(), count))); - lines.add(Text.literal(String.format("%-19s", "Bazaar sell Price:")) - .formatted(Formatting.GOLD) - .append(getItem.get("sellPrice").isJsonNull() - ? Text.literal("No data").formatted(Formatting.RED) - : getCoinsMessage(getItem.get("sellPrice").getAsDouble(), count))); - bazaarExist = true; - } - - // bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api - boolean lbinExist = false; - if (TooltipInfoType.LOWEST_BINS.isTooltipEnabledAndHasOrNullWarning(name) && !bazaarExist) { - lines.add(Text.literal(String.format("%-19s", "Lowest BIN Price:")) - .formatted(Formatting.GOLD) - .append(getCoinsMessage(TooltipInfoType.LOWEST_BINS.getData().get(name).getAsDouble(), count))); - lbinExist = true; - } - - if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) { - if (TooltipInfoType.ONE_DAY_AVERAGE.getData() == null || TooltipInfoType.THREE_DAY_AVERAGE.getData() == null) { - nullWarning(); - } else { - /* - We are skipping check average prices for potions, runes - and enchanted books because there is no data for their in API. - */ - neuName = getNeuName(internalID, neuName); - - if (!neuName.isEmpty() && lbinExist) { - GeneralConfig.Average type = config.avg; - - // "No data" line because of API not keeping old data, it causes NullPointerException - if (type == GeneralConfig.Average.ONE_DAY || type == GeneralConfig.Average.BOTH) { - lines.add( - Text.literal(String.format("%-19s", "1 Day Avg. Price:")) - .formatted(Formatting.GOLD) - .append(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName) == null - ? Text.literal("No data").formatted(Formatting.RED) - : getCoinsMessage(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), count) - ) - ); - } - if (type == GeneralConfig.Average.THREE_DAY || type == GeneralConfig.Average.BOTH) { - lines.add( - Text.literal(String.format("%-19s", "3 Day Avg. Price:")) - .formatted(Formatting.GOLD) - .append(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName) == null - ? Text.literal("No data").formatted(Formatting.RED) - : getCoinsMessage(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), count) - ) - ); - } - } - } - } - } - @NotNull public static String getNeuName(String internalID, String neuName) { switch (internalID) { diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java index 7c28294f..925879b8 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Utils.java +++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java @@ -5,11 +5,9 @@ import com.google.gson.JsonParser; import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.mixins.accessors.MessageHandlerAccessor; import de.hysky.skyblocker.skyblock.item.MuseumItemCache; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import de.hysky.skyblocker.utils.scheduler.Scheduler; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.PacketSender; @@ -235,7 +233,6 @@ public class Utils { if (!isOnSkyblock) { if (!isInjected) { isInjected = true; - ItemTooltipCallback.EVENT.register(ItemTooltip::getTooltip); } isOnSkyblock = true; SkyblockEvents.JOIN.invoker().onSkyblockJoin(); diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/AvgBinTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/AvgBinTooltip.java new file mode 100644 index 00000000..ca36bcf4 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/AvgBinTooltip.java @@ -0,0 +1,66 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.config.configs.GeneralConfig; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class AvgBinTooltip extends TooltipAdder { + protected AvgBinTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + String neuName = ItemTooltip.getInternalNameFromNBT(itemStack, false); + String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (neuName == null || internalID == null) return; + + if (neuName.startsWith("ISSHINY_")) neuName = internalID; + + if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) { + if (TooltipInfoType.ONE_DAY_AVERAGE.getData() == null || TooltipInfoType.THREE_DAY_AVERAGE.getData() == null) { + ItemTooltip.nullWarning(); + } else { + /* + We are skipping check average prices for potions, runes + and enchanted books because there is no data for their in API. + */ + neuName = ItemTooltip.getNeuName(internalID, neuName); + + if (!neuName.isEmpty() && LBinTooltip.lbinExist) { + GeneralConfig.Average type = ItemTooltip.config.avg; + + // "No data" line because of API not keeping old data, it causes NullPointerException + if (type == GeneralConfig.Average.ONE_DAY || type == GeneralConfig.Average.BOTH) { + lore.add( + Text.literal(String.format("%-19s", "1 Day Avg. Price:")) + .formatted(Formatting.GOLD) + .append(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName) == null + ? Text.literal("No data").formatted(Formatting.RED) + : ItemTooltip.getCoinsMessage(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), itemStack.getCount()) + ) + ); + } + if (type == GeneralConfig.Average.THREE_DAY || type == GeneralConfig.Average.BOTH) { + lore.add( + Text.literal(String.format("%-19s", "3 Day Avg. Price:")) + .formatted(Formatting.GOLD) + .append(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName) == null + ? Text.literal("No data").formatted(Formatting.RED) + : ItemTooltip.getCoinsMessage(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), itemStack.getCount()) + ) + ); + } + } + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/BazaarPriceTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/BazaarPriceTooltip.java new file mode 100644 index 00000000..c43a3fa2 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/BazaarPriceTooltip.java @@ -0,0 +1,46 @@ +package de.hysky.skyblocker.utils.tooltip; + +import com.google.gson.JsonObject; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class BazaarPriceTooltip extends TooltipAdder { + public static boolean bazaarExist = false; + + protected BazaarPriceTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + bazaarExist = false; + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (internalID == null) return; + String name = ItemTooltip.getInternalNameFromNBT(itemStack, false); + if (name == null) return; + + if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; + + if (TooltipInfoType.BAZAAR.isTooltipEnabledAndHasOrNullWarning(name)) { + JsonObject getItem = TooltipInfoType.BAZAAR.getData().getAsJsonObject(name); + lore.add(Text.literal(String.format("%-18s", "Bazaar buy Price:")) + .formatted(Formatting.GOLD) + .append(getItem.get("buyPrice").isJsonNull() + ? Text.literal("No data").formatted(Formatting.RED) + : ItemTooltip.getCoinsMessage(getItem.get("buyPrice").getAsDouble(), itemStack.getCount()))); + lore.add(Text.literal(String.format("%-19s", "Bazaar sell Price:")) + .formatted(Formatting.GOLD) + .append(getItem.get("sellPrice").isJsonNull() + ? Text.literal("No data").formatted(Formatting.RED) + : ItemTooltip.getCoinsMessage(getItem.get("sellPrice").getAsDouble(), itemStack.getCount()))); + bazaarExist = true; + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/LBinTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/LBinTooltip.java new file mode 100644 index 00000000..e35df8fe --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/LBinTooltip.java @@ -0,0 +1,39 @@ +package de.hysky.skyblocker.utils.tooltip; + +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class LBinTooltip extends TooltipAdder { + public static boolean lbinExist = false; + + protected LBinTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + lbinExist = false; + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (internalID == null) return; + String name = ItemTooltip.getInternalNameFromNBT(itemStack, false); + if (name == null) return; + + if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; + + // bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api + + if (TooltipInfoType.LOWEST_BINS.isTooltipEnabledAndHasOrNullWarning(name) && !BazaarPriceTooltip.bazaarExist) { + lore.add(Text.literal(String.format("%-19s", "Lowest BIN Price:")) + .formatted(Formatting.GOLD) + .append(ItemTooltip.getCoinsMessage(TooltipInfoType.LOWEST_BINS.getData().get(name).getAsDouble(), itemStack.getCount()))); + lbinExist = true; + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java index dca81389..b1e902e7 100644 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java @@ -13,13 +13,16 @@ import java.util.List; public class TooltipManager { private static final TooltipAdder[] adders = new TooltipAdder[]{ new LineSmoothener(), - new DungeonQualityTooltip(0), new NpcPriceTooltip(1), - new ObtainedTooltip(3), - new MuseumTooltip(4), - new ColorTooltip(5), - new AccessoryTooltip(6), - new MotesTooltip(0), + new BazaarPriceTooltip(2), + new LBinTooltip(3), //Has to come after bz price + new AvgBinTooltip(4), //Has to come after lbin price + new DungeonQualityTooltip(5), + new MotesTooltip(6), + new ObtainedTooltip(7), + new MuseumTooltip(8), + new ColorTooltip(9), + new AccessoryTooltip(10), }; private static final ArrayList currentScreenAdders = new ArrayList<>(); -- cgit From 38f32048dffcd2b1bcdbba77ecdb16aeeac61690 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 13:45:34 +0300 Subject: Move tooltip adders from utils/tooltip package to skyblock/item/tooltip/adders --- .../java/de/hysky/skyblocker/SkyblockerMod.java | 2 +- .../skyblocker/mixins/HandledScreenMixin.java | 2 +- .../chocolatefactory/ChocolateFactorySolver.java | 2 +- .../skyblock/item/tooltip/TooltipManager.java | 69 +++++++++++ .../item/tooltip/adders/AccessoryTooltip.java | 43 +++++++ .../item/tooltip/adders/AvgBinTooltip.java | 66 ++++++++++ .../item/tooltip/adders/BazaarPriceTooltip.java | 46 +++++++ .../skyblock/item/tooltip/adders/ColorTooltip.java | 135 +++++++++++++++++++++ .../item/tooltip/adders/DungeonQualityTooltip.java | 55 +++++++++ .../skyblock/item/tooltip/adders/LBinTooltip.java | 39 ++++++ .../item/tooltip/adders/LineSmoothener.java | 31 +++++ .../skyblock/item/tooltip/adders/MotesTooltip.java | 50 ++++++++ .../item/tooltip/adders/MuseumTooltip.java | 49 ++++++++ .../item/tooltip/adders/NpcPriceTooltip.java | 27 +++++ .../item/tooltip/adders/ObtainedTooltip.java | 71 +++++++++++ .../skyblock/item/tooltip/adders/TooltipAdder.java | 36 ++++++ .../skyblocker/utils/tooltip/AccessoryTooltip.java | 43 ------- .../skyblocker/utils/tooltip/AvgBinTooltip.java | 66 ---------- .../utils/tooltip/BazaarPriceTooltip.java | 46 ------- .../skyblocker/utils/tooltip/ColorTooltip.java | 135 --------------------- .../utils/tooltip/DungeonQualityTooltip.java | 55 --------- .../skyblocker/utils/tooltip/LBinTooltip.java | 39 ------ .../skyblocker/utils/tooltip/LineSmoothener.java | 31 ----- .../skyblocker/utils/tooltip/MotesTooltip.java | 50 -------- .../skyblocker/utils/tooltip/MuseumTooltip.java | 49 -------- .../skyblocker/utils/tooltip/NpcPriceTooltip.java | 27 ----- .../skyblocker/utils/tooltip/ObtainedTooltip.java | 71 ----------- .../skyblocker/utils/tooltip/TooltipAdder.java | 35 ------ .../skyblocker/utils/tooltip/TooltipManager.java | 68 ----------- .../de/hysky/skyblocker/utils/ItemUtilsTest.java | 2 +- 30 files changed, 721 insertions(+), 719 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedTooltip.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/AccessoryTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/AvgBinTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/BazaarPriceTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/ColorTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/DungeonQualityTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/LBinTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/LineSmoothener.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/MotesTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/MuseumTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/NpcPriceTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/ObtainedTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index 5243ff46..462e6a4a 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -34,6 +34,7 @@ import de.hysky.skyblocker.skyblock.item.*; import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipManager; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.skyblock.rift.TheRift; import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager; @@ -55,7 +56,6 @@ import de.hysky.skyblocker.utils.render.gui.ContainerSolverManager; import de.hysky.skyblocker.utils.render.title.TitleContainer; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import de.hysky.skyblocker.utils.scheduler.Scheduler; -import de.hysky.skyblocker.utils.tooltip.TooltipManager; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.loader.api.FabricLoader; diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index a5f8c5cd..0c413fc8 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -16,12 +16,12 @@ import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; import de.hysky.skyblocker.skyblock.item.WikiLookup; import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipManager; import de.hysky.skyblocker.skyblock.quicknav.QuickNav; import de.hysky.skyblocker.skyblock.quicknav.QuickNavButton; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; -import de.hysky.skyblocker.utils.tooltip.TooltipManager; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index cd622934..fa19119a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -1,11 +1,11 @@ package de.hysky.skyblocker.skyblock.chocolatefactory; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.adders.LineSmoothener; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RegexUtils; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; -import de.hysky.skyblocker.utils.tooltip.LineSmoothener; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java new file mode 100644 index 00000000..90dc48d6 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -0,0 +1,69 @@ +package de.hysky.skyblocker.skyblock.item.tooltip; + +import de.hysky.skyblocker.skyblock.item.tooltip.adders.*; +import de.hysky.skyblocker.utils.Utils; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class TooltipManager { + private static final TooltipAdder[] adders = new TooltipAdder[]{ + new LineSmoothener(), + new NpcPriceTooltip(1), + new BazaarPriceTooltip(2), + new LBinTooltip(3), //Has to come after bz price + new AvgBinTooltip(4), //Has to come after lbin price + new DungeonQualityTooltip(5), + new MotesTooltip(6), + new ObtainedTooltip(7), + new MuseumTooltip(8), + new ColorTooltip(9), + new AccessoryTooltip(10), + }; + private static final ArrayList currentScreenAdders = new ArrayList<>(); + + private TooltipManager() { + } + + public static void init() { + ScreenEvents.AFTER_INIT.register((client, screen, width, height) -> { + onScreenChange(screen); + ScreenEvents.remove(screen).register(ignored -> currentScreenAdders.clear()); + }); + } + + private static void onScreenChange(Screen screen) { + final String title = screen.getTitle().getString(); + for (TooltipAdder adder : adders) { + if (adder.titlePattern == null || adder.titlePattern.matcher(title).matches()) { + currentScreenAdders.add(adder); + } + } + currentScreenAdders.sort(Comparator.comparingInt(adder -> adder.priority)); + } + + /** + *

Adds additional text from all adders that are applicable to the current screen. + * This method is run on each tooltip render, so don't do any heavy calculations here.

+ * + *

If you want to add info to the tooltips of multiple items, consider using a switch statement with {@code focusedSlot.getIndex()}

+ * + * @param lore The lore of the focused item. + * @param focusedSlot The slot that is currently focused by the cursor. + * @return The lore itself after all adders have added their text. + * @deprecated This method is public only for the sake of the mixin. Don't call directly, not that there is any point to it. + */ + @Deprecated + public static List addToTooltip(List lore, Slot focusedSlot) { + if (!Utils.isOnSkyblock()) return lore; + for (TooltipAdder adder : currentScreenAdders) { + adder.addToTooltip(lore, focusedSlot); + } + return lore; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java new file mode 100644 index 00000000..b35ba0a1 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java @@ -0,0 +1,43 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import it.unimi.dsi.fastutil.Pair; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class AccessoryTooltip extends TooltipAdder { + public AccessoryTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final String internalID = ItemTooltip.getInternalNameFromNBT(focusedSlot.getStack(), true); + if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { + Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); + + if (report.left() != AccessoriesHelper.AccessoryReport.INELIGIBLE) { + MutableText title = Text.literal(String.format("%-19s", "Accessory: ")).withColor(0xf57542); + + Text stateText = switch (report.left()) { + case HAS_HIGHEST_TIER -> Text.literal("✔ Collected").formatted(Formatting.GREEN); + case IS_GREATER_TIER -> Text.literal("✦ Upgrade ").withColor(0x218bff).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case HAS_GREATER_TIER -> Text.literal("↑ Upgradable ").withColor(0xf8d048).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case OWNS_BETTER_TIER -> Text.literal("↓ Downgrade ").formatted(Formatting.GRAY).append(Text.literal(report.right()).withColor(0xf8f8ff)); + case MISSING -> Text.literal("✖ Missing ").formatted(Formatting.RED).append(Text.literal(report.right()).withColor(0xf8f8ff)); + + //Should never be the case + default -> Text.literal("? Unknown").formatted(Formatting.GRAY); + }; + + lore.add(title.append(stateText)); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java new file mode 100644 index 00000000..70dc3b21 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java @@ -0,0 +1,66 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.config.configs.GeneralConfig; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class AvgBinTooltip extends TooltipAdder { + public AvgBinTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + String neuName = ItemTooltip.getInternalNameFromNBT(itemStack, false); + String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (neuName == null || internalID == null) return; + + if (neuName.startsWith("ISSHINY_")) neuName = internalID; + + if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) { + if (TooltipInfoType.ONE_DAY_AVERAGE.getData() == null || TooltipInfoType.THREE_DAY_AVERAGE.getData() == null) { + ItemTooltip.nullWarning(); + } else { + /* + We are skipping check average prices for potions, runes + and enchanted books because there is no data for their in API. + */ + neuName = ItemTooltip.getNeuName(internalID, neuName); + + if (!neuName.isEmpty() && LBinTooltip.lbinExist) { + GeneralConfig.Average type = ItemTooltip.config.avg; + + // "No data" line because of API not keeping old data, it causes NullPointerException + if (type == GeneralConfig.Average.ONE_DAY || type == GeneralConfig.Average.BOTH) { + lore.add( + Text.literal(String.format("%-19s", "1 Day Avg. Price:")) + .formatted(Formatting.GOLD) + .append(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName) == null + ? Text.literal("No data").formatted(Formatting.RED) + : ItemTooltip.getCoinsMessage(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), itemStack.getCount()) + ) + ); + } + if (type == GeneralConfig.Average.THREE_DAY || type == GeneralConfig.Average.BOTH) { + lore.add( + Text.literal(String.format("%-19s", "3 Day Avg. Price:")) + .formatted(Formatting.GOLD) + .append(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName) == null + ? Text.literal("No data").formatted(Formatting.RED) + : ItemTooltip.getCoinsMessage(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), itemStack.getCount()) + ) + ); + } + } + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java new file mode 100644 index 00000000..8266aa87 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java @@ -0,0 +1,46 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import com.google.gson.JsonObject; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class BazaarPriceTooltip extends TooltipAdder { + public static boolean bazaarExist = false; + + public BazaarPriceTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + bazaarExist = false; + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (internalID == null) return; + String name = ItemTooltip.getInternalNameFromNBT(itemStack, false); + if (name == null) return; + + if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; + + if (TooltipInfoType.BAZAAR.isTooltipEnabledAndHasOrNullWarning(name)) { + JsonObject getItem = TooltipInfoType.BAZAAR.getData().getAsJsonObject(name); + lore.add(Text.literal(String.format("%-18s", "Bazaar buy Price:")) + .formatted(Formatting.GOLD) + .append(getItem.get("buyPrice").isJsonNull() + ? Text.literal("No data").formatted(Formatting.RED) + : ItemTooltip.getCoinsMessage(getItem.get("buyPrice").getAsDouble(), itemStack.getCount()))); + lore.add(Text.literal(String.format("%-19s", "Bazaar sell Price:")) + .formatted(Formatting.GOLD) + .append(getItem.get("sellPrice").isJsonNull() + ? Text.literal("No data").formatted(Formatting.RED) + : ItemTooltip.getCoinsMessage(getItem.get("sellPrice").getAsDouble(), itemStack.getCount()))); + bazaarExist = true; + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java new file mode 100644 index 00000000..253626ef --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java @@ -0,0 +1,135 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import de.hysky.skyblocker.utils.Constants; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.DyedColorComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.StringIdentifiable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class ColorTooltip extends TooltipAdder { + private static final Logger LOGGER = LoggerFactory.getLogger(ColorTooltip.class); + + public ColorTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && itemStack.contains(DataComponentTypes.DYED_COLOR)) { + String uuid = ItemUtils.getItemUuid(itemStack); + boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); + //DyedColorComponent#getColor returns ARGB so we mask out the alpha bits + int dyeColor = DyedColorComponent.getColor(itemStack, 0); + + // dyeColor will have alpha = 255 if it's dyed, and alpha = 0 if it's not dyed, + if (!hasCustomDye && dyeColor != 0) { + dyeColor = dyeColor & 0x00FFFFFF; + String colorHex = String.format("%06X", dyeColor); + String expectedHex = getExpectedHex(internalID); + + boolean correctLine = false; + for (Text text : lore) { + String existingTooltip = text.getString() + " "; + if (existingTooltip.startsWith("Color: ")) { + correctLine = true; + + addExoticTooltip(lore, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, existingTooltip); + break; + } + } + + if (!correctLine) { + addExoticTooltip(lore, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, ""); + } + } + } + } + + private static void addExoticTooltip(List lines, String internalID, NbtCompound customData, String colorHex, String expectedHex, String existingTooltip) { + if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !isException(internalID, colorHex) && !intendedDyed(customData)) { + final DyeType type = checkDyeType(colorHex); + lines.add(1, Text.literal(existingTooltip + Formatting.DARK_GRAY + "(").append(type.getTranslatedText()).append(Formatting.DARK_GRAY + ")")); + } + } + + public static String getExpectedHex(String id) { + String color = TooltipInfoType.COLOR.getData().get(id).getAsString(); + if (color != null) { + String[] RGBValues = color.split(","); + return String.format("%02X%02X%02X", Integer.parseInt(RGBValues[0]), Integer.parseInt(RGBValues[1]), Integer.parseInt(RGBValues[2])); + } else { + LOGGER.warn("[Skyblocker Exotics] No expected color data found for id {}", id); + return null; + } + } + + public static boolean isException(String id, String hex) { + return switch (id) { + case String it when it.startsWith("LEATHER") || it.equals("GHOST_BOOTS") || Constants.SEYMOUR_IDS.contains(it) -> true; + case String it when it.startsWith("RANCHER") -> Constants.RANCHERS.contains(hex); + case String it when it.contains("ADAPTIVE_CHESTPLATE") -> Constants.ADAPTIVE_CHEST.contains(hex); + case String it when it.contains("ADAPTIVE") -> Constants.ADAPTIVE.contains(hex); + case String it when it.contains("REAPER") -> Constants.REAPER.contains(hex); + case String it when it.contains("FAIRY") -> Constants.FAIRY_HEXES.contains(hex); + case String it when it.contains("CRYSTAL") -> Constants.CRYSTAL_HEXES.contains(hex); + case String it when it.contains("SPOOK") -> Constants.SPOOK.contains(hex); + default -> false; + }; + } + + public static DyeType checkDyeType(String hex) { + return switch (hex) { + case String it when Constants.CRYSTAL_HEXES.contains(it) -> DyeType.CRYSTAL; + case String it when Constants.FAIRY_HEXES.contains(it) -> DyeType.FAIRY; + case String it when Constants.OG_FAIRY_HEXES.contains(it) -> DyeType.OG_FAIRY; + case String it when Constants.SPOOK.contains(it) -> DyeType.SPOOK; + case String it when Constants.GLITCHED.contains(it) -> DyeType.GLITCHED; + default -> DyeType.EXOTIC; + }; + } + + public static boolean intendedDyed(NbtCompound customData) { + return customData.contains("dye_item"); + } + + public enum DyeType implements StringIdentifiable { + CRYSTAL("crystal", Formatting.AQUA), + FAIRY("fairy", Formatting.LIGHT_PURPLE), + OG_FAIRY("og_fairy", Formatting.DARK_PURPLE), + SPOOK("spook", Formatting.RED), + GLITCHED("glitched", Formatting.BLUE), + EXOTIC("exotic", Formatting.GOLD); + private final String name; + private final Formatting formatting; + + DyeType(String name, Formatting formatting) { + this.name = name; + this.formatting = formatting; + } + + @Override + public String asString() { + return name; + } + + public MutableText getTranslatedText() { + return Text.translatable("skyblocker.exotic." + name).formatted(formatting); + } + } + +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java new file mode 100644 index 00000000..7f928e75 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java @@ -0,0 +1,55 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class DungeonQualityTooltip extends TooltipAdder { + public DungeonQualityTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + if (!SkyblockerConfigManager.get().general.itemTooltip.dungeonQuality) return; + NbtCompound customData = ItemUtils.getCustomData(focusedSlot.getStack()); + if (customData == null || !customData.contains("baseStatBoostPercentage")) return; + int baseStatBoostPercentage = customData.getInt("baseStatBoostPercentage"); + boolean maxQuality = baseStatBoostPercentage == 50; + if (maxQuality) { + lore.add(Text.literal(String.format("%-17s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.RED).formatted(Formatting.BOLD)); + } else { + lore.add(Text.literal(String.format("%-21s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.BLUE)); + } + + if (customData.contains("item_tier")) { // sometimes it just isn't here? + int itemTier = customData.getInt("item_tier"); + if (maxQuality) { + lore.add(Text.literal(String.format("%-17s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.RED).formatted(Formatting.BOLD)); + } else { + lore.add(Text.literal(String.format("%-21s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.BLUE)); + } + } + } + + final String getItemTierFloor(int tier) { + return switch (tier) { + case 1 -> "F1"; + case 2 -> "F2"; + case 3 -> "F3"; + case 4 -> "F4/M1"; + case 5 -> "F5/M2"; + case 6 -> "F6/M3"; + case 7 -> "F7/M4"; + case 8 -> "M5"; + case 9 -> "M6"; + case 10 -> "M7"; + default -> "Unknown"; + }; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java new file mode 100644 index 00000000..f5332215 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java @@ -0,0 +1,39 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class LBinTooltip extends TooltipAdder { + public static boolean lbinExist = false; + + public LBinTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + lbinExist = false; + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (internalID == null) return; + String name = ItemTooltip.getInternalNameFromNBT(itemStack, false); + if (name == null) return; + + if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; + + // bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api + + if (TooltipInfoType.LOWEST_BINS.isTooltipEnabledAndHasOrNullWarning(name) && !BazaarPriceTooltip.bazaarExist) { + lore.add(Text.literal(String.format("%-19s", "Lowest BIN Price:")) + .formatted(Formatting.GOLD) + .append(ItemTooltip.getCoinsMessage(TooltipInfoType.LOWEST_BINS.getData().get(name).getAsDouble(), itemStack.getCount()))); + lbinExist = true; + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java new file mode 100644 index 00000000..b527284a --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java @@ -0,0 +1,31 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class LineSmoothener extends TooltipAdder { + //This is static to not create a new text object for each line in every item + private static final Text BUMPY_LINE = Text.literal("-----------------").formatted(Formatting.DARK_GRAY, Formatting.STRIKETHROUGH); + + public static Text createSmoothLine() { + return Text.literal(" ").formatted(Formatting.DARK_GRAY, Formatting.STRIKETHROUGH, Formatting.BOLD); + } + + public LineSmoothener() { + super(Integer.MIN_VALUE); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + for (int i = 0; i < lore.size(); i++) { + List lineSiblings = lore.get(i).getSiblings(); + //Compare the first sibling rather than the whole object as the style of the root object can change while visually staying the same + if (lineSiblings.size() == 1 && lineSiblings.getFirst().equals(BUMPY_LINE)) { + lore.set(i, createSmoothLine()); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java new file mode 100644 index 00000000..23a88d55 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java @@ -0,0 +1,50 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; +import java.util.Locale; + +public class MotesTooltip extends TooltipAdder { + public MotesTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (internalID != null && TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { + lore.add(Text.literal(String.format("%-20s", "Motes Price:")) + .formatted(Formatting.LIGHT_PURPLE) + .append(getMotesMessage(TooltipInfoType.MOTES.getData().get(internalID).getAsInt(), itemStack.getCount()))); + } + } + + private static Text getMotesMessage(int price, int count) { + float motesMultiplier = SkyblockerConfigManager.get().otherLocations.rift.mcGrubberStacks * 0.05f + 1; + + // Calculate the total price + int totalPrice = price * count; + String totalPriceString = String.format(Locale.ENGLISH, "%1$,.1f", totalPrice * motesMultiplier); + + // If count is 1, return a simple message + if (count == 1) { + return Text.literal(totalPriceString.replace(".0", "") + " Motes").formatted(Formatting.DARK_AQUA); + } + + // If count is greater than 1, include the "each" information + String eachPriceString = String.format(Locale.ENGLISH, "%1$,.1f", price * motesMultiplier); + MutableText message = Text.literal(totalPriceString.replace(".0", "") + " Motes ").formatted(Formatting.DARK_AQUA); + message.append(Text.literal("(" + eachPriceString.replace(".0", "") + " each)").formatted(Formatting.GRAY)); + + return message; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java new file mode 100644 index 00000000..ced3fe76 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java @@ -0,0 +1,49 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.skyblock.item.MuseumItemCache; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class MuseumTooltip extends TooltipAdder { + public MuseumTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack itemStack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { + String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); + String format = switch (itemCategory) { + case "Weapons" -> "%-18s"; + case "Armor" -> "%-19s"; + default -> "%-20s"; + }; + + //Special case the special category so that it doesn't always display not donated + if (itemCategory.equals("Special")) { + lore.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) + .formatted(Formatting.LIGHT_PURPLE)); + } else { + NbtCompound customData = ItemUtils.getCustomData(itemStack); + boolean isInMuseum = (customData.contains("donated_museum") && customData.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID); + + Formatting donatedIndicatorFormatting = isInMuseum ? Formatting.GREEN : Formatting.RED; + + lore.add(Text.literal(String.format(format, "Museum (" + itemCategory + "):")) + .formatted(Formatting.LIGHT_PURPLE) + .append(Text.literal(isInMuseum ? "✔" : "✖").formatted(donatedIndicatorFormatting, Formatting.BOLD)) + .append(Text.literal(isInMuseum ? " Donated" : " Not Donated").formatted(donatedIndicatorFormatting))); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java new file mode 100644 index 00000000..386e38a5 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java @@ -0,0 +1,27 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; + +public class NpcPriceTooltip extends TooltipAdder { + public NpcPriceTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + final ItemStack stack = focusedSlot.getStack(); + final String internalID = ItemTooltip.getInternalNameFromNBT(stack, true); + if (internalID != null && TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { + lore.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) + .formatted(Formatting.YELLOW) + .append(ItemTooltip.getCoinsMessage(TooltipInfoType.NPC.getData().get(internalID).getAsDouble(), stack.getCount()))); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedTooltip.java new file mode 100644 index 00000000..24a31211 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedTooltip.java @@ -0,0 +1,71 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; +import java.util.List; +import java.util.Locale; + +public class ObtainedTooltip extends TooltipAdder { + private static final DateTimeFormatter OBTAINED_DATE_FORMATTER = DateTimeFormatter.ofPattern("MMMM d, yyyy").withZone(ZoneId.systemDefault()).localizedBy(Locale.ENGLISH); + private static final DateTimeFormatter OLD_OBTAINED_DATE_FORMAT = DateTimeFormatter.ofPattern("M/d/yy h:m a").withZone(ZoneId.of("UTC")).localizedBy(Locale.ENGLISH); + + public ObtainedTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + if (TooltipInfoType.OBTAINED.isTooltipEnabled()) { + String timestamp = getTimestamp(focusedSlot.getStack()); + + if (!timestamp.isEmpty()) { + lore.add(Text.empty() + .append(Text.literal(String.format("%-21s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE)) + .append(Text.literal(timestamp).formatted(Formatting.RED))); + } + } + } + + /** + * This method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum. + * Currently, there are two types of string timestamps the legacy which is built like this + * "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this + * "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without + * taking into account of their formats, we do the same. The final result looks like this + * "MMMM dd, yyyy" (December 24, 2020). + * Since the legacy format has a 25 as "month" SimpleDateFormat converts the 25 into 2 years and 1 month and makes + * "25/04/20 16:38" -> "January 04, 2022" instead of "April 25, 2020". + * This causes the museum rank to be much worse than it should be. + *

+ * This also handles the long timestamp format introduced in January 2024 where the timestamp is in epoch milliseconds. + * + * @param stack the item under the pointer + * @return if the item have a "Timestamp" it will be shown formated on the tooltip + */ + public static String getTimestamp(ItemStack stack) { + NbtCompound customData = ItemUtils.getCustomData(stack); + + if (customData != null && customData.contains("timestamp", NbtElement.LONG_TYPE)) { + Instant date = Instant.ofEpochMilli(customData.getLong("timestamp")); + return OBTAINED_DATE_FORMATTER.format(date); + } + + if (customData != null && customData.contains("timestamp", NbtElement.STRING_TYPE)) { + TemporalAccessor date = OLD_OBTAINED_DATE_FORMAT.parse(customData.getString("timestamp")); + return OBTAINED_DATE_FORMATTER.format(date); + } + + return ""; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java new file mode 100644 index 00000000..254add09 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java @@ -0,0 +1,36 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipManager; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Extend this class and add it to {@link TooltipManager#adders} to add additional text to tooltips. + */ +public abstract class TooltipAdder { + public final Pattern titlePattern; + //Lower priority means it will be applied first + public final int priority; + + protected TooltipAdder(String titlePattern, int priority) { + this(Pattern.compile(titlePattern), priority); + } + + protected TooltipAdder(Pattern titlePattern, int priority) { + this.titlePattern = titlePattern; + this.priority = priority; + } + + /** + * Creates a TooltipAdder that will be applied to all screens. + */ + protected TooltipAdder(int priority) { + this.titlePattern = null; + this.priority = priority; + } + + public abstract void addToTooltip(List lore, Slot focusedSlot); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/AccessoryTooltip.java deleted file mode 100644 index 6650adee..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/AccessoryTooltip.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import it.unimi.dsi.fastutil.Pair; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class AccessoryTooltip extends TooltipAdder { - public AccessoryTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - final String internalID = ItemTooltip.getInternalNameFromNBT(focusedSlot.getStack(), true); - if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { - Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); - - if (report.left() != AccessoriesHelper.AccessoryReport.INELIGIBLE) { - MutableText title = Text.literal(String.format("%-19s", "Accessory: ")).withColor(0xf57542); - - Text stateText = switch (report.left()) { - case HAS_HIGHEST_TIER -> Text.literal("✔ Collected").formatted(Formatting.GREEN); - case IS_GREATER_TIER -> Text.literal("✦ Upgrade ").withColor(0x218bff).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case HAS_GREATER_TIER -> Text.literal("↑ Upgradable ").withColor(0xf8d048).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case OWNS_BETTER_TIER -> Text.literal("↓ Downgrade ").formatted(Formatting.GRAY).append(Text.literal(report.right()).withColor(0xf8f8ff)); - case MISSING -> Text.literal("✖ Missing ").formatted(Formatting.RED).append(Text.literal(report.right()).withColor(0xf8f8ff)); - - //Should never be the case - default -> Text.literal("? Unknown").formatted(Formatting.GRAY); - }; - - lore.add(title.append(stateText)); - } - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/AvgBinTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/AvgBinTooltip.java deleted file mode 100644 index ca36bcf4..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/AvgBinTooltip.java +++ /dev/null @@ -1,66 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.config.configs.GeneralConfig; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class AvgBinTooltip extends TooltipAdder { - protected AvgBinTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - final ItemStack itemStack = focusedSlot.getStack(); - String neuName = ItemTooltip.getInternalNameFromNBT(itemStack, false); - String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); - if (neuName == null || internalID == null) return; - - if (neuName.startsWith("ISSHINY_")) neuName = internalID; - - if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) { - if (TooltipInfoType.ONE_DAY_AVERAGE.getData() == null || TooltipInfoType.THREE_DAY_AVERAGE.getData() == null) { - ItemTooltip.nullWarning(); - } else { - /* - We are skipping check average prices for potions, runes - and enchanted books because there is no data for their in API. - */ - neuName = ItemTooltip.getNeuName(internalID, neuName); - - if (!neuName.isEmpty() && LBinTooltip.lbinExist) { - GeneralConfig.Average type = ItemTooltip.config.avg; - - // "No data" line because of API not keeping old data, it causes NullPointerException - if (type == GeneralConfig.Average.ONE_DAY || type == GeneralConfig.Average.BOTH) { - lore.add( - Text.literal(String.format("%-19s", "1 Day Avg. Price:")) - .formatted(Formatting.GOLD) - .append(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName) == null - ? Text.literal("No data").formatted(Formatting.RED) - : ItemTooltip.getCoinsMessage(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), itemStack.getCount()) - ) - ); - } - if (type == GeneralConfig.Average.THREE_DAY || type == GeneralConfig.Average.BOTH) { - lore.add( - Text.literal(String.format("%-19s", "3 Day Avg. Price:")) - .formatted(Formatting.GOLD) - .append(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName) == null - ? Text.literal("No data").formatted(Formatting.RED) - : ItemTooltip.getCoinsMessage(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName).getAsDouble(), itemStack.getCount()) - ) - ); - } - } - } - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/BazaarPriceTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/BazaarPriceTooltip.java deleted file mode 100644 index c43a3fa2..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/BazaarPriceTooltip.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import com.google.gson.JsonObject; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class BazaarPriceTooltip extends TooltipAdder { - public static boolean bazaarExist = false; - - protected BazaarPriceTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - bazaarExist = false; - final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); - if (internalID == null) return; - String name = ItemTooltip.getInternalNameFromNBT(itemStack, false); - if (name == null) return; - - if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; - - if (TooltipInfoType.BAZAAR.isTooltipEnabledAndHasOrNullWarning(name)) { - JsonObject getItem = TooltipInfoType.BAZAAR.getData().getAsJsonObject(name); - lore.add(Text.literal(String.format("%-18s", "Bazaar buy Price:")) - .formatted(Formatting.GOLD) - .append(getItem.get("buyPrice").isJsonNull() - ? Text.literal("No data").formatted(Formatting.RED) - : ItemTooltip.getCoinsMessage(getItem.get("buyPrice").getAsDouble(), itemStack.getCount()))); - lore.add(Text.literal(String.format("%-19s", "Bazaar sell Price:")) - .formatted(Formatting.GOLD) - .append(getItem.get("sellPrice").isJsonNull() - ? Text.literal("No data").formatted(Formatting.RED) - : ItemTooltip.getCoinsMessage(getItem.get("sellPrice").getAsDouble(), itemStack.getCount()))); - bazaarExist = true; - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/ColorTooltip.java deleted file mode 100644 index 5908f4e8..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/ColorTooltip.java +++ /dev/null @@ -1,135 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import de.hysky.skyblocker.utils.Constants; -import de.hysky.skyblocker.utils.ItemUtils; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.DyedColorComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.StringIdentifiable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -public class ColorTooltip extends TooltipAdder { - private static final Logger LOGGER = LoggerFactory.getLogger(ColorTooltip.class); - - public ColorTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); - if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && itemStack.contains(DataComponentTypes.DYED_COLOR)) { - String uuid = ItemUtils.getItemUuid(itemStack); - boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); - //DyedColorComponent#getColor returns ARGB so we mask out the alpha bits - int dyeColor = DyedColorComponent.getColor(itemStack, 0); - - // dyeColor will have alpha = 255 if it's dyed, and alpha = 0 if it's not dyed, - if (!hasCustomDye && dyeColor != 0) { - dyeColor = dyeColor & 0x00FFFFFF; - String colorHex = String.format("%06X", dyeColor); - String expectedHex = getExpectedHex(internalID); - - boolean correctLine = false; - for (Text text : lore) { - String existingTooltip = text.getString() + " "; - if (existingTooltip.startsWith("Color: ")) { - correctLine = true; - - addExoticTooltip(lore, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, existingTooltip); - break; - } - } - - if (!correctLine) { - addExoticTooltip(lore, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, ""); - } - } - } - } - - private static void addExoticTooltip(List lines, String internalID, NbtCompound customData, String colorHex, String expectedHex, String existingTooltip) { - if (expectedHex != null && !colorHex.equalsIgnoreCase(expectedHex) && !isException(internalID, colorHex) && !intendedDyed(customData)) { - final DyeType type = checkDyeType(colorHex); - lines.add(1, Text.literal(existingTooltip + Formatting.DARK_GRAY + "(").append(type.getTranslatedText()).append(Formatting.DARK_GRAY + ")")); - } - } - - public static String getExpectedHex(String id) { - String color = TooltipInfoType.COLOR.getData().get(id).getAsString(); - if (color != null) { - String[] RGBValues = color.split(","); - return String.format("%02X%02X%02X", Integer.parseInt(RGBValues[0]), Integer.parseInt(RGBValues[1]), Integer.parseInt(RGBValues[2])); - } else { - LOGGER.warn("[Skyblocker Exotics] No expected color data found for id {}", id); - return null; - } - } - - public static boolean isException(String id, String hex) { - return switch (id) { - case String it when it.startsWith("LEATHER") || it.equals("GHOST_BOOTS") || Constants.SEYMOUR_IDS.contains(it) -> true; - case String it when it.startsWith("RANCHER") -> Constants.RANCHERS.contains(hex); - case String it when it.contains("ADAPTIVE_CHESTPLATE") -> Constants.ADAPTIVE_CHEST.contains(hex); - case String it when it.contains("ADAPTIVE") -> Constants.ADAPTIVE.contains(hex); - case String it when it.contains("REAPER") -> Constants.REAPER.contains(hex); - case String it when it.contains("FAIRY") -> Constants.FAIRY_HEXES.contains(hex); - case String it when it.contains("CRYSTAL") -> Constants.CRYSTAL_HEXES.contains(hex); - case String it when it.contains("SPOOK") -> Constants.SPOOK.contains(hex); - default -> false; - }; - } - - public static DyeType checkDyeType(String hex) { - return switch (hex) { - case String it when Constants.CRYSTAL_HEXES.contains(it) -> DyeType.CRYSTAL; - case String it when Constants.FAIRY_HEXES.contains(it) -> DyeType.FAIRY; - case String it when Constants.OG_FAIRY_HEXES.contains(it) -> DyeType.OG_FAIRY; - case String it when Constants.SPOOK.contains(it) -> DyeType.SPOOK; - case String it when Constants.GLITCHED.contains(it) -> DyeType.GLITCHED; - default -> DyeType.EXOTIC; - }; - } - - public static boolean intendedDyed(NbtCompound customData) { - return customData.contains("dye_item"); - } - - public enum DyeType implements StringIdentifiable { - CRYSTAL("crystal", Formatting.AQUA), - FAIRY("fairy", Formatting.LIGHT_PURPLE), - OG_FAIRY("og_fairy", Formatting.DARK_PURPLE), - SPOOK("spook", Formatting.RED), - GLITCHED("glitched", Formatting.BLUE), - EXOTIC("exotic", Formatting.GOLD); - private final String name; - private final Formatting formatting; - - DyeType(String name, Formatting formatting) { - this.name = name; - this.formatting = formatting; - } - - @Override - public String asString() { - return name; - } - - public MutableText getTranslatedText() { - return Text.translatable("skyblocker.exotic." + name).formatted(formatting); - } - } - -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/DungeonQualityTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/DungeonQualityTooltip.java deleted file mode 100644 index f7be590e..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/DungeonQualityTooltip.java +++ /dev/null @@ -1,55 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.utils.ItemUtils; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class DungeonQualityTooltip extends TooltipAdder { - protected DungeonQualityTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - if (!SkyblockerConfigManager.get().general.itemTooltip.dungeonQuality) return; - NbtCompound customData = ItemUtils.getCustomData(focusedSlot.getStack()); - if (customData == null || !customData.contains("baseStatBoostPercentage")) return; - int baseStatBoostPercentage = customData.getInt("baseStatBoostPercentage"); - boolean maxQuality = baseStatBoostPercentage == 50; - if (maxQuality) { - lore.add(Text.literal(String.format("%-17s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.RED).formatted(Formatting.BOLD)); - } else { - lore.add(Text.literal(String.format("%-21s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.BLUE)); - } - - if (customData.contains("item_tier")) { // sometimes it just isn't here? - int itemTier = customData.getInt("item_tier"); - if (maxQuality) { - lore.add(Text.literal(String.format("%-17s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.RED).formatted(Formatting.BOLD)); - } else { - lore.add(Text.literal(String.format("%-21s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.BLUE)); - } - } - } - - final String getItemTierFloor(int tier) { - return switch (tier) { - case 1 -> "F1"; - case 2 -> "F2"; - case 3 -> "F3"; - case 4 -> "F4/M1"; - case 5 -> "F5/M2"; - case 6 -> "F6/M3"; - case 7 -> "F7/M4"; - case 8 -> "M5"; - case 9 -> "M6"; - case 10 -> "M7"; - default -> "Unknown"; - }; - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/LBinTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/LBinTooltip.java deleted file mode 100644 index e35df8fe..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/LBinTooltip.java +++ /dev/null @@ -1,39 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class LBinTooltip extends TooltipAdder { - public static boolean lbinExist = false; - - protected LBinTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - lbinExist = false; - final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); - if (internalID == null) return; - String name = ItemTooltip.getInternalNameFromNBT(itemStack, false); - if (name == null) return; - - if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; - - // bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api - - if (TooltipInfoType.LOWEST_BINS.isTooltipEnabledAndHasOrNullWarning(name) && !BazaarPriceTooltip.bazaarExist) { - lore.add(Text.literal(String.format("%-19s", "Lowest BIN Price:")) - .formatted(Formatting.GOLD) - .append(ItemTooltip.getCoinsMessage(TooltipInfoType.LOWEST_BINS.getData().get(name).getAsDouble(), itemStack.getCount()))); - lbinExist = true; - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/LineSmoothener.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/LineSmoothener.java deleted file mode 100644 index 1096f7b0..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/LineSmoothener.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class LineSmoothener extends TooltipAdder { - //This is static to not create a new text object for each line in every item - private static final Text BUMPY_LINE = Text.literal("-----------------").formatted(Formatting.DARK_GRAY, Formatting.STRIKETHROUGH); - - public static Text createSmoothLine() { - return Text.literal(" ").formatted(Formatting.DARK_GRAY, Formatting.STRIKETHROUGH, Formatting.BOLD); - } - - protected LineSmoothener() { - super(Integer.MIN_VALUE); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - for (int i = 0; i < lore.size(); i++) { - List lineSiblings = lore.get(i).getSiblings(); - //Compare the first sibling rather than the whole object as the style of the root object can change while visually staying the same - if (lineSiblings.size() == 1 && lineSiblings.getFirst().equals(BUMPY_LINE)) { - lore.set(i, createSmoothLine()); - } - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/MotesTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/MotesTooltip.java deleted file mode 100644 index 79a58a62..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/MotesTooltip.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; -import java.util.Locale; - -public class MotesTooltip extends TooltipAdder { - protected MotesTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); - if (internalID != null && TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { - lore.add(Text.literal(String.format("%-20s", "Motes Price:")) - .formatted(Formatting.LIGHT_PURPLE) - .append(getMotesMessage(TooltipInfoType.MOTES.getData().get(internalID).getAsInt(), itemStack.getCount()))); - } - } - - private static Text getMotesMessage(int price, int count) { - float motesMultiplier = SkyblockerConfigManager.get().otherLocations.rift.mcGrubberStacks * 0.05f + 1; - - // Calculate the total price - int totalPrice = price * count; - String totalPriceString = String.format(Locale.ENGLISH, "%1$,.1f", totalPrice * motesMultiplier); - - // If count is 1, return a simple message - if (count == 1) { - return Text.literal(totalPriceString.replace(".0", "") + " Motes").formatted(Formatting.DARK_AQUA); - } - - // If count is greater than 1, include the "each" information - String eachPriceString = String.format(Locale.ENGLISH, "%1$,.1f", price * motesMultiplier); - MutableText message = Text.literal(totalPriceString.replace(".0", "") + " Motes ").formatted(Formatting.DARK_AQUA); - message.append(Text.literal("(" + eachPriceString.replace(".0", "") + " each)").formatted(Formatting.GRAY)); - - return message; - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/MuseumTooltip.java deleted file mode 100644 index 038cbbe8..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/MuseumTooltip.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.skyblock.item.MuseumItemCache; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import de.hysky.skyblocker.utils.ItemUtils; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class MuseumTooltip extends TooltipAdder { - public MuseumTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); - if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { - String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); - String format = switch (itemCategory) { - case "Weapons" -> "%-18s"; - case "Armor" -> "%-19s"; - default -> "%-20s"; - }; - - //Special case the special category so that it doesn't always display not donated - if (itemCategory.equals("Special")) { - lore.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) - .formatted(Formatting.LIGHT_PURPLE)); - } else { - NbtCompound customData = ItemUtils.getCustomData(itemStack); - boolean isInMuseum = (customData.contains("donated_museum") && customData.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID); - - Formatting donatedIndicatorFormatting = isInMuseum ? Formatting.GREEN : Formatting.RED; - - lore.add(Text.literal(String.format(format, "Museum (" + itemCategory + "):")) - .formatted(Formatting.LIGHT_PURPLE) - .append(Text.literal(isInMuseum ? "✔" : "✖").formatted(donatedIndicatorFormatting, Formatting.BOLD)) - .append(Text.literal(isInMuseum ? " Donated" : " Not Donated").formatted(donatedIndicatorFormatting))); - } - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/NpcPriceTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/NpcPriceTooltip.java deleted file mode 100644 index 0e8d4bf7..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/NpcPriceTooltip.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.util.List; - -public class NpcPriceTooltip extends TooltipAdder { - protected NpcPriceTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - final ItemStack stack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(stack, true); - if (internalID != null && TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { - lore.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) - .formatted(Formatting.YELLOW) - .append(ItemTooltip.getCoinsMessage(TooltipInfoType.NPC.getData().get(internalID).getAsDouble(), stack.getCount()))); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/ObtainedTooltip.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/ObtainedTooltip.java deleted file mode 100644 index f6bcd2f2..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/ObtainedTooltip.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import de.hysky.skyblocker.utils.ItemUtils; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.time.temporal.TemporalAccessor; -import java.util.List; -import java.util.Locale; - -public class ObtainedTooltip extends TooltipAdder { - private static final DateTimeFormatter OBTAINED_DATE_FORMATTER = DateTimeFormatter.ofPattern("MMMM d, yyyy").withZone(ZoneId.systemDefault()).localizedBy(Locale.ENGLISH); - private static final DateTimeFormatter OLD_OBTAINED_DATE_FORMAT = DateTimeFormatter.ofPattern("M/d/yy h:m a").withZone(ZoneId.of("UTC")).localizedBy(Locale.ENGLISH); - - protected ObtainedTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - if (TooltipInfoType.OBTAINED.isTooltipEnabled()) { - String timestamp = getTimestamp(focusedSlot.getStack()); - - if (!timestamp.isEmpty()) { - lore.add(Text.empty() - .append(Text.literal(String.format("%-21s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE)) - .append(Text.literal(timestamp).formatted(Formatting.RED))); - } - } - } - - /** - * This method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum. - * Currently, there are two types of string timestamps the legacy which is built like this - * "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this - * "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without - * taking into account of their formats, we do the same. The final result looks like this - * "MMMM dd, yyyy" (December 24, 2020). - * Since the legacy format has a 25 as "month" SimpleDateFormat converts the 25 into 2 years and 1 month and makes - * "25/04/20 16:38" -> "January 04, 2022" instead of "April 25, 2020". - * This causes the museum rank to be much worse than it should be. - *

- * This also handles the long timestamp format introduced in January 2024 where the timestamp is in epoch milliseconds. - * - * @param stack the item under the pointer - * @return if the item have a "Timestamp" it will be shown formated on the tooltip - */ - public static String getTimestamp(ItemStack stack) { - NbtCompound customData = ItemUtils.getCustomData(stack); - - if (customData != null && customData.contains("timestamp", NbtElement.LONG_TYPE)) { - Instant date = Instant.ofEpochMilli(customData.getLong("timestamp")); - return OBTAINED_DATE_FORMATTER.format(date); - } - - if (customData != null && customData.contains("timestamp", NbtElement.STRING_TYPE)) { - TemporalAccessor date = OLD_OBTAINED_DATE_FORMAT.parse(customData.getString("timestamp")); - return OBTAINED_DATE_FORMATTER.format(date); - } - - return ""; - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java deleted file mode 100644 index 1e628e99..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipAdder.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; - -import java.util.List; -import java.util.regex.Pattern; - -/** - * Extend this class and add it to {@link TooltipManager#adders} to add additional text to tooltips. - */ -public abstract class TooltipAdder { - public final Pattern titlePattern; - //Lower priority means it will be applied first - public final int priority; - - protected TooltipAdder(String titlePattern, int priority) { - this(Pattern.compile(titlePattern), priority); - } - - protected TooltipAdder(Pattern titlePattern, int priority) { - this.titlePattern = titlePattern; - this.priority = priority; - } - - /** - * Creates a TooltipAdder that will be applied to all screens. - */ - protected TooltipAdder(int priority) { - this.titlePattern = null; - this.priority = priority; - } - - public abstract void addToTooltip(List lore, Slot focusedSlot); -} diff --git a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java deleted file mode 100644 index b1e902e7..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/tooltip/TooltipManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package de.hysky.skyblocker.utils.tooltip; - -import de.hysky.skyblocker.utils.Utils; -import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -public class TooltipManager { - private static final TooltipAdder[] adders = new TooltipAdder[]{ - new LineSmoothener(), - new NpcPriceTooltip(1), - new BazaarPriceTooltip(2), - new LBinTooltip(3), //Has to come after bz price - new AvgBinTooltip(4), //Has to come after lbin price - new DungeonQualityTooltip(5), - new MotesTooltip(6), - new ObtainedTooltip(7), - new MuseumTooltip(8), - new ColorTooltip(9), - new AccessoryTooltip(10), - }; - private static final ArrayList currentScreenAdders = new ArrayList<>(); - - private TooltipManager() { - } - - public static void init() { - ScreenEvents.AFTER_INIT.register((client, screen, width, height) -> { - onScreenChange(screen); - ScreenEvents.remove(screen).register(ignored -> currentScreenAdders.clear()); - }); - } - - private static void onScreenChange(Screen screen) { - final String title = screen.getTitle().getString(); - for (TooltipAdder adder : adders) { - if (adder.titlePattern == null || adder.titlePattern.matcher(title).matches()) { - currentScreenAdders.add(adder); - } - } - currentScreenAdders.sort(Comparator.comparingInt(adder -> adder.priority)); - } - - /** - *

Adds additional text from all adders that are applicable to the current screen. - * This method is run on each tooltip render, so don't do any heavy calculations here.

- * - *

If you want to add info to the tooltips of multiple items, consider using a switch statement with {@code focusedSlot.getIndex()}

- * - * @param lore The lore of the focused item. - * @param focusedSlot The slot that is currently focused by the cursor. - * @return The lore itself after all adders have added their text. - * @deprecated This method is public only for the sake of the mixin. Don't call directly, not that there is any point to it. - */ - @Deprecated - public static List addToTooltip(List lore, Slot focusedSlot) { - if (!Utils.isOnSkyblock()) return lore; - for (TooltipAdder adder : currentScreenAdders) { - adder.addToTooltip(lore, focusedSlot); - } - return lore; - } -} diff --git a/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java b/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java index 92419624..9bc8c268 100644 --- a/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java +++ b/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.utils; import com.google.gson.JsonParser; import com.mojang.serialization.JsonOps; -import de.hysky.skyblocker.utils.tooltip.ObtainedTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.adders.ObtainedTooltip; import it.unimi.dsi.fastutil.ints.IntIntPair; import net.minecraft.Bootstrap; import net.minecraft.SharedConstants; -- cgit From b8682b30ba5d4cd4efdbef74681f6f4fb9c207d7 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 13:46:13 +0300 Subject: Rename ObtainedTooltip to ObtainedDateTooltip --- .../skyblock/item/tooltip/TooltipManager.java | 2 +- .../item/tooltip/adders/ObtainedDateTooltip.java | 71 ++++++++++++++++++++++ .../item/tooltip/adders/ObtainedTooltip.java | 71 ---------------------- .../de/hysky/skyblocker/utils/ItemUtilsTest.java | 10 +-- 4 files changed, 77 insertions(+), 77 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index 90dc48d6..6108dbf8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -20,7 +20,7 @@ public class TooltipManager { new AvgBinTooltip(4), //Has to come after lbin price new DungeonQualityTooltip(5), new MotesTooltip(6), - new ObtainedTooltip(7), + new ObtainedDateTooltip(7), new MuseumTooltip(8), new ColorTooltip(9), new AccessoryTooltip(10), diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java new file mode 100644 index 00000000..03254225 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java @@ -0,0 +1,71 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; +import java.util.List; +import java.util.Locale; + +public class ObtainedDateTooltip extends TooltipAdder { + private static final DateTimeFormatter OBTAINED_DATE_FORMATTER = DateTimeFormatter.ofPattern("MMMM d, yyyy").withZone(ZoneId.systemDefault()).localizedBy(Locale.ENGLISH); + private static final DateTimeFormatter OLD_OBTAINED_DATE_FORMAT = DateTimeFormatter.ofPattern("M/d/yy h:m a").withZone(ZoneId.of("UTC")).localizedBy(Locale.ENGLISH); + + public ObtainedDateTooltip(int priority) { + super(priority); + } + + @Override + public void addToTooltip(List lore, Slot focusedSlot) { + if (TooltipInfoType.OBTAINED.isTooltipEnabled()) { + String timestamp = getTimestamp(focusedSlot.getStack()); + + if (!timestamp.isEmpty()) { + lore.add(Text.empty() + .append(Text.literal(String.format("%-21s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE)) + .append(Text.literal(timestamp).formatted(Formatting.RED))); + } + } + } + + /** + * This method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum. + * Currently, there are two types of string timestamps the legacy which is built like this + * "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this + * "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without + * taking into account of their formats, we do the same. The final result looks like this + * "MMMM dd, yyyy" (December 24, 2020). + * Since the legacy format has a 25 as "month" SimpleDateFormat converts the 25 into 2 years and 1 month and makes + * "25/04/20 16:38" -> "January 04, 2022" instead of "April 25, 2020". + * This causes the museum rank to be much worse than it should be. + *

+ * This also handles the long timestamp format introduced in January 2024 where the timestamp is in epoch milliseconds. + * + * @param stack the item under the pointer + * @return if the item have a "Timestamp" it will be shown formated on the tooltip + */ + public static String getTimestamp(ItemStack stack) { + NbtCompound customData = ItemUtils.getCustomData(stack); + + if (customData != null && customData.contains("timestamp", NbtElement.LONG_TYPE)) { + Instant date = Instant.ofEpochMilli(customData.getLong("timestamp")); + return OBTAINED_DATE_FORMATTER.format(date); + } + + if (customData != null && customData.contains("timestamp", NbtElement.STRING_TYPE)) { + TemporalAccessor date = OLD_OBTAINED_DATE_FORMAT.parse(customData.getString("timestamp")); + return OBTAINED_DATE_FORMATTER.format(date); + } + + return ""; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedTooltip.java deleted file mode 100644 index 24a31211..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedTooltip.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.hysky.skyblocker.skyblock.item.tooltip.adders; - -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; -import de.hysky.skyblocker.utils.ItemUtils; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.time.temporal.TemporalAccessor; -import java.util.List; -import java.util.Locale; - -public class ObtainedTooltip extends TooltipAdder { - private static final DateTimeFormatter OBTAINED_DATE_FORMATTER = DateTimeFormatter.ofPattern("MMMM d, yyyy").withZone(ZoneId.systemDefault()).localizedBy(Locale.ENGLISH); - private static final DateTimeFormatter OLD_OBTAINED_DATE_FORMAT = DateTimeFormatter.ofPattern("M/d/yy h:m a").withZone(ZoneId.of("UTC")).localizedBy(Locale.ENGLISH); - - public ObtainedTooltip(int priority) { - super(priority); - } - - @Override - public void addToTooltip(List lore, Slot focusedSlot) { - if (TooltipInfoType.OBTAINED.isTooltipEnabled()) { - String timestamp = getTimestamp(focusedSlot.getStack()); - - if (!timestamp.isEmpty()) { - lore.add(Text.empty() - .append(Text.literal(String.format("%-21s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE)) - .append(Text.literal(timestamp).formatted(Formatting.RED))); - } - } - } - - /** - * This method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum. - * Currently, there are two types of string timestamps the legacy which is built like this - * "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this - * "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without - * taking into account of their formats, we do the same. The final result looks like this - * "MMMM dd, yyyy" (December 24, 2020). - * Since the legacy format has a 25 as "month" SimpleDateFormat converts the 25 into 2 years and 1 month and makes - * "25/04/20 16:38" -> "January 04, 2022" instead of "April 25, 2020". - * This causes the museum rank to be much worse than it should be. - *

- * This also handles the long timestamp format introduced in January 2024 where the timestamp is in epoch milliseconds. - * - * @param stack the item under the pointer - * @return if the item have a "Timestamp" it will be shown formated on the tooltip - */ - public static String getTimestamp(ItemStack stack) { - NbtCompound customData = ItemUtils.getCustomData(stack); - - if (customData != null && customData.contains("timestamp", NbtElement.LONG_TYPE)) { - Instant date = Instant.ofEpochMilli(customData.getLong("timestamp")); - return OBTAINED_DATE_FORMATTER.format(date); - } - - if (customData != null && customData.contains("timestamp", NbtElement.STRING_TYPE)) { - TemporalAccessor date = OLD_OBTAINED_DATE_FORMAT.parse(customData.getString("timestamp")); - return OBTAINED_DATE_FORMATTER.format(date); - } - - return ""; - } -} diff --git a/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java b/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java index 9bc8c268..944df116 100644 --- a/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java +++ b/src/test/java/de/hysky/skyblocker/utils/ItemUtilsTest.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.utils; import com.google.gson.JsonParser; import com.mojang.serialization.JsonOps; -import de.hysky.skyblocker.skyblock.item.tooltip.adders.ObtainedTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.adders.ObtainedDateTooltip; import it.unimi.dsi.fastutil.ints.IntIntPair; import net.minecraft.Bootstrap; import net.minecraft.SharedConstants; @@ -49,10 +49,10 @@ public class ItemUtilsTest { @Test void testGetTimestamp() { - Assertions.assertEquals("February 5, 2022", ObtainedTooltip.getTimestamp(DARK_CLAYMORE_OLD)); - Assertions.assertEquals("December 16, 2022", ObtainedTooltip.getTimestamp(DARK_CLAYMORE)); // The timestamp is 1671157200000 which is December 16, 2022 in UTC - Assertions.assertEquals("April 12, 2024", ObtainedTooltip.getTimestamp(TITANIUM_DRILL_DR_X655)); - Assertions.assertEquals("March 1, 2021", ObtainedTooltip.getTimestamp(ASTRAEA)); + Assertions.assertEquals("February 5, 2022", ObtainedDateTooltip.getTimestamp(DARK_CLAYMORE_OLD)); + Assertions.assertEquals("December 16, 2022", ObtainedDateTooltip.getTimestamp(DARK_CLAYMORE)); // The timestamp is 1671157200000 which is December 16, 2022 in UTC + Assertions.assertEquals("April 12, 2024", ObtainedDateTooltip.getTimestamp(TITANIUM_DRILL_DR_X655)); + Assertions.assertEquals("March 1, 2021", ObtainedDateTooltip.getTimestamp(ASTRAEA)); } @Test -- cgit From 00faab7a0f29e1c1723464d7aa4975383f99a67b Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 16:39:36 +0300 Subject: Added item price multiplication on sacks when there's multiple items Basically price*. Also renamed `lore` to `lines` in all `TooltipAdder`s. --- .../skyblock/item/tooltip/TooltipManager.java | 12 +++++----- .../item/tooltip/adders/AccessoryTooltip.java | 4 ++-- .../item/tooltip/adders/AvgBinTooltip.java | 6 ++--- .../item/tooltip/adders/BazaarPriceTooltip.java | 28 +++++++++++++++------- .../skyblock/item/tooltip/adders/ColorTooltip.java | 8 +++---- .../item/tooltip/adders/DungeonQualityTooltip.java | 10 ++++---- .../skyblock/item/tooltip/adders/LBinTooltip.java | 8 +++---- .../item/tooltip/adders/LineSmoothener.java | 8 +++---- .../skyblock/item/tooltip/adders/MotesTooltip.java | 8 +++---- .../item/tooltip/adders/MuseumTooltip.java | 14 +++++------ .../item/tooltip/adders/NpcPriceTooltip.java | 8 +++---- .../item/tooltip/adders/ObtainedDateTooltip.java | 8 +++---- .../skyblock/item/tooltip/adders/TooltipAdder.java | 5 +++- 13 files changed, 70 insertions(+), 57 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index 6108dbf8..6c055975 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -53,17 +53,17 @@ public class TooltipManager { * *

If you want to add info to the tooltips of multiple items, consider using a switch statement with {@code focusedSlot.getIndex()}

* - * @param lore The lore of the focused item. + * @param lines The tooltip lines of the focused item. This includes the display name, as it's a part of the tooltip (at index 0). * @param focusedSlot The slot that is currently focused by the cursor. - * @return The lore itself after all adders have added their text. + * @return The lines list itself after all adders have added their text. * @deprecated This method is public only for the sake of the mixin. Don't call directly, not that there is any point to it. */ @Deprecated - public static List addToTooltip(List lore, Slot focusedSlot) { - if (!Utils.isOnSkyblock()) return lore; + public static List addToTooltip(List lines, Slot focusedSlot) { + if (!Utils.isOnSkyblock()) return lines; for (TooltipAdder adder : currentScreenAdders) { - adder.addToTooltip(lore, focusedSlot); + adder.addToTooltip(lines, focusedSlot); } - return lore; + return lines; } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java index b35ba0a1..d26e1846 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java @@ -17,7 +17,7 @@ public class AccessoryTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { final String internalID = ItemTooltip.getInternalNameFromNBT(focusedSlot.getStack(), true); if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); @@ -36,7 +36,7 @@ public class AccessoryTooltip extends TooltipAdder { default -> Text.literal("? Unknown").formatted(Formatting.GRAY); }; - lore.add(title.append(stateText)); + lines.add(title.append(stateText)); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java index 70dc3b21..8bb71c9a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java @@ -17,7 +17,7 @@ public class AvgBinTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); String neuName = ItemTooltip.getInternalNameFromNBT(itemStack, false); String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); @@ -40,7 +40,7 @@ public class AvgBinTooltip extends TooltipAdder { // "No data" line because of API not keeping old data, it causes NullPointerException if (type == GeneralConfig.Average.ONE_DAY || type == GeneralConfig.Average.BOTH) { - lore.add( + lines.add( Text.literal(String.format("%-19s", "1 Day Avg. Price:")) .formatted(Formatting.GOLD) .append(TooltipInfoType.ONE_DAY_AVERAGE.getData().get(neuName) == null @@ -50,7 +50,7 @@ public class AvgBinTooltip extends TooltipAdder { ); } if (type == GeneralConfig.Average.THREE_DAY || type == GeneralConfig.Average.BOTH) { - lore.add( + lines.add( Text.literal(String.format("%-19s", "3 Day Avg. Price:")) .formatted(Formatting.GOLD) .append(TooltipInfoType.THREE_DAY_AVERAGE.getData().get(neuName) == null diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java index 8266aa87..12d7e821 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java @@ -7,6 +7,7 @@ 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 java.util.List; @@ -18,7 +19,7 @@ public class BazaarPriceTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { bazaarExist = false; final ItemStack itemStack = focusedSlot.getStack(); final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); @@ -29,17 +30,26 @@ public class BazaarPriceTooltip extends TooltipAdder { if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; if (TooltipInfoType.BAZAAR.isTooltipEnabledAndHasOrNullWarning(name)) { + int amount; + if (lines.get(1).getString().endsWith("Sack")) { + //The amount is in the 2nd sibling of the 3rd line of the lore. here V + //Example line: empty[style={color=dark_purple,!italic}, siblings=[literal{Stored: }[style={color=gray}], literal{0}[style={color=dark_gray}], literal{/20k}[style={color=gray}]] + String line = lines.get(3).getSiblings().get(1).getString().replace(",", ""); + amount = NumberUtils.isParsable(line) && !line.equals("0") ? Integer.parseInt(line) : itemStack.getCount(); + } else { + amount = itemStack.getCount(); + } JsonObject getItem = TooltipInfoType.BAZAAR.getData().getAsJsonObject(name); - lore.add(Text.literal(String.format("%-18s", "Bazaar buy Price:")) - .formatted(Formatting.GOLD) - .append(getItem.get("buyPrice").isJsonNull() + lines.add(Text.literal(String.format("%-18s", "Bazaar buy Price:")) + .formatted(Formatting.GOLD) + .append(getItem.get("buyPrice").isJsonNull() ? Text.literal("No data").formatted(Formatting.RED) - : ItemTooltip.getCoinsMessage(getItem.get("buyPrice").getAsDouble(), itemStack.getCount()))); - lore.add(Text.literal(String.format("%-19s", "Bazaar sell Price:")) - .formatted(Formatting.GOLD) - .append(getItem.get("sellPrice").isJsonNull() + : ItemTooltip.getCoinsMessage(getItem.get("buyPrice").getAsDouble(), amount))); + lines.add(Text.literal(String.format("%-19s", "Bazaar sell Price:")) + .formatted(Formatting.GOLD) + .append(getItem.get("sellPrice").isJsonNull() ? Text.literal("No data").formatted(Formatting.RED) - : ItemTooltip.getCoinsMessage(getItem.get("sellPrice").getAsDouble(), itemStack.getCount()))); + : ItemTooltip.getCoinsMessage(getItem.get("sellPrice").getAsDouble(), amount))); bazaarExist = true; } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java index 253626ef..d806faa8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java @@ -27,7 +27,7 @@ public class ColorTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && itemStack.contains(DataComponentTypes.DYED_COLOR)) { @@ -43,18 +43,18 @@ public class ColorTooltip extends TooltipAdder { String expectedHex = getExpectedHex(internalID); boolean correctLine = false; - for (Text text : lore) { + for (Text text : lines) { String existingTooltip = text.getString() + " "; if (existingTooltip.startsWith("Color: ")) { correctLine = true; - addExoticTooltip(lore, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, existingTooltip); + addExoticTooltip(lines, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, existingTooltip); break; } } if (!correctLine) { - addExoticTooltip(lore, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, ""); + addExoticTooltip(lines, internalID, ItemUtils.getCustomData(itemStack), colorHex, expectedHex, ""); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java index 7f928e75..54616963 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java @@ -15,24 +15,24 @@ public class DungeonQualityTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { if (!SkyblockerConfigManager.get().general.itemTooltip.dungeonQuality) return; NbtCompound customData = ItemUtils.getCustomData(focusedSlot.getStack()); if (customData == null || !customData.contains("baseStatBoostPercentage")) return; int baseStatBoostPercentage = customData.getInt("baseStatBoostPercentage"); boolean maxQuality = baseStatBoostPercentage == 50; if (maxQuality) { - lore.add(Text.literal(String.format("%-17s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.RED).formatted(Formatting.BOLD)); + lines.add(Text.literal(String.format("%-17s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.RED).formatted(Formatting.BOLD)); } else { - lore.add(Text.literal(String.format("%-21s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.BLUE)); + lines.add(Text.literal(String.format("%-21s", "Item Quality:") + baseStatBoostPercentage + "/50").formatted(Formatting.BLUE)); } if (customData.contains("item_tier")) { // sometimes it just isn't here? int itemTier = customData.getInt("item_tier"); if (maxQuality) { - lore.add(Text.literal(String.format("%-17s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.RED).formatted(Formatting.BOLD)); + lines.add(Text.literal(String.format("%-17s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.RED).formatted(Formatting.BOLD)); } else { - lore.add(Text.literal(String.format("%-21s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.BLUE)); + lines.add(Text.literal(String.format("%-21s", "Floor Tier:") + itemTier + " (" + getItemTierFloor(itemTier) + ")").formatted(Formatting.BLUE)); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java index f5332215..7d109081 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java @@ -17,7 +17,7 @@ public class LBinTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { lbinExist = false; final ItemStack itemStack = focusedSlot.getStack(); final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); @@ -30,9 +30,9 @@ public class LBinTooltip extends TooltipAdder { // bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api if (TooltipInfoType.LOWEST_BINS.isTooltipEnabledAndHasOrNullWarning(name) && !BazaarPriceTooltip.bazaarExist) { - lore.add(Text.literal(String.format("%-19s", "Lowest BIN Price:")) - .formatted(Formatting.GOLD) - .append(ItemTooltip.getCoinsMessage(TooltipInfoType.LOWEST_BINS.getData().get(name).getAsDouble(), itemStack.getCount()))); + lines.add(Text.literal(String.format("%-19s", "Lowest BIN Price:")) + .formatted(Formatting.GOLD) + .append(ItemTooltip.getCoinsMessage(TooltipInfoType.LOWEST_BINS.getData().get(name).getAsDouble(), itemStack.getCount()))); lbinExist = true; } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java index b527284a..9a5b2a79 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java @@ -19,12 +19,12 @@ public class LineSmoothener extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { - for (int i = 0; i < lore.size(); i++) { - List lineSiblings = lore.get(i).getSiblings(); + public void addToTooltip(List lines, Slot focusedSlot) { + for (int i = 0; i < lines.size(); i++) { + List lineSiblings = lines.get(i).getSiblings(); //Compare the first sibling rather than the whole object as the style of the root object can change while visually staying the same if (lineSiblings.size() == 1 && lineSiblings.getFirst().equals(BUMPY_LINE)) { - lore.set(i, createSmoothLine()); + lines.set(i, createSmoothLine()); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java index 23a88d55..285a1449 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java @@ -18,13 +18,13 @@ public class MotesTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); if (internalID != null && TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { - lore.add(Text.literal(String.format("%-20s", "Motes Price:")) - .formatted(Formatting.LIGHT_PURPLE) - .append(getMotesMessage(TooltipInfoType.MOTES.getData().get(internalID).getAsInt(), itemStack.getCount()))); + lines.add(Text.literal(String.format("%-20s", "Motes Price:")) + .formatted(Formatting.LIGHT_PURPLE) + .append(getMotesMessage(TooltipInfoType.MOTES.getData().get(internalID).getAsInt(), itemStack.getCount()))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java index ced3fe76..734dd508 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java @@ -18,7 +18,7 @@ public class MuseumTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { @@ -31,18 +31,18 @@ public class MuseumTooltip extends TooltipAdder { //Special case the special category so that it doesn't always display not donated if (itemCategory.equals("Special")) { - lore.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) - .formatted(Formatting.LIGHT_PURPLE)); + lines.add(Text.literal(String.format(format, "Museum: (" + itemCategory + ")")) + .formatted(Formatting.LIGHT_PURPLE)); } else { NbtCompound customData = ItemUtils.getCustomData(itemStack); boolean isInMuseum = (customData.contains("donated_museum") && customData.getBoolean("donated_museum")) || MuseumItemCache.hasItemInMuseum(internalID); Formatting donatedIndicatorFormatting = isInMuseum ? Formatting.GREEN : Formatting.RED; - lore.add(Text.literal(String.format(format, "Museum (" + itemCategory + "):")) - .formatted(Formatting.LIGHT_PURPLE) - .append(Text.literal(isInMuseum ? "✔" : "✖").formatted(donatedIndicatorFormatting, Formatting.BOLD)) - .append(Text.literal(isInMuseum ? " Donated" : " Not Donated").formatted(donatedIndicatorFormatting))); + lines.add(Text.literal(String.format(format, "Museum (" + itemCategory + "):")) + .formatted(Formatting.LIGHT_PURPLE) + .append(Text.literal(isInMuseum ? "✔" : "✖").formatted(donatedIndicatorFormatting, Formatting.BOLD)) + .append(Text.literal(isInMuseum ? " Donated" : " Not Donated").formatted(donatedIndicatorFormatting))); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java index 386e38a5..3b12f482 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java @@ -15,13 +15,13 @@ public class NpcPriceTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack stack = focusedSlot.getStack(); final String internalID = ItemTooltip.getInternalNameFromNBT(stack, true); if (internalID != null && TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { - lore.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) - .formatted(Formatting.YELLOW) - .append(ItemTooltip.getCoinsMessage(TooltipInfoType.NPC.getData().get(internalID).getAsDouble(), stack.getCount()))); + lines.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) + .formatted(Formatting.YELLOW) + .append(ItemTooltip.getCoinsMessage(TooltipInfoType.NPC.getData().get(internalID).getAsDouble(), stack.getCount()))); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java index 03254225..e919122d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java @@ -25,14 +25,14 @@ public class ObtainedDateTooltip extends TooltipAdder { } @Override - public void addToTooltip(List lore, Slot focusedSlot) { + public void addToTooltip(List lines, Slot focusedSlot) { if (TooltipInfoType.OBTAINED.isTooltipEnabled()) { String timestamp = getTimestamp(focusedSlot.getStack()); if (!timestamp.isEmpty()) { - lore.add(Text.empty() - .append(Text.literal(String.format("%-21s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE)) - .append(Text.literal(timestamp).formatted(Formatting.RED))); + lines.add(Text.empty() + .append(Text.literal(String.format("%-21s", "Obtained: ")).formatted(Formatting.LIGHT_PURPLE)) + .append(Text.literal(timestamp).formatted(Formatting.RED))); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java index 254add09..a466faba 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java @@ -32,5 +32,8 @@ public abstract class TooltipAdder { this.priority = priority; } - public abstract void addToTooltip(List lore, Slot focusedSlot); + /** + * @implNote The first element of the lines list holds the item's display name, as it's a list of all lines that will be displayed in the tooltip. + */ + public abstract void addToTooltip(List lines, Slot focusedSlot); } -- cgit From 8ffde8a752b8a3bffa0015b1eb73fa449bd9e823 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 18:48:40 +0300 Subject: Add comments and format code --- .../skyblocker/skyblock/item/tooltip/TooltipManager.java | 2 +- .../skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index 6c055975..f6652248 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -13,7 +13,7 @@ import java.util.List; public class TooltipManager { private static final TooltipAdder[] adders = new TooltipAdder[]{ - new LineSmoothener(), + new LineSmoothener(), // Applies before anything else new NpcPriceTooltip(1), new BazaarPriceTooltip(2), new LBinTooltip(3), //Has to come after bz price diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java index a466faba..b0b24c1c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java @@ -11,8 +11,14 @@ import java.util.regex.Pattern; * Extend this class and add it to {@link TooltipManager#adders} to add additional text to tooltips. */ public abstract class TooltipAdder { + /** + * The title of the screen must match this pattern for this adder to be applied. Null means it will be applied to all screens. + */ public final Pattern titlePattern; - //Lower priority means it will be applied first + /** + * The priority of this adder. Lower priority means it will be applied first. + * @apiNote Consider taking this value on your class' constructor and setting it from {@link TooltipManager#adders} to make it easy to read and maintain. + */ public final int priority; protected TooltipAdder(String titlePattern, int priority) { @@ -33,7 +39,8 @@ public abstract class TooltipAdder { } /** - * @implNote The first element of the lines list holds the item's display name, as it's a list of all lines that will be displayed in the tooltip. + * @implNote The first element of the lines list holds the item's display name, + * as it's a list of all lines that will be displayed in the tooltip. */ public abstract void addToTooltip(List lines, Slot focusedSlot); } -- cgit From b157736114a1e6c5ace90a65a483c087326a5a1e Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 18:49:55 +0300 Subject: Add slot text adders, which render arbitrary text on arbitrary slots --- .../java/de/hysky/skyblocker/SkyblockerMod.java | 2 + .../skyblocker/mixins/HandledScreenMixin.java | 17 +++++++ .../skyblock/item/slottext/SlotTextAdder.java | 42 +++++++++++++++++ .../skyblock/item/slottext/SlotTextManager.java | 54 ++++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index 462e6a4a..7b379495 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -31,6 +31,7 @@ import de.hysky.skyblocker.skyblock.garden.FarmingHud; import de.hysky.skyblocker.skyblock.garden.LowerSensitivity; import de.hysky.skyblocker.skyblock.garden.VisitorHelper; import de.hysky.skyblocker.skyblock.item.*; +import de.hysky.skyblocker.skyblock.item.slottext.SlotTextManager; import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; @@ -188,6 +189,7 @@ public class SkyblockerMod implements ClientModInitializer { TimeTowerReminder.init(); SkyblockTime.init(); TooltipManager.init(); + SlotTextManager.init(); Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20); Scheduler.INSTANCE.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 200); diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 0c413fc8..847416aa 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.SlotTextManager; import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipManager; @@ -27,6 +28,7 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.item.TooltipData; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -309,4 +311,19 @@ public abstract class HandledScreenMixin extends Screen RenderSystem.disableBlend(); } } + + @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; + 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. + } + context.drawText(textRenderer, text, length > 16 ? (int) (slot.x * length / 16f) : slot.x, length > 16 ? (int) ((slot.y + 9) * length / 16f) : slot.y, 0xFFFFFF, true); + matrices.pop(); + } } 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 new file mode 100644 index 00000000..5ef388bd --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java @@ -0,0 +1,42 @@ +package de.hysky.skyblocker.skyblock.item.slottext; + +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Pattern; + +/** + * Extend this class and add it to {@link SlotTextManager#adders} to add text to any arbitrary slot. + */ +public abstract class SlotTextAdder { + /** + * The title of the screen must match this pattern for this adder to be applied. Null means it will be applied to all screens. + */ + public final Pattern titlePattern; + + protected SlotTextAdder(String titlePattern) { + this(Pattern.compile(titlePattern)); + } + + protected SlotTextAdder(Pattern titlePattern) { + this.titlePattern = titlePattern; + } + + /** + * Creates a SlotTextRenderer that will be applied to all screens. + */ + protected SlotTextAdder() { + this.titlePattern = null; + } + + /** + * This method will be called for each rendered slot. Consider using a switch statement on {@link Slot#getIndex()} if you wish to add different text to different slots. + * + * @return The text to be rendered. Return null 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); +} 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 new file mode 100644 index 00000000..b6dfa6cd --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java @@ -0,0 +1,54 @@ +package de.hysky.skyblocker.skyblock.item.slottext; + +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 java.util.ArrayList; + +public class SlotTextManager { + private static final SlotTextAdder[] adders = new SlotTextAdder[]{ + }; + private static final ArrayList currentScreenAdders = new ArrayList<>(); + + private SlotTextManager() { + } + + public static void init() { + ScreenEvents.AFTER_INIT.register((client, screen, width, height) -> { + if (screen instanceof HandledScreen) { + onScreenChange(screen); + ScreenEvents.remove(screen).register(ignored -> currentScreenAdders.clear()); + } + }); + } + + private static void onScreenChange(Screen screen) { + final String title = screen.getTitle().getString(); + for (SlotTextAdder adder : adders) { + if (adder.titlePattern == null || adder.titlePattern.matcher(title).matches()) { + currentScreenAdders.add(adder); + } + } + } + + /** + * The returned text is rendered on top of the slot. The text will be scaled if it doesn't fit in the slot, + * but 3 characters should be seen as the maximum to keep it readable and in place as it tends to move around when scaled. + * + * @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; + for (SlotTextAdder adder : currentScreenAdders) { + Text text = adder.getText(slot); + if (text != null) return text; + } + return null; + } +} -- cgit From c5b456cf7264edb802b0af18e1075451c39276b5 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 19:15:45 +0300 Subject: Fix unscaled characters being drawn on wrong Y level --- src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 847416aa..0a4fed8c 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -323,7 +323,7 @@ public abstract class HandledScreenMixin extends Screen 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. } - context.drawText(textRenderer, text, length > 16 ? (int) (slot.x * length / 16f) : slot.x, length > 16 ? (int) ((slot.y + 9) * length / 16f) : slot.y, 0xFFFFFF, true); + context.drawText(textRenderer, text, length > 16 ? (int) (slot.x * length / 16f) : slot.x, length > 16 ? (int) ((slot.y + 9) * length / 16f) : slot.y + 9, 0xFFFFFF, true); matrices.pop(); } } -- cgit From 70f64540381615499964bfb42afa9d969cf52b59 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 19:16:05 +0300 Subject: Add enchantment level slot text --- .../skyblock/item/slottext/SlotTextManager.java | 2 ++ .../slottext/adders/EnchantmentLevelAdder.java | 32 ++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java (limited to 'src/main/java/de') 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 b6dfa6cd..bc555454 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 @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.slottext; +import de.hysky.skyblocker.skyblock.item.slottext.adders.EnchantmentLevelAdder; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; @@ -11,6 +12,7 @@ import java.util.ArrayList; public class SlotTextManager { private static final SlotTextAdder[] adders = new SlotTextAdder[]{ + new EnchantmentLevelAdder() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); 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 new file mode 100644 index 00000000..e041f675 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/EnchantmentLevelAdder.java @@ -0,0 +1,32 @@ +package de.hysky.skyblocker.skyblock.item.slottext.adders; + +import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; +import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.item.ItemStack; +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 java.util.List; + +public class EnchantmentLevelAdder extends SlotTextAdder { + public EnchantmentLevelAdder() { + super(); + } + + @Override + public @Nullable Text getText(Slot slot) { + final ItemStack itemStack = slot.getStack(); + if (!itemStack.isOf(Items.ENCHANTED_BOOK)) return null; + List lore = ItemUtils.getLore(itemStack); + if (lore.isEmpty()) return null; + String firstLine = lore.getFirst().getString(); + String romanNumeral = firstLine.substring(firstLine.lastIndexOf(' ') + 1); //+1 because we don't need the space itself + int level = ChocolateFactorySolver.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. + if (level == 0) return null; + return Text.literal(String.valueOf(level)).formatted(Formatting.BLUE); + } +} -- cgit From 4277b7d1492c37463ab2d2e45a291e250ff046b8 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 19:25:44 +0300 Subject: Add minion level slot text --- .../skyblock/item/slottext/SlotTextManager.java | 4 +++- .../slottext/adders/EnchantmentLevelAdder.java | 2 +- .../item/slottext/adders/MinionLevelAdder.java | 28 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/MinionLevelAdder.java (limited to 'src/main/java/de') 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 bc555454..dd98cbdf 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 @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.slottext; import de.hysky.skyblocker.skyblock.item.slottext.adders.EnchantmentLevelAdder; +import de.hysky.skyblocker.skyblock.item.slottext.adders.MinionLevelAdder; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; @@ -12,7 +13,8 @@ import java.util.ArrayList; public class SlotTextManager { private static final SlotTextAdder[] adders = new SlotTextAdder[]{ - new EnchantmentLevelAdder() + new EnchantmentLevelAdder(), + new MinionLevelAdder() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); 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 e041f675..babf27d6 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 @@ -27,6 +27,6 @@ public class EnchantmentLevelAdder extends SlotTextAdder { String romanNumeral = firstLine.substring(firstLine.lastIndexOf(' ') + 1); //+1 because we don't need the space itself int level = ChocolateFactorySolver.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. if (level == 0) return null; - return Text.literal(String.valueOf(level)).formatted(Formatting.BLUE); + return 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 new file mode 100644 index 00000000..d6f53b7d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/MinionLevelAdder.java @@ -0,0 +1,28 @@ +package de.hysky.skyblocker.skyblock.item.slottext.adders; + +import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; +import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; +import net.minecraft.item.ItemStack; +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; + +public class MinionLevelAdder extends SlotTextAdder { + public MinionLevelAdder() { + super(); + } + + @Override + public @Nullable Text getText(Slot slot) { + ItemStack itemStack = slot.getStack(); + if (!itemStack.isOf(Items.PLAYER_HEAD)) return null; + String name = itemStack.getName().getString(); + if (!name.contains("Minion")) return null; + String romanNumeral = name.substring(name.lastIndexOf(' ') + 1); //+1 because we don't need the space itself + int level = ChocolateFactorySolver.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. + if (level == 0) return null; + return Text.literal(String.valueOf(level)).formatted(Formatting.DARK_PURPLE); + } +} -- cgit From ececd4c3d491e989869abafe38a9ed490cb7620b Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 19:42:57 +0300 Subject: Add pet level slot text --- .../skyblock/item/slottext/SlotTextManager.java | 4 +++- .../item/slottext/adders/PetLevelAdder.java | 28 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PetLevelAdder.java (limited to 'src/main/java/de') 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 dd98cbdf..06eb4d28 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 @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.item.slottext; import de.hysky.skyblocker.skyblock.item.slottext.adders.EnchantmentLevelAdder; import de.hysky.skyblocker.skyblock.item.slottext.adders.MinionLevelAdder; +import de.hysky.skyblocker.skyblock.item.slottext.adders.PetLevelAdder; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; @@ -14,7 +15,8 @@ import java.util.ArrayList; public class SlotTextManager { private static final SlotTextAdder[] adders = new SlotTextAdder[]{ new EnchantmentLevelAdder(), - new MinionLevelAdder() + new MinionLevelAdder(), + new PetLevelAdder() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); 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 new file mode 100644 index 00000000..7e384888 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PetLevelAdder.java @@ -0,0 +1,28 @@ +package de.hysky.skyblocker.skyblock.item.slottext.adders; + +import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +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; + +public class PetLevelAdder extends SlotTextAdder { + public PetLevelAdder() { + super(); + } + + @Override + public @Nullable Text getText(Slot slot) { + ItemStack itemStack = slot.getStack(); + if (!itemStack.isOf(Items.PLAYER_HEAD)) return null; + Text name = itemStack.getName(); + String nameStr = name.getString(); + if (!nameStr.startsWith("[Lvl ")) return null; + String level = nameStr.substring(5, nameStr.indexOf(']')); + if (!NumberUtils.isDigits(level)) return null; + return Text.literal(level).formatted(Formatting.GOLD); + } +} -- cgit From cac8a42e71b04833d5b62e8bd48e496b493f1afa Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 19:47:05 +0300 Subject: Fix titlePattern not matching when the title is changed by ChestValue --- .../java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java | 3 +++ .../de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java | 2 +- .../java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java | 2 +- .../de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java | 3 +++ 4 files changed, 8 insertions(+), 2 deletions(-) (limited to 'src/main/java/de') 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 5ef388bd..b41f42fc 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 @@ -1,5 +1,6 @@ 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.Nullable; @@ -12,6 +13,8 @@ import java.util.regex.Pattern; public abstract class SlotTextAdder { /** * The title of the screen must match this pattern for this adder to be applied. Null means it will be applied to all screens. + * @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; 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 06eb4d28..513764ea 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 @@ -35,7 +35,7 @@ public class SlotTextManager { private static void onScreenChange(Screen screen) { final String title = screen.getTitle().getString(); for (SlotTextAdder adder : adders) { - if (adder.titlePattern == null || adder.titlePattern.matcher(title).matches()) { + if (adder.titlePattern == null || adder.titlePattern.matcher(title).find()) { currentScreenAdders.add(adder); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index f6652248..324c0616 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -40,7 +40,7 @@ public class TooltipManager { private static void onScreenChange(Screen screen) { final String title = screen.getTitle().getString(); for (TooltipAdder adder : adders) { - if (adder.titlePattern == null || adder.titlePattern.matcher(title).matches()) { + if (adder.titlePattern == null || adder.titlePattern.matcher(title).find()) { currentScreenAdders.add(adder); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java index b0b24c1c..065dfe5e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; +import de.hysky.skyblocker.skyblock.ChestValue; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipManager; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; @@ -13,6 +14,8 @@ import java.util.regex.Pattern; public abstract class TooltipAdder { /** * The title of the screen must match this pattern for this adder to be applied. Null means it will be applied to all screens. + * @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; /** -- cgit From 52b7980c44b167612f6e9b864d7b483fba909270 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 29 May 2024 20:02:25 +0300 Subject: Fix EnchantmentLevelAdder crash in bazaar --- .../chocolatefactory/ChocolateFactorySolver.java | 1 + .../slottext/adders/EnchantmentLevelAdder.java | 24 +++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index fa19119a..7babe7f2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -375,6 +375,7 @@ public class ChocolateFactorySolver extends ContainerSolver { int lastNumber = 0; for (int i = romanNumeral.length() - 1; i >= 0; i--) { char ch = romanNumeral.charAt(i); + if (!romanMap.containsKey(ch)) return 0; decimal = romanMap.get(ch) >= lastNumber ? decimal + romanMap.get(ch) : decimal - romanMap.get(ch); lastNumber = romanMap.get(ch); } 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 babf27d6..44b3c982 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 @@ -21,12 +21,22 @@ public class EnchantmentLevelAdder extends SlotTextAdder { public @Nullable Text getText(Slot slot) { final ItemStack itemStack = slot.getStack(); if (!itemStack.isOf(Items.ENCHANTED_BOOK)) return null; - List lore = ItemUtils.getLore(itemStack); - if (lore.isEmpty()) return null; - String firstLine = lore.getFirst().getString(); - String romanNumeral = firstLine.substring(firstLine.lastIndexOf(' ') + 1); //+1 because we don't need the space itself - int level = ChocolateFactorySolver.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. - if (level == 0) return null; - return Text.literal(String.valueOf(level)).formatted(Formatting.GREEN); + String name = itemStack.getName().getString(); + if (name.equals("Enchanted Book")) { + List lore = ItemUtils.getLore(itemStack); + if (lore.isEmpty()) return null; + int level = getEnchantLevelFromString(lore.getFirst().getString()); + if (level == 0) return null; + return 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); + } + } + + private static int getEnchantLevelFromString(String str) { + String romanNumeral = str.substring(str.lastIndexOf(' ') + 1); //+1 because we don't need the space itself + return ChocolateFactorySolver.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. } } -- cgit From 1f333588274d473dfc41580e1e34ce7f405da9ea Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 31 May 2024 20:56:24 +0300 Subject: Add skyblock level adder --- .../skyblock/item/slottext/SlotTextManager.java | 4 +++- .../item/slottext/adders/SkyblockLevelAdder.java | 28 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkyblockLevelAdder.java (limited to 'src/main/java/de') 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 513764ea..7087f602 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 @@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.item.slottext; import de.hysky.skyblocker.skyblock.item.slottext.adders.EnchantmentLevelAdder; import de.hysky.skyblocker.skyblock.item.slottext.adders.MinionLevelAdder; import de.hysky.skyblocker.skyblock.item.slottext.adders.PetLevelAdder; +import de.hysky.skyblocker.skyblock.item.slottext.adders.SkyblockLevelAdder; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; @@ -16,7 +17,8 @@ public class SlotTextManager { private static final SlotTextAdder[] adders = new SlotTextAdder[]{ new EnchantmentLevelAdder(), new MinionLevelAdder(), - new PetLevelAdder() + new PetLevelAdder(), + new SkyblockLevelAdder() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); 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 new file mode 100644 index 00000000..bab88372 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkyblockLevelAdder.java @@ -0,0 +1,28 @@ +package de.hysky.skyblocker.skyblock.item.slottext.adders; + +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 java.util.List; + +public class SkyblockLevelAdder extends SlotTextAdder { + public SkyblockLevelAdder() { + super("^SkyBlock Menu"); + } + + @Override + public @Nullable Text getText(Slot slot) { + if (slot.getIndex() != 22) return null; + List lore = ItemUtils.getLore(slot.getStack()); + if (lore.isEmpty()) return null; + List siblings = lore.getFirst().getSiblings(); + if (siblings.size() < 3) return null; + Text levelText = siblings.get(2); //The 3rd child is the level text itself + if (!NumberUtils.isDigits(levelText.getString())) return null; + return levelText; + } +} -- cgit From f056499d12e7e93c922487f859535c2aa502d6ae Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 31 May 2024 20:57:10 +0300 Subject: Fine-tune text y level for 2 and 3 characters --- src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 0a4fed8c..8533ddfa 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -323,7 +323,7 @@ public abstract class HandledScreenMixin extends Screen 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. } - context.drawText(textRenderer, text, length > 16 ? (int) (slot.x * length / 16f) : slot.x, length > 16 ? (int) ((slot.y + 9) * length / 16f) : slot.y + 9, 0xFFFFFF, true); + 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(); } } -- cgit From f8a70f9488263cd101d07c1271c68b15c62f959e Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 31 May 2024 20:58:22 +0300 Subject: Refactor romanToDecimal method to its own class and optimize a few things --- .../chocolatefactory/ChocolateFactorySolver.java | 28 ++-------------- .../slottext/adders/EnchantmentLevelAdder.java | 4 +-- .../item/slottext/adders/MinionLevelAdder.java | 4 +-- .../de/hysky/skyblocker/utils/RomanNumerals.java | 37 ++++++++++++++++++++++ 4 files changed, 44 insertions(+), 29 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index 7babe7f2..66822962 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -4,6 +4,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.tooltip.adders.LineSmoothener; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RegexUtils; +import de.hysky.skyblocker.utils.RomanNumerals; import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -143,8 +144,8 @@ public class ChocolateFactorySolver extends ContainerSolver { } //Time Tower is in slot 39 - timeTowerMultiplier = romanToDecimal(StringUtils.substringAfterLast(slots.get(TIME_TOWER_SLOT).getName().getString(), ' ')) / 10.0; //The name holds the level, which is multiplier * 10 in roman numerals - Matcher timeTowerStatusMatcher = TIME_TOWER_STATUS_PATTERN.matcher(getConcatenatedLore(slots.get(TIME_TOWER_SLOT))); + timeTowerMultiplier = RomanNumerals.romanToDecimal(StringUtils.substringAfterLast(slots.get(39).getName().getString(), ' ')) / 10.0; //The name holds the level, which is multiplier * 10 in roman numerals + Matcher timeTowerStatusMatcher = TIME_TOWER_STATUS_PATTERN.matcher(getConcatenatedLore(slots.get(39))); if (timeTowerStatusMatcher.find()) { isTimeTowerActive = timeTowerStatusMatcher.group(1).equals("ACTIVE"); } @@ -358,27 +359,4 @@ public class ChocolateFactorySolver extends ContainerSolver { private record Rabbit(double cpsIncrease, int cost, int slot, ItemStack itemStack) { } - - //Perhaps the part below can go to a separate file later on, but I couldn't find a proper name for the class, so they're staying here. - private static final Map romanMap = Map.of( - 'I', 1, - 'V', 5, - 'X', 10, - 'L', 50, - 'C', 100, - 'D', 500, - 'M', 1000 - ); - - public static int romanToDecimal(String romanNumeral) { - int decimal = 0; - int lastNumber = 0; - for (int i = romanNumeral.length() - 1; i >= 0; i--) { - char ch = romanNumeral.charAt(i); - if (!romanMap.containsKey(ch)) return 0; - decimal = romanMap.get(ch) >= lastNumber ? decimal + romanMap.get(ch) : decimal - romanMap.get(ch); - lastNumber = romanMap.get(ch); - } - return decimal; - } } 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 44b3c982..44b12a7e 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,8 +1,8 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; -import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.RomanNumerals; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.screen.slot.Slot; @@ -37,6 +37,6 @@ public class EnchantmentLevelAdder extends SlotTextAdder { private static int getEnchantLevelFromString(String str) { String romanNumeral = str.substring(str.lastIndexOf(' ') + 1); //+1 because we don't need the space itself - return ChocolateFactorySolver.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. + return RomanNumerals.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. } } 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 d6f53b7d..3a27c022 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,7 +1,7 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; -import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; +import de.hysky.skyblocker.utils.RomanNumerals; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.screen.slot.Slot; @@ -21,7 +21,7 @@ public class MinionLevelAdder extends SlotTextAdder { String name = itemStack.getName().getString(); if (!name.contains("Minion")) return null; String romanNumeral = name.substring(name.lastIndexOf(' ') + 1); //+1 because we don't need the space itself - int level = ChocolateFactorySolver.romanToDecimal(romanNumeral); //Temporary line. The method will be moved out later. + int level = RomanNumerals.romanToDecimal(romanNumeral); if (level == 0) return null; return Text.literal(String.valueOf(level)).formatted(Formatting.DARK_PURPLE); } diff --git a/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java b/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java new file mode 100644 index 00000000..2ab3c776 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java @@ -0,0 +1,37 @@ +package de.hysky.skyblocker.utils; + +public class RomanNumerals { + private static int getDecimalValue(char romanChar) { + return switch (romanChar) { + case 'I' -> 1; + case 'V' -> 5; + case 'X' -> 10; + case 'L' -> 50; + case 'C' -> 100; + case 'D' -> 500; + case 'M' -> 1000; + default -> 0; + }; + } + + /** + * Converts a roman numeral to a decimal number. + * + * @param romanNumeral The roman numeral to convert. + * @return The decimal number, or 0 if the roman numeral string is malformed, empty or null. + */ + public static int romanToDecimal(String romanNumeral) { + if (romanNumeral == null || romanNumeral.isEmpty()) return 0; + romanNumeral = romanNumeral.trim().toUpperCase(); + int decimal = 0; + int lastNumber = 0; + for (int i = romanNumeral.length() - 1; i >= 0; i--) { + char ch = romanNumeral.charAt(i); + int number = getDecimalValue(ch); + if (number == 0) return 0; //Malformed roman numeral + decimal = number >= lastNumber ? decimal + number : decimal - number; + lastNumber = number; + } + return decimal; + } +} -- cgit From f25586827c1f567526369fa9255c8d7a454c0b9f Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 31 May 2024 21:05:55 +0300 Subject: Add RomanNumerals.isValidRomanNumeral --- src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java b/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java index 2ab3c776..5f273f8e 100644 --- a/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java +++ b/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java @@ -1,6 +1,8 @@ package de.hysky.skyblocker.utils; public class RomanNumerals { + private RomanNumerals() { + } private static int getDecimalValue(char romanChar) { return switch (romanChar) { case 'I' -> 1; @@ -14,6 +16,14 @@ public class RomanNumerals { }; } + public static boolean isValidRomanNumeral(String romanNumeral) { + if (romanNumeral == null || romanNumeral.isEmpty()) return false; + for (int i = 0; i < romanNumeral.length(); i++) { + if (getDecimalValue(romanNumeral.charAt(i)) == 0) return false; + } + return true; + } + /** * Converts a roman numeral to a decimal number. * -- cgit From fd7143c51f131fa9d0aafd00db8172d6426a6a18 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 31 May 2024 21:19:47 +0300 Subject: Javadoc correction --- .../java/de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de') 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 b41f42fc..8db4cde5 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 @@ -34,7 +34,7 @@ public abstract class SlotTextAdder { } /** - * This method will be called for each rendered slot. Consider using a switch statement on {@link Slot#getIndex()} if you wish to add different text to different slots. + * 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. * @implNote By minecraft's design, scaled text inexplicably moves around. -- cgit From a74e944f417b14ae73d59cf3ca9e35508726a5bf Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 31 May 2024 21:25:40 +0300 Subject: Add skill level slot text --- .../skyblock/item/slottext/SlotTextManager.java | 8 +++--- .../item/slottext/adders/SkillLevelAdder.java | 31 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkillLevelAdder.java (limited to 'src/main/java/de') 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 7087f602..d23e0739 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 @@ -1,9 +1,6 @@ package de.hysky.skyblocker.skyblock.item.slottext; -import de.hysky.skyblocker.skyblock.item.slottext.adders.EnchantmentLevelAdder; -import de.hysky.skyblocker.skyblock.item.slottext.adders.MinionLevelAdder; -import de.hysky.skyblocker.skyblock.item.slottext.adders.PetLevelAdder; -import de.hysky.skyblocker.skyblock.item.slottext.adders.SkyblockLevelAdder; +import de.hysky.skyblocker.skyblock.item.slottext.adders.*; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; @@ -18,7 +15,8 @@ public class SlotTextManager { new EnchantmentLevelAdder(), new MinionLevelAdder(), new PetLevelAdder(), - new SkyblockLevelAdder() + new SkyblockLevelAdder(), + new SkillLevelAdder() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); 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 new file mode 100644 index 00000000..03f9fbd0 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/SkillLevelAdder.java @@ -0,0 +1,31 @@ +package de.hysky.skyblocker.skyblock.item.slottext.adders; + +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; + +public class SkillLevelAdder extends SlotTextAdder { + public SkillLevelAdder() { + super("^Your Skills"); + } + + @Override + public @Nullable Text 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. + 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); + } + default -> { + return null; + } + } + } +} -- cgit From d923b643f6753fc83e8cc21e1837211f65c43e73 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 31 May 2024 22:04:21 +0300 Subject: Add catacombs level slot text --- .../skyblock/item/slottext/SlotTextManager.java | 5 +- .../item/slottext/adders/CatacombsLevelAdder.java | 89 ++++++++++++++++++++++ .../item/slottext/adders/PetLevelAdder.java | 5 +- 3 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CatacombsLevelAdder.java (limited to 'src/main/java/de') 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 d23e0739..710d780c 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 @@ -16,7 +16,10 @@ public class SlotTextManager { new MinionLevelAdder(), new PetLevelAdder(), new SkyblockLevelAdder(), - new SkillLevelAdder() + new SkillLevelAdder(), + new CatacombsLevelAdder.Dungeoneering(), + new CatacombsLevelAdder.DungeonClasses(), + new CatacombsLevelAdder.ReadyUp() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); 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 new file mode 100644 index 00000000..00a96f1a --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CatacombsLevelAdder.java @@ -0,0 +1,89 @@ +package de.hysky.skyblocker.skyblock.item.slottext.adders; + +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; + +//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. +public class CatacombsLevelAdder { + private CatacombsLevelAdder() { + } + + public static class Dungeoneering extends SlotTextAdder { + public Dungeoneering() { + super("^Dungeoneering"); + } + + @Override + public @Nullable Text 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); + String level = name.substring(lastIndex + 1); + if (!NumberUtils.isDigits(level)) return null; //Sanity check, just in case. + return Text.literal(level).formatted(Formatting.RED); + } + default -> { + return null; + } + } + } + } + + public static class DungeonClasses extends SlotTextAdder { + + public DungeonClasses() { + super("^Dungeon Classes"); //Applies to both screens as they are same in both the placement and the style of the level text. + } + + @Override + public @Nullable Text 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); + } + default -> { + return null; + } + } + } + } + + public static class ReadyUp extends SlotTextAdder { + + public ReadyUp() { + super("^Ready Up"); + } + + @Override + public @Nullable Text 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); + } + default -> { + return null; + } + } + } + } + + public static String getBracketedLevelFromName(ItemStack itemStack) { + String name = itemStack.getName().getString(); + if (!name.startsWith("[Lvl ")) return null; + int index = name.indexOf(']'); + if (index == -1) return null; + return name.substring(5, index); + } +} 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 7e384888..c4632d8e 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 @@ -18,10 +18,7 @@ public class PetLevelAdder extends SlotTextAdder { public @Nullable Text getText(Slot slot) { ItemStack itemStack = slot.getStack(); if (!itemStack.isOf(Items.PLAYER_HEAD)) return null; - Text name = itemStack.getName(); - String nameStr = name.getString(); - if (!nameStr.startsWith("[Lvl ")) return null; - String level = nameStr.substring(5, nameStr.indexOf(']')); + String level = CatacombsLevelAdder.getBracketedLevelFromName(itemStack); if (!NumberUtils.isDigits(level)) return null; return Text.literal(level).formatted(Formatting.GOLD); } -- cgit From 8eab800571a599ef5f5ec7c3a353e8bb3b948b69 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Sat, 1 Jun 2024 12:25:38 +0300 Subject: Fix time tower slot variable not being used --- .../skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index 66822962..6c51cfbd 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -144,8 +144,8 @@ public class ChocolateFactorySolver extends ContainerSolver { } //Time Tower is in slot 39 - timeTowerMultiplier = RomanNumerals.romanToDecimal(StringUtils.substringAfterLast(slots.get(39).getName().getString(), ' ')) / 10.0; //The name holds the level, which is multiplier * 10 in roman numerals - Matcher timeTowerStatusMatcher = TIME_TOWER_STATUS_PATTERN.matcher(getConcatenatedLore(slots.get(39))); + timeTowerMultiplier = RomanNumerals.romanToDecimal(StringUtils.substringAfterLast(slots.get(TIME_TOWER_SLOT).getName().getString(), ' ')) / 10.0; //The name holds the level, which is multiplier * 10 in roman numerals + Matcher timeTowerStatusMatcher = TIME_TOWER_STATUS_PATTERN.matcher(getConcatenatedLore(slots.get(TIME_TOWER_SLOT))); if (timeTowerStatusMatcher.find()) { isTimeTowerActive = timeTowerStatusMatcher.group(1).equals("ACTIVE"); } -- cgit From d5a5fc05b8d7f73c16b069d45396e55e4d0b3efa Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Sat, 1 Jun 2024 14:01:14 +0300 Subject: Switch to interface injection to cache the items' internal ids and neu names --- .../injected/ItemStackInternalIdGetter.java | 11 +++ .../de/hysky/skyblocker/mixins/ItemStackMixin.java | 107 ++++++++++++++++++++- .../de/hysky/skyblocker/skyblock/ChestValue.java | 5 +- .../hysky/skyblocker/skyblock/TeleportOverlay.java | 3 +- .../skyblock/auction/AuctionBrowserScreen.java | 4 +- .../skyblock/item/tooltip/ItemTooltip.java | 70 -------------- .../item/tooltip/adders/AccessoryTooltip.java | 3 +- .../item/tooltip/adders/AvgBinTooltip.java | 8 +- .../item/tooltip/adders/BazaarPriceTooltip.java | 4 +- .../skyblock/item/tooltip/adders/ColorTooltip.java | 3 +- .../skyblock/item/tooltip/adders/LBinTooltip.java | 4 +- .../skyblock/item/tooltip/adders/MotesTooltip.java | 3 +- .../item/tooltip/adders/MuseumTooltip.java | 3 +- .../item/tooltip/adders/NpcPriceTooltip.java | 2 +- src/main/resources/fabric.mod.json | 5 + 15 files changed, 138 insertions(+), 97 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java b/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java new file mode 100644 index 00000000..25b84516 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java @@ -0,0 +1,11 @@ +package de.hysky.skyblocker.injected; + +public interface ItemStackInternalIdGetter { + default String skyblocker$getInternalId(boolean internalIdOnly) { + return ""; + } + + default String skyblocker$getNeuName() { + return ""; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 878a93ac..48710bc0 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -1,13 +1,19 @@ package de.hysky.skyblocker.mixins; +import com.google.gson.JsonObject; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.injected.ItemStackInternalIdGetter; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import it.unimi.dsi.fastutil.ints.IntIntPair; import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.item.ItemStack; import net.minecraft.item.TooltipAppender; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -17,8 +23,11 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Locale; +import java.util.Optional; + @Mixin(ItemStack.class) -public abstract class ItemStackMixin { +public abstract class ItemStackMixin implements ItemStackInternalIdGetter { @Shadow public abstract int getDamage(); @@ -29,6 +38,15 @@ public abstract class ItemStackMixin { @Unique private int maxDamage; + @Unique + private String internalId; + + @Unique + private String internalName; + + @Unique + private String neuName; + @ModifyReturnValue(method = "getName", at = @At("RETURN")) private Text skyblocker$customItemNames(Text original) { if (Utils.isOnSkyblock()) { @@ -103,4 +121,91 @@ public abstract class ItemStackMixin { setDamage(durability.rightInt() - durability.leftInt()); return true; } + + @Override + public String skyblocker$getInternalId(boolean internalIDOnly) { + if (internalIDOnly) { + if (internalId != null && !internalId.isEmpty()) return internalId; + internalId = skyblocker$getInternalNameFromNBT(true); + return internalId; + } // else + if (internalName != null && !internalName.isEmpty()) return internalName; + internalName = skyblocker$getInternalNameFromNBT(false); + return internalName; + } + + @Override + public String skyblocker$getNeuName() { + if (neuName != null && !neuName.isEmpty()) return neuName; + String name = skyblocker$getInternalId(false); + String internalId = skyblocker$getInternalId(true); + if (name == null || internalId == null) return ""; + + if (name.startsWith("ISSHINY_")) name = internalId; + + neuName = ItemTooltip.getNeuName(internalId, name); + return neuName; + } + + @Unique + private String skyblocker$getInternalNameFromNBT(boolean internalIDOnly) { + NbtCompound customData = ItemUtils.getCustomData((ItemStack) (Object) this); + + if (customData == null || !customData.contains(ItemUtils.ID, NbtElement.STRING_TYPE)) { + return null; + } + String customDataString = customData.getString(ItemUtils.ID); + + if (internalIDOnly) { + return customDataString; + } + + // Transformation to API format. + if (customData.contains("is_shiny")) { + return "ISSHINY_" + customDataString; + } + + switch (customDataString) { + case "ENCHANTED_BOOK" -> { + if (customData.contains("enchantments")) { + NbtCompound enchants = customData.getCompound("enchantments"); + Optional firstEnchant = enchants.getKeys().stream().findFirst(); + String enchant = firstEnchant.orElse(""); + return "ENCHANTMENT_" + enchant.toUpperCase(Locale.ENGLISH) + "_" + enchants.getInt(enchant); + } + } + case "PET" -> { + if (customData.contains("petInfo")) { + JsonObject petInfo = SkyblockerMod.GSON.fromJson(customData.getString("petInfo"), JsonObject.class); + return "LVL_1_" + petInfo.get("tier").getAsString() + "_" + petInfo.get("type").getAsString(); + } + } + case "POTION" -> { + String enhanced = customData.contains("enhanced") ? "_ENHANCED" : ""; + String extended = customData.contains("extended") ? "_EXTENDED" : ""; + String splash = customData.contains("splash") ? "_SPLASH" : ""; + if (customData.contains("potion") && customData.contains("potion_level")) { + return (customData.getString("potion") + "_" + customDataString + "_" + customData.getInt("potion_level") + + enhanced + extended + splash).toUpperCase(Locale.ENGLISH); + } + } + case "RUNE" -> { + if (customData.contains("runes")) { + NbtCompound runes = customData.getCompound("runes"); + Optional firstRunes = runes.getKeys().stream().findFirst(); + String rune = firstRunes.orElse(""); + return rune.toUpperCase(Locale.ENGLISH) + "_RUNE_" + runes.getInt(rune); + } + } + case "ATTRIBUTE_SHARD" -> { + if (customData.contains("attributes")) { + NbtCompound shards = customData.getCompound("attributes"); + Optional firstShards = shards.getKeys().stream().findFirst(); + String shard = firstShards.orElse(""); + return customDataString + "-" + shard.toUpperCase(Locale.ENGLISH) + "_" + shards.getInt(shard); + } + } + } + return customDataString; + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 7f8b2c71..0ca15e81 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -6,7 +6,6 @@ import de.hysky.skyblocker.config.configs.DungeonsConfig; import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.mixins.accessors.ScreenAccessor; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; @@ -81,7 +80,7 @@ public class ChestValue { } String name = stack.getName().getString(); - String id = ItemTooltip.getInternalNameFromNBT(stack, false); + String id = stack.skyblocker$getInternalId(false); //Regular item price if (id != null) { @@ -160,7 +159,7 @@ public class ChestValue { continue; } - String id = ItemTooltip.getInternalNameFromNBT(stack, false); + String id = stack.skyblocker$getInternalId(false); if (id != null) { LongBooleanPair priceData = getItemPrice(id); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java index 042b126b..b431dcc9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.skyblock; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.RenderHelper; @@ -27,7 +26,7 @@ public class TeleportOverlay { private static void render(WorldRenderContext wrc) { if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().uiAndVisuals.teleportOverlay.enableTeleportOverlays && client.player != null && client.world != null) { ItemStack heldItem = client.player.getMainHandStack(); - String itemId = ItemTooltip.getInternalNameFromNBT(heldItem, true); + String itemId = heldItem.skyblocker$getInternalId(true); NbtCompound customData = ItemUtils.getCustomData(heldItem); if (itemId != null) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java index fd69d886..3a825e81 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java @@ -295,8 +295,8 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI { - if (customData.contains("enchantments")) { - NbtCompound enchants = customData.getCompound("enchantments"); - Optional firstEnchant = enchants.getKeys().stream().findFirst(); - String enchant = firstEnchant.orElse(""); - return "ENCHANTMENT_" + enchant.toUpperCase(Locale.ENGLISH) + "_" + enchants.getInt(enchant); - } - } - case "PET" -> { - if (customData.contains("petInfo")) { - JsonObject petInfo = SkyblockerMod.GSON.fromJson(customData.getString("petInfo"), JsonObject.class); - return "LVL_1_" + petInfo.get("tier").getAsString() + "_" + petInfo.get("type").getAsString(); - } - } - case "POTION" -> { - String enhanced = customData.contains("enhanced") ? "_ENHANCED" : ""; - String extended = customData.contains("extended") ? "_EXTENDED" : ""; - String splash = customData.contains("splash") ? "_SPLASH" : ""; - if (customData.contains("potion") && customData.contains("potion_level")) { - return (customData.getString("potion") + "_" + internalName + "_" + customData.getInt("potion_level") - + enhanced + extended + splash).toUpperCase(Locale.ENGLISH); - } - } - case "RUNE" -> { - if (customData.contains("runes")) { - NbtCompound runes = customData.getCompound("runes"); - Optional firstRunes = runes.getKeys().stream().findFirst(); - String rune = firstRunes.orElse(""); - return rune.toUpperCase(Locale.ENGLISH) + "_RUNE_" + runes.getInt(rune); - } - } - case "ATTRIBUTE_SHARD" -> { - if (customData.contains("attributes")) { - NbtCompound shards = customData.getCompound("attributes"); - Optional firstShards = shards.getKeys().stream().findFirst(); - String shard = firstShards.orElse(""); - return internalName + "-" + shard.toUpperCase(Locale.ENGLISH) + "_" + shards.getInt(shard); - } - } - } - return internalName; - } - public static Text getCoinsMessage(double price, int count) { // Format the price string once String priceString = String.format(Locale.ENGLISH, "%1$,.1f", price); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java index d26e1846..18991a1c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import it.unimi.dsi.fastutil.Pair; import net.minecraft.screen.slot.Slot; @@ -18,7 +17,7 @@ public class AccessoryTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { - final String internalID = ItemTooltip.getInternalNameFromNBT(focusedSlot.getStack(), true); + final String internalID = focusedSlot.getStack().skyblocker$getInternalId(true); if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java index 8bb71c9a..85c8d4e1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java @@ -19,12 +19,10 @@ public class AvgBinTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - String neuName = ItemTooltip.getInternalNameFromNBT(itemStack, false); - String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + String neuName = itemStack.skyblocker$getNeuName(); + String internalID = itemStack.skyblocker$getInternalId(true); if (neuName == null || internalID == null) return; - if (neuName.startsWith("ISSHINY_")) neuName = internalID; - if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) { if (TooltipInfoType.ONE_DAY_AVERAGE.getData() == null || TooltipInfoType.THREE_DAY_AVERAGE.getData() == null) { ItemTooltip.nullWarning(); @@ -33,8 +31,6 @@ public class AvgBinTooltip extends TooltipAdder { We are skipping check average prices for potions, runes and enchanted books because there is no data for their in API. */ - neuName = ItemTooltip.getNeuName(internalID, neuName); - if (!neuName.isEmpty() && LBinTooltip.lbinExist) { GeneralConfig.Average type = ItemTooltip.config.avg; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java index 12d7e821..5ebe1f30 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java @@ -22,9 +22,9 @@ public class BazaarPriceTooltip extends TooltipAdder { public void addToTooltip(List lines, Slot focusedSlot) { bazaarExist = false; final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + final String internalID = itemStack.skyblocker$getInternalId(true); if (internalID == null) return; - String name = ItemTooltip.getInternalNameFromNBT(itemStack, false); + String name = itemStack.skyblocker$getInternalId(false); if (name == null) return; if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java index d806faa8..ac28e08b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.ItemUtils; @@ -29,7 +28,7 @@ public class ColorTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + final String internalID = itemStack.skyblocker$getInternalId(true); if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && itemStack.contains(DataComponentTypes.DYED_COLOR)) { String uuid = ItemUtils.getItemUuid(itemStack); boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java index 7d109081..8f3bfe09 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java @@ -20,9 +20,9 @@ public class LBinTooltip extends TooltipAdder { public void addToTooltip(List lines, Slot focusedSlot) { lbinExist = false; final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + final String internalID = itemStack.skyblocker$getInternalId(true); if (internalID == null) return; - String name = ItemTooltip.getInternalNameFromNBT(itemStack, false); + String name = itemStack.skyblocker$getInternalId(false); if (name == null) return; if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java index 285a1449..7311e614 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; @@ -20,7 +19,7 @@ public class MotesTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + final String internalID = itemStack.skyblocker$getInternalId(true); if (internalID != null && TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { lines.add(Text.literal(String.format("%-20s", "Motes Price:")) .formatted(Formatting.LIGHT_PURPLE) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java index 734dd508..d6e2c13b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.skyblock.item.MuseumItemCache; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.item.ItemStack; @@ -20,7 +19,7 @@ public class MuseumTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(itemStack, true); + final String internalID = itemStack.skyblocker$getInternalId(true); if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); String format = switch (itemCategory) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java index 3b12f482..3ffdc003 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java @@ -17,7 +17,7 @@ public class NpcPriceTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack stack = focusedSlot.getStack(); - final String internalID = ItemTooltip.getInternalNameFromNBT(stack, true); + final String internalID = stack.skyblocker$getInternalId(true); if (internalID != null && TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { lines.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) .formatted(Formatting.YELLOW) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 645eda34..2d137920 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -52,6 +52,11 @@ "modmenu.modrinth": "https://modrinth.com/mod/skyblocker-liap", "text.skyblocker.translate": "https://translate.hysky.de" } + }, + "loom:injected_interfaces": { + "net/minecraft/class_1799": [ + "de/hysky/skyblocker/injected/ItemStackInternalIdGetter" + ] } } } -- cgit From c170b563895d1aa97b0d9f18aebb685ba02ad9a6 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:48:44 +0300 Subject: Add text position for slot text Will be configurable later on --- .../skyblocker/mixins/HandledScreenMixin.java | 34 ++++++++++++++++------ .../skyblock/item/slottext/PositionedText.java | 21 +++++++++++++ .../skyblock/item/slottext/SlotTextAdder.java | 27 ++++++++++++----- .../skyblock/item/slottext/SlotTextManager.java | 16 +++++----- .../skyblock/item/slottext/TextPosition.java | 8 +++++ .../item/slottext/adders/CatacombsLevelAdder.java | 31 +++++++++++--------- .../slottext/adders/EnchantmentLevelAdder.java | 17 ++++++----- .../item/slottext/adders/MinionLevelAdder.java | 15 ++++++---- .../item/slottext/adders/PetLevelAdder.java | 13 +++++---- .../item/slottext/adders/SkillLevelAdder.java | 15 ++++++---- .../item/slottext/adders/SkyblockLevelAdder.java | 15 +++++----- 11 files changed, 141 insertions(+), 71 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/PositionedText.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/TextPosition.java (limited to 'src/main/java/de') 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 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 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 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 getText(Slot slot) { + if (currentScreenAdders.isEmpty()) return List.of(); for (SlotTextAdder adder : currentScreenAdders) { - Text text = adder.getText(slot); - if (text != null) return text; + List 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 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 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 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 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 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 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 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 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 getText(Slot slot) { + if (slot.getIndex() != 22) return List.of(); List lore = ItemUtils.getLore(slot.getStack()); - if (lore.isEmpty()) return null; + if (lore.isEmpty()) return List.of(); List 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)); } } -- cgit From 4e163a840ab776fa772819066f14ff4afa4ef646 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:56:27 +0300 Subject: Optimize slot text positioning --- src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 1758026a..47229a54 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -328,14 +328,14 @@ public abstract class HandledScreenMixin extends Screen 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); + case BOTTOM_LEFT, BOTTOM_RIGHT -> matrices.translate(x, ((slot.y + 16f - textRenderer.fontHeight + 2f + 0.7f) * 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); + case BOTTOM_LEFT -> matrices.translate(0.0f, 16f - textRenderer.fontHeight + 2f, 0.0f); + case BOTTOM_RIGHT -> matrices.translate(16f - length, 16f - textRenderer.fontHeight + 2f, 0.0f); } } context.drawText(textRenderer, positionedText.text(), slot.x, slot.y, 0xFFFFFF, true); -- cgit From 446e9e2214c24f67c1e6bb8d7a29214e72e51707 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 4 Jun 2024 20:24:12 +0300 Subject: Rename injected methods and separate internalId and internalName into 2 methods --- .../injected/ItemStackInternalIdGetter.java | 8 +++++-- .../de/hysky/skyblocker/mixins/ItemStackMixin.java | 26 ++++++++++++---------- .../de/hysky/skyblocker/skyblock/ChestValue.java | 12 +++++----- .../hysky/skyblocker/skyblock/TeleportOverlay.java | 2 +- .../skyblock/auction/AuctionBrowserScreen.java | 4 ++-- .../item/tooltip/adders/AccessoryTooltip.java | 2 +- .../item/tooltip/adders/AvgBinTooltip.java | 4 ++-- .../item/tooltip/adders/BazaarPriceTooltip.java | 4 ++-- .../skyblock/item/tooltip/adders/ColorTooltip.java | 2 +- .../skyblock/item/tooltip/adders/LBinTooltip.java | 4 ++-- .../skyblock/item/tooltip/adders/MotesTooltip.java | 2 +- .../item/tooltip/adders/MuseumTooltip.java | 2 +- .../item/tooltip/adders/NpcPriceTooltip.java | 2 +- 13 files changed, 40 insertions(+), 34 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java b/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java index 25b84516..87c1304b 100644 --- a/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java +++ b/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java @@ -1,11 +1,15 @@ package de.hysky.skyblocker.injected; public interface ItemStackInternalIdGetter { - default String skyblocker$getInternalId(boolean internalIdOnly) { + default String getInternalId() { return ""; } - default String skyblocker$getNeuName() { + default String getInternalName() { + return ""; + } + + default String getNeuName() { return ""; } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 48710bc0..8b5dd31d 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -123,27 +123,29 @@ public abstract class ItemStackMixin implements ItemStackInternalIdGetter { } @Override - public String skyblocker$getInternalId(boolean internalIDOnly) { - if (internalIDOnly) { - if (internalId != null && !internalId.isEmpty()) return internalId; - internalId = skyblocker$getInternalNameFromNBT(true); - return internalId; - } // else + public String getInternalId() { + if (internalId != null && !internalId.isEmpty()) return internalId; + internalId = skyblocker$getInternalNameFromNBT(true); + return internalId; + } + + @Override + public String getInternalName() { if (internalName != null && !internalName.isEmpty()) return internalName; internalName = skyblocker$getInternalNameFromNBT(false); return internalName; } @Override - public String skyblocker$getNeuName() { + public String getNeuName() { if (neuName != null && !neuName.isEmpty()) return neuName; - String name = skyblocker$getInternalId(false); - String internalId = skyblocker$getInternalId(true); - if (name == null || internalId == null) return ""; + String name = getInternalName(); + String id = getInternalId(); + if (name == null || id == null) return ""; - if (name.startsWith("ISSHINY_")) name = internalId; + if (name.startsWith("ISSHINY_")) name = id; - neuName = ItemTooltip.getNeuName(internalId, name); + neuName = ItemTooltip.getNeuName(id, name); return neuName; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 0ca15e81..3d1da0bd 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -80,11 +80,11 @@ public class ChestValue { } String name = stack.getName().getString(); - String id = stack.skyblocker$getInternalId(false); + String internalName = stack.getInternalName(); //Regular item price - if (id != null) { - LongBooleanPair priceData = getItemPrice(id); + if (internalName != null) { + LongBooleanPair priceData = getItemPrice(internalName); if (!priceData.rightBoolean()) hasIncompleteData = true; @@ -159,10 +159,10 @@ public class ChestValue { continue; } - String id = stack.skyblocker$getInternalId(false); + String internalName = stack.getInternalName(); - if (id != null) { - LongBooleanPair priceData = getItemPrice(id); + if (internalName != null) { + LongBooleanPair priceData = getItemPrice(internalName); if (!priceData.rightBoolean()) hasIncompleteData = true; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java index b431dcc9..d8a05809 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java @@ -26,7 +26,7 @@ public class TeleportOverlay { private static void render(WorldRenderContext wrc) { if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().uiAndVisuals.teleportOverlay.enableTeleportOverlays && client.player != null && client.world != null) { ItemStack heldItem = client.player.getMainHandStack(); - String itemId = heldItem.skyblocker$getInternalId(true); + String itemId = heldItem.getInternalId(); NbtCompound customData = ItemUtils.getCustomData(heldItem); if (itemId != null) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java index 3a825e81..21bd965c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java @@ -295,8 +295,8 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI lines, Slot focusedSlot) { - final String internalID = focusedSlot.getStack().skyblocker$getInternalId(true); + final String internalID = focusedSlot.getStack().getInternalId(); if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java index 85c8d4e1..ba06b54d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java @@ -19,8 +19,8 @@ public class AvgBinTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - String neuName = itemStack.skyblocker$getNeuName(); - String internalID = itemStack.skyblocker$getInternalId(true); + String neuName = itemStack.getNeuName(); + String internalID = itemStack.getInternalId(); if (neuName == null || internalID == null) return; if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java index 5ebe1f30..afd6d301 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java @@ -22,9 +22,9 @@ public class BazaarPriceTooltip extends TooltipAdder { public void addToTooltip(List lines, Slot focusedSlot) { bazaarExist = false; final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.skyblocker$getInternalId(true); + final String internalID = itemStack.getInternalId(); if (internalID == null) return; - String name = itemStack.skyblocker$getInternalId(false); + String name = itemStack.getInternalName(); if (name == null) return; if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java index ac28e08b..85be7215 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java @@ -28,7 +28,7 @@ public class ColorTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.skyblocker$getInternalId(true); + final String internalID = itemStack.getInternalId(); if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && itemStack.contains(DataComponentTypes.DYED_COLOR)) { String uuid = ItemUtils.getItemUuid(itemStack); boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java index 8f3bfe09..da6b9ed0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java @@ -20,9 +20,9 @@ public class LBinTooltip extends TooltipAdder { public void addToTooltip(List lines, Slot focusedSlot) { lbinExist = false; final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.skyblocker$getInternalId(true); + final String internalID = itemStack.getInternalId(); if (internalID == null) return; - String name = itemStack.skyblocker$getInternalId(false); + String name = itemStack.getInternalName(); if (name == null) return; if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java index 7311e614..6e286ea6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java @@ -19,7 +19,7 @@ public class MotesTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.skyblocker$getInternalId(true); + final String internalID = itemStack.getInternalId(); if (internalID != null && TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { lines.add(Text.literal(String.format("%-20s", "Motes Price:")) .formatted(Formatting.LIGHT_PURPLE) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java index d6e2c13b..5ce0e730 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java @@ -19,7 +19,7 @@ public class MuseumTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.skyblocker$getInternalId(true); + final String internalID = itemStack.getInternalId(); if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); String format = switch (itemCategory) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java index 3ffdc003..d59d26f6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java @@ -17,7 +17,7 @@ public class NpcPriceTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack stack = focusedSlot.getStack(); - final String internalID = stack.skyblocker$getInternalId(true); + final String internalID = stack.getInternalId(); if (internalID != null && TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { lines.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) .formatted(Formatting.YELLOW) -- cgit From b7d8783c538234afc407dc03e0f354c3fac94c15 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 4 Jun 2024 22:22:10 +0300 Subject: Refactor chocolate factory tooltip --- .../chocolatefactory/ChocolateFactorySolver.java | 279 +++++++++++---------- .../skyblock/item/tooltip/TooltipManager.java | 6 +- 2 files changed, 145 insertions(+), 140 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index 6c51cfbd..14228f4d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.chocolatefactory; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.tooltip.adders.LineSmoothener; +import de.hysky.skyblocker.skyblock.item.tooltip.adders.TooltipAdder; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RegexUtils; import de.hysky.skyblocker.utils.RomanNumerals; @@ -9,13 +10,9 @@ import de.hysky.skyblocker.utils.render.gui.ColorHighlight; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; -import net.minecraft.client.item.TooltipType; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.screen.slot.Slot; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -49,8 +46,8 @@ public class ChocolateFactorySolver extends ContainerSolver { private static double timeTowerMultiplier = -1.0; private static boolean isTimeTowerActive = false; private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#,###.#", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); - private static ItemStack bestUpgrade = null; - private static ItemStack bestAffordableUpgrade = null; + private static int bestUpgrade = -1; + private static int bestAffordableUpgrade = -1; //Slots, for ease of maintenance rather than using magic numbers everywhere. private static final byte RABBITS_START = 28; @@ -64,8 +61,7 @@ public class ChocolateFactorySolver extends ContainerSolver { private static final byte STRAY_RABBIT_END = 26; public ChocolateFactorySolver() { - super("^Chocolate Factory$"); - ItemTooltipCallback.EVENT.register(ChocolateFactorySolver::handleTooltip); + super("^Chocolate Factory$"); //There are multiple screens that fit the pattern `^Chocolate Factory`, so the $ is required } @Override @@ -83,7 +79,7 @@ public class ChocolateFactorySolver extends ContainerSolver { if (totalChocolate <= 0 || cpsIncreaseFactors.isEmpty()) return highlights; //Something went wrong or there's nothing we can afford. Rabbit bestRabbit = cpsIncreaseFactors.getFirst(); - bestUpgrade = bestRabbit.itemStack; + bestUpgrade = bestRabbit.slot; if (bestRabbit.cost <= totalChocolate) { highlights.add(ColorHighlight.green(bestRabbit.slot)); return highlights; @@ -92,7 +88,7 @@ public class ChocolateFactorySolver extends ContainerSolver { for (Rabbit rabbit : cpsIncreaseFactors.subList(1, cpsIncreaseFactors.size())) { if (rabbit.cost <= totalChocolate) { - bestAffordableUpgrade = rabbit.itemStack; + bestAffordableUpgrade = rabbit.slot; highlights.add(ColorHighlight.green(rabbit.slot)); break; } @@ -154,130 +150,6 @@ public class ChocolateFactorySolver extends ContainerSolver { cpsIncreaseFactors.sort(Comparator.comparingDouble(rabbit -> rabbit.cost() / rabbit.cpsIncrease())); //Ascending order, lower = better } - private static void handleTooltip(ItemStack stack, Item.TooltipContext tooltipContext, TooltipType tooltipType, List lines) { - if (!SkyblockerConfigManager.get().helpers.chocolateFactory.enableChocolateFactoryHelper) return; - if (!(MinecraftClient.getInstance().currentScreen instanceof GenericContainerScreen screen) || !screen.getTitle().getString().equals("Chocolate Factory")) return; - - int lineIndex = lines.size(); - //This boolean is used to determine if we should add a smooth line to separate the added information from the rest of the tooltip. - //It should be set to true if there's any information added, false otherwise. - boolean shouldAddLine = false; - - String lore = concatenateLore(lines); - Matcher costMatcher = COST_PATTERN.matcher(lore); - OptionalLong cost = RegexUtils.getLongFromMatcher(costMatcher); - //Available on all items with a chocolate cost - if (cost.isPresent()) shouldAddLine = addUpgradeTimerToLore(lines, cost.getAsLong()); - - //Prestige item - if (stack.isOf(Items.DROPPER)) { - shouldAddLine = addPrestigeTimerToLore(lines) || shouldAddLine; - } - //Time tower - else if (stack.isOf(Items.CLOCK)) { - shouldAddLine = addTimeTowerStatsToLore(lines) || shouldAddLine; - } - //Rabbits - else if (stack.isOf(Items.PLAYER_HEAD)) { - shouldAddLine = addRabbitStatsToLore(lines, stack) || shouldAddLine; - } - - //This is an ArrayList, so this operation is probably not very efficient, but logically it's pretty much the only way I can think of - if (shouldAddLine) lines.add(lineIndex, LineSmoothener.createSmoothLine()); - } - - private static boolean addUpgradeTimerToLore(List lines, long cost) { - if (totalChocolate < 0L || totalCps < 0.0) return false; - lines.add(Text.empty() - .append(Text.literal("Time until upgrade: ").formatted(Formatting.GRAY)) - .append(formatTime((cost - totalChocolate) / totalCps))); - return true; - } - - private static boolean addPrestigeTimerToLore(List lines) { - if (totalCps < 0.0 || reachedMaxPrestige) return false; - if (requiredUntilNextPrestige > 0 && !canPrestige) { - lines.add(Text.empty() - .append(Text.literal("Chocolate until next prestige: ").formatted(Formatting.GRAY)) - .append(Text.literal(DECIMAL_FORMAT.format(requiredUntilNextPrestige)).formatted(Formatting.GOLD))); - } - lines.add(Text.empty() //Keep this outside of the `if` to match the format of the upgrade tooltips, that say "Time until upgrade: Now" when it's possible - .append(Text.literal("Time until next prestige: ").formatted(Formatting.GRAY)) - .append(formatTime(requiredUntilNextPrestige / totalCps))); - return true; - } - - private static boolean addTimeTowerStatsToLore(List lines) { - if (totalCps < 0.0 || totalCpsMultiplier < 0.0 || timeTowerMultiplier < 0.0) return false; - lines.add(Text.literal("Current stats:").formatted(Formatting.GRAY)); - lines.add(Text.empty() - .append(Text.literal(" CPS increase: ").formatted(Formatting.GRAY)) - .append(Text.literal(DECIMAL_FORMAT.format(totalCps / totalCpsMultiplier * timeTowerMultiplier)).formatted(Formatting.GOLD))); - lines.add(Text.empty() - .append(Text.literal(" CPS when active: ").formatted(Formatting.GRAY)) - .append(Text.literal(DECIMAL_FORMAT.format(isTimeTowerActive ? totalCps : totalCps / totalCpsMultiplier * (timeTowerMultiplier + totalCpsMultiplier))).formatted(Formatting.GOLD))); - if (timeTowerMultiplier < 1.5) { - lines.add(Text.literal("Stats after upgrade:").formatted(Formatting.GRAY)); - lines.add(Text.empty() - .append(Text.literal(" CPS increase: ").formatted(Formatting.GRAY)) - .append(Text.literal(DECIMAL_FORMAT.format(totalCps / (totalCpsMultiplier) * (timeTowerMultiplier + 0.1))).formatted(Formatting.GOLD))); - lines.add(Text.empty() - .append(Text.literal(" CPS when active: ").formatted(Formatting.GRAY)) - .append(Text.literal(DECIMAL_FORMAT.format(isTimeTowerActive ? totalCps / totalCpsMultiplier * (totalCpsMultiplier + 0.1) : totalCps / totalCpsMultiplier * (timeTowerMultiplier + 0.1 + totalCpsMultiplier))).formatted(Formatting.GOLD))); - } - return true; - } - - private static boolean addRabbitStatsToLore(List lines, ItemStack stack) { - if (cpsIncreaseFactors.isEmpty()) return false; - boolean changed = false; - for (Rabbit rabbit : cpsIncreaseFactors) { - if (rabbit.itemStack != stack) continue; - changed = true; - lines.add(Text.empty() - .append(Text.literal("CPS Increase: ").formatted(Formatting.GRAY)) - .append(Text.literal(DECIMAL_FORMAT.format(rabbit.cpsIncrease)).formatted(Formatting.GOLD))); - - lines.add(Text.empty() - .append(Text.literal("Cost per CPS: ").formatted(Formatting.GRAY)) - .append(Text.literal(DECIMAL_FORMAT.format(rabbit.cost / rabbit.cpsIncrease)).formatted(Formatting.GOLD))); - - if (rabbit.itemStack == bestUpgrade) { - if (rabbit.cost <= totalChocolate) { - lines.add(Text.literal("Best upgrade").formatted(Formatting.GREEN)); - } else { - lines.add(Text.literal("Best upgrade, can't afford").formatted(Formatting.YELLOW)); - } - } else if (rabbit.itemStack == bestAffordableUpgrade && rabbit.cost <= totalChocolate) { - lines.add(Text.literal("Best upgrade you can afford").formatted(Formatting.GREEN)); - } - } - return changed; - } - - private static MutableText formatTime(double seconds) { - seconds = Math.ceil(seconds); - if (seconds <= 0) return Text.literal("Now").formatted(Formatting.GREEN); - - StringBuilder builder = new StringBuilder(); - if (seconds >= 86400) { - builder.append((int) (seconds / 86400)).append("d "); - seconds %= 86400; - } - if (seconds >= 3600) { - builder.append((int) (seconds / 3600)).append("h "); - seconds %= 3600; - } - if (seconds >= 60) { - builder.append((int) (seconds / 60)).append("m "); - seconds %= 60; - } - if (seconds >= 1) { - builder.append((int) seconds).append("s"); - } - return Text.literal(builder.toString()).formatted(Formatting.GOLD); - } - /** * Utility method. */ @@ -318,7 +190,7 @@ public class ChocolateFactorySolver extends ContainerSolver { OptionalInt cost = RegexUtils.getIntFromMatcher(costMatcher, multiplierIncreaseMatcher.hasMatch() ? multiplierIncreaseMatcher.end() : 0); //Cost comes after the multiplier line if (cost.isEmpty()) return Optional.empty(); - return Optional.of(new Rabbit(totalCps / totalCpsMultiplier * (nextCpsMultiplier.getAsDouble() - currentCpsMultiplier.getAsDouble()), cost.getAsInt(), COACH_SLOT, coachItem)); + return Optional.of(new Rabbit(totalCps / totalCpsMultiplier * (nextCpsMultiplier.getAsDouble() - currentCpsMultiplier.getAsDouble()), cost.getAsInt(), COACH_SLOT)); } private static Optional getRabbit(ItemStack item, int slot) { @@ -335,7 +207,7 @@ public class ChocolateFactorySolver extends ContainerSolver { Matcher costMatcher = COST_PATTERN.matcher(lore); OptionalInt cost = RegexUtils.getIntFromMatcher(costMatcher, cpsMatcher.hasMatch() ? cpsMatcher.end() : 0); //Cost comes after the cps line if (cost.isEmpty()) return Optional.empty(); - return Optional.of(new Rabbit(nextCps.getAsInt() - currentCps.getAsInt(), cost.getAsInt(), slot, item)); + return Optional.of(new Rabbit(nextCps.getAsInt() - currentCps.getAsInt(), cost.getAsInt(), slot)); } private static Optional getPrestigeHighlight() { @@ -357,6 +229,137 @@ public class ChocolateFactorySolver extends ContainerSolver { return highlights; } - private record Rabbit(double cpsIncrease, int cost, int slot, ItemStack itemStack) { + private record Rabbit(double cpsIncrease, int cost, int slot) { } + + public static final class Tooltip extends TooltipAdder { + public Tooltip() { + super("^Chocolate Factory", 0); //The priority doesn't really matter here as this is the only tooltip adder for the Chocolate Factory. + } + + @Override + public void addToTooltip(List lines, Slot focusedSlot) { + if (!SkyblockerConfigManager.get().helpers.chocolateFactory.enableChocolateFactoryHelper) return; + + int lineIndex = lines.size(); + //This boolean is used to determine if we should add a smooth line to separate the added information from the rest of the tooltip. + //It should be set to true if there's any information added, false otherwise. + boolean shouldAddLine = false; + + String lore = concatenateLore(lines); + Matcher costMatcher = COST_PATTERN.matcher(lore); + OptionalLong cost = RegexUtils.getLongFromMatcher(costMatcher); + //Available on all items with a chocolate cost + if (cost.isPresent()) shouldAddLine |= addUpgradeTimerToLore(lines, cost.getAsLong()); + + int index = focusedSlot.id; + + //Prestige item + if (index == PRESTIGE_SLOT) { + shouldAddLine |= addPrestigeTimerToLore(lines); + } + //Time tower + else if (index == TIME_TOWER_SLOT) { + shouldAddLine |= addTimeTowerStatsToLore(lines); + } + //Rabbits + else if (index == COACH_SLOT || (index >= RABBITS_START && index <= RABBITS_END)) { + shouldAddLine |= addRabbitStatsToLore(lines, index); + } + + //This is an ArrayList, so this operation is probably not very efficient, but logically it's pretty much the only way I can think of + if (shouldAddLine) lines.add(lineIndex, LineSmoothener.createSmoothLine()); + } + + private static boolean addUpgradeTimerToLore(List lines, long cost) { + if (totalChocolate < 0L || totalCps < 0.0) return false; + lines.add(Text.empty() + .append(Text.literal("Time until upgrade: ").formatted(Formatting.GRAY)) + .append(formatTime((cost - totalChocolate) / totalCps))); + return true; + } + + private static boolean addPrestigeTimerToLore(List lines) { + if (totalCps < 0.0 || reachedMaxPrestige) return false; + if (requiredUntilNextPrestige > 0 && !canPrestige) { + lines.add(Text.empty() + .append(Text.literal("Chocolate until next prestige: ").formatted(Formatting.GRAY)) + .append(Text.literal(DECIMAL_FORMAT.format(requiredUntilNextPrestige)).formatted(Formatting.GOLD))); + } + lines.add(Text.empty() //Keep this outside of the `if` to match the format of the upgrade tooltips, that say "Time until upgrade: Now" when it's possible + .append(Text.literal("Time until next prestige: ").formatted(Formatting.GRAY)) + .append(formatTime(requiredUntilNextPrestige / totalCps))); + return true; + } + + private static boolean addTimeTowerStatsToLore(List lines) { + if (totalCps < 0.0 || totalCpsMultiplier < 0.0 || timeTowerMultiplier < 0.0) return false; + lines.add(Text.literal("Current stats:").formatted(Formatting.GRAY)); + lines.add(Text.empty() + .append(Text.literal(" CPS increase: ").formatted(Formatting.GRAY)) + .append(Text.literal(DECIMAL_FORMAT.format(totalCps / totalCpsMultiplier * timeTowerMultiplier)).formatted(Formatting.GOLD))); + lines.add(Text.empty() + .append(Text.literal(" CPS when active: ").formatted(Formatting.GRAY)) + .append(Text.literal(DECIMAL_FORMAT.format(isTimeTowerActive ? totalCps : totalCps / totalCpsMultiplier * (timeTowerMultiplier + totalCpsMultiplier))).formatted(Formatting.GOLD))); + if (timeTowerMultiplier < 1.5) { + lines.add(Text.literal("Stats after upgrade:").formatted(Formatting.GRAY)); + lines.add(Text.empty() + .append(Text.literal(" CPS increase: ").formatted(Formatting.GRAY)) + .append(Text.literal(DECIMAL_FORMAT.format(totalCps / (totalCpsMultiplier) * (timeTowerMultiplier + 0.1))).formatted(Formatting.GOLD))); + lines.add(Text.empty() + .append(Text.literal(" CPS when active: ").formatted(Formatting.GRAY)) + .append(Text.literal(DECIMAL_FORMAT.format(isTimeTowerActive ? totalCps / totalCpsMultiplier * (totalCpsMultiplier + 0.1) : totalCps / totalCpsMultiplier * (timeTowerMultiplier + 0.1 + totalCpsMultiplier))).formatted(Formatting.GOLD))); + } + return true; + } + + private static boolean addRabbitStatsToLore(List lines, int slot) { + if (cpsIncreaseFactors.isEmpty()) return false; + for (Rabbit rabbit : cpsIncreaseFactors) { + if (rabbit.slot == slot) { + lines.add(Text.empty() + .append(Text.literal("CPS Increase: ").formatted(Formatting.GRAY)) + .append(Text.literal(DECIMAL_FORMAT.format(rabbit.cpsIncrease)).formatted(Formatting.GOLD))); + + lines.add(Text.empty() + .append(Text.literal("Cost per CPS: ").formatted(Formatting.GRAY)) + .append(Text.literal(DECIMAL_FORMAT.format(rabbit.cost / rabbit.cpsIncrease)).formatted(Formatting.GOLD))); + + if (rabbit.slot == bestUpgrade) { + if (rabbit.cost <= totalChocolate) { + lines.add(Text.literal("Best upgrade").formatted(Formatting.GREEN)); + } else { + lines.add(Text.literal("Best upgrade, can't afford").formatted(Formatting.YELLOW)); + } + } else if (rabbit.slot == bestAffordableUpgrade && rabbit.cost <= totalChocolate) { + lines.add(Text.literal("Best upgrade you can afford").formatted(Formatting.GREEN)); + } + return true; + } + } + return false; + } + + private static MutableText formatTime(double seconds) { + seconds = Math.ceil(seconds); + if (seconds <= 0) return Text.literal("Now").formatted(Formatting.GREEN); + + StringBuilder builder = new StringBuilder(); + if (seconds >= 86400) { + builder.append((int) (seconds / 86400)).append("d "); + seconds %= 86400; + } + if (seconds >= 3600) { + builder.append((int) (seconds / 3600)).append("h "); + seconds %= 3600; + } + if (seconds >= 60) { + builder.append((int) (seconds / 60)).append("m "); + seconds %= 60; + } + if (seconds >= 1) { + builder.append((int) seconds).append("s"); + } + return Text.literal(builder.toString()).formatted(Formatting.GOLD); + } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index 324c0616..9fa44654 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip; +import de.hysky.skyblocker.skyblock.chocolatefactory.ChocolateFactorySolver; import de.hysky.skyblocker.skyblock.item.tooltip.adders.*; import de.hysky.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; @@ -14,10 +15,11 @@ import java.util.List; public class TooltipManager { private static final TooltipAdder[] adders = new TooltipAdder[]{ new LineSmoothener(), // Applies before anything else + new ChocolateFactorySolver.Tooltip(), new NpcPriceTooltip(1), new BazaarPriceTooltip(2), - new LBinTooltip(3), //Has to come after bz price - new AvgBinTooltip(4), //Has to come after lbin price + new LBinTooltip(3), + new AvgBinTooltip(4), new DungeonQualityTooltip(5), new MotesTooltip(6), new ObtainedDateTooltip(7), -- cgit From 89aaf5573632916316605af414def03bd993ca93 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 4 Jun 2024 22:39:49 +0300 Subject: Add rancher boots speed slot text --- .../skyblock/item/slottext/SlotTextManager.java | 3 +- .../slottext/adders/RancherBootsSpeedAdder.java | 34 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java (limited to 'src/main/java/de') 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 c7ca2ea6..c974edc5 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 @@ -19,7 +19,8 @@ public class SlotTextManager { new SkillLevelAdder(), new CatacombsLevelAdder.Dungeoneering(), new CatacombsLevelAdder.DungeonClasses(), - new CatacombsLevelAdder.ReadyUp() + new CatacombsLevelAdder.ReadyUp(), + new RancherBootsSpeedAdder() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java new file mode 100644 index 00000000..43f4773b --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java @@ -0,0 +1,34 @@ +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.component.ComponentMap; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.NbtComponent; +import net.minecraft.item.ItemStack; +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.NotNull; + +import java.util.List; + +public class RancherBootsSpeedAdder extends SlotTextAdder { + public RancherBootsSpeedAdder() { + super(); + } + + @SuppressWarnings("deprecation") //It's only deprecated to discourage usage as the nbt is supposed to be immutable, but we're not mutating it anyway, so it's fine + @Override + public @NotNull List getText(Slot slot) { + final ItemStack itemStack = slot.getStack(); + if (!itemStack.isOf(Items.LEATHER_BOOTS)) return List.of(); + final ComponentMap components = itemStack.getComponents(); + if (!components.contains(DataComponentTypes.CUSTOM_DATA)) return List.of(); + NbtComponent nbt = components.get(DataComponentTypes.CUSTOM_DATA); + if (nbt == null || nbt.isEmpty()) return List.of(); + if (!nbt.contains("ranchers_speed")) return List.of(); + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(nbt.getNbt().getInt("ranchers_speed"))).formatted(Formatting.GREEN))); + } +} -- cgit From 673933a9a412088b774c22c87a9e08061bcf5e59 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Tue, 4 Jun 2024 22:42:55 +0300 Subject: Add entrance floor to DungeonQualityTooltip --- .../skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java | 1 + 1 file changed, 1 insertion(+) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java index 54616963..6050c7e0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java @@ -39,6 +39,7 @@ public class DungeonQualityTooltip extends TooltipAdder { final String getItemTierFloor(int tier) { return switch (tier) { + case 0 -> "E"; case 1 -> "F1"; case 2 -> "F2"; case 3 -> "F3"; -- cgit From 94f3d4f3cdcc63b6b3d95724a18ebba6521e4f53 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 5 Jun 2024 00:05:36 +0300 Subject: Add proper nullability indicators for internal id/name stuff --- .../de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java | 5 +++++ src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java b/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java index 87c1304b..d1992705 100644 --- a/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java +++ b/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java @@ -1,14 +1,19 @@ package de.hysky.skyblocker.injected; +import org.jetbrains.annotations.Nullable; + public interface ItemStackInternalIdGetter { + @Nullable default String getInternalId() { return ""; } + @Nullable default String getInternalName() { return ""; } + @Nullable default String getNeuName() { return ""; } diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 8b5dd31d..e4550a5c 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -15,6 +15,7 @@ import net.minecraft.item.TooltipAppender; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -123,6 +124,7 @@ public abstract class ItemStackMixin implements ItemStackInternalIdGetter { } @Override + @Nullable public String getInternalId() { if (internalId != null && !internalId.isEmpty()) return internalId; internalId = skyblocker$getInternalNameFromNBT(true); @@ -130,6 +132,7 @@ public abstract class ItemStackMixin implements ItemStackInternalIdGetter { } @Override + @Nullable public String getInternalName() { if (internalName != null && !internalName.isEmpty()) return internalName; internalName = skyblocker$getInternalNameFromNBT(false); @@ -137,11 +140,12 @@ public abstract class ItemStackMixin implements ItemStackInternalIdGetter { } @Override + @Nullable public String getNeuName() { if (neuName != null && !neuName.isEmpty()) return neuName; String name = getInternalName(); String id = getInternalId(); - if (name == null || id == null) return ""; + if (name == null || id == null) return null; if (name.startsWith("ISSHINY_")) name = id; -- cgit From b39d0698a9f5349c359aebab3c21f9de009d00ad Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 5 Jun 2024 00:24:01 +0300 Subject: Fix RancherBootsSpeedAdder not considering player's actual speed cap --- .../slottext/adders/RancherBootsSpeedAdder.java | 24 ++++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java index 43f4773b..9fd498b7 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java @@ -2,33 +2,35 @@ 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.component.ComponentMap; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.NbtComponent; +import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class RancherBootsSpeedAdder extends SlotTextAdder { + private static final Pattern SPEED_PATTERN = Pattern.compile("Current Speed Cap: (\\d+) ?(\\d+)?"); + public RancherBootsSpeedAdder() { super(); } - @SuppressWarnings("deprecation") //It's only deprecated to discourage usage as the nbt is supposed to be immutable, but we're not mutating it anyway, so it's fine @Override public @NotNull List getText(Slot slot) { final ItemStack itemStack = slot.getStack(); - if (!itemStack.isOf(Items.LEATHER_BOOTS)) return List.of(); - final ComponentMap components = itemStack.getComponents(); - if (!components.contains(DataComponentTypes.CUSTOM_DATA)) return List.of(); - NbtComponent nbt = components.get(DataComponentTypes.CUSTOM_DATA); - if (nbt == null || nbt.isEmpty()) return List.of(); - if (!nbt.contains("ranchers_speed")) return List.of(); - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(nbt.getNbt().getInt("ranchers_speed"))).formatted(Formatting.GREEN))); + // V null-safe equals. + if (!itemStack.isOf(Items.LEATHER_BOOTS) && !StringUtils.equals(itemStack.getInternalId(), "RANCHERS_BOOTS")) return List.of(); + Matcher matcher = ItemUtils.getLoreLineIfMatch(slot.getStack(), SPEED_PATTERN); + if (matcher == null) return List.of(); + String speed = matcher.group(2); + if (speed == null) speed = matcher.group(1); //2nd group only matches when the speed cap is set to a number beyond the player's actual speed cap. + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(speed).formatted(Formatting.GREEN))); } } -- cgit From 7cb41ea5fd347f8db3a57bc7e35f20f11d49795a Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 5 Jun 2024 23:06:00 +0300 Subject: Change default color of MinionLevelAdder --- .../skyblocker/skyblock/item/slottext/adders/MinionLevelAdder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de') 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 95e6beb8..b98bed2b 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 @@ -26,6 +26,6 @@ public class MinionLevelAdder extends SlotTextAdder { 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 List.of(); - return List.of(PositionedText.TOP_RIGHT(Text.literal(String.valueOf(level)).formatted(Formatting.DARK_PURPLE))); + return List.of(PositionedText.TOP_RIGHT(Text.literal(String.valueOf(level)).formatted(Formatting.AQUA))); } } -- cgit From 5dc2720ad8d9ffce2d0b1c906c0ea71cd5680019 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Wed, 5 Jun 2024 23:06:30 +0300 Subject: Add SupercraftReminder as the method of shift+clicking is not mentioned in the default tooltip --- .../skyblock/item/tooltip/TooltipManager.java | 1 + .../item/tooltip/adders/SupercraftReminder.java | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index 9fa44654..319df71a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -15,6 +15,7 @@ import java.util.List; public class TooltipManager { private static final TooltipAdder[] adders = new TooltipAdder[]{ new LineSmoothener(), // Applies before anything else + new SupercraftReminder(), new ChocolateFactorySolver.Tooltip(), new NpcPriceTooltip(1), new BazaarPriceTooltip(2), diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java new file mode 100644 index 00000000..e0376d22 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import net.minecraft.item.Items; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.List; +import java.util.regex.Pattern; + +public class SupercraftReminder extends TooltipAdder { + public SupercraftReminder() { + super(Pattern.compile("^.+ Recipe$"), Integer.MIN_VALUE); + } + + @Override + public void addToTooltip(List lines, Slot focusedSlot) { + if (focusedSlot.id != 32 || !focusedSlot.getStack().isOf(Items.GOLDEN_PICKAXE)) return; + lines.add(lines.size()-1, Text.literal("Shift-Click to maximize the amount!").formatted(Formatting.GOLD)); + } +} -- cgit From fda12a425035591d2fa27ea700a1fd471d5119be Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:39:39 +0300 Subject: Fix SupercraftReminder adding conditions to not display when unnecessary --- .../skyblock/item/tooltip/adders/SupercraftReminder.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java index e0376d22..3affa64b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; +import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.item.Items; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; @@ -9,13 +10,20 @@ import java.util.List; import java.util.regex.Pattern; public class SupercraftReminder extends TooltipAdder { + private static final byte SUPERCRAFT_SLOT = 32; + private static final byte RECIPE_RESULT_SLOT = 25; + public SupercraftReminder() { super(Pattern.compile("^.+ Recipe$"), Integer.MIN_VALUE); } @Override public void addToTooltip(List lines, Slot focusedSlot) { - if (focusedSlot.id != 32 || !focusedSlot.getStack().isOf(Items.GOLDEN_PICKAXE)) return; - lines.add(lines.size()-1, Text.literal("Shift-Click to maximize the amount!").formatted(Formatting.GOLD)); + if (focusedSlot.id != SUPERCRAFT_SLOT || !focusedSlot.getStack().isOf(Items.GOLDEN_PICKAXE)) return; + String UUID = ItemUtils.getItemUuid(focusedSlot.inventory.getStack(RECIPE_RESULT_SLOT)); + if (!UUID.isEmpty()) return; //Items with UUID can't be stacked, and therefore the shift-click feature doesn't matter + int index = lines.size()-1; + if (lines.get(lines.size()-2).getString().equals("Recipe not unlocked!")) index--; //Place it right below the "Right-Click to set amount" line + lines.add(index, Text.literal("Shift-Click to maximize the amount!").formatted(Formatting.GOLD)); } } -- cgit From 4442a6589173484581dbfaec811f2ec2d5ac6de4 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:57:12 +0300 Subject: Refactor EnchantmentLevelAdder to use nbt rather than lore --- .../item/slottext/adders/EnchantmentLevelAdder.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/main/java/de') 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 46be2a7f..4131d07c 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 @@ -6,6 +6,8 @@ import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RomanNumerals; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -24,12 +26,13 @@ public class EnchantmentLevelAdder extends SlotTextAdder { if (!itemStack.isOf(Items.ENCHANTED_BOOK)) return List.of(); String name = itemStack.getName().getString(); if (name.equals("Enchanted Book")) { - List lore = ItemUtils.getLore(itemStack); - if (lore.isEmpty()) return List.of(); - int level = getEnchantLevelFromString(lore.getFirst().getString()); - if (level == 0) return List.of(); + NbtCompound nbt = ItemUtils.getCustomData(itemStack); + if (nbt.isEmpty() || !nbt.contains("enchantments", NbtElement.COMPOUND_TYPE)) return List.of(); + NbtCompound enchantments = nbt.getCompound("enchantments"); + if (enchantments.getSize() != 1) return List.of(); //Only makes sense to display the level when there's one enchant. + int level = enchantments.getInt(enchantments.getKeys().iterator().next()); 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 + } else { //In bazaar, the books have the enchantment level in the name int level = getEnchantLevelFromString(name); if (level == 0) return List.of(); return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(level)).formatted(Formatting.GREEN))); -- cgit From c8be5f7d7aaf4a12acb078c0250cae8afd7e96fd Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:47:27 +0300 Subject: Limit SlotTextAdders to only work in skyblock --- .../de/hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/main/java/de') 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 c974edc5..3fc057c4 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 @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.slottext; import de.hysky.skyblocker.skyblock.item.slottext.adders.*; +import de.hysky.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; @@ -29,7 +30,7 @@ public class SlotTextManager { public static void init() { ScreenEvents.AFTER_INIT.register((client, screen, width, height) -> { - if (screen instanceof HandledScreen) { + if (screen instanceof HandledScreen && Utils.isOnSkyblock()) { onScreenChange(screen); ScreenEvents.remove(screen).register(ignored -> currentScreenAdders.clear()); } -- cgit From 168861865adfa334126082df5e85668c8cde1bc8 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:51:24 +0300 Subject: Add isEnabled method to SlotTextAdder --- .../de/hysky/skyblocker/skyblock/item/slottext/SlotTextAdder.java | 8 ++++++++ .../hysky/skyblocker/skyblock/item/slottext/SlotTextManager.java | 1 + 2 files changed, 9 insertions(+) (limited to 'src/main/java/de') 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 71659430..2e6213b0 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 @@ -53,4 +53,12 @@ public abstract class SlotTextAdder { */ public abstract @NotNull List getText(Slot slot); + /** + * Override this method to add conditions to enable or disable this adder. + * @return Whether this adder is enabled. + * @implNote The slot text adders only work while in skyblock, so no need to check for that again. + */ + public boolean isEnabled() { + return true; + } } 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 3fc057c4..1181baeb 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 @@ -40,6 +40,7 @@ public class SlotTextManager { private static void onScreenChange(Screen screen) { final String title = screen.getTitle().getString(); for (SlotTextAdder adder : adders) { + if (!adder.isEnabled()) continue; if (adder.titlePattern == null || adder.titlePattern.matcher(title).find()) { currentScreenAdders.add(adder); } -- cgit From 6cdcfe90e0e01abb26c9681190ce5c2fb08b3637 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:56:49 +0300 Subject: Refactor AttributeShards to AttributeShardAdder --- .../hysky/skyblocker/mixins/DrawContextMixin.java | 52 ------------ .../skyblocker/skyblock/item/AttributeShards.java | 59 ------------- .../skyblock/item/slottext/SlotTextManager.java | 3 +- .../item/slottext/adders/AttributeShardAdder.java | 97 ++++++++++++++++++++++ 4 files changed, 99 insertions(+), 112 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/AttributeShards.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java b/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java index 7964b114..9f09c37a 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java @@ -2,67 +2,15 @@ package de.hysky.skyblocker.mixins; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.AttributeShards; import de.hysky.skyblocker.skyblock.item.ItemCooldowns; -import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; -import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.Formatting; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(DrawContext.class) public abstract class DrawContextMixin { - @Shadow - @Final - private MatrixStack matrices; - - @Shadow - public abstract int drawText(TextRenderer textRenderer, @Nullable String text, int x, int y, int color, boolean shadow); - - @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD")) - private void skyblocker$renderAttributeShardDisplay(CallbackInfo ci, @Local(argsOnly = true) TextRenderer textRenderer, @Local(argsOnly = true) ItemStack stack, @Local(argsOnly = true, ordinal = 0) int x, @Local(argsOnly = true, ordinal = 1) int y, @Local(argsOnly = true) LocalRef countOverride) { - if (!SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo) return; - - if (Utils.isOnSkyblock()) { - NbtCompound customData = ItemUtils.getCustomData(stack); - - if (ItemUtils.getItemId(stack).equals("ATTRIBUTE_SHARD")) { - NbtCompound attributesTag = customData.getCompound("attributes"); - String[] attributes = attributesTag.getKeys().toArray(String[]::new); - - if (attributes.length != 0) { - String attributeId = attributes[0]; - int attributeLevel = attributesTag.getInt(attributeId); - - //Set item count - countOverride.set(Integer.toString(attributeLevel)); - - //Draw the attribute name - this.matrices.push(); - this.matrices.translate(0f, 0f, 200f); - - String attributeInitials = AttributeShards.getShortName(attributeId); - - this.drawText(textRenderer, attributeInitials, x, y, Formatting.AQUA.getColorValue(), true); - - this.matrices.pop(); - } - } - } - } - @ModifyExpressionValue(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/ItemCooldownManager;getCooldownProgress(Lnet/minecraft/item/Item;F)F")) private float skyblocker$modifyItemCooldown(float cooldownProgress, @Local(argsOnly = true) ItemStack stack) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/AttributeShards.java b/src/main/java/de/hysky/skyblocker/skyblock/item/AttributeShards.java deleted file mode 100644 index ed650e26..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/AttributeShards.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.hysky.skyblocker.skyblock.item; - -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; - -public class AttributeShards { - private static final Object2ObjectOpenHashMap ID_2_SHORT_NAME = new Object2ObjectOpenHashMap<>(); - - static { - //Weapons - ID_2_SHORT_NAME.put("arachno", "A"); - ID_2_SHORT_NAME.put("attack_speed", "AS"); - ID_2_SHORT_NAME.put("blazing", "BL"); - ID_2_SHORT_NAME.put("combo", "C"); - ID_2_SHORT_NAME.put("elite", "E"); - ID_2_SHORT_NAME.put("ender", "EN"); - ID_2_SHORT_NAME.put("ignition", "I"); - ID_2_SHORT_NAME.put("life_recovery", "LR"); - ID_2_SHORT_NAME.put("mana_steal", "MS"); - ID_2_SHORT_NAME.put("midas_touch", "MT"); - ID_2_SHORT_NAME.put("undead", "U"); - - //Swords & Bows - ID_2_SHORT_NAME.put("warrior", "W"); - ID_2_SHORT_NAME.put("deadeye", "DE"); - - //Armor or Equipment - ID_2_SHORT_NAME.put("arachno_resistance", "AR"); - ID_2_SHORT_NAME.put("blazing_resistance", "BR"); - ID_2_SHORT_NAME.put("breeze", "B"); - ID_2_SHORT_NAME.put("dominance", "D"); - ID_2_SHORT_NAME.put("ender_resistance", "ER"); - ID_2_SHORT_NAME.put("experience", "XP"); - ID_2_SHORT_NAME.put("fortitude", "F"); - ID_2_SHORT_NAME.put("life_regeneration", "HR"); //Health regeneration - ID_2_SHORT_NAME.put("lifeline", "L"); - ID_2_SHORT_NAME.put("magic_find", "MF"); - ID_2_SHORT_NAME.put("mana_pool", "MP"); - ID_2_SHORT_NAME.put("mana_regeneration", "MR"); - ID_2_SHORT_NAME.put("mending", "V"); //Vitality - ID_2_SHORT_NAME.put("speed", "S"); - ID_2_SHORT_NAME.put("undead_resistance", "UR"); - ID_2_SHORT_NAME.put("veteran", "V"); - - //Fishing Gear - ID_2_SHORT_NAME.put("blazing_fortune", "BF"); - ID_2_SHORT_NAME.put("fishing_experience", "FE"); - ID_2_SHORT_NAME.put("infection", "IF"); - ID_2_SHORT_NAME.put("double_hook", "DH"); - ID_2_SHORT_NAME.put("fisherman", "FM"); - ID_2_SHORT_NAME.put("fishing_speed", "FS"); - ID_2_SHORT_NAME.put("hunter", "H"); - ID_2_SHORT_NAME.put("trophy_hunter", "TH"); - - } - - public static String getShortName(String id) { - return ID_2_SHORT_NAME.getOrDefault(id, ""); - } -} 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 1181baeb..55e5960d 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 @@ -21,7 +21,8 @@ public class SlotTextManager { new CatacombsLevelAdder.Dungeoneering(), new CatacombsLevelAdder.DungeonClasses(), new CatacombsLevelAdder.ReadyUp(), - new RancherBootsSpeedAdder() + new RancherBootsSpeedAdder(), + new AttributeShardAdder() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java new file mode 100644 index 00000000..2c75b9d9 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java @@ -0,0 +1,97 @@ +package de.hysky.skyblocker.skyblock.item.slottext.adders; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; +import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; +import de.hysky.skyblocker.utils.ItemUtils; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class AttributeShardAdder extends SlotTextAdder { + private static final Object2ObjectMap ID_2_SHORT_NAME = new Object2ObjectOpenHashMap<>(); + + static { + //Weapons + ID_2_SHORT_NAME.put("arachno", "A"); + ID_2_SHORT_NAME.put("attack_speed", "AS"); + ID_2_SHORT_NAME.put("blazing", "BL"); + ID_2_SHORT_NAME.put("combo", "C"); + ID_2_SHORT_NAME.put("elite", "E"); + ID_2_SHORT_NAME.put("ender", "EN"); + ID_2_SHORT_NAME.put("ignition", "I"); + ID_2_SHORT_NAME.put("life_recovery", "LR"); + ID_2_SHORT_NAME.put("mana_steal", "MS"); + ID_2_SHORT_NAME.put("midas_touch", "MT"); + ID_2_SHORT_NAME.put("undead", "U"); + + //Swords & Bows + ID_2_SHORT_NAME.put("warrior", "W"); + ID_2_SHORT_NAME.put("deadeye", "DE"); + + //Armor or Equipment + ID_2_SHORT_NAME.put("arachno_resistance", "AR"); + ID_2_SHORT_NAME.put("blazing_resistance", "BR"); + ID_2_SHORT_NAME.put("breeze", "B"); + ID_2_SHORT_NAME.put("dominance", "D"); + ID_2_SHORT_NAME.put("ender_resistance", "ER"); + ID_2_SHORT_NAME.put("experience", "XP"); + ID_2_SHORT_NAME.put("fortitude", "F"); + ID_2_SHORT_NAME.put("life_regeneration", "HR"); //Health regeneration + ID_2_SHORT_NAME.put("lifeline", "L"); + ID_2_SHORT_NAME.put("magic_find", "MF"); + ID_2_SHORT_NAME.put("mana_pool", "MP"); + ID_2_SHORT_NAME.put("mana_regeneration", "MR"); + ID_2_SHORT_NAME.put("mending", "V"); //Vitality + ID_2_SHORT_NAME.put("speed", "S"); + ID_2_SHORT_NAME.put("undead_resistance", "UR"); + ID_2_SHORT_NAME.put("veteran", "V"); + + //Fishing Gear + ID_2_SHORT_NAME.put("blazing_fortune", "BF"); + ID_2_SHORT_NAME.put("fishing_experience", "FE"); + ID_2_SHORT_NAME.put("infection", "IF"); + ID_2_SHORT_NAME.put("double_hook", "DH"); + ID_2_SHORT_NAME.put("fisherman", "FM"); + ID_2_SHORT_NAME.put("fishing_speed", "FS"); + ID_2_SHORT_NAME.put("hunter", "H"); + ID_2_SHORT_NAME.put("trophy_hunter", "TH"); + } + + public AttributeShardAdder() { + super(); + } + + @Override + public @NotNull List getText(Slot slot) { + final ItemStack stack = slot.getStack(); + NbtCompound customData = ItemUtils.getCustomData(stack); + + if (!ItemUtils.getItemId(stack).equals("ATTRIBUTE_SHARD")) return List.of(); + + NbtCompound attributesTag = customData.getCompound("attributes"); + String[] attributes = attributesTag.getKeys().toArray(String[]::new); + + if (attributes.length != 1) return List.of(); + String attributeId = attributes[0]; + int attributeLevel = attributesTag.getInt(attributeId); + String attributeInitials = ID_2_SHORT_NAME.getOrDefault(attributeId, ""); + + return List.of( + PositionedText.BOTTOM_RIGHT(Text.literal(String.valueOf(attributeLevel))), + PositionedText.TOP_LEFT(Text.literal(attributeInitials).formatted(Formatting.AQUA)) + ); + } + + @Override + public boolean isEnabled() { + return SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo; + } +} -- cgit From 58e266e0cb135a4c629f3772bdcd3e960e07901e Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:07:01 +0300 Subject: Change the color of attribute shards' levels --- .../skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java index 2c75b9d9..d15031e9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java @@ -85,7 +85,7 @@ public class AttributeShardAdder extends SlotTextAdder { String attributeInitials = ID_2_SHORT_NAME.getOrDefault(attributeId, ""); return List.of( - PositionedText.BOTTOM_RIGHT(Text.literal(String.valueOf(attributeLevel))), + PositionedText.BOTTOM_RIGHT(Text.literal(String.valueOf(attributeLevel)).withColor(0x34eb77)), PositionedText.TOP_LEFT(Text.literal(attributeInitials).formatted(Formatting.AQUA)) ); } -- cgit From 14aad20b98a7443d63241836667de34900605d55 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Thu, 6 Jun 2024 21:22:06 +0300 Subject: Fix skill level not being displayed in a certain case --- .../skyblocker/skyblock/item/slottext/adders/SkillLevelAdder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java/de') 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 b84de4d3..efc077cd 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 @@ -23,8 +23,8 @@ public class SkillLevelAdder extends SlotTextAdder { int lastIndex = name.lastIndexOf(' '); 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 List.of(); - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(RomanNumerals.romanToDecimal(romanNumeral))).formatted(Formatting.LIGHT_PURPLE))); + //The "romanNumeral" might be a latin numeral, too. There's a skyblock setting for this, so we have to do it this way V + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(RomanNumerals.isValidRomanNumeral(romanNumeral) ? RomanNumerals.romanToDecimal(romanNumeral) : Integer.parseInt(romanNumeral))).formatted(Formatting.LIGHT_PURPLE))); } default -> { return List.of(); -- cgit From 4caab913b7ed28c2f5312f669dacef9e907f01ee Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:18:47 +0300 Subject: Add prehistoric egg slot text --- .../skyblock/item/slottext/SlotTextManager.java | 3 +- .../item/slottext/adders/PrehistoricEggAdder.java | 34 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PrehistoricEggAdder.java (limited to 'src/main/java/de') 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 55e5960d..4885f0b8 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 @@ -22,7 +22,8 @@ public class SlotTextManager { new CatacombsLevelAdder.DungeonClasses(), new CatacombsLevelAdder.ReadyUp(), new RancherBootsSpeedAdder(), - new AttributeShardAdder() + new AttributeShardAdder(), + new PrehistoricEggAdder() }; private static final ArrayList currentScreenAdders = new ArrayList<>(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PrehistoricEggAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PrehistoricEggAdder.java new file mode 100644 index 00000000..5db253fc --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PrehistoricEggAdder.java @@ -0,0 +1,34 @@ +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.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class PrehistoricEggAdder extends SlotTextAdder { + @Override + public @NotNull List getText(Slot slot) { + final ItemStack stack = slot.getStack(); + if (!stack.isOf(Items.PLAYER_HEAD) || !StringUtils.equals(stack.getInternalId(), "PREHISTORIC_EGG")) return List.of(); + NbtCompound nbt = ItemUtils.getCustomData(stack); + if (!nbt.contains("blocks_walked", NbtElement.INT_TYPE)) return List.of(); + int walked = nbt.getInt("blocks_walked"); + + String walkedstr; + if (walked < 1000) walkedstr = String.valueOf(walked); + else if (walked < 10000) walkedstr = String.format("%.1fk", walked/1000.0f); + else walkedstr = walked / 1000 + "k"; + + return List.of(PositionedText.BOTTOM_LEFT(Text.literal(walkedstr).formatted(Formatting.GOLD))); + } +} -- cgit From 8d8bd17a8816e57daa19c348bb865eab2337b84b Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:21:04 +0300 Subject: Move TooltipAdder outside of the adders package --- .../chocolatefactory/ChocolateFactorySolver.java | 2 +- .../skyblock/item/tooltip/TooltipAdder.java | 48 +++++++++++++++++++++ .../item/tooltip/adders/AccessoryTooltip.java | 1 + .../item/tooltip/adders/AvgBinTooltip.java | 1 + .../item/tooltip/adders/BazaarPriceTooltip.java | 1 + .../skyblock/item/tooltip/adders/ColorTooltip.java | 1 + .../item/tooltip/adders/DungeonQualityTooltip.java | 1 + .../skyblock/item/tooltip/adders/LBinTooltip.java | 1 + .../item/tooltip/adders/LineSmoothener.java | 1 + .../skyblock/item/tooltip/adders/MotesTooltip.java | 1 + .../item/tooltip/adders/MuseumTooltip.java | 1 + .../item/tooltip/adders/NpcPriceTooltip.java | 1 + .../item/tooltip/adders/ObtainedDateTooltip.java | 1 + .../item/tooltip/adders/SupercraftReminder.java | 1 + .../skyblock/item/tooltip/adders/TooltipAdder.java | 49 ---------------------- 15 files changed, 61 insertions(+), 50 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipAdder.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index 14228f4d..bf31bd1f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.chocolatefactory; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.tooltip.adders.LineSmoothener; -import de.hysky.skyblocker.skyblock.item.tooltip.adders.TooltipAdder; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RegexUtils; import de.hysky.skyblocker.utils.RomanNumerals; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipAdder.java new file mode 100644 index 00000000..7c43957e --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipAdder.java @@ -0,0 +1,48 @@ +package de.hysky.skyblocker.skyblock.item.tooltip; + +import de.hysky.skyblocker.skyblock.ChestValue; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Extend this class and add it to {@link TooltipManager#adders} to add additional text to tooltips. + */ +public abstract class TooltipAdder { + /** + * The title of the screen must match this pattern for this adder to be applied. Null means it will be applied to all screens. + * @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; + /** + * The priority of this adder. Lower priority means it will be applied first. + * @apiNote Consider taking this value on your class' constructor and setting it from {@link TooltipManager#adders} to make it easy to read and maintain. + */ + public final int priority; + + protected TooltipAdder(String titlePattern, int priority) { + this(Pattern.compile(titlePattern), priority); + } + + protected TooltipAdder(Pattern titlePattern, int priority) { + this.titlePattern = titlePattern; + this.priority = priority; + } + + /** + * Creates a TooltipAdder that will be applied to all screens. + */ + protected TooltipAdder(int priority) { + this.titlePattern = null; + this.priority = priority; + } + + /** + * @implNote The first element of the lines list holds the item's display name, + * as it's a list of all lines that will be displayed in the tooltip. + */ + public abstract void addToTooltip(List lines, Slot focusedSlot); +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java index 0bc50997..34d93abc 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import it.unimi.dsi.fastutil.Pair; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java index ba06b54d..4754932b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.GeneralConfig; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java index afd6d301..9237c141 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java @@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import com.google.gson.JsonObject; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java index 85be7215..56dd60b0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.ItemUtils; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java index 6050c7e0..05e9887c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/DungeonQualityTooltip.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.nbt.NbtCompound; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java index da6b9ed0..2a28df79 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java index 9a5b2a79..e3ce12df 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LineSmoothener.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.Formatting; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java index 6e286ea6..5a8c2ddb 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java index 5ce0e730..ce98f1c5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.skyblock.item.MuseumItemCache; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.item.ItemStack; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java index d59d26f6..ba24364b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java index e919122d..9cc03b4d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ObtainedDateTooltip.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.item.ItemStack; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java index 3affa64b..eb953b9c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.item.tooltip.adders; +import de.hysky.skyblocker.skyblock.item.tooltip.TooltipAdder; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.item.Items; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java deleted file mode 100644 index 065dfe5e..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/TooltipAdder.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.hysky.skyblocker.skyblock.item.tooltip.adders; - -import de.hysky.skyblocker.skyblock.ChestValue; -import de.hysky.skyblocker.skyblock.item.tooltip.TooltipManager; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; - -import java.util.List; -import java.util.regex.Pattern; - -/** - * Extend this class and add it to {@link TooltipManager#adders} to add additional text to tooltips. - */ -public abstract class TooltipAdder { - /** - * The title of the screen must match this pattern for this adder to be applied. Null means it will be applied to all screens. - * @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; - /** - * The priority of this adder. Lower priority means it will be applied first. - * @apiNote Consider taking this value on your class' constructor and setting it from {@link TooltipManager#adders} to make it easy to read and maintain. - */ - public final int priority; - - protected TooltipAdder(String titlePattern, int priority) { - this(Pattern.compile(titlePattern), priority); - } - - protected TooltipAdder(Pattern titlePattern, int priority) { - this.titlePattern = titlePattern; - this.priority = priority; - } - - /** - * Creates a TooltipAdder that will be applied to all screens. - */ - protected TooltipAdder(int priority) { - this.titlePattern = null; - this.priority = priority; - } - - /** - * @implNote The first element of the lines list holds the item's display name, - * as it's a list of all lines that will be displayed in the tooltip. - */ - public abstract void addToTooltip(List lines, Slot focusedSlot); -} -- cgit From 97167505f1f7f805e6afdb8f1c60810e17f553e3 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:34:44 +0300 Subject: Add tests for RomanNumerals and clarify their uses in javadocs --- .../de/hysky/skyblocker/utils/RomanNumerals.java | 9 +++++- .../hysky/skyblocker/utils/RomanNumeralsTest.java | 35 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/test/java/de/hysky/skyblocker/utils/RomanNumeralsTest.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java b/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java index 5f273f8e..007cb0b1 100644 --- a/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java +++ b/src/main/java/de/hysky/skyblocker/utils/RomanNumerals.java @@ -16,6 +16,13 @@ public class RomanNumerals { }; } + /** + * Checks if a string is a valid roman numeral. + * It's the caller's responsibility to clean up the string before calling this method (such as trimming it). + * @param romanNumeral The roman numeral to check. + * @return True if the string is a valid roman numeral, false otherwise. + * @implNote This will only check if the string contains valid roman numeral characters. It won't check if the numeral is well-formed. + */ public static boolean isValidRomanNumeral(String romanNumeral) { if (romanNumeral == null || romanNumeral.isEmpty()) return false; for (int i = 0; i < romanNumeral.length(); i++) { @@ -28,7 +35,7 @@ public class RomanNumerals { * Converts a roman numeral to a decimal number. * * @param romanNumeral The roman numeral to convert. - * @return The decimal number, or 0 if the roman numeral string is malformed, empty or null. + * @return The decimal number, or 0 if the roman numeral string has non-roman characters in it, or if the string is empty or null. */ public static int romanToDecimal(String romanNumeral) { if (romanNumeral == null || romanNumeral.isEmpty()) return 0; diff --git a/src/test/java/de/hysky/skyblocker/utils/RomanNumeralsTest.java b/src/test/java/de/hysky/skyblocker/utils/RomanNumeralsTest.java new file mode 100644 index 00000000..35bd76ee --- /dev/null +++ b/src/test/java/de/hysky/skyblocker/utils/RomanNumeralsTest.java @@ -0,0 +1,35 @@ +package de.hysky.skyblocker.utils; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class RomanNumeralsTest { + @Test + void testToRoman() { + // Test the first 50 numbers + String[] expected = new String[]{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX", "XXI", "XXII", "XXIII", "XXIV", "XXV", "XXVI", "XXVII", "XXVIII", "XXIX", "XXX", "XXXI", "XXXII", "XXXIII", "XXXIV", "XXXV", "XXXVI", "XXXVII", "XXXVIII", "XXXIX", "XL", "XLI", "XLII", "XLIII", "XLIV", "XLV", "XLVI", "XLVII", "XLVIII", "XLIX", "L"}; + for (int i = 1; i <= 50; i++) { + Assertions.assertEquals(i, RomanNumerals.romanToDecimal(expected[i-1])); + } + Assertions.assertEquals(100, RomanNumerals.romanToDecimal("C")); + Assertions.assertEquals(400, RomanNumerals.romanToDecimal("CD")); + Assertions.assertEquals(500, RomanNumerals.romanToDecimal("D")); + Assertions.assertEquals(900, RomanNumerals.romanToDecimal("CM")); + Assertions.assertEquals(1000, RomanNumerals.romanToDecimal("M")); + Assertions.assertEquals(1999, RomanNumerals.romanToDecimal("MCMXCIX")); + } + + @Test + void isValidRoman() { + Assertions.assertTrue(RomanNumerals.isValidRomanNumeral("I")); + Assertions.assertFalse(RomanNumerals.isValidRomanNumeral("AI")); + Assertions.assertTrue(RomanNumerals.isValidRomanNumeral("CMI")); + Assertions.assertFalse(RomanNumerals.isValidRomanNumeral(" CMI")); + Assertions.assertFalse(RomanNumerals.isValidRomanNumeral("XI I")); + Assertions.assertFalse(RomanNumerals.isValidRomanNumeral("A")); + Assertions.assertFalse(RomanNumerals.isValidRomanNumeral("15")); + Assertions.assertFalse(RomanNumerals.isValidRomanNumeral("MCMLXXXAIV")); + Assertions.assertFalse(RomanNumerals.isValidRomanNumeral(null)); + Assertions.assertFalse(RomanNumerals.isValidRomanNumeral("")); + } +} -- cgit From 69a08217ec3ca685dfe1a0bdd53eb8d7424a8791 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:36:58 +0300 Subject: Reformat SupercraftReminder and lowercase the uuid the variable Co-authored-by: Kevin <92656833+kevinthegreat1@users.noreply.github.com> --- .../skyblock/item/tooltip/adders/SupercraftReminder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java index eb953b9c..8a8f198c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/SupercraftReminder.java @@ -21,10 +21,10 @@ public class SupercraftReminder extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { if (focusedSlot.id != SUPERCRAFT_SLOT || !focusedSlot.getStack().isOf(Items.GOLDEN_PICKAXE)) return; - String UUID = ItemUtils.getItemUuid(focusedSlot.inventory.getStack(RECIPE_RESULT_SLOT)); - if (!UUID.isEmpty()) return; //Items with UUID can't be stacked, and therefore the shift-click feature doesn't matter - int index = lines.size()-1; - if (lines.get(lines.size()-2).getString().equals("Recipe not unlocked!")) index--; //Place it right below the "Right-Click to set amount" line + String uuid = ItemUtils.getItemUuid(focusedSlot.inventory.getStack(RECIPE_RESULT_SLOT)); + if (!uuid.isEmpty()) return; //Items with UUID can't be stacked, and therefore the shift-click feature doesn't matter + int index = lines.size() - 1; + if (lines.get(lines.size() - 2).getString().equals("Recipe not unlocked!")) index--; //Place it right below the "Right-Click to set amount" line lines.add(index, Text.literal("Shift-Click to maximize the amount!").formatted(Formatting.GOLD)); } } -- cgit From e5702972380417c65e2a3750401fb95b96bd4d31 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:47:21 +0300 Subject: Rename PositionedText into SlotText and rename its methods to be camelCase --- .../hysky/skyblocker/mixins/HandledScreenMixin.java | 14 +++++++------- .../skyblock/item/slottext/PositionedText.java | 21 --------------------- .../skyblocker/skyblock/item/slottext/SlotText.java | 21 +++++++++++++++++++++ .../skyblock/item/slottext/SlotTextAdder.java | 2 +- .../skyblock/item/slottext/SlotTextManager.java | 4 ++-- .../item/slottext/adders/AttributeShardAdder.java | 8 ++++---- .../item/slottext/adders/CatacombsLevelAdder.java | 16 ++++++++-------- .../item/slottext/adders/EnchantmentLevelAdder.java | 8 ++++---- .../item/slottext/adders/MinionLevelAdder.java | 6 +++--- .../item/slottext/adders/PetLevelAdder.java | 6 +++--- .../item/slottext/adders/PrehistoricEggAdder.java | 6 +++--- .../slottext/adders/RancherBootsSpeedAdder.java | 6 +++--- .../item/slottext/adders/SkillLevelAdder.java | 8 ++++---- .../item/slottext/adders/SkyblockLevelAdder.java | 6 +++--- 14 files changed, 66 insertions(+), 66 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/PositionedText.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotText.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 47229a54..e4dc09fb 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -14,7 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextManager; import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview; import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview; @@ -315,30 +315,30 @@ public abstract class HandledScreenMixin 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) { - List textList = SlotTextManager.getText(slot); + List textList = SlotTextManager.getText(slot); if (textList.isEmpty()) return; MatrixStack matrices = context.getMatrices(); - for (PositionedText positionedText : textList) { + for (SlotText slotText : textList) { matrices.push(); matrices.translate(0.0f, 0.0f, 200.0f); - int length = textRenderer.getWidth(positionedText.text()); + int length = textRenderer.getWidth(slotText.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()) { + switch (slotText.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 + 2f + 0.7f) * length / 16.0f) - slot.y, 0.0f); } } else { - switch (positionedText.position()) { + switch (slotText.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 + 2f, 0.0f); case BOTTOM_RIGHT -> matrices.translate(16f - length, 16f - textRenderer.fontHeight + 2f, 0.0f); } } - context.drawText(textRenderer, positionedText.text(), slot.x, slot.y, 0xFFFFFF, true); + context.drawText(textRenderer, slotText.text(), slot.x, slot.y, 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 deleted file mode 100644 index 4738038a..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/PositionedText.java +++ /dev/null @@ -1,21 +0,0 @@ -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/SlotText.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotText.java new file mode 100644 index 00000000..66c02ca1 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/SlotText.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.skyblock.item.slottext; + +import net.minecraft.text.Text; + +public record SlotText(Text text, TextPosition position) { + public static SlotText bottomLeft(Text text) { + return new SlotText(text, TextPosition.BOTTOM_LEFT); + } + + public static SlotText bottomRight(Text text) { + return new SlotText(text, TextPosition.BOTTOM_RIGHT); + } + + public static SlotText topLeft(Text text) { + return new SlotText(text, TextPosition.TOP_LEFT); + } + + public static SlotText topRight(Text text) { + return new SlotText(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 2e6213b0..18bf1dc1 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 @@ -51,7 +51,7 @@ public abstract class SlotTextAdder { * @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. */ - public abstract @NotNull List getText(Slot slot); + public abstract @NotNull List getText(Slot slot); /** * Override this method to add conditions to enable or disable this adder. 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 4885f0b8..7b4b34cf 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 @@ -57,10 +57,10 @@ public class SlotTextManager { * The order of the adders remains the same as they were added to the {@link SlotTextManager#adders} array. */ @NotNull - public static List getText(Slot slot) { + public static List getText(Slot slot) { if (currentScreenAdders.isEmpty()) return List.of(); for (SlotTextAdder adder : currentScreenAdders) { - List text = adder.getText(slot); + List text = adder.getText(slot); if (!text.isEmpty()) return text; } return List.of(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java index d15031e9..811677d7 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/AttributeShardAdder.java @@ -1,7 +1,7 @@ package de.hysky.skyblocker.skyblock.item.slottext.adders; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.item.slottext.PositionedText; +import de.hysky.skyblocker.skyblock.item.slottext.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; @@ -70,7 +70,7 @@ public class AttributeShardAdder extends SlotTextAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { final ItemStack stack = slot.getStack(); NbtCompound customData = ItemUtils.getCustomData(stack); @@ -85,8 +85,8 @@ public class AttributeShardAdder extends SlotTextAdder { String attributeInitials = ID_2_SHORT_NAME.getOrDefault(attributeId, ""); return List.of( - PositionedText.BOTTOM_RIGHT(Text.literal(String.valueOf(attributeLevel)).withColor(0x34eb77)), - PositionedText.TOP_LEFT(Text.literal(attributeInitials).formatted(Formatting.AQUA)) + SlotText.bottomRight(Text.literal(String.valueOf(attributeLevel)).withColor(0x34eb77)), + SlotText.topLeft(Text.literal(attributeInitials).formatted(Formatting.AQUA)) ); } 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 90aa5d3e..31e0d110 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,6 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; @@ -23,15 +23,15 @@ public class CatacombsLevelAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List 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 List.of(PositionedText.BOTTOM_LEFT(Text.literal("0").formatted(Formatting.RED))); + if (lastIndex == -1) return List.of(SlotText.bottomLeft(Text.literal("0").formatted(Formatting.RED))); String level = name.substring(lastIndex + 1); if (!NumberUtils.isDigits(level)) return List.of(); //Sanity check, just in case. - return List.of(PositionedText.BOTTOM_RIGHT(Text.literal(level).formatted(Formatting.RED))); + return List.of(SlotText.bottomRight(Text.literal(level).formatted(Formatting.RED))); } default -> { return List.of(); @@ -47,12 +47,12 @@ public class CatacombsLevelAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { switch (slot.id) { case 11, 12, 13, 14, 15 -> { String level = getBracketedLevelFromName(slot.getStack()); if (!NumberUtils.isDigits(level)) return List.of(); - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(level).formatted(Formatting.RED))); + return List.of(SlotText.bottomLeft(Text.literal(level).formatted(Formatting.RED))); } default -> { return List.of(); @@ -68,12 +68,12 @@ public class CatacombsLevelAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { switch (slot.id) { case 29, 30, 31, 32, 33 -> { String level = getBracketedLevelFromName(slot.getStack()); if (!NumberUtils.isDigits(level)) return List.of(); - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(level).formatted(Formatting.RED))); + return List.of(SlotText.bottomLeft(Text.literal(level).formatted(Formatting.RED))); } default -> { 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 4131d07c..9c85ae61 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,6 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.RomanNumerals; @@ -21,7 +21,7 @@ public class EnchantmentLevelAdder extends SlotTextAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { final ItemStack itemStack = slot.getStack(); if (!itemStack.isOf(Items.ENCHANTED_BOOK)) return List.of(); String name = itemStack.getName().getString(); @@ -31,11 +31,11 @@ public class EnchantmentLevelAdder extends SlotTextAdder { NbtCompound enchantments = nbt.getCompound("enchantments"); if (enchantments.getSize() != 1) return List.of(); //Only makes sense to display the level when there's one enchant. int level = enchantments.getInt(enchantments.getKeys().iterator().next()); - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(level)).formatted(Formatting.GREEN))); + return List.of(SlotText.bottomLeft(Text.literal(String.valueOf(level)).formatted(Formatting.GREEN))); } else { //In bazaar, the books have the enchantment level in the name int level = getEnchantLevelFromString(name); if (level == 0) return List.of(); - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(level)).formatted(Formatting.GREEN))); + return List.of(SlotText.bottomLeft(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 b98bed2b..b54b6a89 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,6 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.RomanNumerals; import net.minecraft.item.ItemStack; @@ -18,7 +18,7 @@ public class MinionLevelAdder extends SlotTextAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { ItemStack itemStack = slot.getStack(); if (!itemStack.isOf(Items.PLAYER_HEAD)) return List.of(); String name = itemStack.getName().getString(); @@ -26,6 +26,6 @@ public class MinionLevelAdder extends SlotTextAdder { 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 List.of(); - return List.of(PositionedText.TOP_RIGHT(Text.literal(String.valueOf(level)).formatted(Formatting.AQUA))); + return List.of(SlotText.topRight(Text.literal(String.valueOf(level)).formatted(Formatting.AQUA))); } } 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 9c3eef08..3813563a 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,6 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -18,11 +18,11 @@ public class PetLevelAdder extends SlotTextAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { ItemStack itemStack = slot.getStack(); if (!itemStack.isOf(Items.PLAYER_HEAD)) return List.of(); String level = CatacombsLevelAdder.getBracketedLevelFromName(itemStack); if (!NumberUtils.isDigits(level)) return List.of(); - return List.of(PositionedText.TOP_LEFT(Text.literal(level).formatted(Formatting.GOLD))); + return List.of(SlotText.topLeft(Text.literal(level).formatted(Formatting.GOLD))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PrehistoricEggAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PrehistoricEggAdder.java index 5db253fc..cbb3515f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PrehistoricEggAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/PrehistoricEggAdder.java @@ -1,6 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.item.ItemStack; @@ -17,7 +17,7 @@ import java.util.List; public class PrehistoricEggAdder extends SlotTextAdder { @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { final ItemStack stack = slot.getStack(); if (!stack.isOf(Items.PLAYER_HEAD) || !StringUtils.equals(stack.getInternalId(), "PREHISTORIC_EGG")) return List.of(); NbtCompound nbt = ItemUtils.getCustomData(stack); @@ -29,6 +29,6 @@ public class PrehistoricEggAdder extends SlotTextAdder { else if (walked < 10000) walkedstr = String.format("%.1fk", walked/1000.0f); else walkedstr = walked / 1000 + "k"; - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(walkedstr).formatted(Formatting.GOLD))); + return List.of(SlotText.bottomLeft(Text.literal(walkedstr).formatted(Formatting.GOLD))); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java index 9fd498b7..c56e4525 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java @@ -1,6 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.item.ItemStack; @@ -23,7 +23,7 @@ public class RancherBootsSpeedAdder extends SlotTextAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { final ItemStack itemStack = slot.getStack(); // V null-safe equals. if (!itemStack.isOf(Items.LEATHER_BOOTS) && !StringUtils.equals(itemStack.getInternalId(), "RANCHERS_BOOTS")) return List.of(); @@ -31,6 +31,6 @@ public class RancherBootsSpeedAdder extends SlotTextAdder { if (matcher == null) return List.of(); String speed = matcher.group(2); if (speed == null) speed = matcher.group(1); //2nd group only matches when the speed cap is set to a number beyond the player's actual speed cap. - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(speed).formatted(Formatting.GREEN))); + return List.of(SlotText.bottomLeft(Text.literal(speed).formatted(Formatting.GREEN))); } } 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 efc077cd..095982af 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,6 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.RomanNumerals; import net.minecraft.screen.slot.Slot; @@ -16,15 +16,15 @@ public class SkillLevelAdder extends SlotTextAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List 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 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. + if (lastIndex == -1) return List.of(SlotText.bottomLeft(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 //The "romanNumeral" might be a latin numeral, too. There's a skyblock setting for this, so we have to do it this way V - return List.of(PositionedText.BOTTOM_LEFT(Text.literal(String.valueOf(RomanNumerals.isValidRomanNumeral(romanNumeral) ? RomanNumerals.romanToDecimal(romanNumeral) : Integer.parseInt(romanNumeral))).formatted(Formatting.LIGHT_PURPLE))); + return List.of(SlotText.bottomLeft(Text.literal(String.valueOf(RomanNumerals.isValidRomanNumeral(romanNumeral) ? RomanNumerals.romanToDecimal(romanNumeral) : Integer.parseInt(romanNumeral))).formatted(Formatting.LIGHT_PURPLE))); } default -> { 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 f1e9f52c..8b528508 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,6 +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.SlotText; import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; import net.minecraft.screen.slot.Slot; @@ -16,7 +16,7 @@ public class SkyblockLevelAdder extends SlotTextAdder { } @Override - public @NotNull List getText(Slot slot) { + public @NotNull List getText(Slot slot) { if (slot.getIndex() != 22) return List.of(); List lore = ItemUtils.getLore(slot.getStack()); if (lore.isEmpty()) return List.of(); @@ -24,6 +24,6 @@ public class SkyblockLevelAdder extends SlotTextAdder { 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 List.of(); - return List.of(PositionedText.BOTTOM_LEFT(levelText)); + return List.of(SlotText.bottomLeft(levelText)); } } -- cgit From 25ee7d7419ecd1dccdb06f0b0718fd20bebc0d14 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:54:36 +0300 Subject: Rename ItemStackInternalIdGetter and its methods to be more distinguishable --- .../injected/ItemStackInternalIdGetter.java | 20 ---------------- .../hysky/skyblocker/injected/SkyblockerStack.java | 20 ++++++++++++++++ .../de/hysky/skyblocker/mixins/ItemStackMixin.java | 28 +++++++++++----------- .../de/hysky/skyblocker/skyblock/ChestValue.java | 4 ++-- .../hysky/skyblocker/skyblock/TeleportOverlay.java | 2 +- .../skyblock/auction/AuctionBrowserScreen.java | 4 ++-- .../item/slottext/adders/PrehistoricEggAdder.java | 2 +- .../slottext/adders/RancherBootsSpeedAdder.java | 2 +- .../item/tooltip/adders/AccessoryTooltip.java | 2 +- .../item/tooltip/adders/AvgBinTooltip.java | 2 +- .../item/tooltip/adders/BazaarPriceTooltip.java | 4 ++-- .../skyblock/item/tooltip/adders/ColorTooltip.java | 2 +- .../skyblock/item/tooltip/adders/LBinTooltip.java | 4 ++-- .../skyblock/item/tooltip/adders/MotesTooltip.java | 2 +- .../item/tooltip/adders/MuseumTooltip.java | 2 +- .../item/tooltip/adders/NpcPriceTooltip.java | 2 +- src/main/resources/fabric.mod.json | 2 +- 17 files changed, 52 insertions(+), 52 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java create mode 100644 src/main/java/de/hysky/skyblocker/injected/SkyblockerStack.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java b/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java deleted file mode 100644 index d1992705..00000000 --- a/src/main/java/de/hysky/skyblocker/injected/ItemStackInternalIdGetter.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.hysky.skyblocker.injected; - -import org.jetbrains.annotations.Nullable; - -public interface ItemStackInternalIdGetter { - @Nullable - default String getInternalId() { - return ""; - } - - @Nullable - default String getInternalName() { - return ""; - } - - @Nullable - default String getNeuName() { - return ""; - } -} diff --git a/src/main/java/de/hysky/skyblocker/injected/SkyblockerStack.java b/src/main/java/de/hysky/skyblocker/injected/SkyblockerStack.java new file mode 100644 index 00000000..dc3d9c1f --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/injected/SkyblockerStack.java @@ -0,0 +1,20 @@ +package de.hysky.skyblocker.injected; + +import org.jetbrains.annotations.Nullable; + +public interface SkyblockerStack { + @Nullable + default String getSkyblockId() { + return ""; + } + + @Nullable + default String getSkyblockName() { + return ""; + } + + @Nullable + default String getNeuName() { + return ""; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index e4550a5c..1e5cff10 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -4,7 +4,7 @@ import com.google.gson.JsonObject; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.injected.ItemStackInternalIdGetter; +import de.hysky.skyblocker.injected.SkyblockerStack; import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; @@ -28,7 +28,7 @@ import java.util.Locale; import java.util.Optional; @Mixin(ItemStack.class) -public abstract class ItemStackMixin implements ItemStackInternalIdGetter { +public abstract class ItemStackMixin implements SkyblockerStack { @Shadow public abstract int getDamage(); @@ -40,10 +40,10 @@ public abstract class ItemStackMixin implements ItemStackInternalIdGetter { private int maxDamage; @Unique - private String internalId; + private String skyblockId; @Unique - private String internalName; + private String skyblockName; @Unique private String neuName; @@ -125,26 +125,26 @@ public abstract class ItemStackMixin implements ItemStackInternalIdGetter { @Override @Nullable - public String getInternalId() { - if (internalId != null && !internalId.isEmpty()) return internalId; - internalId = skyblocker$getInternalNameFromNBT(true); - return internalId; + public String getSkyblockId() { + if (skyblockId != null && !skyblockId.isEmpty()) return skyblockId; + skyblockId = skyblocker$getInternalNameFromNBT(true); + return skyblockId; } @Override @Nullable - public String getInternalName() { - if (internalName != null && !internalName.isEmpty()) return internalName; - internalName = skyblocker$getInternalNameFromNBT(false); - return internalName; + public String getSkyblockName() { + if (skyblockName != null && !skyblockName.isEmpty()) return skyblockName; + skyblockName = skyblocker$getInternalNameFromNBT(false); + return skyblockName; } @Override @Nullable public String getNeuName() { if (neuName != null && !neuName.isEmpty()) return neuName; - String name = getInternalName(); - String id = getInternalId(); + String name = getSkyblockName(); + String id = getSkyblockId(); if (name == null || id == null) return null; if (name.startsWith("ISSHINY_")) name = id; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 3d1da0bd..cc800803 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -80,7 +80,7 @@ public class ChestValue { } String name = stack.getName().getString(); - String internalName = stack.getInternalName(); + String internalName = stack.getSkyblockName(); //Regular item price if (internalName != null) { @@ -159,7 +159,7 @@ public class ChestValue { continue; } - String internalName = stack.getInternalName(); + String internalName = stack.getSkyblockName(); if (internalName != null) { LongBooleanPair priceData = getItemPrice(internalName); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java index d8a05809..a8155b43 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java @@ -26,7 +26,7 @@ public class TeleportOverlay { private static void render(WorldRenderContext wrc) { if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().uiAndVisuals.teleportOverlay.enableTeleportOverlays && client.player != null && client.world != null) { ItemStack heldItem = client.player.getMainHandStack(); - String itemId = heldItem.getInternalId(); + String itemId = heldItem.getSkyblockId(); NbtCompound customData = ItemUtils.getCustomData(heldItem); if (itemId != null) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java index 21bd965c..3d205252 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java @@ -295,8 +295,8 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI getText(Slot slot) { final ItemStack stack = slot.getStack(); - if (!stack.isOf(Items.PLAYER_HEAD) || !StringUtils.equals(stack.getInternalId(), "PREHISTORIC_EGG")) return List.of(); + if (!stack.isOf(Items.PLAYER_HEAD) || !StringUtils.equals(stack.getSkyblockId(), "PREHISTORIC_EGG")) return List.of(); NbtCompound nbt = ItemUtils.getCustomData(stack); if (!nbt.contains("blocks_walked", NbtElement.INT_TYPE)) return List.of(); int walked = nbt.getInt("blocks_walked"); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java index c56e4525..1f92fb8a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/RancherBootsSpeedAdder.java @@ -26,7 +26,7 @@ public class RancherBootsSpeedAdder extends SlotTextAdder { public @NotNull List getText(Slot slot) { final ItemStack itemStack = slot.getStack(); // V null-safe equals. - if (!itemStack.isOf(Items.LEATHER_BOOTS) && !StringUtils.equals(itemStack.getInternalId(), "RANCHERS_BOOTS")) return List.of(); + if (!itemStack.isOf(Items.LEATHER_BOOTS) && !StringUtils.equals(itemStack.getSkyblockId(), "RANCHERS_BOOTS")) return List.of(); Matcher matcher = ItemUtils.getLoreLineIfMatch(slot.getStack(), SPEED_PATTERN); if (matcher == null) return List.of(); String speed = matcher.group(2); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java index 34d93abc..3b150488 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AccessoryTooltip.java @@ -18,7 +18,7 @@ public class AccessoryTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { - final String internalID = focusedSlot.getStack().getInternalId(); + final String internalID = focusedSlot.getStack().getSkyblockId(); if (TooltipInfoType.ACCESSORIES.isTooltipEnabledAndHasOrNullWarning(internalID)) { Pair report = AccessoriesHelper.calculateReport4Accessory(internalID); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java index 4754932b..a36f30e9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/AvgBinTooltip.java @@ -21,7 +21,7 @@ public class AvgBinTooltip extends TooltipAdder { public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); String neuName = itemStack.getNeuName(); - String internalID = itemStack.getInternalId(); + String internalID = itemStack.getSkyblockId(); if (neuName == null || internalID == null) return; if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java index 9237c141..ed24a2fd 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/BazaarPriceTooltip.java @@ -23,9 +23,9 @@ public class BazaarPriceTooltip extends TooltipAdder { public void addToTooltip(List lines, Slot focusedSlot) { bazaarExist = false; final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.getInternalId(); + final String internalID = itemStack.getSkyblockId(); if (internalID == null) return; - String name = itemStack.getInternalName(); + String name = itemStack.getSkyblockName(); if (name == null) return; if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java index 56dd60b0..2b576be6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/ColorTooltip.java @@ -29,7 +29,7 @@ public class ColorTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.getInternalId(); + final String internalID = itemStack.getSkyblockId(); if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && itemStack.contains(DataComponentTypes.DYED_COLOR)) { String uuid = ItemUtils.getItemUuid(itemStack); boolean hasCustomDye = SkyblockerConfigManager.get().general.customDyeColors.containsKey(uuid) || SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(uuid); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java index 2a28df79..38ef49e6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/LBinTooltip.java @@ -21,9 +21,9 @@ public class LBinTooltip extends TooltipAdder { public void addToTooltip(List lines, Slot focusedSlot) { lbinExist = false; final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.getInternalId(); + final String internalID = itemStack.getSkyblockId(); if (internalID == null) return; - String name = itemStack.getInternalName(); + String name = itemStack.getSkyblockName(); if (name == null) return; if (name.startsWith("ISSHINY_")) name = "SHINY_" + internalID; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java index 5a8c2ddb..64640b95 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MotesTooltip.java @@ -20,7 +20,7 @@ public class MotesTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.getInternalId(); + final String internalID = itemStack.getSkyblockId(); if (internalID != null && TooltipInfoType.MOTES.isTooltipEnabledAndHasOrNullWarning(internalID)) { lines.add(Text.literal(String.format("%-20s", "Motes Price:")) .formatted(Formatting.LIGHT_PURPLE) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java index ce98f1c5..1c64760a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java @@ -20,7 +20,7 @@ public class MuseumTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack itemStack = focusedSlot.getStack(); - final String internalID = itemStack.getInternalId(); + final String internalID = itemStack.getSkyblockId(); if (TooltipInfoType.MUSEUM.isTooltipEnabledAndHasOrNullWarning(internalID)) { String itemCategory = TooltipInfoType.MUSEUM.getData().get(internalID).getAsString(); String format = switch (itemCategory) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java index ba24364b..3ac7d298 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/NpcPriceTooltip.java @@ -18,7 +18,7 @@ public class NpcPriceTooltip extends TooltipAdder { @Override public void addToTooltip(List lines, Slot focusedSlot) { final ItemStack stack = focusedSlot.getStack(); - final String internalID = stack.getInternalId(); + final String internalID = stack.getSkyblockId(); if (internalID != null && TooltipInfoType.NPC.isTooltipEnabledAndHasOrNullWarning(internalID)) { lines.add(Text.literal(String.format("%-21s", "NPC Sell Price:")) .formatted(Formatting.YELLOW) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 2d137920..17ce8bc8 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -55,7 +55,7 @@ }, "loom:injected_interfaces": { "net/minecraft/class_1799": [ - "de/hysky/skyblocker/injected/ItemStackInternalIdGetter" + "de/hysky/skyblocker/injected/SkyblockerStack" ] } } -- cgit From dbd04ba00b94fcc28bb6d801c8e49ecf6e791ce0 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Sat, 8 Jun 2024 04:55:45 +0300 Subject: Fix a few things in ChocolateFactorySolver --- .../chocolatefactory/ChocolateFactorySolver.java | 24 +++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java index bf31bd1f..d33a83e9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/ChocolateFactorySolver.java @@ -44,10 +44,27 @@ public class ChocolateFactorySolver extends ContainerSolver { private static boolean canPrestige = false; private static boolean reachedMaxPrestige = false; private static double timeTowerMultiplier = -1.0; + private static boolean isTimeTowerMaxed = false; private static boolean isTimeTowerActive = false; - private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#,###.#", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); private static int bestUpgrade = -1; private static int bestAffordableUpgrade = -1; + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#,###.#", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); + + @Override + protected void reset() { + cpsIncreaseFactors.clear(); + totalChocolate = -1L; + totalCps = -1.0; + totalCpsMultiplier = -1.0; + requiredUntilNextPrestige = -1L; + canPrestige = false; + reachedMaxPrestige = false; + timeTowerMultiplier = -1.0; + isTimeTowerMaxed = false; + isTimeTowerActive = false; + bestUpgrade = -1; + bestAffordableUpgrade = -1; + } //Slots, for ease of maintenance rather than using magic numbers everywhere. private static final byte RABBITS_START = 28; @@ -140,6 +157,7 @@ public class ChocolateFactorySolver extends ContainerSolver { } //Time Tower is in slot 39 + isTimeTowerMaxed = StringUtils.substringAfterLast(slots.get(TIME_TOWER_SLOT).getName().getString(), ' ').equals("XV"); timeTowerMultiplier = RomanNumerals.romanToDecimal(StringUtils.substringAfterLast(slots.get(TIME_TOWER_SLOT).getName().getString(), ' ')) / 10.0; //The name holds the level, which is multiplier * 10 in roman numerals Matcher timeTowerStatusMatcher = TIME_TOWER_STATUS_PATTERN.matcher(getConcatenatedLore(slots.get(TIME_TOWER_SLOT))); if (timeTowerStatusMatcher.find()) { @@ -233,7 +251,7 @@ public class ChocolateFactorySolver extends ContainerSolver { public static final class Tooltip extends TooltipAdder { public Tooltip() { - super("^Chocolate Factory", 0); //The priority doesn't really matter here as this is the only tooltip adder for the Chocolate Factory. + super("^Chocolate Factory$", 0); //The priority doesn't really matter here as this is the only tooltip adder for the Chocolate Factory. } @Override @@ -300,7 +318,7 @@ public class ChocolateFactorySolver extends ContainerSolver { lines.add(Text.empty() .append(Text.literal(" CPS when active: ").formatted(Formatting.GRAY)) .append(Text.literal(DECIMAL_FORMAT.format(isTimeTowerActive ? totalCps : totalCps / totalCpsMultiplier * (timeTowerMultiplier + totalCpsMultiplier))).formatted(Formatting.GOLD))); - if (timeTowerMultiplier < 1.5) { + if (!isTimeTowerMaxed) { lines.add(Text.literal("Stats after upgrade:").formatted(Formatting.GRAY)); lines.add(Text.empty() .append(Text.literal(" CPS increase: ").formatted(Formatting.GRAY)) -- cgit From f9c514db798a32956a9c96201c8871f44501a7a4 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sat, 8 Jun 2024 12:17:10 +0800 Subject: Move tooltip injection point --- .../skyblocker/mixins/HandledScreenMixin.java | 22 ++++++-------- .../mixins/accessors/HandledScreenAccessor.java | 8 +++++ .../item/tooltip/CompactorDeletorPreview.java | 4 +-- .../skyblock/itemlist/ResultButtonWidget.java | 34 +++++++--------------- 4 files changed, 29 insertions(+), 39 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index e4dc09fb..35b91639 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -1,7 +1,6 @@ package de.hysky.skyblocker.mixins; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.SkyblockerMod; @@ -24,11 +23,9 @@ import de.hysky.skyblocker.skyblock.quicknav.QuickNavButton; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.gui.ContainerSolver; -import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.item.TooltipData; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.Item; @@ -41,10 +38,7 @@ import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; @@ -53,7 +47,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.regex.Matcher; @@ -101,6 +94,9 @@ public abstract class HandledScreenMixin extends Screen @Final protected T handler; + @Shadow + protected abstract List getTooltipFromItem(ItemStack stack); + @Unique private List quickNavButtons; @@ -182,7 +178,7 @@ public abstract class HandledScreenMixin extends Screen // Compactor Preview if (SkyblockerConfigManager.get().uiAndVisuals.compactorDeletorPreview) { Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemUtils.getItemId(stack)); - if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) { + if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, getTooltipFromItem(stack), matcher.group("type"), matcher.group("size"), x, y)) { ci.cancel(); } } @@ -194,9 +190,9 @@ public abstract class HandledScreenMixin extends Screen } @SuppressWarnings("deprecation") - @WrapOperation(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V")) - private void skyblocker$tooltips$drawMouseoverTooltip(DrawContext context, TextRenderer textRenderer, List text, Optional data, int x, int y, Operation original) { - original.call(context, textRenderer, TooltipManager.addToTooltip(text, focusedSlot), data, x, y); + @ModifyReturnValue(method = "getTooltipFromItem", at = @At("RETURN")) + private List skyblocker$tooltips$addToTooltip(List tooltip) { + return TooltipManager.addToTooltip(tooltip, focusedSlot); } @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 3), ordinal = 0) diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java index 9a2a8311..41323a5e 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java @@ -1,11 +1,16 @@ package de.hysky.skyblocker.mixins.accessors; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.item.ItemStack; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.List; @Mixin(HandledScreen.class) public interface HandledScreenAccessor { @@ -27,4 +32,7 @@ public interface HandledScreenAccessor { @Accessor("focusedSlot") Slot getFocusedSlot(); + + @Invoker + List invokeGetTooltipFromItem(ItemStack stack); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java index c5279c61..b93ca77a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java @@ -7,7 +7,6 @@ import it.unimi.dsi.fastutil.ints.IntIntPair; import it.unimi.dsi.fastutil.ints.IntObjectPair; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.tooltip.HoveredTooltipPositioner; import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.item.ItemStack; @@ -34,8 +33,7 @@ public class CompactorDeletorPreview { public static final Pattern NAME = Pattern.compile("PERSONAL_(?COMPACTOR|DELETOR)_(?\\d+)"); private static final MinecraftClient client = MinecraftClient.getInstance(); - public static boolean drawPreview(DrawContext context, ItemStack stack, String type, String size, int x, int y) { - List tooltips = Screen.getTooltipFromItem(client, stack); + public static boolean drawPreview(DrawContext context, ItemStack stack, List tooltips, String type, String size, int x, int y) { int targetIndex = getTargetIndex(tooltips); if (targetIndex == -1) return false; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ResultButtonWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ResultButtonWidget.java index d2d463c7..9e2ec0b3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ResultButtonWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ResultButtonWidget.java @@ -1,30 +1,29 @@ package de.hysky.skyblocker.skyblock.itemlist; -import java.util.List; -import java.util.ArrayList; - +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.text.OrderedText; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import java.util.List; + public class ResultButtonWidget extends ClickableWidget { private static final Identifier BACKGROUND_TEXTURE = new Identifier("recipe_book/slot_craftable"); protected ItemStack itemStack = null; public ResultButtonWidget(int x, int y) { - super(x, y, 25, 25, Text.of("")); + super(x, y, 25, 25, Text.literal("")); } protected void setItemStack(ItemStack itemStack) { - this.active = !itemStack.getItem().equals(Items.AIR); + this.active = !itemStack.isEmpty(); this.visible = true; this.itemStack = itemStack; } @@ -37,29 +36,18 @@ public class ResultButtonWidget extends ClickableWidget { @Override public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { MinecraftClient client = MinecraftClient.getInstance(); - // this.drawTexture(matrices, this.x, this.y, 29, 206, this.width, this.height); context.drawGuiTexture(BACKGROUND_TEXTURE, this.getX(), this.getY(), this.getWidth(), this.getHeight()); - // client.getItemRenderer().renderInGui(this.itemStack, this.x + 4, this.y + 4); context.drawItem(this.itemStack, this.getX() + 4, this.getY() + 4); - // client.getItemRenderer().renderGuiItemOverlay(client.textRenderer, itemStack, this.x + 4, this.y + 4); context.drawItemInSlot(client.textRenderer, itemStack, this.getX() + 4, this.getY() + 4); } public void renderTooltip(DrawContext context, int mouseX, int mouseY) { MinecraftClient client = MinecraftClient.getInstance(); - List tooltip = Screen.getTooltipFromItem(client, this.itemStack); - List orderedTooltip = new ArrayList<>(); - - for(int i = 0; i < tooltip.size(); i++) { - orderedTooltip.add(tooltip.get(i).asOrderedText()); - } - - client.currentScreen.setTooltip(orderedTooltip); + if (client.currentScreen == null) return; + List tooltip = client.currentScreen instanceof HandledScreen handledScreen ? ((HandledScreenAccessor) handledScreen).invokeGetTooltipFromItem(this.itemStack) : Screen.getTooltipFromItem(client, this.itemStack); + client.currentScreen.setTooltip(tooltip.stream().map(Text::asOrderedText).toList()); } - @Override - protected void appendClickableNarrations(NarrationMessageBuilder builder) { - // TODO Auto-generated method stub - - } + @Override + protected void appendClickableNarrations(NarrationMessageBuilder builder) {} } -- cgit From 2ce943b4278b7d89898acdde6046fb347e2447b1 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Sun, 9 Jun 2024 11:49:22 +0800 Subject: Refactor SkyblockerStack and ItemStackMixin --- .../hysky/skyblocker/injected/SkyblockerStack.java | 2 +- .../de/hysky/skyblocker/mixins/ItemStackMixin.java | 23 ++++++++++------------ .../de/hysky/skyblocker/skyblock/ChestValue.java | 15 +++++++------- .../skyblock/auction/AuctionBrowserScreen.java | 2 +- .../item/tooltip/adders/BazaarPriceTooltip.java | 2 +- .../skyblock/item/tooltip/adders/LBinTooltip.java | 2 +- 6 files changed, 21 insertions(+), 25 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/injected/SkyblockerStack.java b/src/main/java/de/hysky/skyblocker/injected/SkyblockerStack.java index dc3d9c1f..2f54917b 100644 --- a/src/main/java/de/hysky/skyblocker/injected/SkyblockerStack.java +++ b/src/main/java/de/hysky/skyblocker/injected/SkyblockerStack.java @@ -9,7 +9,7 @@ public interface SkyblockerStack { } @Nullable - default String getSkyblockName() { + default String getSkyblockApiId() { return ""; } diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 1e5cff10..b57ee32a 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -43,7 +43,7 @@ public abstract class ItemStackMixin implements SkyblockerStack { private String skyblockId; @Unique - private String skyblockName; + private String skyblockApiId; @Unique private String neuName; @@ -127,34 +127,31 @@ public abstract class ItemStackMixin implements SkyblockerStack { @Nullable public String getSkyblockId() { if (skyblockId != null && !skyblockId.isEmpty()) return skyblockId; - skyblockId = skyblocker$getInternalNameFromNBT(true); - return skyblockId; + return skyblockId = skyblocker$getSkyblockId(true); } @Override @Nullable - public String getSkyblockName() { - if (skyblockName != null && !skyblockName.isEmpty()) return skyblockName; - skyblockName = skyblocker$getInternalNameFromNBT(false); - return skyblockName; + public String getSkyblockApiId() { + if (skyblockApiId != null && !skyblockApiId.isEmpty()) return skyblockApiId; + return skyblockApiId = skyblocker$getSkyblockId(false); } @Override @Nullable public String getNeuName() { if (neuName != null && !neuName.isEmpty()) return neuName; - String name = getSkyblockName(); + String apiId = getSkyblockApiId(); String id = getSkyblockId(); - if (name == null || id == null) return null; + if (apiId == null || id == null) return null; - if (name.startsWith("ISSHINY_")) name = id; + if (apiId.startsWith("ISSHINY_")) apiId = id; - neuName = ItemTooltip.getNeuName(id, name); - return neuName; + return neuName = ItemTooltip.getNeuName(id, apiId); } @Unique - private String skyblocker$getInternalNameFromNBT(boolean internalIDOnly) { + private String skyblocker$getSkyblockId(boolean internalIDOnly) { NbtCompound customData = ItemUtils.getCustomData((ItemStack) (Object) this); if (customData == null || !customData.contains(ItemUtils.ID, NbtElement.STRING_TYPE)) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index cc800803..0b5e623a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -12,7 +12,6 @@ import de.hysky.skyblocker.utils.Utils; import it.unimi.dsi.fastutil.longs.LongBooleanPair; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.fabric.api.client.screen.v1.Screens; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; @@ -44,7 +43,7 @@ public class ChestValue { if (DUNGEON_CHESTS.contains(titleString)) { if (SkyblockerConfigManager.get().dungeons.dungeonChestProfit.enableProfitCalculator) { ScreenEvents.afterTick(screen).register(screen_ -> - ((ScreenAccessor) screen).setTitle(getDungeonChestProfit(genericContainerScreen.getScreenHandler(), title, titleString, client)) + ((ScreenAccessor) screen).setTitle(getDungeonChestProfit(genericContainerScreen.getScreenHandler(), title, titleString)) ); } } else if (SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue && !titleString.equals("SkyBlock Menu")) { @@ -64,7 +63,7 @@ public class ChestValue { }); } - private static Text getDungeonChestProfit(GenericContainerScreenHandler handler, Text title, String titleString, MinecraftClient client) { + private static Text getDungeonChestProfit(GenericContainerScreenHandler handler, Text title, String titleString) { try { long profit = 0; boolean hasIncompleteData = false, usedKismet = false; @@ -80,7 +79,7 @@ public class ChestValue { } String name = stack.getName().getString(); - String internalName = stack.getSkyblockName(); + String internalName = stack.getSkyblockApiId(); //Regular item price if (internalName != null) { @@ -115,7 +114,7 @@ public class ChestValue { //Determine the cost of the chest if (name.contains("Open Reward Chest")) { - String foundString = searchLoreFor(stack, client, "Coins"); + String foundString = searchLoreFor(stack, "Coins"); //Incase we're searching the free chest if (!StringUtils.isBlank(foundString)) { @@ -127,7 +126,7 @@ public class ChestValue { //Determine if a kismet was used or not if (name.contains("Reroll Chest")) { - usedKismet = !StringUtils.isBlank(searchLoreFor(stack, client, "You already rerolled a chest!")); + usedKismet = !StringUtils.isBlank(searchLoreFor(stack, "You already rerolled a chest!")); } } @@ -159,7 +158,7 @@ public class ChestValue { continue; } - String internalName = stack.getSkyblockName(); + String internalName = stack.getSkyblockApiId(); if (internalName != null) { LongBooleanPair priceData = getItemPrice(internalName); @@ -205,7 +204,7 @@ public class ChestValue { /** * Searches for a specific string of characters in the name and lore of an item */ - private static String searchLoreFor(ItemStack stack, MinecraftClient client, String searchString) { + private static String searchLoreFor(ItemStack stack, String searchString) { return ItemUtils.getLoreLineIf(stack, line -> line.contains(searchString)); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java index 3d205252..557cb6c9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java @@ -295,7 +295,7 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI Date: Mon, 10 Jun 2024 12:09:05 +0800 Subject: Fix merge conflicts --- .../de/hysky/skyblocker/skyblock/ChestValue.java | 13 ++++++------ .../java/de/hysky/skyblocker/utils/ItemUtils.java | 24 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 0b5e623a..bee7b8ff 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -6,6 +6,7 @@ import de.hysky.skyblocker.config.configs.DungeonsConfig; import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.mixins.accessors.ScreenAccessor; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; @@ -79,11 +80,11 @@ public class ChestValue { } String name = stack.getName().getString(); - String internalName = stack.getSkyblockApiId(); + String id = stack.getSkyblockApiId(); //Regular item price - if (internalName != null) { - LongBooleanPair priceData = getItemPrice(internalName); + if (id != null) { + LongBooleanPair priceData = getItemPrice(id); if (!priceData.rightBoolean()) hasIncompleteData = true; @@ -158,10 +159,10 @@ public class ChestValue { continue; } - String internalName = stack.getSkyblockApiId(); + String id = stack.getSkyblockApiId(); - if (internalName != null) { - LongBooleanPair priceData = getItemPrice(internalName); + if (id != null) { + LongBooleanPair priceData = getItemPrice(id); if (!priceData.rightBoolean()) hasIncompleteData = true; diff --git a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java index fbc9bddc..1ac40d29 100644 --- a/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/ItemUtils.java @@ -8,6 +8,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; import com.mojang.serialization.codecs.RecordCodecBuilder; +import de.hysky.skyblocker.skyblock.item.tooltip.adders.ObtainedDateTooltip; import de.hysky.skyblocker.SkyblockerMod; import it.unimi.dsi.fastutil.ints.IntIntPair; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; @@ -102,6 +103,29 @@ public class ItemUtils { return getCustomData(stack).getString(UUID); } + /** + * This method converts the "timestamp" variable into the same date format as Hypixel represents it in the museum. + * Currently, there are two types of string timestamps the legacy which is built like this + * "dd/MM/yy hh:mm" ("25/04/20 16:38") and the current which is built like this + * "MM/dd/yy hh:mm aa" ("12/24/20 11:08 PM"). Since Hypixel transforms the two formats into one format without + * taking into account of their formats, we do the same. The final result looks like this + * "MMMM dd, yyyy" (December 24, 2020). + * Since the legacy format has a 25 as "month" SimpleDateFormat converts the 25 into 2 years and 1 month and makes + * "25/04/20 16:38" -> "January 04, 2022" instead of "April 25, 2020". + * This causes the museum rank to be much worse than it should be. + *

+ * This also handles the long timestamp format introduced in January 2024 where the timestamp is in epoch milliseconds. + * + * @param stack the item under the pointer + * @return if the item have a "Timestamp" it will be shown formated on the tooltip + * @deprecated use {@link ObtainedDateTooltip#getTimestamp(ItemStack)} instead + */ + public static String getTimestamp(ItemStack stack) { + NbtCompound customData = getCustomData(stack); + + return ObtainedDateTooltip.getTimestamp(stack); + } + public static boolean hasCustomDurability(@NotNull ItemStack stack) { NbtCompound customData = getCustomData(stack); return customData != null && (customData.contains("drill_fuel") || customData.getString(ID).equals("PICKONIMBUS")); -- cgit