KubeJS 气动工艺

KubeJS 气动工艺

KubeJS 气动工艺集成

KubeJS

PneumaticCraft: RepressurizedKubeJS 的集成。此模组允许你在 KubeJS 脚本中添加并正确地编辑 PneumaticCraft 模组的配方。

需要 KubeJS 和 PneumaticCraft: Repressurized(两者均为必需)。客户端和服务端均支持。

支持的配方类型(全部位于 event.recipes.pneumaticcraft. 下):

  • pressure_chamber
  • explosion_crafting
  • assembly_drill
  • assembly_laser
  • fluid_mixer
  • refinery(支持 .minTemp().maxTemp()
  • thermo_plant(支持 .minTemp().maxTemp()
  • heat_frame_cooling
  • amadron
  • fuel_quality
  • heat_properties

注意:pressure_chamber_enchanting / pressure_chamber_disenchanting 仅是 JEI 展示页面(它们的配方 JSON 中不包含输入/输出),而 assembly_drill_laser 是在运行时由钻头 + 激光对生成的 —— 这两者都无法编写。

对象形式与位置参数 —— 它们的解析方式不同,所以请阅读以下内容一次:

  • 对象形式,event.recipes.pneumaticcraft.thermo_plant({ ... }),使用 PneumaticCraft 自己的 codec 解析。未知或拼写错误的键会被静默忽略(与编写原始 JSON 完全一样),但本模组未声明的任何键都会原样传递 —— 这就是你设置例如 amadron whitelist / blacklist 的方式。
  • 位置参数、键函数以及温度语法糖(.pressure(2.0).minTemp(373))会经过本模组自己的读取器:未知键会被拒绝并给出合法键列表,接受简写形式,并强制执行 PneumaticCraft 的数值规则。

event.recipes.pneumaticcraft.pressure_chamber(results[], inputs[], pressure) 其中 results 是物品堆叠(或单个),inputs 是带数量的 ingredient(或单个:{ count: 1, item: 'minecraft:glass' } / { count: 1, tag: 'c:stones' })。pressure 单位为 bar;PneumaticCraft 允许 -1..20。

event.recipes.pneumaticcraft.explosion_crafting(results[], input, loss_rate) 其中 input 是单个带数量的 ingredient。loss_rate 为 0..99(原版配方中为 20)。

event.recipes.pneumaticcraft.assembly_drill(result, input, program) 以及 event.recipes.pneumaticcraft.assembly_laser(result, input, program) 其中 result 是单个物品堆叠,input 是单个带数量的 ingredient。program'drill''laser' —— 'drill_laser' 会被拒绝。

event.recipes.pneumaticcraft.fluid_mixer(input1, input2, fluid_output, item_output, pressure, time) 两个输入均为带数量的流体:{ amount: 25, tag: 'c:plantoil' }{ amount: 25, fluid: 'minecraft:water' }amount 可选,默认 1000)。time 单位为刻。

event.recipes.pneumaticcraft.refinery(input, outputs[], temperature?) 其中 input 是带数量的流体,outputs 必须是 2 到 4 个流体堆叠,temperature 默认为 { min: 373 }。流体堆叠为 { amount: 2, id: 'pneumaticcraft:diesel' } —— 这里 amount 必需的(与流体 ingredient 不同)。

event.recipes.pneumaticcraft.thermo_plant(inputs, outputs, temperature?, pressure?, speed?, air_use_multiplier?, exothermic?) inputs = { fluid: { amount: 100, tag: 'c:diesel' }, item: [] }item: [] 表示“不消耗物品”;fluid / item 中至少有一个必须存在),outputs = { fluid_output: { amount: 80, id: 'pneumaticcraft:kerosene' } } 和/或 { item_output: { count: 1, id: 'minecraft:glass' } }

event.recipes.pneumaticcraft.heat_frame_cooling(input, temperature, output, bonusMultiplier?, bonusLimit?) 其中 input 要么是流体容器 { fluid: { amount: 1000, tag: 'minecraft:water' } } —— 在其内部键是 idtagamount 是必需的,不是 fluid —— 要么是普通 ingredient。temperature 是以开尔文为单位的阈值。

event.recipes.pneumaticcraft.amadron(offer_id, input, output, level?, static?, villager_trade?, maxStock?, inStock?) 交易对于物品为 { resource: { count: 1, id: 'minecraft:emerald' } },对于流体为 { resource: { amount: 1000, id: 'pneumaticcraft:diesel' } }。位置参数也接受裸 id 字符串,并会自行判断物品还是流体。

event.recipes.pneumaticcraft.fuel_quality(fluid, air_per_bucket, burn_rate?) 其中 fluid无数量的流体 ingredient:{ tag: 'c:diesel' }{ fluid: 'minecraft:water' }。在这里写 amount 是错误的 —— PneumaticCraft 会忽略它,所以本模组会拒绝它,而不是静默丢弃。

event.recipes.pneumaticcraft.heat_properties(block, temperature, thermalResistance?, heatCapacity?, transforms?, predicates?, description?) transforms = { hot: 'minecraft:lava', cold: 'minecraft:ice', hot_flowing: ..., cold_flowing: ... }(方块状态字符串);predicates = { lit: 'true' }(方块状态属性 —— 键确实是 predicates;在 PneumaticCraft 自己的一些文件中看到的 statePredicate 会被忽略)。

示例:

