跳到正文

PowerfulJS

作者:Amygdaloideae

为 Forge 的 Capability 系统提供 KubeJS 集成,支持 Curios、植物魔法、FE 和流体处理。

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

PowerfulJS

从 1.20.1 版本重写后,PowerfulJS 现在确实名副其实,功能更强大了!

PowerfulJS 1.21 现在对能力的处理更完善,全面支持 ProbeJS,性能也大幅提升!

旧版 PowerfulJS 文档请参阅 GitHub 仓库

能力系统简介

NeoForge 的能力系统统一了物品、方块、实体等的实现方式,以处理通用行为。因此,任何实现了 item handler 能力的方块都可以从漏斗接收物品,或向漏斗提供物品;任何实现了 fluid handler 能力的物品都可以由 Mekanism 流体储罐注入流体。

PowerfulJS 让整合包作者能够为这些对象添加能力。附加能力后,你可以让熔炉拥有 FE 或流体储存功能,也可以制作一个能够注入流体以变成电池的电池外壳……可能性无穷无尽。

快速上手

本节将介绍如何使用 PowerfulJS 实现一些简单的功能。安装 PowerfulJS 后即可运行这些代码,但始终建议安装 ProbeJS,以便在 VSCode 中获得 IDE 支持。

1. 添加能力

能力可以附加到 3 种对象上:item、block 和 entity。此外还有第四种类型 block entity,但它包含在 block 能力中。

能力注册会在启动时触发,下面是一个添加能力的简单示例:

PowerfulEvents.registerCapabilities(event => {
    // 添加一个具有恒定 FE 供应量的能力
    //
    // 因此,红石块现在可以持续以 100FE/t 产生能量,
    // 但你需要使用提取器(例如处于提取模式的 MEK 电缆)
    // 才能获得能量,因为方块本身不会向周围分配能量


    event.registerBlock('powerfuljs:constant_energy', {
        maxExtract: 100,
        maxReceive: 0,
    }, "redstone_block")


    // 添加一个容量固定、最大输入/输出量已定义的储罐
    event.registerBlockEntity('powerfuljs:fixed_storage_fluid', {
        capacity: 2000,
        maxExtract: 250,
        maxReceive: 250,
    }, 'minecraft:furnace')


    // FE 能量存储也是如此
    event.registerBlockEntity('powerfuljs:fixed_storage_fe', {
        maxExtract: 1000,
        maxReceive: 1000,
        capacity: 10000,
    }, 'minecraft:furnace')


    // 添加一个具有恒定流体供应量的流体能力
    //
    // 只要接上管道,就能抽取无限的熔岩!
    // 太强了!!!
    event.registerBlock('powerfuljs:constant_fluid', {
        content: Fluid.of('lava', 1000),
        maxReceive: 0
    }, 'minecraft:lava')
        // ……因此,你可以通过设置条件限制其可用性;
        // 例如,这里检查它是否为流体源方块,
        // 且位于“nether”生物群系中,也就是 nether_waste。
        //
        // 但是,如果方块在运行过程中可能改变状态,
        // 就不要依赖这个验证器,例如熔炉。
        // 出于性能考虑,此能力会被多个机器重复使用,
        // 而能力一旦已经提供,`validate` 就不会再被调用
        .validate((blockContext, info) => {
            return blockContext.state().fluidState.source &&
                blockContext.level().getBiome(blockContext.pos())
                    .registeredName
                    .includes("nether")
        })


    // 还可以让 `netherrack` 和 `soul sand` 能够装入熔岩
    //
    // 装满后,它们会变成 `magma block`
    //
    // 不同能力构建器之间存在一些差异,
    // 你可以使用 ProbeJS 查看各个构建器支持哪些内容
    event.registerItem('powerfuljs:fixed_storage_fluid', {
        capacity: 1000,
        maxReceive: 20,
        maxExtract: 20,
        validator: "minecraft:lava",
        changeItemWhen: {
            full: [
                { fluid: "minecraft:lava", item: "minecraft:magma_block" }
            ]
        }
    }, 'netherrack', 'soul_sand')
})

2. 拦截刻 tick

为了让附加到方块上的能力更实用,PowerfulJS 还实现了拦截方块原有刻 tick 逻辑的方法,也可以强制让不会刻 tick 的方块执行刻 tick。

系统使用名为 RuleSet 的机制来定义具体逻辑,以平衡性能与灵活性。理论上,使用该系统实现的任何逻辑,其性能都能与原生 Java 相当,不过这仍很大程度上取决于你的实现方式。

刻 tick 拦截会在服务端脚本加载时注册,因此你也可以重新加载服务端脚本来刷新行为。不过,对于已经注入逻辑的方块,你需要先破坏再放置,才能刷新其刻 tick 处理器。

示例如下:

PowerfulEvents.interceptTicking(event => {
    let burningFurnaceOfAnyDirection = [
        "minecraft:furnace[lit=true, facing=west]",
        "minecraft:furnace[lit=true, facing=east]",
        "minecraft:furnace[lit=true, facing=north]",
        "minecraft:furnace[lit=true, facing=south]"
    ]


    event.intercept('minecraft:furnace', () => [
        // 检查熔炉是否正在运行
        Rules.matchBlock(burningFurnaceOfAnyDirection)
            // 如果熔炉没有运行,则启用它
            // 这样它就能正常检测配方
            .negate()
            // 如果熔炉正在运行
            .or(
                // 如果有 1000mB 熔岩,就让它继续运行
                Rules.hasFluid(Fluid.lava(1000), null)
                    // 同时消耗 1mB 熔岩并产生 5 FE
                    .effect(Effects.drainFluid(Fluid.lava(1), null))
                    .effect(Effects.fillEnergy(5, null))
            )
            // 因此,如果熔炉没有运行,或熔炉正在运行且有流体,
            // 就启用熔炉逻辑(上一条规则的结果为 true);否则
            // 禁用熔炉逻辑(结果为 false)
            .effect(Effects.toggleEnable())
    ])
    // 上述逻辑会让熔炉至少需要 1000mB 熔岩才能运行,
    // 并以每 tick 消耗 1mB 熔岩为代价,产出 5FE/t


    // 箱子不会自行 tick,因此我们用空逻辑强制箱子开始 tick,
    // 然后再通过拦截添加我们的逻辑
    event.forceTicker('chest', true)
    event.intercept('chest', () => [
        // 每 20 ticks
        Rules.every(20).effect(
            // 获得一块曲奇!
            Effects.insertItem('cookie', null)
        )
    ])
})

常见问题

PowerfulJS 支持哪些 Minecraft 版本?

PowerfulJS 支持 Minecraft Java 版 1.19.2–1.21.1,共 4 个版本,可用的加载器:Forge / NeoForge。下载时注意选择和你游戏版本一致的文件。

PowerfulJS 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Forge / NeoForge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分

Amygdaloideae 的其他作品

查看全部 →