本站为非官方 Pylon 文档站,大量内容均为 AI 生成·前往官方文档站● ● ●This is an unofficial Pylon documentation site, most content is AI-generated·Visit Official Docs● ● ●中文开发者交流·加入 QQ 群● ● ●本站为非官方 Pylon 文档站,大量内容均为 AI 生成·前往官方文档站● ● ●This is an unofficial Pylon documentation site, most content is AI-generated·Visit Official Docs● ● ●中文开发者交流·加入 QQ 群● ● ●
Pylon 中文文档
开发文档参考多方块

与多方块组件交互

了解如何在多方块中与特定组件进行交互

最后更新时间

开发时经常需要操作多方块中的特定组件——比如在多方块工作时点燃其中的熔炉。这时可以用 getMultiblockComponentgetMultiblockComponentOrThrowgetMultiblockBlock 这几个方法。

这些方法已经自动处理了旋转问题,传入的坐标和你在 getComponents 中定义的一致即可。

示例:

@Override
public void tick() {
    if (!isFormedAndFullyLoaded()) {
        return;
    }

    Block furnace = getMultiblockBlock(new Vector3i(0, 2, 0));
    Furnace furnaceData = (Furnace) furnace;
    furnaceData.setLit(true);
    furnace.setBlockData(furnaceData);

    getMultiblockComponentOrThrow(FluidInputHatch.class, new Vector3i(0, 0, 1))
            .addFluid(PylonFluids.HYDRAULIC_FLUID, 100.0);
}

建议把常用组件的位置定义成常量,避免到处硬编码坐标。以后要调整位置也只需改一处:

public static final Vector3i FURNACE_POSITION = new Vector3i(0, 2, 0);

// ...

@Override
public @NotNull Map<@NotNull Vector3i, @NotNull MultiblockComponent> getComponents() {
    return Map.of(
            FURNACE_POSITION, MultiblockComponent.of(Material.FURNACE),
            // ...
    );
}

@Override
public void tick() {
    if (!isFormedAndFullyLoaded()) {
        return;
    }

    Block furnace = getMultiblockBlock(FURNACE_POSITION);
    Furnace furnaceData = (Furnace) furnace;
    furnaceData.setLit(true);
    furnace.setBlockData(furnaceData);

    // ...
}

物品和流体舱口

本节仅适用于为 Pylon 开发附属模组

Pylon 提供了物品舱口和流体舱口,在多方块开发中非常实用。

物品舱口

物品舱口的使用很简单:

  1. 在多方块中加入物品舱口组件
  2. getMultiblockComponentOrThrow 获取舱口实例
  3. 操作舱口的库存,实现你的 ticking 逻辑

示例:

public static final Vector3i ITEM_INPUT_HATCH_POSITION = new Vector3i(0, 2, 0);

// ...

@Override
public @NotNull Map<@NotNull Vector3i, @NotNull MultiblockComponent> getComponents() {
    return Map.of(
            ITEM_INPUT_HATCH_POSITION, MultiblockComponent.of(PylonKeys.ITEM_INPUT_HATCH)
            // ...
    );
}

@Override
public void tick() {
    if (!isFormedAndFullyLoaded()) {
        return;
    }

    VirtualInventory inventory = getMultiblockComponentOrThrow(ItemInputHatch.class, ITEM_INPUT_HATCH_POSITION).inventory;
    ItemStack stack = inventory.getItem(0);
    if (new ItemStack(Material.BLAZE_POWDER).isSimilar(stack)) {
        inventory.setItem(new MachineUpdateReason(), 0, stack.subtract());
        // ...
    }

    // ...
}

流体舱口

流体舱口和物品舱口类似,但多一步:需要在多方块成型时指定舱口接受的流体类型。

  1. 在多方块中加入流体舱口组件
  2. onMultiblockFormed 中设置每个舱口的流体类型
  3. getMultiblockComponentOrThrow 获取舱口实例
  4. 在逻辑中从舱口存取流体

示例:

public static final Vector3i FLUID_INPUT_HATCH_POSITION = new Vector3i(0, 2, 0);

// ...

@Override
public @NotNull Map<@NotNull Vector3i, @NotNull MultiblockComponent> getComponents() {
    return Map.of(
            FLUID_INPUT_HATCH_POSITION, MultiblockComponent.of(PylonKeys.FLUID_INPUT_HATCH)
    );
}

@Override
public void onMultiblockFormed() {
    getMultiblockComponentOrThrow(FluidInputHatch.class, FLUID_INPUT_HATCH_POSITION)
            .setFluidType(PylonFluids.WATER);
}

@Override
public void tick() {
    if (!isFormedAndFullyLoaded()) {
        return;
    }

    FluidInputHatch inputHatch = getMultiblockComponentOrThrow(FluidInputHatch.class, FLUID_INPUT_HATCH_POSITION);
    if (inputHatch.fluidAmount(PylonFluids.WATER) < 1000.0) {
        return;
    }
    inputHatch.removeFluid(PylonFluids.WATER, 1000.0);

    // ...
}

目录