aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
diff options
context:
space:
mode:
authormsg-programs <msgdoesstuff@gmail.com>2023-10-31 21:03:42 +0100
committermsg-programs <msgdoesstuff@gmail.com>2023-10-31 21:03:42 +0100
commitd560c4611e603fa9e72ff6842bc14518d7bdbd63 (patch)
tree36eb1e24443bc9d9fbba51e14f12e5aacfac935c /src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
parent1df4ef827d8a2e2fcc3767c1f5bf961f16b7fa19 (diff)
parent5bb91104d3275283d7479f0b35c1b18be470d632 (diff)
downloadSkyblocker-d560c4611e603fa9e72ff6842bc14518d7bdbd63.tar.gz
Skyblocker-d560c4611e603fa9e72ff6842bc14518d7bdbd63.tar.bz2
Skyblocker-d560c4611e603fa9e72ff6842bc14518d7bdbd63.zip
Merge branch 'master' of https://github.com/SkyblockerMod/Skyblocker into cleanup-2
# Conflicts: # src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java # src/main/java/de/hysky/skyblocker/utils/Http.java # src/main/java/de/hysky/skyblocker/utils/render/title/TitleContainerConfigScreen.java Pull changes from upstream master
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java70
1 files changed, 56 insertions, 14 deletions
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;
}
}