Verwendung und Grenzen
Konvertiert ItemStack-Komponenten unabhängig von der Anzahl in exakte Schlüssel. Nutzt Register statt Anzeigenamen. Rekonstruierte Stacks müssen gültige Mengen und Komponenten enthalten.
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)
}
}
Quelle
src/main/kotlin/dev/nebulastorage/api/platform/ItemResourceCodec.kt; editorial/de.json
43b4d12d69e6033c24fa8c39dac383ef2429b446