event.recipes.pneumaticcraft.pressure_chamber(
    [{ count: 1, id: 'minecraft:blue_ice' }],
    [{ count: 4, item: 'minecraft:packed_ice' }],
    2.5
).id('mypack:pressure/blue_ice')
event.recipes.pneumaticcraft.thermo_plant({
    inputs: { fluid: { amount: 100, tag: 'c:diesel' }, item: [] },
    outputs: { fluid_output: { amount: 80, id: 'pneumaticcraft:kerosene' } },
    pressure: 2.0,
    temperature: { min: 573 }
}).id('mypack:thermo/kerosene')
event.recipes.pneumaticcraft.refinery(
    { amount: 10, tag: 'c:crude_oil' },
    [
        { amount: 2, id: 'pneumaticcraft:diesel' },
        { amount: 3, id: 'pneumaticcraft:kerosene' }
    ]
).temperature({ min: 373 }).id('mypack:refinery/crude')

// 同样的内容,使用温度语法糖,外加一个最大界限:
event.recipes.pneumaticcraft.refinery(
    { amount: 10, tag: 'c:crude_oil' },
    [
        { amount: 3, id: 'pneumaticcraft:diesel' },
        { amount: 3, id: 'pneumaticcraft:lpg' }
    ]
).minTemp(303).maxTemp(333).id('mypack:refinery/crude_warm')
event.recipes.pneumaticcraft.fluid_mixer(
    { amount: 25, tag: 'c:plantoil' },
    { amount: 25, tag: 'c:ethanol' },
    { amount: 50, id: 'pneumaticcraft:biodiesel' },
    { count: 1, id: 'pneumaticcraft:glycerol' },
    2.0,
    300
).id('mypack:mixer/biodiesel')
event.recipes.pneumaticcraft.assembly_drill(
    { count: 1, id: 'pneumaticcraft:pressure_chamber_valve' },
    { count: 1, item: 'pneumaticcraft:compressed_iron_block' },
    'drill'
).id('mypack:assembly/valve')
event.recipes.pneumaticcraft.heat_frame_cooling(
    { fluid: { amount: 1000, tag: 'minecraft:water' } },
    273,
    { count: 1, id: 'minecraft:ice' }
).id('mypack:cooling/ice')
event.recipes.pneumaticcraft.amadron({
    offer_id: 'mypack:amadron/emerald_to_diesel',
    input: { resource: { id: 'minecraft:emerald', count: 1 } },
    output: { resource: { id: 'pneumaticcraft:diesel', amount: 1000 } },
    level: 0
}).id('mypack:amadron/emerald_to_diesel')
event.recipes.pneumaticcraft.fuel_quality(
    { tag: 'c:my_fuel' },
    500000,
    1.0
).id('mypack:fuel/my_fuel')
event.recipes.pneumaticcraft.heat_properties({
    block: 'minecraft:magma_block',
    temperature: 900,
    thermalResistance: 1000,
    heatCapacity: 500,
    transforms: { cold: 'minecraft:netherrack' },
    predicates: { lit: 'true' }
}).id('mypack:heat/magma')

移除和编辑 PneumaticCraft 配方现在可以工作了 —— 但始终要添加类型:

event.remove({ type: 'pneumaticcraft:refinery', output: Fluid.of('pneumaticcraft:diesel') })
event.remove({ type: 'pneumaticcraft:amadron', output: 'minecraft:emerald' })
event.remove({ type: 'pneumaticcraft:pressure_chamber', mod: 'pneumaticcraft' })

注意:过滤器是跨类型的,所以不带 type:{ output: ... } 也会命中其他模组的配方。而对于流体输出,过滤器值必须是流体,即 Fluid.of('pneumaticcraft:diesel') —— 普通字符串会作为物品匹配,永远不会匹配流体输出。

注意:PneumaticCraft 附带了 9 个 fuel_quality 配方,但其中两个(ethylenehydrogen)受 PneumaticCraft 自身的 fluid_tag_present 条件限制,因此只有当某个模组提供 c:fuels/ethene / c:fuels/hydrogen 时它们才会加载。缺失标签意味着该配方被跳过 —— 这是预期行为,不是本模组的 bug。

注意:pressure(压力室,-1..20)和 loss_rate(爆炸合成,0..99)目前尚未由本模组进行范围检查;超出范围的值会由 PneumaticCraft 本身报告。

错误会被报告而不是被忽略 —— 例如:

# heat_frame_cooling 流体容器使用了 "fluid" 键
pneumaticcraft:fluid_container_ingredient: PnC 的 heat_frame_cooling 流体输入是 either(FluidStack, tag+amount)
- 单一流体的键是 'id',不是 'fluid'(这是旧陷阱)。有效键:[id, tag, amount]

# 在无数量的流体 ingredient(fuel_quality)上使用 amount
pneumaticcraft:fluid_ingredient_unsized: 这个 PnC 字段接受 UNSIZED 流体 ingredient - PnC 会忽略 'amount'
在这里,因此它被拒绝。移除它,或对带数量的字段使用 pneumaticcraft:fluid_ingredient。

# temperature 必须严格满足 min < max
temperature: min 必须 < max(PnC 规则) - 得到 400 <= T <= 300

没有 mixin、没有访问转换器、没有注册表更改,也没有添加内容 —— 本模组只向 KubeJS 注册配方字段类型,因此可以随时添加或移除,而无需改动你的世界。

MIT 许可。它不引用任何 me.desht.pneumaticcraft.* 类:每条规则都是从 PneumaticCraft 的源码中读出并在此重新实现的,因此它既不继承 GPLv3,也不会因 PneumaticCraft 内部变化而损坏。