aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorvicisacat <victor.branchu@gmail.com>2023-09-14 15:54:08 +0200
committervicisacat <victor.branchu@gmail.com>2023-09-14 15:54:08 +0200
commitdf96aa7bb5bb79a78988ba6701e65a5de3a9ecf2 (patch)
tree46ac7bb637d57db31b2b2209ff6d124b572d8218 /src/main/java
parent992178bef293e0b31a2230ff4193d2ed99997bf0 (diff)
downloadSkyblocker-df96aa7bb5bb79a78988ba6701e65a5de3a9ecf2.tar.gz
Skyblocker-df96aa7bb5bb79a78988ba6701e65a5de3a9ecf2.tar.bz2
Skyblocker-df96aa7bb5bb79a78988ba6701e65a5de3a9ecf2.zip
"Refactor CompactorDeletorPreview logic for better structure"
Split the logic for CompactorDeletorPreview to reduce the complexity within the HandledScreenMixin.java file. This change helps to make the code simpler and easier to maintain.
Diffstat (limited to 'src/main/java')
-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;
+ }
+ }
+}