# 物品操作工具
# 介绍
TabooLib 内置了一套 关于 构建物品 编辑物品 修改/获取 NBT 的工具
本文就是着重介绍 涉及到的模块包括:
- BUKKIT_ALL
- NMS_UTIL
# 构建物品
ItemBuilder
buildItem(XMaterial.APPLE) {
name = "&d坏黑的大苹果"
lore.add("&7这是一个坏黑的大苹果")
colored()
}
然后就可以返回一个 ItemStack 供你使用
# 入口 - 以物造物
通过现有物品构建新的物品
fun buildItem(itemStack: ItemStack, builder: ItemBuilder.() -> Unit = {}): ItemStack
# 入口 - XMaterial 造物
XMaterial 是一个多版本兼容支持的类型
fun buildItem(material: XMaterial, builder: ItemBuilder.() -> Unit = {}): ItemStack
# 入口 - Material 造物
fun buildItem(material: Material, builder: ItemBuilder.() -> Unit = {}): ItemStack
# 可选参数

# 修改元数据
在Bukkit中,把物品的职能通过ItemMeta进行拆分
比如:可掉耐久的 书本 他们都是ItemMeta的子类
但是如果使用getMeta的方法获得到的是个clone的副本还需要再设置回去
在TabooLib中可以通过一个DSL快速操作
以掉耐久的为例 这个得看自己的版本来决定写法
buildItem.modifyMeta<Damageable> {
damage = 10
}
# 修改 Lore
Lore是一个高频使用的功能 所以TabooLib把他从ItemMeta抽出来作为一个单独的方法使用
buildItem.modifyLore {
add("123")
clear()
add("&d新的一行")
colored()
}
# 修改NBT
TabooLib对NBT进行了封装 叫做 ItemTag 本文作为入门教学 只提供增删改查等基础教学
如果要深入操作 还请自行研究
# 入口
val itemTag = buildItem.getItemTag()
// 获取数据
itemTag.getDeep("自定义的节点.支持多节点")
// 获取数据 如果不存在则设置默认值
itemTag.getDeepOrElse("自定义的节点.支持多节点", ItemTagData("无"))
// 设置数据
itemTag.putDeep("自定义的节点.支持多节点", ItemTagData("新的值"))
// 删除数据
itemTag.removeDeep("自定义的节点.支持多节点")
// 保存数据
itemTag.saveTo(buildItem)
操作起来还是略显繁琐 如果NBT节点数量多 那么操作的量是毁灭的
所以枫溪在TabooLib里内置了一个工具 ItemTagReader 让你像配置文件一样操作NBT
# ItemTagReader
buildItem.itemTagReader {
val value = getString("自定义的节点.支持多节点", "默认值")
set("自定义的节点.支持多节点", "新的值 + ${value}")
// 收尾方法 写了才算写入物品 不然不会写入 减少操作可能出现的失误
write(buildItem)
}
# 工具
TabooLib为了简化物品操作 内置了很多的工具函数方便你的使用
# 检查数量
检查玩家背包/容器中的特定物品是否达到特定数量
fun Player.checkItem(item: ItemStack, amount: Int = 1, remove: Boolean = false): Boolean
fun Inventory.checkItem(item: ItemStack, amount: Int = 1, remove: Boolean = false): Boolean
# 检查数量 - 过滤器
获取符合过滤器内函数的物品数量
fun Inventory.hasItem(amount: Int = 1, matcher: (itemStack: ItemStack) -> Boolean): Boolean
player.inventory.hasItem {
it.type == Material.APPLE
}
# 扣除物品
fun Inventory.takeItem(amount: Int = 1, matcher: (itemStack: ItemStack) -> Boolean): Boolean
player.inventory.takeItem(50) {
it.type == Material.APPLE
}
# 获取数量
fun Inventory.countItem(matcher: (itemStack: ItemStack) -> Boolean): Int
入门
12分钟