diff options
Diffstat (limited to 'src/main/java/me')
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java | 130 | ||||
-rw-r--r-- | src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CompactorDeletorPreview.java | 122 |
2 files changed, 135 insertions, 117 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java index e16568a6..ddcbb33f 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java +++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java @@ -8,7 +8,7 @@ import me.xmrvizzy.skyblocker.skyblock.experiment.ChronomatronSolver; import me.xmrvizzy.skyblocker.skyblock.experiment.ExperimentSolver; import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver; import me.xmrvizzy.skyblocker.skyblock.experiment.UltrasequencerSolver; -import me.xmrvizzy.skyblocker.skyblock.item.CompactorPreviewTooltipComponent; +import me.xmrvizzy.skyblocker.skyblock.item.CompactorDeletorPreview; import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup; import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; import me.xmrvizzy.skyblocker.utils.Utils; @@ -16,18 +16,12 @@ import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver; 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.tooltip.HoveredTooltipPositioner; -import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.MutableText; -import net.minecraft.text.Style; import net.minecraft.text.Text; -import net.minecraft.util.Formatting; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -39,10 +33,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Set; @Mixin(HandledScreen.class) public abstract class HandledScreenMixin extends Screen { @@ -50,17 +41,6 @@ public abstract class HandledScreenMixin extends Screen { @Nullable protected Slot focusedSlot; - @Unique - private static final Map<String, int[]> personalCompactorTypeToSlot = new HashMap<>(); - // Lines, and slots per lines - static { - personalCompactorTypeToSlot.put("4000", new int[]{1,1}); - personalCompactorTypeToSlot.put("5000", new int[]{1,3}); - personalCompactorTypeToSlot.put("6000", new int[]{1,7}); - personalCompactorTypeToSlot.put("7000", new int[]{2,6}); - personalCompactorTypeToSlot.put("default", new int[]{1,6}); - } - protected HandledScreenMixin(Text title) { super(title); } @@ -72,8 +52,12 @@ public abstract class HandledScreenMixin extends Screen { } } - @Inject(at = @At("HEAD"), method = "drawMouseoverTooltip", cancellable = true) + @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) { + ItemStack stack = this.focusedSlot.getStack(); + String internalName = ItemRegistry.getInternalName(stack); + // Hide Empty Tooltips if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideEmptyTooltips && this.focusedSlot != null && focusedSlot.getStack().getName().getString().equals(" ")) { ci.cancel(); @@ -81,7 +65,13 @@ public abstract class HandledScreenMixin extends Screen { // Backpack Preview boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown(); - if (this.client != null && this.client.player != null && this.focusedSlot != null && shiftDown && this.getTitle().getString().equals("Storage") && this.focusedSlot.inventory != this.client.player.getInventory() && BackpackPreview.renderPreview(context, this.focusedSlot.getIndex(), x, y)) { + if (this.client == null || this.client.player == null) return; + if (shiftDown && this.getTitle().getString().equals("Storage") && this.focusedSlot.inventory != this.client.player.getInventory() && BackpackPreview.renderPreview(context, this.focusedSlot.getIndex(), x, y)) { + ci.cancel(); + } + + // Compactor Preview + if ((internalName.contains("PERSONAL_COMPACTOR_") || internalName.contains("PERSONAL_DELETOR_")) && CompactorDeletorPreview.displayCompactorDeletorPreview((DrawContextInvoker) context, x, y, stack)) { ci.cancel(); } } @@ -96,91 +86,7 @@ public abstract class HandledScreenMixin extends Screen { return skyblocker$experimentSolvers$getStack(slot, stack); } - @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) - private void skyblocker$addTooltipComponent(DrawContext context, int x, int y, CallbackInfo ci) { - if (this.focusedSlot == null || this.client == null) return; - ItemStack stack = this.focusedSlot.getStack(); - String internalName = ItemRegistry.getInternalName(stack); - // PERSONAL COMPACTOR - if (internalName.contains("PERSONAL_COMPACTOR_") || internalName.contains("PERSONAL_DELETOR_")) { - String prefix; - String itemSlotPrefix; - if (internalName.contains("PERSONAL_COMPACTOR_")) { - prefix = "PERSONAL_COMPACTOR_"; - itemSlotPrefix = "personal_compact_"; - } else { - prefix = "PERSONAL_DELETOR_"; - itemSlotPrefix = "personal_deletor_"; - } - - // Find the line to insert component - int targetIndex = -1; - int lineCount = 0; - List<Text> tooltips = Screen.getTooltipFromItem(this.client, stack); - for (int i = 0; i < tooltips.size(); i++) { - if (tooltips.get(i).getString().isEmpty()) { - lineCount += 1; - } - if (lineCount == 2) { - targetIndex = i; - break; - } - } - if (targetIndex == -1) return; - List<TooltipComponent> components = new java.util.ArrayList<>(tooltips.stream().map(Text::asOrderedText).map(TooltipComponent::of).toList()); - - // STUFF - String internalID = ItemRegistry.getInternalName(stack); - String compactorType = internalID.replaceFirst(prefix, ""); - int[] dimensions = personalCompactorTypeToSlot.containsKey(compactorType) ? personalCompactorTypeToSlot.get(compactorType) : personalCompactorTypeToSlot.get("default"); - - NbtCompound nbt = stack.getNbt(); - if (nbt == null || !nbt.contains("ExtraAttributes", 10)) { - return; - } - NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes"); - Set<String> attributesKeys = extraAttributes.getKeys(); - List<String> compactorItems = attributesKeys.stream().filter(s -> s.contains(itemSlotPrefix)).toList(); - Map<Integer, ItemStack> slotAndItem = new HashMap<>(); - - if (compactorItems.isEmpty()) { - int slotsCount = (dimensions[0] * dimensions[1]); - components.add(targetIndex, TooltipComponent.of(Text.literal( - slotsCount + (slotsCount == 1 ? " slot": " slots")) - .fillStyle(Style.EMPTY.withColor(Formatting.DARK_GRAY)).asOrderedText())); - - ((DrawContextInvoker) context).invokeDrawTooltip(textRenderer, components, x, y, HoveredTooltipPositioner.INSTANCE); - ci.cancel(); - return; - } - - compactorItems.forEach(s -> slotAndItem.put(getNumberAtEnd(s, itemSlotPrefix), ItemRegistry.getItemStack(extraAttributes.getString(s)))); - - - components.add(targetIndex, new CompactorPreviewTooltipComponent(slotAndItem, dimensions)); - components.add(targetIndex, TooltipComponent.of(Text.literal(" ").append( - Text.literal("Contents:").fillStyle(Style.EMPTY - .withItalic(true))) - .asOrderedText())); - if (attributesKeys.stream().anyMatch(s -> s.contains("PERSONAL_DELETOR_ACTIVE"))) { - MutableText isActiveText = Text.literal("Active: "); - if (extraAttributes.getBoolean("PERSONAL_DELETOR_ACTIVE")) { - components.add(targetIndex, TooltipComponent.of(isActiveText.append( - Text.literal("YES").fillStyle(Style.EMPTY.withBold(true).withColor(Formatting.GREEN)) - ).asOrderedText() - )); - } else { - components.add(targetIndex, TooltipComponent.of(isActiveText.append( - Text.literal("NO").fillStyle(Style.EMPTY.withBold(true).withColor(Formatting.RED)) - ).asOrderedText() - )); - } - } - ((DrawContextInvoker) context).invokeDrawTooltip(textRenderer, components, x, y, HoveredTooltipPositioner.INSTANCE); - ci.cancel(); - } - } @Unique private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, ItemStack stack) { @@ -212,14 +118,4 @@ public abstract class HandledScreenMixin extends Screen { } } } - - @Unique - private static Integer getNumberAtEnd(String str, String attributesKey) { - try { - String numberPartOfTheString = str.replace(attributesKey, ""); - return Integer.parseInt(numberPartOfTheString); - } catch (NumberFormatException e) { - return 0; - } - } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CompactorDeletorPreview.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CompactorDeletorPreview.java new file mode 100644 index 00000000..70a37b8a --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CompactorDeletorPreview.java @@ -0,0 +1,122 @@ +package me.xmrvizzy.skyblocker.skyblock.item; + +import me.xmrvizzy.skyblocker.mixin.accessor.DrawContextInvoker; +import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry; +import net.minecraft.client.MinecraftClient; +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; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.text.MutableText; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class CompactorDeletorPreview { + + private static final MinecraftClient mcClient = MinecraftClient.getInstance(); + private static final Map<String, int[]> personalCompactorTypeToSlot = new HashMap<>(); + // Lines, and slots per lines + static { + personalCompactorTypeToSlot.put("4000", new int[]{1,1}); + personalCompactorTypeToSlot.put("5000", new int[]{1,3}); + personalCompactorTypeToSlot.put("6000", new int[]{1,7}); + personalCompactorTypeToSlot.put("7000", new int[]{2,6}); + personalCompactorTypeToSlot.put("default", new int[]{1,6}); + } + + public static boolean displayCompactorDeletorPreview(DrawContextInvoker context, int x, int y, ItemStack stack) { + String internalName = ItemRegistry.getInternalName(stack); + + String prefix; + String itemSlotPrefix; + if (internalName.contains("PERSONAL_COMPACTOR_")) { + prefix = "PERSONAL_COMPACTOR_"; + itemSlotPrefix = "personal_compact_"; + } else { + prefix = "PERSONAL_DELETOR_"; + itemSlotPrefix = "personal_deletor_"; + } + + // Find the line to insert component + int targetIndex = -1; + int lineCount = 0; + + List<Text> tooltips = Screen.getTooltipFromItem(mcClient, stack); + for (int i = 0; i < tooltips.size(); i++) { + if (tooltips.get(i).getString().isEmpty()) { + lineCount += 1; + } + if (lineCount == 2) { + targetIndex = i; + break; + } + } + if (targetIndex == -1) return false; + List<TooltipComponent> components = new java.util.ArrayList<>(tooltips.stream().map(Text::asOrderedText).map(TooltipComponent::of).toList()); + + // STUFF + String internalID = ItemRegistry.getInternalName(stack); + String compactorType = internalID.replaceFirst(prefix, ""); + int[] dimensions = personalCompactorTypeToSlot.containsKey(compactorType) ? personalCompactorTypeToSlot.get(compactorType) : personalCompactorTypeToSlot.get("default"); + + NbtCompound nbt = stack.getNbt(); + if (nbt == null || !nbt.contains("ExtraAttributes", 10)) { + return false; + } + NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes"); + Set<String> attributesKeys = extraAttributes.getKeys(); + List<String> compactorItems = attributesKeys.stream().filter(s -> s.contains(itemSlotPrefix)).toList(); + Map<Integer, ItemStack> slotAndItem = new HashMap<>(); + + if (compactorItems.isEmpty()) { + int slotsCount = (dimensions[0] * dimensions[1]); + components.add(targetIndex, TooltipComponent.of(Text.literal( + slotsCount + (slotsCount == 1 ? " slot": " slots")) + .fillStyle(Style.EMPTY.withColor(Formatting.DARK_GRAY)).asOrderedText())); + + context.invokeDrawTooltip(mcClient.textRenderer, components, x, y, HoveredTooltipPositioner.INSTANCE); + return true; + } + + compactorItems.forEach(s -> slotAndItem.put(getNumberAtEnd(s, itemSlotPrefix), ItemRegistry.getItemStack(extraAttributes.getString(s)))); + + + components.add(targetIndex, new CompactorPreviewTooltipComponent(slotAndItem, dimensions)); + components.add(targetIndex, TooltipComponent.of(Text.literal(" ").append( + Text.literal("Contents:").fillStyle(Style.EMPTY + .withItalic(true))) + .asOrderedText())); + if (attributesKeys.stream().anyMatch(s -> s.contains("PERSONAL_DELETOR_ACTIVE"))) { + MutableText isActiveText = Text.literal("Active: "); + if (extraAttributes.getBoolean("PERSONAL_DELETOR_ACTIVE")) { + components.add(targetIndex, TooltipComponent.of(isActiveText.append( + Text.literal("YES").fillStyle(Style.EMPTY.withBold(true).withColor(Formatting.GREEN)) + ).asOrderedText() + )); + } else { + components.add(targetIndex, TooltipComponent.of(isActiveText.append( + Text.literal("NO").fillStyle(Style.EMPTY.withBold(true).withColor(Formatting.RED)) + ).asOrderedText() + )); + } + } + context.invokeDrawTooltip(mcClient.textRenderer, components, x, y, HoveredTooltipPositioner.INSTANCE); + return true; + } + + private static Integer getNumberAtEnd(String str, String attributesKey) { + try { + String numberPartOfTheString = str.replace(attributesKey, ""); + return Integer.parseInt(numberPartOfTheString); + } catch (NumberFormatException e) { + return 0; + } + } +} |