aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/mixin
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/mixin')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java12
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java19
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java22
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java13
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java70
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/yacl/DoubleFieldControllerMixin.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/yacl/FloatFieldControllerMixin.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/yacl/IntegerFieldControllerMixin.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/yacl/LongFieldControllerMixin.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/yacl/NumberFieldControllerMixin.java43
10 files changed, 263 insertions, 32 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
index fff534b2..f68a4e94 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
@@ -2,14 +2,16 @@ package de.hysky.skyblocker.mixin;
import com.llamalad7.mixinextras.injector.WrapWithCondition;
import com.llamalad7.mixinextras.sugar.Local;
-import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonSecrets;
-import dev.cbyrne.betterinject.annotations.Inject;
import de.hysky.skyblocker.skyblock.FishingHelper;
+import de.hysky.skyblocker.skyblock.diana.MythologicalRitual;
+import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonSecrets;
import de.hysky.skyblocker.utils.Utils;
+import dev.cbyrne.betterinject.annotations.Inject;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity;
+import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket;
import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Mixin;
@@ -24,7 +26,6 @@ public abstract class ClientPlayNetworkHandlerMixin {
FishingHelper.onSound(packet);
}
- @SuppressWarnings("resource")
@ModifyVariable(method = "onItemPickupAnimation", at = @At(value = "STORE", ordinal = 0))
private ItemEntity skyblocker$onItemPickup(ItemEntity itemEntity, @Local LivingEntity collector) {
DungeonSecrets.onItemPickup(itemEntity, collector, collector == MinecraftClient.getInstance().player);
@@ -45,4 +46,9 @@ public abstract class ClientPlayNetworkHandlerMixin {
private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object... arg) {
return !Utils.isOnHypixel();
}
+
+ @Inject(method = "onParticle", at = @At("RETURN"))
+ private void skyblocker$onParticle(ParticleS2CPacket packet) {
+ MythologicalRitual.onParticle(packet);
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
index a6691fe8..b25db7cf 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
@@ -6,7 +6,11 @@ import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver;
import de.hysky.skyblocker.skyblock.experiment.ExperimentSolver;
import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver;
import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver;
-import de.hysky.skyblocker.skyblock.item.*;
+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.tooltip.BackpackPreview;
+import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
@@ -41,7 +45,7 @@ import java.util.regex.Matcher;
@Mixin(HandledScreen.class)
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
+ * 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;
@@ -61,7 +65,7 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen
@Inject(at = @At("HEAD"), method = "keyPressed")
public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) {
if (this.client != null && this.focusedSlot != null && keyCode != 256 && !this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) {
- WikiLookup.openWiki(this.focusedSlot);
+ WikiLookup.openWiki(this.focusedSlot, client.player);
}
}
@@ -78,7 +82,7 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen
// Backpack Preview
boolean shiftDown = SkyblockerConfigManager.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown();
- if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, focusedSlot.getIndex(), x, y)) {
+ if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, this, focusedSlot.getIndex(), x, y)) {
ci.cancel();
}
@@ -140,7 +144,7 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen
*/
@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()) {
+ 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();
@@ -174,7 +178,7 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen
}
}
}
- }
+ }
}
//TODO make this a util method somewhere else, eventually
@@ -184,6 +188,7 @@ public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen
@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);
+ if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds)
+ ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y);
}
}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java
new file mode 100644
index 00000000..b957603a
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java
@@ -0,0 +1,22 @@
+package de.hysky.skyblocker.mixin;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import net.minecraft.client.gui.hud.InGameOverlayRenderer;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
+
+@Mixin(InGameOverlayRenderer.class)
+public class InGameOverlayRendererMixin {
+
+ @ModifyArg(method = "renderFireOverlay", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/BufferBuilder;vertex(Lorg/joml/Matrix4f;FFF)Lnet/minecraft/client/render/VertexConsumer;"))
+ private static float configureFlameHeight(float y) {
+ return y - SkyblockerConfigManager.get().general.flameOverlay.flameHeight;
+ }
+
+ @ModifyArg(method = "renderFireOverlay", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumer;color(FFFF)Lnet/minecraft/client/render/VertexConsumer;"))
+ private static float configureFlameOpacity(float opacity) {
+ return opacity - SkyblockerConfigManager.get().general.flameOverlay.flameOpacity;
+ }
+
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java
index 98bea52b..6b49220b 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/ItemMixin.java
@@ -1,22 +1,19 @@
package de.hysky.skyblocker.mixin;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
-
-import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
-import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
-
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
+import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(Item.class)
public abstract class ItemMixin {
- @WrapOperation(
+ @Redirect(
method = {"getItemBarColor", "getItemBarStep"},
at = @At(value = "FIELD", target = "Lnet/minecraft/item/Item;maxDamage:I", opcode = Opcodes.GETFIELD)
)
- private int skyblocker$handlePickoDrillBar(Item item, Operation<Integer> original, ItemStack stack) {
+ private int skyblocker$handlePickoDrillBar(Item item, ItemStack stack) {
return stack.getMaxDamage();
}
}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
index 79a37d68..c5b2438a 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
@@ -4,48 +4,90 @@ package de.hysky.skyblocker.mixin;
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.ItemUtils.Durability;
import de.hysky.skyblocker.utils.Utils;
+import dev.cbyrne.betterinject.annotations.Inject;
+import it.unimi.dsi.fastutil.ints.IntIntPair;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@Mixin(ItemStack.class)
public abstract class ItemStackMixin {
+
+ @Shadow
+ public abstract int getDamage();
+
+ @Shadow
+ public abstract void setDamage(int damage);
+
+ @Unique
+ private int maxDamage;
+
@ModifyReturnValue(method = "getName", at = @At("RETURN"))
private Text skyblocker$customItemNames(Text original) {
- if (Utils.isOnSkyblock()) {
+ if (Utils.isOnSkyblock()) {
return SkyblockerConfigManager.get().general.customItemNames.getOrDefault(ItemUtils.getItemUuid((ItemStack) (Object) this), original);
}
return original;
}
+ /**
+ * Updates the durability of this item stack every tick when in the inventory.
+ */
+ @Inject(method = "inventoryTick", at = @At("TAIL"))
+ private void skyblocker$updateDamage() {
+ if (!skyblocker$shouldProcess()) {
+ return;
+ }
+ skyblocker$getAndCacheDurability();
+ }
+
@ModifyReturnValue(method = "getDamage", at = @At("RETURN"))
private int skyblocker$handleDamage(int original) {
- Durability dur = ItemUtils.getDurability((ItemStack) (Object) this);
- if (dur != null) {
- return dur.max() - dur.current();
+ // If the durability is already calculated, the original value should be the damage
+ if (!skyblocker$shouldProcess() || maxDamage != 0) {
+ return original;
}
- return original;
+ return skyblocker$getAndCacheDurability() ? getDamage() : original;
}
@ModifyReturnValue(method = "getMaxDamage", at = @At("RETURN"))
private int skyblocker$handleMaxDamage(int original) {
- Durability dur = ItemUtils.getDurability((ItemStack) (Object) this);
- if (dur != null) {
- return dur.max();
+ if (!skyblocker$shouldProcess()) {
+ return original;
}
- return original;
+ // If the max damage is already calculated, return it
+ if (maxDamage != 0) {
+ return maxDamage;
+ }
+ return skyblocker$getAndCacheDurability() ? maxDamage : original;
}
@ModifyReturnValue(method = "isDamageable", at = @At("RETURN"))
private boolean skyblocker$handleDamageable(boolean original) {
- Durability dur = ItemUtils.getDurability((ItemStack) (Object) this);
- if (dur != null) {
- return true;
+ return skyblocker$shouldProcess() || original;
+ }
+
+ @Unique
+ private boolean skyblocker$shouldProcess() {
+ return Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.dwarvenMines.enableDrillFuel && ItemUtils.hasCustomDurability((ItemStack) (Object) this);
+ }
+
+ @Unique
+ private boolean skyblocker$getAndCacheDurability() {
+ // Calculate the durability
+ IntIntPair durability = ItemUtils.getDurability((ItemStack) (Object) this);
+ // Return if calculating the durability failed
+ if (durability == null) {
+ return false;
}
- return original;
+ // Saves the calculated durability
+ maxDamage = durability.rightInt();
+ setDamage(durability.rightInt() - durability.leftInt());
+ return true;
}
}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/yacl/DoubleFieldControllerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/yacl/DoubleFieldControllerMixin.java
new file mode 100644
index 00000000..ac24c09f
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/yacl/DoubleFieldControllerMixin.java
@@ -0,0 +1,27 @@
+package de.hysky.skyblocker.mixin.yacl;
+
+import java.text.NumberFormat;
+import java.util.function.Function;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.gui.controllers.string.number.DoubleFieldController;
+import dev.isxander.yacl3.gui.controllers.string.number.NumberFieldController;
+import net.minecraft.text.Text;
+
+@Mixin(value = DoubleFieldController.class, remap = false)
+public abstract class DoubleFieldControllerMixin extends NumberFieldController<Double> {
+ private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance();
+
+
+ public DoubleFieldControllerMixin(Option<Double> option, Function<Double, Text> displayFormatter) {
+ super(option, displayFormatter);
+ }
+
+ @Overwrite
+ public String getString() {
+ return NUMBER_FORMAT.format(option().pendingValue());
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/yacl/FloatFieldControllerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/yacl/FloatFieldControllerMixin.java
new file mode 100644
index 00000000..d67993c2
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/yacl/FloatFieldControllerMixin.java
@@ -0,0 +1,27 @@
+package de.hysky.skyblocker.mixin.yacl;
+
+import java.text.NumberFormat;
+import java.util.function.Function;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.gui.controllers.string.number.FloatFieldController;
+import dev.isxander.yacl3.gui.controllers.string.number.NumberFieldController;
+import net.minecraft.text.Text;
+
+@Mixin(value = FloatFieldController.class, remap = false)
+public abstract class FloatFieldControllerMixin extends NumberFieldController<Float> {
+ private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance();
+
+
+ public FloatFieldControllerMixin(Option<Float> option, Function<Float, Text> displayFormatter) {
+ super(option, displayFormatter);
+ }
+
+ @Overwrite
+ public String getString() {
+ return NUMBER_FORMAT.format(option().pendingValue());
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/yacl/IntegerFieldControllerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/yacl/IntegerFieldControllerMixin.java
new file mode 100644
index 00000000..b95cbef7
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/yacl/IntegerFieldControllerMixin.java
@@ -0,0 +1,31 @@
+package de.hysky.skyblocker.mixin.yacl;
+
+import java.text.NumberFormat;
+import java.util.function.Function;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.gui.controllers.string.number.IntegerFieldController;
+import dev.isxander.yacl3.gui.controllers.string.number.NumberFieldController;
+import net.minecraft.text.Text;
+
+@Mixin(value = IntegerFieldController.class, remap = false)
+public abstract class IntegerFieldControllerMixin extends NumberFieldController<Integer> {
+ private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance();
+
+ public IntegerFieldControllerMixin(Option<Integer> option, Function<Integer, Text> displayFormatter) {
+ super(option, displayFormatter);
+ }
+
+ @Overwrite
+ public String getString() {
+ return NUMBER_FORMAT.format(option().pendingValue());
+ }
+
+ @Overwrite
+ public boolean isInputValid(String input) {
+ return super.isInputValid(input);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/yacl/LongFieldControllerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/yacl/LongFieldControllerMixin.java
new file mode 100644
index 00000000..99871e2e
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/yacl/LongFieldControllerMixin.java
@@ -0,0 +1,31 @@
+package de.hysky.skyblocker.mixin.yacl;
+
+import java.text.NumberFormat;
+import java.util.function.Function;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.gui.controllers.string.number.LongFieldController;
+import dev.isxander.yacl3.gui.controllers.string.number.NumberFieldController;
+import net.minecraft.text.Text;
+
+@Mixin(value = LongFieldController.class, remap = false)
+public abstract class LongFieldControllerMixin extends NumberFieldController<Long> {
+ private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance();
+
+ public LongFieldControllerMixin(Option<Long> option, Function<Long, Text> displayFormatter) {
+ super(option, displayFormatter);
+ }
+
+ @Overwrite
+ public String getString() {
+ return NUMBER_FORMAT.format(option().pendingValue());
+ }
+
+ @Overwrite
+ public boolean isInputValid(String input) {
+ return super.isInputValid(input);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/yacl/NumberFieldControllerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/yacl/NumberFieldControllerMixin.java
new file mode 100644
index 00000000..17a99cfd
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/yacl/NumberFieldControllerMixin.java
@@ -0,0 +1,43 @@
+package de.hysky.skyblocker.mixin.yacl;
+
+import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.ParsePosition;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+
+import dev.isxander.yacl3.gui.controllers.slider.ISliderController;
+import dev.isxander.yacl3.gui.controllers.string.number.NumberFieldController;
+import dev.isxander.yacl3.impl.utils.YACLConstants;
+import net.minecraft.util.math.MathHelper;
+
+@Mixin(value = NumberFieldController.class, remap = false)
+public abstract class NumberFieldControllerMixin<T extends Number> implements ISliderController<T> {
+ private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance();
+ private static final DecimalFormatSymbols DECIMAL_FORMAT_SYMBOLS = DecimalFormatSymbols.getInstance();
+
+ @Overwrite
+ public void setFromString(String value) {
+ try {
+ setPendingValue(MathHelper.clamp(NUMBER_FORMAT.parse(value).doubleValue(), min(), max()));
+ } catch (ParseException ignore) {
+ YACLConstants.LOGGER.warn("Failed to parse number: {}", value);
+ }
+ }
+
+ @Overwrite
+ public boolean isInputValid(String input) {
+ input = input.replace(DECIMAL_FORMAT_SYMBOLS.getGroupingSeparator() + "", "");
+ ParsePosition parsePosition = new ParsePosition(0);
+ NUMBER_FORMAT.parse(input, parsePosition);
+
+ return parsePosition.getIndex() == input.length();
+ }
+
+ @Overwrite
+ protected String cleanupNumberString(String number) {
+ throw new UnsupportedOperationException("This method should no longer be called.");
+ }
+}