Skip to content

Commit 46e8ff8

Browse files
committed
item ability utils
1 parent 5b8f2f1 commit 46e8ff8

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

Diff for: src/main/kotlin/dev/sterner/api/VoidBoundApi.kt

+54
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package dev.sterner.api
33
import com.sammy.malum.client.VoidRevelationHandler
44
import com.sammy.malum.common.container.WeaversWorkbenchContainer.component
55
import com.sammy.malum.core.systems.recipe.SpiritWithCount
6+
import dev.sterner.api.item.ItemAbility
7+
import dev.sterner.api.item.ItemAbilityWithLevel
68
import dev.sterner.listener.EnchantSpiritDataReloadListener
79
import dev.sterner.registry.VoidBoundComponentRegistry
810
import dev.sterner.registry.VoidBoundItemRegistry
@@ -13,6 +15,7 @@ import net.minecraft.core.registries.BuiltInRegistries
1315
import net.minecraft.network.chat.Component
1416
import net.minecraft.world.entity.EquipmentSlot
1517
import net.minecraft.world.entity.player.Player
18+
import net.minecraft.world.item.ItemStack
1619
import net.minecraft.world.item.enchantment.Enchantment
1720
import net.minecraft.world.level.Level
1821
import team.lodestar.lodestone.helpers.TrinketsHelper
@@ -139,4 +142,55 @@ object VoidBoundApi {
139142
}
140143
return false
141144
}
145+
146+
fun getItemAbility(stack: ItemStack): List<ItemAbilityWithLevel> {
147+
val abilities = mutableListOf<ItemAbilityWithLevel>()
148+
val tag = stack.tag ?: return abilities // Return empty if no NBT
149+
150+
val abilitiesTag = tag.getList("Abilities", 10) // 10 is the NBT type for CompoundTag
151+
for (i in 0 until abilitiesTag.size) {
152+
val abilityTag = abilitiesTag.getCompound(i)
153+
val ability = ItemAbilityWithLevel.readNbt(abilityTag)
154+
abilities.add(ability)
155+
}
156+
return abilities
157+
}
158+
159+
// Function to add an ItemAbilityWithLevel to an ItemStack's NBT
160+
fun addItemAbility(stack: ItemStack, abilityWithLevel: ItemAbilityWithLevel) {
161+
val tag = stack.orCreateTag // Ensures the stack has NBT
162+
val abilitiesTag = tag.getList("Abilities", 10) // Fetch or create list
163+
164+
// Check if ability already exists, if so, skip adding a duplicate
165+
for (i in 0 until abilitiesTag.size) {
166+
val abilityTag = abilitiesTag.getCompound(i)
167+
val existingAbility = ItemAbilityWithLevel.readNbt(abilityTag)
168+
if (existingAbility.itemAbility == abilityWithLevel.itemAbility) {
169+
return // Ability already exists, exit without adding
170+
}
171+
}
172+
173+
// Add new ability
174+
abilitiesTag.add(abilityWithLevel.writeNbt())
175+
tag.put("Abilities", abilitiesTag)
176+
}
177+
178+
// Function to modify the level of an existing ItemAbility in NBT
179+
fun modifyItemAbilityLevel(stack: ItemStack, itemAbility: ItemAbility, newLevel: Int) {
180+
val tag = stack.tag ?: return // No NBT, nothing to modify
181+
val abilitiesTag = tag.getList("Abilities", 10)
182+
183+
// Find the ability and modify its level
184+
for (i in 0 until abilitiesTag.size) {
185+
val abilityTag = abilitiesTag.getCompound(i)
186+
val ability = ItemAbilityWithLevel.readNbt(abilityTag)
187+
if (ability.itemAbility == itemAbility) {
188+
// Modify the level and update the NBT
189+
abilityTag.putInt("Level", newLevel)
190+
abilitiesTag[i] = abilityTag // Replace the modified ability in the list
191+
tag.put("Abilities", abilitiesTag)
192+
return
193+
}
194+
}
195+
}
142196
}

Diff for: src/main/kotlin/dev/sterner/api/item/ItemAbility.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ enum class ItemAbility(private val equipmentSlot: EquipmentSlot?, private val cl
1717
return this.name.lowercase()
1818
}
1919

20-
fun getAbilityFromItem(item: Item): List<ItemAbility> {
20+
fun getAvailableAbilitiesFromItem(item: Item): List<ItemAbility> {
2121
val list = mutableListOf<ItemAbility>()
2222
for (ability in entries) {
2323
// Check if the item matches the clazz or the equipmentSlot

0 commit comments

Comments
 (0)