介绍
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 的其他作品
查看全部 →KubeJS Botania
植物魔法的KubeJS集成
Custom Disc
一个简单的模组,用于在1.12.2中添加自定义唱片
Dynamic Trees Create Compat
(Deprecated) Unofficial mixin mod to re-add compat for Mechanical Saw to cut Dynamic Trees
KubeJS ComputerCraft
Adding ComputerCraft peripherals from KubeJS
评论
登录后评论和评分