aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java72
1 files changed, 71 insertions, 1 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
index 17497ded..7e94d660 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
@@ -8,20 +8,27 @@ import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver;
import me.xmrvizzy.skyblocker.skyblock.experiment.UltrasequencerSolver;
import me.xmrvizzy.skyblocker.skyblock.item.BackpackPreview;
import me.xmrvizzy.skyblocker.skyblock.item.CompactorDeletorPreview;
+import me.xmrvizzy.skyblocker.skyblock.item.ItemProtection;
+import me.xmrvizzy.skyblocker.skyblock.item.ItemRarityBackgrounds;
import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup;
import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry;
import me.xmrvizzy.skyblocker.utils.Utils;
import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver;
+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.item.TooltipContext;
import net.minecraft.inventory.SimpleInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
+import net.minecraft.screen.GenericContainerScreenHandler;
+import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
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;
@@ -36,10 +43,20 @@ import java.util.Map;
import java.util.regex.Matcher;
@Mixin(HandledScreen.class)
-public abstract class HandledScreenMixin extends Screen {
+public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen {
+ /**
+ * This is the slot id returned for when a click is outside of the screen's bounds
+ */
+ @Unique
+ private static final int OUT_OF_BOUNDS_SLOT = -999;
+
@Shadow
@Nullable
protected Slot focusedSlot;
+
+ @Shadow
+ @Final
+ protected T handler;
protected HandledScreenMixin(Text title) {
super(title);
@@ -120,4 +137,57 @@ public abstract class HandledScreenMixin extends Screen {
}
}
}
+
+ /**
+ * 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
+ */
+ @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At("HEAD"), cancellable = true)
+ private void skyblocker$onSlotInteract(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) {
+ if (Utils.isOnSkyblock()) {
+ // When you try and drop the item by picking it up then clicking outside of the screen
+ if (slotId == OUT_OF_BOUNDS_SLOT) {
+ ItemStack cursorStack = this.handler.getCursorStack();
+
+ if (ItemProtection.isItemProtected(cursorStack)) ci.cancel();
+ }
+
+ if (slot != null) {
+ // When you click your drop key while hovering over an item
+ if (actionType == SlotActionType.THROW) {
+ ItemStack stack = slot.getStack();
+
+ if (ItemProtection.isItemProtected(stack)) ci.cancel();
+ }
+
+ //Prevent salvaging
+ if (this.getTitle().getString().equals("Salvage Items")) {
+ ItemStack stack = slot.getStack();
+
+ if (ItemProtection.isItemProtected(stack)) ci.cancel();
+ }
+
+ //Prevent selling to NPC shops
+ if (this.client != null && this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) {
+ ItemStack sellItem = this.handler.slots.get(49).getStack();
+
+ if (sellItem.getName().getString().equals("Sell Item") || skyblocker$doesLoreContain(sellItem, this.client, "buyback")) {
+ ItemStack stack = slot.getStack();
+
+ if (ItemProtection.isItemProtected(stack)) ci.cancel();
+ }
+ }
+ }
+ }
+ }
+
+ //TODO make this a util method somewhere else, eventually
+ private static boolean skyblocker$doesLoreContain(ItemStack stack, MinecraftClient client, String searchString) {
+ return stack.getTooltip(client.player, TooltipContext.BASIC).stream().map(Text::getString).anyMatch(line -> line.contains(searchString));
+ }
+
+ @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);
+ }
}