diff options
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/mixin')
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."); + } +} |