aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java130
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CompactorDeletorPreview.java122
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;
+ }
+ }
+}