Files
netease-modsdk-wiki/docs/mcguide/28-电脑网络游戏/课程4:常见第三方库教程/31-TabooLib/1-基础技术/12-物品操作工具.md
boybook 760c2dd9ad 2.6
2025-12-01 20:59:16 +08:00

138 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
front:
hard: 入门
time: 12分钟
---
# 物品操作工具
## 介绍
TabooLib 内置了一套 关于 构建物品 编辑物品 修改/获取 NBT 的工具
本文就是着重介绍 涉及到的模块包括:
1. BUKKIT_ALL
2. NMS_UTIL
## 构建物品
ItemBuilder
```kotlin
buildItem(XMaterial.APPLE) {
name = "&d坏黑的大苹果"
lore.add("&7这是一个坏黑的大苹果")
colored()
}
```
然后就可以返回一个 ItemStack 供你使用
### 入口 - 以物造物
通过现有物品构建新的物品
```kotlin
fun buildItem(itemStack: ItemStack, builder: ItemBuilder.() -> Unit = {}): ItemStack
```
### 入口 - XMaterial 造物
XMaterial 是一个多版本兼容支持的类型
```kotlin
fun buildItem(material: XMaterial, builder: ItemBuilder.() -> Unit = {}): ItemStack
```
### 入口 - Material 造物
```kotlin
fun buildItem(material: Material, builder: ItemBuilder.() -> Unit = {}): ItemStack
```
### 可选参数
![](../images/0_33.png)
## 修改元数据
在Bukkit中把物品的职能通过ItemMeta进行拆分
比如:可掉耐久的 书本 他们都是ItemMeta的子类
但是如果使用getMeta的方法获得到的是个clone的副本还需要再设置回去
在TabooLib中可以通过一个DSL快速操作
> 以掉耐久的为例 这个得看自己的版本来决定写法
```kotlin
buildItem.modifyMeta<Damageable> {
damage = 10
}
```
## 修改 Lore
Lore是一个高频使用的功能 所以TabooLib把他从ItemMeta抽出来作为一个单独的方法使用
```kotlin
buildItem.modifyLore {
add("123")
clear()
add("&d新的一行")
colored()
}
```
## 修改NBT
TabooLib对NBT进行了封装 叫做 ItemTag 本文作为入门教学 只提供增删改查等基础教学
如果要深入操作 还请自行研究
### 入口
```kotlin
val itemTag = buildItem.getItemTag()
```
```kotlin
// 获取数据
itemTag.getDeep("自定义的节点.支持多节点")
// 获取数据 如果不存在则设置默认值
itemTag.getDeepOrElse("自定义的节点.支持多节点", ItemTagData(""))
// 设置数据
itemTag.putDeep("自定义的节点.支持多节点", ItemTagData("新的值"))
// 删除数据
itemTag.removeDeep("自定义的节点.支持多节点")
// 保存数据
itemTag.saveTo(buildItem)
```
操作起来还是略显繁琐 如果NBT节点数量多 那么操作的量是毁灭的
所以枫溪在TabooLib里内置了一个工具 ItemTagReader 让你像配置文件一样操作NBT
### ItemTagReader
```kotlin
buildItem.itemTagReader {
val value = getString("自定义的节点.支持多节点", "默认值")
set("自定义的节点.支持多节点", "新的值 + ${value}")
// 收尾方法 写了才算写入物品 不然不会写入 减少操作可能出现的失误
write(buildItem)
}
```
## 工具
TabooLib为了简化物品操作 内置了很多的工具函数方便你的使用
### 检查数量
检查玩家背包/容器中的特定物品是否达到特定数量
```kotlin
fun Player.checkItem(item: ItemStack, amount: Int = 1, remove: Boolean = false): Boolean
fun Inventory.checkItem(item: ItemStack, amount: Int = 1, remove: Boolean = false): Boolean
```
### 检查数量 - 过滤器
获取符合过滤器内函数的物品数量
```kotlin
fun Inventory.hasItem(amount: Int = 1, matcher: (itemStack: ItemStack) -> Boolean): Boolean
player.inventory.hasItem {
it.type == Material.APPLE
}
```
### 扣除物品
```kotlin
fun Inventory.takeItem(amount: Int = 1, matcher: (itemStack: ItemStack) -> Boolean): Boolean
player.inventory.takeItem(50) {
it.type == Material.APPLE
}
```
### 获取数量
```kotlin
fun Inventory.countItem(matcher: (itemStack: ItemStack) -> Boolean): Int
```