本篇教程由作者设定未经允许禁止转载。
项目目标
实现如图所示效果。
图片信息解释(从左至右):掉落物所包含物品的数量、所包含的物品、距离自然消失所剩余的时间(单位:秒,向下取整)
ServerEvents.tick(event => {
// 在此处写入项目的代码
})
代码解析
1. 获取并遍历服务端的实体,并判断其类型是否为 minecraft:item。
event.server.entities.forEach(entity => {
if (entity.type == "minecraft:item"){
// 在此处写入步骤2的代码
}
}
)
2. 获取掉落物的nbt数据。
// 获取掉落物距离自然消失所剩余的时间(单位:秒,向上取整)
var restlife = Math.trunc((6000-entity.age)/(20))
// 获取掉落物所包含的物品
let id = (entity.nbt["Item"]["id"])
// 获取掉落物所包含的物品的数量
let amont = entity.nbt["Item"]["Count"]
3. 拼接字符串,并通过设置其 customName 显示。
// 设置自定义名称为可见
entity.customNameVisible = true
// 设置自定义的名称
entity.customName = Component.green(`${amont}x ${id} ${restlife}`)
到此为止,该项目的主要代码就完成了,但是此时我们还是无法获取该物品本地化的名称。(如图红线部分所示)
获取物品的本地化名称
我们只需要创建 ItemStack 对象并 获取其显示名称即可。试了3个小时才找到了这个解决方法
let localname = Item.of(id).getDisplayName().getString()
完整代码
ServerEvents.tick(event => {
event.server.entities.forEach(entity => {
if (entity.type == "minecraft:item"){
// 获取掉落物距离自然消失所剩余的时间(单位:秒,向上取整)
var restlife = Math.trunc((6000-entity.age)/(20))
// 获取掉落物所包含的物品
let id = (entity.nbt["Item"]["id"])
// 获取掉落物所包含的物品的数量
let amont = entity.nbt["Item"]["Count"]
// 获取掉落物所包含的物品的本地化的名称
let localname = Item.of(id).getDisplayName().getString()
// 显示
entity.customNameVisible = true
entity.customName = Component.green(`${amont}x ${id} ${restlife}`)
}
})
})
代码适用版本
Kubejs 6