本篇教程由作者设定未经允许禁止转载。

项目目标

实现如图所示效果。

图片信息解释(从左至右):掉落物所包含物品的数量、所包含的物品、距离自然消失所剩余的时间(单位:秒,向下取整)

Kubejs:掉落物信息显示-第1张图片

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}`)


到此为止,该项目的主要代码就完成了,但是此时我们还是无法获取该物品本地化的名称。(如图红线部分所示)

Kubejs:掉落物信息显示-第2张图片

获取物品的本地化名称

我们只需要创建 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