Utilisation et contraintes
Convertit les composants d’un ItemStack en ResourceKey exacte, indépendamment de sa quantité. Utilisez le codec lié aux registres, jamais le nom de l’objet. Les piles reconstruites respectent quantité légale et limites des composants.
ItemResourceCodec
package dev.nebulastorage.api.platform
import dev.nebulastorage.api.resource.ResourceKey
import dev.nebulastorage.api.resource.ResourceTypeId
import net.minecraft.core.HolderLookup
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.TagParser
import net.minecraft.world.item.ItemStack
/** Registry-aware, count-independent item identities preserving the exact component patch. */
class ItemResourceCodec(internal val registries: HolderLookup.Provider) {
/** Tests the current Nebula transfer-size bound; larger identities may be encoded but cannot be transferred. */
fun transferable(key: ResourceKey): Boolean = CanonicalComponents.transferable(key.components)
fun key(stack: ItemStack): ResourceKey {
require(!stack.isEmpty)
val encoded = stack.copyWithCount(1).save(registries) as CompoundTag
val components = encoded.get("components")?.let(CanonicalComponents::encode) ?: ""
return ResourceKey(ResourceTypeId.ITEM, BuiltInRegistries.ITEM.getKey(stack.item).toString(), components)
}
/** Returns a fresh stack. Unknown identities and counts outside one legal stack are rejected. */
fun stack(key: ResourceKey, count: Int = 1): ItemStack {
require(key.type == ResourceTypeId.ITEM && count > 0)
val data = CompoundTag().apply {
putString("id", key.id)
putInt("count", 1)
if (key.components.isNotEmpty()) put("components", TagParser.parseTag(key.components))
}
val decoded = ItemStack.parse(registries, data).orElseThrow { IllegalArgumentException("Unknown item or components: ${key.id}") }
require(!decoded.isEmpty && count <= decoded.maxStackSize)
return decoded.copyWithCount(count)
}
}
Source
src/main/kotlin/dev/nebulastorage/api/platform/ItemResourceCodec.kt; editorial/fr.json
43b4d12d69e6033c24fa8c39dac383ef2429b446