From ffebb438f8d1582ee65936399b79dd714454f223 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Sun, 17 Nov 2024 16:11:21 +0100 Subject: fix: Pets missing an item rarity --- .../features/inventory/ItemRarityCosmetics.kt | 108 +++++++++------------ .../features/inventory/buttons/InventoryButtons.kt | 2 +- src/main/kotlin/util/GetRectangle.kt | 17 ---- src/main/kotlin/util/SkyblockId.kt | 6 +- src/main/kotlin/util/StringUtil.kt | 9 ++ src/main/kotlin/util/accessors/GetRectangle.kt | 17 ++++ src/main/kotlin/util/skyblock/ItemType.kt | 21 ++++ src/main/kotlin/util/skyblock/Rarity.kt | 61 ++++++++++++ 8 files changed, 160 insertions(+), 81 deletions(-) delete mode 100644 src/main/kotlin/util/GetRectangle.kt create mode 100644 src/main/kotlin/util/StringUtil.kt create mode 100644 src/main/kotlin/util/accessors/GetRectangle.kt create mode 100644 src/main/kotlin/util/skyblock/ItemType.kt create mode 100644 src/main/kotlin/util/skyblock/Rarity.kt diff --git a/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt b/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt index 26712da..a659c79 100644 --- a/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt +++ b/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt @@ -1,5 +1,3 @@ - - package moe.nea.firmament.features.inventory import java.awt.Color @@ -13,74 +11,64 @@ import moe.nea.firmament.events.HotbarItemRenderEvent import moe.nea.firmament.events.SlotRenderEvents import moe.nea.firmament.features.FirmamentFeature import moe.nea.firmament.gui.config.ManagedConfig -import moe.nea.firmament.util.MC -import moe.nea.firmament.util.mc.loreAccordingToNbt import moe.nea.firmament.util.collections.lastNotNullOfOrNull import moe.nea.firmament.util.collections.memoizeIdentity -import moe.nea.firmament.util.render.drawGuiTexture +import moe.nea.firmament.util.mc.loreAccordingToNbt +import moe.nea.firmament.util.skyblock.Rarity import moe.nea.firmament.util.unformattedString object ItemRarityCosmetics : FirmamentFeature { - override val identifier: String - get() = "item-rarity-cosmetics" - - object TConfig : ManagedConfig(identifier, Category.INVENTORY) { - val showItemRarityBackground by toggle("background") { false } - val showItemRarityInHotbar by toggle("background-hotbar") { false } - } - - override val config: ManagedConfig - get() = TConfig - - private val rarityToColor = mapOf( - "UNCOMMON" to Formatting.GREEN, - "COMMON" to Formatting.WHITE, - "RARE" to Formatting.DARK_BLUE, - "EPIC" to Formatting.DARK_PURPLE, - "LEGENDARY" to Formatting.GOLD, - "LEGENJERRY" to Formatting.GOLD, - "MYTHIC" to Formatting.LIGHT_PURPLE, - "DIVINE" to Formatting.BLUE, - "SPECIAL" to Formatting.DARK_RED, - "SUPREME" to Formatting.DARK_RED, - ).mapValues { - val c = Color(it.value.colorValue!!) - c.rgb - } + override val identifier: String + get() = "item-rarity-cosmetics" - private fun getSkyblockRarity0(itemStack: ItemStack): Int? { - return itemStack.loreAccordingToNbt.lastNotNullOfOrNull { - val entry = it.unformattedString - rarityToColor.entries.find { (k, v) -> k in entry }?.value - } - } + object TConfig : ManagedConfig(identifier, Category.INVENTORY) { + val showItemRarityBackground by toggle("background") { false } + val showItemRarityInHotbar by toggle("background-hotbar") { false } + } - val getSkyblockRarity = ::getSkyblockRarity0.memoizeIdentity(100) + override val config: ManagedConfig + get() = TConfig + private val rarityToColor = mapOf( + Rarity.UNCOMMON to Formatting.GREEN, + Rarity.COMMON to Formatting.WHITE, + Rarity.RARE to Formatting.DARK_BLUE, + Rarity.EPIC to Formatting.DARK_PURPLE, + Rarity.LEGENDARY to Formatting.GOLD, + Rarity.MYTHIC to Formatting.LIGHT_PURPLE, + Rarity.DIVINE to Formatting.BLUE, + Rarity.SPECIAL to Formatting.DARK_RED, + Rarity.VERY_SPECIAL to Formatting.DARK_RED, + Rarity.SUPREME to Formatting.DARK_RED, + ).mapValues { + val c = Color(it.value.colorValue!!) + c.rgb + } - fun drawItemStackRarity(drawContext: DrawContext, x: Int, y: Int, item: ItemStack) { - val rgb = getSkyblockRarity(item) ?: return - drawContext.drawGuiTexture( - RenderLayer::getGuiTextured, - Identifier.of("firmament:item_rarity_background"), - x, y, - 16, 16, - rgb - ) - } + fun drawItemStackRarity(drawContext: DrawContext, x: Int, y: Int, item: ItemStack) { + val rarity = Rarity.fromItem(item) ?: return + val rgb = rarityToColor[rarity] ?: 0xFF00FF80.toInt() + drawContext.drawGuiTexture( + RenderLayer::getGuiTextured, + Identifier.of("firmament:item_rarity_background"), + x, y, + 16, 16, + rgb + ) + } - @Subscribe - fun onRenderSlot(it: SlotRenderEvents.Before) { - if (!TConfig.showItemRarityBackground) return - val stack = it.slot.stack ?: return - drawItemStackRarity(it.context, it.slot.x, it.slot.y, stack) - } + @Subscribe + fun onRenderSlot(it: SlotRenderEvents.Before) { + if (!TConfig.showItemRarityBackground) return + val stack = it.slot.stack ?: return + drawItemStackRarity(it.context, it.slot.x, it.slot.y, stack) + } - @Subscribe - fun onRenderHotbarItem(it: HotbarItemRenderEvent) { - if (!TConfig.showItemRarityInHotbar) return - val stack = it.item - drawItemStackRarity(it.context, it.x, it.y, stack) - } + @Subscribe + fun onRenderHotbarItem(it: HotbarItemRenderEvent) { + if (!TConfig.showItemRarityInHotbar) return + val stack = it.item + drawItemStackRarity(it.context, it.x, it.y, stack) + } } diff --git a/src/main/kotlin/features/inventory/buttons/InventoryButtons.kt b/src/main/kotlin/features/inventory/buttons/InventoryButtons.kt index ca64f80..d5b5417 100644 --- a/src/main/kotlin/features/inventory/buttons/InventoryButtons.kt +++ b/src/main/kotlin/features/inventory/buttons/InventoryButtons.kt @@ -14,7 +14,7 @@ import moe.nea.firmament.gui.config.ManagedConfig import moe.nea.firmament.util.MC import moe.nea.firmament.util.ScreenUtil import moe.nea.firmament.util.data.DataHolder -import moe.nea.firmament.util.getRectangle +import moe.nea.firmament.util.accessors.getRectangle object InventoryButtons : FirmamentFeature { override val identifier: String diff --git a/src/main/kotlin/util/GetRectangle.kt b/src/main/kotlin/util/GetRectangle.kt deleted file mode 100644 index ec64f31..0000000 --- a/src/main/kotlin/util/GetRectangle.kt +++ /dev/null @@ -1,17 +0,0 @@ - - -package moe.nea.firmament.util - -import me.shedaniel.math.Rectangle -import moe.nea.firmament.mixins.accessor.AccessorHandledScreen -import net.minecraft.client.gui.screen.ingame.HandledScreen - -fun HandledScreen<*>.getRectangle(): Rectangle { - this as AccessorHandledScreen - return Rectangle( - getX_Firmament(), - getY_Firmament(), - getBackgroundWidth_Firmament(), - getBackgroundHeight_Firmament() - ) -} diff --git a/src/main/kotlin/util/SkyblockId.kt b/src/main/kotlin/util/SkyblockId.kt index eeca70c..1c1aa77 100644 --- a/src/main/kotlin/util/SkyblockId.kt +++ b/src/main/kotlin/util/SkyblockId.kt @@ -101,7 +101,7 @@ data class HypixelPetInfo( val uuid: UUID? = null, val active: Boolean = false, ) { - val skyblockId get() = SkyblockId("${type.uppercase()};${tier.ordinal}") + val skyblockId get() = SkyblockId("${type.uppercase()};${tier.ordinal}") // TODO: is this ordinal set up correctly? } private val jsonparser = Json { ignoreUnknownKeys = true } @@ -125,8 +125,8 @@ val ItemStack.skyblockUUID: UUID? private val petDataCache = WeakCache.memoize>("PetInfo") { val jsonString = it.extraAttributes.getString("petInfo") if (jsonString.isNullOrBlank()) return@memoize Optional.empty() - runCatching { jsonparser.decodeFromString(jsonString) } - .getOrElse { null }.intoOptional() + ErrorUtil.catch("Could not decode hypixel pet info") { jsonparser.decodeFromString(jsonString) } + .or { null }.intoOptional() } val ItemStack.petData: HypixelPetInfo? diff --git a/src/main/kotlin/util/StringUtil.kt b/src/main/kotlin/util/StringUtil.kt new file mode 100644 index 0000000..d9253cb --- /dev/null +++ b/src/main/kotlin/util/StringUtil.kt @@ -0,0 +1,9 @@ +package moe.nea.firmament.util + +object StringUtil { + fun String.words(): Sequence { + return splitToSequence(" ") // TODO: better boundaries + } + + fun Iterable.unwords() = joinToString(" ") +} diff --git a/src/main/kotlin/util/accessors/GetRectangle.kt b/src/main/kotlin/util/accessors/GetRectangle.kt new file mode 100644 index 0000000..37acfd9 --- /dev/null +++ b/src/main/kotlin/util/accessors/GetRectangle.kt @@ -0,0 +1,17 @@ + + +package moe.nea.firmament.util.accessors + +import me.shedaniel.math.Rectangle +import moe.nea.firmament.mixins.accessor.AccessorHandledScreen +import net.minecraft.client.gui.screen.ingame.HandledScreen + +fun HandledScreen<*>.getRectangle(): Rectangle { + this as AccessorHandledScreen + return Rectangle( + getX_Firmament(), + getY_Firmament(), + getBackgroundWidth_Firmament(), + getBackgroundHeight_Firmament() + ) +} diff --git a/src/main/kotlin/util/skyblock/ItemType.kt b/src/main/kotlin/util/skyblock/ItemType.kt new file mode 100644 index 0000000..7d53c0d --- /dev/null +++ b/src/main/kotlin/util/skyblock/ItemType.kt @@ -0,0 +1,21 @@ +package moe.nea.firmament.util.skyblock + +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty + + +class ItemType(val name: String) { + companion object { + private val generated = object : ReadOnlyProperty { + override fun getValue(thisRef: Any?, property: KProperty<*>): ItemType { + return ItemType.ofName(property.name) + } + } + + fun ofName(name: String): ItemType { + return ItemType(name) + } + + val SWORD by generated + } +} diff --git a/src/main/kotlin/util/skyblock/Rarity.kt b/src/main/kotlin/util/skyblock/Rarity.kt new file mode 100644 index 0000000..f26cefe --- /dev/null +++ b/src/main/kotlin/util/skyblock/Rarity.kt @@ -0,0 +1,61 @@ +package moe.nea.firmament.util.skyblock + +import net.minecraft.item.ItemStack +import net.minecraft.text.Text +import moe.nea.firmament.util.StringUtil.words +import moe.nea.firmament.util.collections.lastNotNullOfOrNull +import moe.nea.firmament.util.mc.loreAccordingToNbt +import moe.nea.firmament.util.petData +import moe.nea.firmament.util.unformattedString + +typealias RepoRarity = io.github.moulberry.repo.data.Rarity + +enum class Rarity(vararg altNames: String) { + COMMON, + UNCOMMON, + RARE, + EPIC, + LEGENDARY("LEGENJERRY"), + MYTHIC, + DIVINE, + SUPREME, + SPECIAL, + VERY_SPECIAL, + UNKNOWN + ; + + val names = setOf(name) + altNames + + val neuRepoRarity: RepoRarity? = RepoRarity.entries.find { it.name == name } + + companion object { + val byName = entries.flatMap { en -> en.names.map { it to en } }.toMap() + val fromNeuRepo = entries.associateBy { it.neuRepoRarity } + + fun fromNeuRepo(repo: RepoRarity): Rarity? { + return fromNeuRepo[repo] + } + + fun fromString(name: String): Rarity? { + return byName[name] + } + + fun fromTier(tier: Int): Rarity? { + return entries.getOrNull(tier) + } + + fun fromItem(itemStack: ItemStack): Rarity? { + return fromLore(itemStack.loreAccordingToNbt) ?: fromPetItem(itemStack) + } + + fun fromPetItem(itemStack: ItemStack): Rarity? = + itemStack.petData?.tier?.let(::fromNeuRepo) + + fun fromLore(lore: List): Rarity? = + lore.lastNotNullOfOrNull { + it.unformattedString.words() + .firstNotNullOfOrNull(::fromString) + } + + } +} -- cgit