Skip to content

Item — 物品对象

ItemStack纯值对象:内部就是一段 SNBT,不指向游戏里的任何东西。克隆它就是克隆那段文本;只有把它交给容器或玩家,游戏世界才会变。

所有查询和变换都往返一次引擎的 ItemStack::fromTag / save,所以最大堆叠数、附魔规则、耐久逻辑这些永远来自引擎,不是 Rust 这边重新实现的一套。

rust
use levilamina::prelude::*;

let mut item = ItemStack::create("minecraft:diamond_sword", 1);
item.set_custom_name("§b霜之哀伤")?;
item.set_lore(&["§7一把剑", "§7仅此而已"])?;
player.give_item(&item)?;

构造

API说明
ItemStack::create(type_name, count)新建
ItemStack::from_snbt(snbt)从已有 SNBT 包装(容器读取、事件载荷、实体快照的 Item 字段)
ItemStack::empty()空堆叠

API返回
item.snbt()&str — 底层 SNBT
item.to_nbt()Result<NbtValue>
item.type_name()Result<String> — 如 minecraft:apple
item.raw_name_id()Result<String>
item.name()Result<String> — 显示名
item.custom_name()Result<String> — 自定义名
item.count()Result<u8>
item.max_stack_size()Result<u8>
item.id()Result<i32>
item.aux_value()Result<i32>
item.damage()Result<i32>

判定

全部返回 Result<bool>

is_null(空堆叠)、is_blockis_enchantedis_armoris_damageableis_damaged

API说明
item.set_count(n)数量
item.set_custom_name(name)自定义名(相当于铁砧改名)
item.set_lore(&lines)描述文字,一行一个元素
item.set_damage(d)耐久损耗

这几个是 &mut self,改的是本地那份 SNBT。改完要生效得再交给容器或玩家。

附魔

API说明
item.enchants() -> Result<String>当前附魔(SNBT)
item.with_enchants(snbt) -> Result<ItemStack>返回一个换了附魔的堆叠

with_enchants 不改原对象——它是值对象,这样组合起来更安全。

其他

API说明
item.matches(&other) -> bool两个堆叠是不是同一种东西
item.user_data() -> Result<String>自定义 NBT 数据区

想改的字段这里没有?

to_nbt() 拿出来直接改,再 from_snbt() 包回去:

rust
let mut v = item.to_nbt()?;
v.insert("SomeCustomTag", NbtValue::Int(42));
let item = ItemStack::from_snbt(v.to_snbt());