Utilisation et contraintes
Convertit un FluidStack en clé exacte et quantité en millibuckets avec les registres courants. Conservez les composants. Le décodage crée une nouvelle pile valide et refuse les données inconnues ou trop volumineuses.
FluidResourceCodec
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.neoforged.neoforge.fluids.FluidStack
/** Registry-aware fluid identities independent of amount, with exact component patches and integral mB. */
class FluidResourceCodec(private val registries: HolderLookup.Provider) {
/** Tests the shared Nebula component-size bound before a fluid is admitted to a transfer. */
fun transferable(key: ResourceKey): Boolean = CanonicalComponents.transferable(key.components)
fun key(stack: FluidStack): ResourceKey {
require(!stack.isEmpty)
val encoded = stack.copyWithAmount(1).save(registries) as CompoundTag
val components = encoded.get("components")?.let(CanonicalComponents::encode) ?: ""
return ResourceKey(ResourceTypeId.FLUID, BuiltInRegistries.FLUID.getKey(stack.fluid).toString(), components)
}
fun stack(key: ResourceKey, amount: Int = 1): FluidStack {
require(key.type == ResourceTypeId.FLUID && amount > 0)
val data = CompoundTag().apply {
putString("id", key.id)
putInt("amount", amount)
if (key.components.isNotEmpty()) put("components", TagParser.parseTag(key.components))
}
return FluidStack.parse(registries, data).orElseThrow { IllegalArgumentException("Unknown fluid or components: ${key.id}") }
}
}
Source
src/main/kotlin/dev/nebulastorage/api/platform/FluidResourceCodec.kt; editorial/fr.json
43b4d12d69e6033c24fa8c39dac383ef2429b446