From c41488139136c213fd5d799523da5f318a0014a2 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Wed, 27 Nov 2024 16:06:52 +0100 Subject: feat: Add item type function --- src/main/kotlin/util/skyblock/AbilityUtils.kt | 1 + src/main/kotlin/util/skyblock/ItemType.kt | 40 +++++++++++++++----- src/test/kotlin/util/skyblock/ItemTypeTest.kt | 53 +++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 src/test/kotlin/util/skyblock/ItemTypeTest.kt diff --git a/src/main/kotlin/util/skyblock/AbilityUtils.kt b/src/main/kotlin/util/skyblock/AbilityUtils.kt index 0f0adbe..0d7d2b7 100644 --- a/src/main/kotlin/util/skyblock/AbilityUtils.kt +++ b/src/main/kotlin/util/skyblock/AbilityUtils.kt @@ -131,6 +131,7 @@ object AbilityUtils { return abilities } + // TODO: memoize fun getAbilities(itemStack: ItemStack): List { return getAbilities(itemStack.loreAccordingToNbt) } diff --git a/src/main/kotlin/util/skyblock/ItemType.kt b/src/main/kotlin/util/skyblock/ItemType.kt index 7d53c0d..b031b69 100644 --- a/src/main/kotlin/util/skyblock/ItemType.kt +++ b/src/main/kotlin/util/skyblock/ItemType.kt @@ -1,21 +1,41 @@ package moe.nea.firmament.util.skyblock -import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty +import net.minecraft.item.ItemStack +import moe.nea.firmament.util.directLiteralStringContent +import moe.nea.firmament.util.mc.loreAccordingToNbt +import moe.nea.firmament.util.petData -class ItemType(val name: String) { +@JvmInline +value class ItemType private constructor(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 + fun fromItemStack(itemStack: ItemStack): ItemType? { + if (itemStack.petData != null) + return PET + val typeText = + itemStack.loreAccordingToNbt.lastOrNull() + ?.siblings?.find { + !it.style.isObfuscated && !it.directLiteralStringContent.isNullOrBlank() + }?.directLiteralStringContent + if (typeText != null) { + val type = typeText.substringAfter(' ', missingDelimiterValue = "").trim() + if (type.isEmpty()) return null + return ofName(type) + } + return null + } + + val SWORD = ofName("SWORD") + val DRILL = ofName("DRILL") + val PICKAXE = ofName("PICKAXE") + + /** + * This one is not really official (it never shows up in game). + */ + val PET = ofName("PET") } } diff --git a/src/test/kotlin/util/skyblock/ItemTypeTest.kt b/src/test/kotlin/util/skyblock/ItemTypeTest.kt new file mode 100644 index 0000000..c89e57d --- /dev/null +++ b/src/test/kotlin/util/skyblock/ItemTypeTest.kt @@ -0,0 +1,53 @@ +package moe.nea.firmament.test.util.skyblock + +import io.kotest.core.spec.style.AnnotationSpec +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import moe.nea.firmament.test.testutil.ItemResources +import moe.nea.firmament.util.skyblock.ItemType + +class ItemTypeTest : AnnotationSpec() { + @Test + fun testPetItem() { + Assertions.assertEquals( + ItemType.PET, + ItemType.fromItemStack(ItemResources.loadItem("pets/lion-item")) + ) + } + + @Test + fun testPetInUI() { + Assertions.assertEquals( + ItemType.PET, + ItemType.fromItemStack(ItemResources.loadItem("pets/rabbit-selected")) + ) + Assertions.assertEquals( + ItemType.PET, + ItemType.fromItemStack(ItemResources.loadItem("pets/mithril-golem-not-selected")) + ) + } + + @Test + fun testAOTV() { + Assertions.assertEquals( + ItemType.SWORD, + ItemType.fromItemStack(ItemResources.loadItem("aspect-of-the-void")) + ) + } + + @Test + fun testDrill() { + Assertions.assertEquals( + ItemType.DRILL, + ItemType.fromItemStack(ItemResources.loadItem("titanium-drill")) + ) + } + + @Test + fun testPickaxe() { + Assertions.assertEquals( + ItemType.PICKAXE, + ItemType.fromItemStack(ItemResources.loadItem("diamond-pickaxe")) + ) + } +} -- cgit