aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-27 16:06:52 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-27 16:06:52 +0100
commitc41488139136c213fd5d799523da5f318a0014a2 (patch)
tree7ac8ab40bf7e8bd289c6c081f9d65c3f4749aed1
parentee0526ac67e093f77d17747d9316765b2db272a2 (diff)
downloadFirmament-c41488139136c213fd5d799523da5f318a0014a2.tar.gz
Firmament-c41488139136c213fd5d799523da5f318a0014a2.tar.bz2
Firmament-c41488139136c213fd5d799523da5f318a0014a2.zip
feat: Add item type function
-rw-r--r--src/main/kotlin/util/skyblock/AbilityUtils.kt1
-rw-r--r--src/main/kotlin/util/skyblock/ItemType.kt40
-rw-r--r--src/test/kotlin/util/skyblock/ItemTypeTest.kt53
3 files changed, 84 insertions, 10 deletions
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<ItemAbility> {
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<Any?, ItemType> {
- 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"))
+ )
+ }
+}