Skip to content

下落合成

本章涉及内容:配方检测、物品实体、实体生成事件、世界tick事件 涉及模组及版本:

  1. rhino-forge-2001.2.2-build.18
  2. architectury-9.2.14-forge
  3. kubejs-forge-2001.6.5-build.14
  4. probejs-6.0.1-forge

完整代码

下面是完整代码和部分注释解析,如需完整内容解析请在哔哩哔哩查看孤梦的视频

js
// 记录下落物品方块的数据
let itemFallList = {};
// 记录配方
let fallItem = [
    {
        inputItem: "minecraft:cobblestone",
        outputItem: 'minecraft:gravel',
        spaceBetween: 10
    }
]

EntityEvents.spawned("item", event => {
    /**
     * @type {Internal.ItemEntity}
     */
    let itemEntity = event.getEntity();
    fallItem.forEach(value => {
        // 判断物品
        if (itemEntity.getItem().getId() != value.inputItem) return;
        // 设置物品可被捡起时间为32767主要用处为无法合并(副作用无法捡起)
        itemEntity.pickUpDelay = 32767;
        // 记录实体掉落物的数量
        let count = itemEntity.getNbt().get("Item").getInt("Count")
         // 传值
        itemFallList[itemEntity.getUuid()] = {
            dimension: event.getLevel().getDimension(),
            y: itemEntity.getY(),
            output: value.outputItem,
            count: count,
            spaceBetween: value.spaceBetween
        }
    })
})

LevelEvents.tick(event => {
    if (event.server.tickCount % 5 != 0) return
    if (Object.keys(itemFallList).length == 0) return
    for (let key in itemFallList) {
        let fallValue = itemFallList[key];
        if (fallValue.dimension == event.getLevel().getDimension()) {
            try {
                let entity = event.getLevel().getEntity(key)
                if (entity.onGround()) {
                    if (fallValue.y - entity.getY() >= fallValue.spaceBetween) {
                        entity.setItem(Item.of(fallValue.output, fallValue.count))
                    }
                    entity.pickUpDelay = 20;
                    delete itemFallList[key]
                }
            } catch (e) {
                console.warn(e);
                delete itemFallList[key]
            }
        }
    }
})

一些注意事项

  1. 该项目的配方检测全是字符串,并不是ItemStack所以无法检测nbt,如需请自行更改
  2. 该项目只是作为示例,很多地方并不是最优解,可自行进行解决
  3. 如果对该项目代码部分不满可以将修改好的代码上传至gitee项目仓库
  4. 代码复制过去可直接使用,如需添加配方只需要在数组fallItem里进行添加修改
  5. 如果是类似水流向上冲走物品实体然后从下掉下来这种,可以在leveltick里实时记录下来物品的最高y轴

贡献者

页面历史

布局切换

调整 VitePress 的布局样式,以适配不同的阅读习惯和屏幕环境。

全部展开
使侧边栏和内容区域占据整个屏幕的全部宽度。
全部展开,但侧边栏宽度可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
全部展开,且侧边栏和内容区域宽度均可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
原始宽度
原始的 VitePress 默认布局宽度

页面最大宽度

调整 VitePress 布局中页面的宽度,以适配不同的阅读习惯和屏幕环境。

调整页面最大宽度
一个可调整的滑块,用于选择和自定义页面最大宽度。

内容最大宽度

调整 VitePress 布局中内容区域的宽度,以适配不同的阅读习惯和屏幕环境。

调整内容最大宽度
一个可调整的滑块,用于选择和自定义内容最大宽度。

聚光灯

支持在正文中高亮当前鼠标悬停的行和元素,以优化阅读和专注困难的用户的阅读体验。

ON 开启
开启聚光灯。
OFF 关闭
关闭聚光灯。