diff options
author | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-06-01 14:01:14 +0300 |
---|---|---|
committer | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-06-08 04:13:47 +0300 |
commit | d5a5fc05b8d7f73c16b069d45396e55e4d0b3efa (patch) | |
tree | f3358c8645728e29ec38c20dea098cac54919a41 /src/main/java/de/hysky/skyblocker/mixins | |
parent | 8eab800571a599ef5f5ec7c3a353e8bb3b948b69 (diff) | |
download | Skyblocker-d5a5fc05b8d7f73c16b069d45396e55e4d0b3efa.tar.gz Skyblocker-d5a5fc05b8d7f73c16b069d45396e55e4d0b3efa.tar.bz2 Skyblocker-d5a5fc05b8d7f73c16b069d45396e55e4d0b3efa.zip |
Switch to interface injection to cache the items' internal ids and neu names
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/mixins')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java | 107 |
1 files changed, 106 insertions, 1 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java index 878a93ac..48710bc0 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java @@ -1,13 +1,19 @@ package de.hysky.skyblocker.mixins; +import com.google.gson.JsonObject; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.injected.ItemStackInternalIdGetter; +import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import it.unimi.dsi.fastutil.ints.IntIntPair; import net.minecraft.component.type.ItemEnchantmentsComponent; import net.minecraft.item.ItemStack; import net.minecraft.item.TooltipAppender; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -17,8 +23,11 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Locale; +import java.util.Optional; + @Mixin(ItemStack.class) -public abstract class ItemStackMixin { +public abstract class ItemStackMixin implements ItemStackInternalIdGetter { @Shadow public abstract int getDamage(); @@ -29,6 +38,15 @@ public abstract class ItemStackMixin { @Unique private int maxDamage; + @Unique + private String internalId; + + @Unique + private String internalName; + + @Unique + private String neuName; + @ModifyReturnValue(method = "getName", at = @At("RETURN")) private Text skyblocker$customItemNames(Text original) { if (Utils.isOnSkyblock()) { @@ -103,4 +121,91 @@ public abstract class ItemStackMixin { setDamage(durability.rightInt() - durability.leftInt()); return true; } + + @Override + public String skyblocker$getInternalId(boolean internalIDOnly) { + if (internalIDOnly) { + if (internalId != null && !internalId.isEmpty()) return internalId; + internalId = skyblocker$getInternalNameFromNBT(true); + return internalId; + } // else + if (internalName != null && !internalName.isEmpty()) return internalName; + internalName = skyblocker$getInternalNameFromNBT(false); + return internalName; + } + + @Override + public String skyblocker$getNeuName() { + if (neuName != null && !neuName.isEmpty()) return neuName; + String name = skyblocker$getInternalId(false); + String internalId = skyblocker$getInternalId(true); + if (name == null || internalId == null) return ""; + + if (name.startsWith("ISSHINY_")) name = internalId; + + neuName = ItemTooltip.getNeuName(internalId, name); + return neuName; + } + + @Unique + private String skyblocker$getInternalNameFromNBT(boolean internalIDOnly) { + NbtCompound customData = ItemUtils.getCustomData((ItemStack) (Object) this); + + if (customData == null || !customData.contains(ItemUtils.ID, NbtElement.STRING_TYPE)) { + return null; + } + String customDataString = customData.getString(ItemUtils.ID); + + if (internalIDOnly) { + return customDataString; + } + + // Transformation to API format. + if (customData.contains("is_shiny")) { + return "ISSHINY_" + customDataString; + } + + switch (customDataString) { + case "ENCHANTED_BOOK" -> { + if (customData.contains("enchantments")) { + NbtCompound enchants = customData.getCompound("enchantments"); + Optional<String> firstEnchant = enchants.getKeys().stream().findFirst(); + String enchant = firstEnchant.orElse(""); + return "ENCHANTMENT_" + enchant.toUpperCase(Locale.ENGLISH) + "_" + enchants.getInt(enchant); + } + } + case "PET" -> { + if (customData.contains("petInfo")) { + JsonObject petInfo = SkyblockerMod.GSON.fromJson(customData.getString("petInfo"), JsonObject.class); + return "LVL_1_" + petInfo.get("tier").getAsString() + "_" + petInfo.get("type").getAsString(); + } + } + case "POTION" -> { + String enhanced = customData.contains("enhanced") ? "_ENHANCED" : ""; + String extended = customData.contains("extended") ? "_EXTENDED" : ""; + String splash = customData.contains("splash") ? "_SPLASH" : ""; + if (customData.contains("potion") && customData.contains("potion_level")) { + return (customData.getString("potion") + "_" + customDataString + "_" + customData.getInt("potion_level") + + enhanced + extended + splash).toUpperCase(Locale.ENGLISH); + } + } + case "RUNE" -> { + if (customData.contains("runes")) { + NbtCompound runes = customData.getCompound("runes"); + Optional<String> firstRunes = runes.getKeys().stream().findFirst(); + String rune = firstRunes.orElse(""); + return rune.toUpperCase(Locale.ENGLISH) + "_RUNE_" + runes.getInt(rune); + } + } + case "ATTRIBUTE_SHARD" -> { + if (customData.contains("attributes")) { + NbtCompound shards = customData.getCompound("attributes"); + Optional<String> firstShards = shards.getKeys().stream().findFirst(); + String shard = firstShards.orElse(""); + return customDataString + "-" + shard.toUpperCase(Locale.ENGLISH) + "_" + shards.getInt(shard); + } + } + } + return customDataString; + } } |