开发文档参考多方块
与多方块组件交互
了解如何在多方块中与特定组件进行交互
最后更新时间
开发时经常需要操作多方块中的特定组件——比如在多方块工作时点燃其中的熔炉。这时可以用 getMultiblockComponent、getMultiblockComponentOrThrow 和 getMultiblockBlock 这几个方法。
这些方法已经自动处理了旋转问题,传入的坐标和你在 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 提供了物品舱口和流体舱口,在多方块开发中非常实用。
物品舱口
物品舱口的使用很简单:
- 在多方块中加入物品舱口组件
- 用
getMultiblockComponentOrThrow获取舱口实例 - 操作舱口的库存,实现你的 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());
// ...
}
// ...
}流体舱口
流体舱口和物品舱口类似,但多一步:需要在多方块成型时指定舱口接受的流体类型。
- 在多方块中加入流体舱口组件
- 在
onMultiblockFormed中设置每个舱口的流体类型 - 用
getMultiblockComponentOrThrow获取舱口实例 - 在逻辑中从舱口存取流体
示例:
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);
// ...
}