Class MultiblockStructureHelper

java.lang.Object
com.hbm_m.multiblock.MultiblockStructureHelper

public class MultiblockStructureHelper extends Object
  • Constructor Summary

    Constructors
    Constructor
    Description
    MultiblockStructureHelper(Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> structureMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState)
     
    MultiblockStructureHelper(Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> structureMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> symbolRoleMap)
     
    MultiblockStructureHelper(Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> structureMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> symbolRoleMap, Map<net.minecraft.core.BlockPos,Character> positionSymbolMap, Map<net.minecraft.core.BlockPos,net.minecraft.world.phys.shapes.VoxelShape> partShapes, Map<net.minecraft.core.BlockPos,net.minecraft.world.phys.shapes.VoxelShape> collisionShapes, net.minecraft.core.BlockPos controllerOffset)
     
    MultiblockStructureHelper(Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> structureMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> symbolRoleMap, Map<net.minecraft.core.BlockPos,Character> positionSymbolMap, net.minecraft.core.BlockPos controllerOffset)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    checkPlacement(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing, net.minecraft.world.entity.player.Player player)
     
    boolean
    computeFrameVisible(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing)
     
    createFromLayersWithRoles(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap)
     
    createFromLayersWithRoles(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap, Map<Character,net.minecraft.world.phys.shapes.VoxelShape> shapeMap, Map<Character,net.minecraft.world.phys.shapes.VoxelShape> collisionMap)
     
    createFromLayersWithRoles(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap, Map<Character,net.minecraft.world.phys.shapes.VoxelShape> shapeMap, Map<Character,net.minecraft.world.phys.shapes.VoxelShape> collisionMap, Map<Character,boolean[]> ladderSideMap, Map<Character,boolean[]> energySideMap, Map<Character,boolean[]> fluidSideMap)
    Создаёт MultiblockStructureHelper из слоёв с картой ролей.
    createFromLayersWithRolesAndSides(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap, Map<Character,boolean[]> ladderSideMap, Map<Character,boolean[]> energySideMap)
    Как полный #createFromLayersWithRoles(String[][], Map, Supplier, Map, Map, Map, Map, Map), но без shapeMap/collisionMap (они null).
    createFromLayersWithRolesAndSides(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap, Map<Character,boolean[]> ladderSideMap, Map<Character,boolean[]> energySideMap, Map<Character,boolean[]> fluidSideMap)
    Как createFromLayersWithRolesAndSides(String[][], Map, Supplier, Map, Map, Map), но дополнительно задаёт стороны жидкостного подключения для FLUID_CONNECTOR / UNIVERSAL_CONNECTOR и (опционально) для самого контроллера (если добавить символ контроллера в карту).
    void
    destroyStructure(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing)
     
    net.minecraft.world.phys.shapes.VoxelShape
    generateShapeFromParts(net.minecraft.core.Direction facing)
     
    List<net.minecraft.core.BlockPos>
    getAllPartPositions(net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing)
     
    net.minecraft.core.BlockPos
    Получает позицию контроллера в структуре (относительные координаты).
    net.minecraft.world.phys.AABB
    getLocalRenderBoundingBox(net.minecraft.core.Direction facing)
    Returns the bounding AABB enclosing the entire multiblock structure in controller-local coordinates (i.e. with the controller treated as origin), with the given facing rotation pre-applied.
    Set<net.minecraft.core.BlockPos>
     
    net.minecraft.world.phys.AABB
    getRenderBoundingBox(net.minecraft.core.BlockPos controllerWorldPos, net.minecraft.core.Direction facing, double inflate)
    World-space convenience wrapper around getLocalRenderBoundingBox(net.minecraft.core.Direction): translates the cached local AABB onto the controller's actual world position and inflates it by inflate blocks on every axis - useful for renderers whose animated parts (rotating arms, sliding heads, particle plumes) reach beyond the static structure's footprint.
    net.minecraft.core.BlockPos
    getRotatedPos(net.minecraft.core.BlockPos controllerWorldPos, net.minecraft.core.BlockPos partLocalPos, net.minecraft.core.Direction facing)
     
    net.minecraft.world.phys.shapes.VoxelShape
    getSpecificCollisionShape(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing)
     
    net.minecraft.world.phys.shapes.VoxelShape
    getSpecificPartShape(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing)
    Возвращает форму конкретной части в мировом пространстве (но без смещения к позиции).
    Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>>
     
    List<net.minecraft.core.BlockPos>
    getTopRingWorldPositions(net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing)
     
    static boolean
     
    boolean
    isFullBlock(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing)
    Проверяет, является ли коллизия блока в этой позиции полным кубом.
    boolean
    isTopRingPart(net.minecraft.core.BlockPos localOffset)
     
    static void
    onNeighborChangedForPart(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos partPos, net.minecraft.core.BlockPos changedPos)
     
    void
    placeStructure(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing, IMultiblockController controller)
     
    resolvePartRole(net.minecraft.core.BlockPos gridPos, IMultiblockController controller)
    Получает роль для части с учётом обоих способов определения.
    static net.minecraft.core.BlockPos
    rotate(net.minecraft.core.BlockPos pos, net.minecraft.core.Direction facing)
     
    static net.minecraft.core.BlockPos
    rotateBack(net.minecraft.core.BlockPos pos, net.minecraft.core.Direction facing)
    Обратное вращение для получения локального оффсета из мировой позиции
    static net.minecraft.world.phys.shapes.VoxelShape
    rotateShape(net.minecraft.world.phys.shapes.VoxelShape shape, net.minecraft.core.Direction facing)
     
    static void
    updateFrameForController(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos)
     

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • MultiblockStructureHelper

      public MultiblockStructureHelper(Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> structureMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState)
    • MultiblockStructureHelper

      public MultiblockStructureHelper(Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> structureMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> symbolRoleMap)
    • MultiblockStructureHelper

      public MultiblockStructureHelper(Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> structureMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> symbolRoleMap, Map<net.minecraft.core.BlockPos,Character> positionSymbolMap, net.minecraft.core.BlockPos controllerOffset)
    • MultiblockStructureHelper

      public MultiblockStructureHelper(Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> structureMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> symbolRoleMap, Map<net.minecraft.core.BlockPos,Character> positionSymbolMap, Map<net.minecraft.core.BlockPos,net.minecraft.world.phys.shapes.VoxelShape> partShapes, Map<net.minecraft.core.BlockPos,net.minecraft.world.phys.shapes.VoxelShape> collisionShapes, net.minecraft.core.BlockPos controllerOffset)
  • Method Details

    • isDestroying

      public static boolean isDestroying()
    • createFromLayersWithRoles

      public static MultiblockStructureHelper createFromLayersWithRoles(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap, Map<Character,net.minecraft.world.phys.shapes.VoxelShape> shapeMap, Map<Character,net.minecraft.world.phys.shapes.VoxelShape> collisionMap, Map<Character,boolean[]> ladderSideMap, Map<Character,boolean[]> energySideMap, Map<Character,boolean[]> fluidSideMap)
      Создаёт MultiblockStructureHelper из слоёв с картой ролей. ВАЖНО: Контроллер должен быть обозначен символом с ролью PartRole.CONTROLLER. В структуре ОБЯЗАТЕЛЬНО должен быть ровно ОДИН контроллер. Структура автоматически центрируется так, чтобы контроллер находился в позиции (0, 0, 0).
      Parameters:
      layers - Массив слоёв
      symbolMap - Карта символов на Supplier
      phantomBlockState - Состояние фантомного блока
      roleMap - Карта символов на PartRole. ОБЯЗАТЕЛЬНО должен содержать символ с ролью CONTROLLER.
      shapeMap - необязательно: кастомные VoxelShape по символу
      collisionMap - необязательно: коллизии по символу
      ladderSideMap - необязательно: для символов с ролью LADDER - boolean[4] в порядке north, south, west, east. Если символа нет в карте - лестница со всех четырёх горизонтальных сторон.
      energySideMap - необязательно: для ENERGY_CONNECTOR / UNIVERSAL_CONNECTOR - boolean[6] в порядке north, south, west, east, up, down. Если символа нет в карте - энергия со всех шести сторон.
      Returns:
      Новый экземпляр MultiblockStructureHelper
    • createFromLayersWithRoles

      public static MultiblockStructureHelper createFromLayersWithRoles(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap, Map<Character,net.minecraft.world.phys.shapes.VoxelShape> shapeMap, Map<Character,net.minecraft.world.phys.shapes.VoxelShape> collisionMap)
    • createFromLayersWithRolesAndSides

      public static MultiblockStructureHelper createFromLayersWithRolesAndSides(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap, Map<Character,boolean[]> ladderSideMap, Map<Character,boolean[]> energySideMap)
      Как полный #createFromLayersWithRoles(String[][], Map, Supplier, Map, Map, Map, Map, Map), но без shapeMap/collisionMap (они null). Отдельное имя - из‑за стирания типов нельзя перегрузить по Map<Character, VoxelShape> vs Map<Character, boolean[]>. Для tuple сторон см. MultiblockSideTuples.
    • createFromLayersWithRolesAndSides

      public static MultiblockStructureHelper createFromLayersWithRolesAndSides(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap, Map<Character,boolean[]> ladderSideMap, Map<Character,boolean[]> energySideMap, Map<Character,boolean[]> fluidSideMap)
      Как createFromLayersWithRolesAndSides(String[][], Map, Supplier, Map, Map, Map), но дополнительно задаёт стороны жидкостного подключения для FLUID_CONNECTOR / UNIVERSAL_CONNECTOR и (опционально) для самого контроллера (если добавить символ контроллера в карту).
    • createFromLayersWithRoles

      public static MultiblockStructureHelper createFromLayersWithRoles(String[][] layers, Map<Character,Supplier<net.minecraft.world.level.block.state.BlockState>> symbolMap, Supplier<net.minecraft.world.level.block.state.BlockState> phantomBlockState, Map<Character,PartRole> roleMap)
    • getControllerOffset

      public net.minecraft.core.BlockPos getControllerOffset()
      Получает позицию контроллера в структуре (относительные координаты).
      Returns:
      BlockPos позиции контроллера относительно центра структуры
    • getSpecificPartShape

      public net.minecraft.world.phys.shapes.VoxelShape getSpecificPartShape(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing)
      Возвращает форму конкретной части в мировом пространстве (но без смещения к позиции).
      Parameters:
      gridPos - Координаты блока в сетке хелпера (из структуры)
      facing - Направление всей структуры
    • getSpecificCollisionShape

      public net.minecraft.world.phys.shapes.VoxelShape getSpecificCollisionShape(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing)
    • isFullBlock

      public boolean isFullBlock(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing)
      Проверяет, является ли коллизия блока в этой позиции полным кубом. Если это не полный куб, игра не должна выталкивать из него игрока.
    • resolvePartRole

      public PartRole resolvePartRole(net.minecraft.core.BlockPos gridPos, IMultiblockController controller)
      Получает роль для части с учётом обоих способов определения. Если есть symbolRoleMap, использует её; иначе вызывает controller.getPartRole().
      Parameters:
      localOffset - Локальная позиция части
      controller - Контроллер мультиблока
      Returns:
      PartRole для данной позиции
    • checkPlacement

      public boolean checkPlacement(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing, net.minecraft.world.entity.player.Player player)
    • getPartOffsets

      public Set<net.minecraft.core.BlockPos> getPartOffsets()
      Returns:
      A Set of all local offsets for the multiblock parts, relative to the controller.
    • placeStructure

      public void placeStructure(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing, IMultiblockController controller)
    • destroyStructure

      public void destroyStructure(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing)
    • getStructureMap

      public Map<net.minecraft.core.BlockPos,Supplier<net.minecraft.world.level.block.state.BlockState>> getStructureMap()
    • isTopRingPart

      public boolean isTopRingPart(net.minecraft.core.BlockPos localOffset)
      See Also:
    • getTopRingWorldPositions

      public List<net.minecraft.core.BlockPos> getTopRingWorldPositions(net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing)
      See Also:
    • computeFrameVisible

      public boolean computeFrameVisible(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing)
      See Also:
    • updateFrameForController

      public static void updateFrameForController(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos)
      See Also:
    • onNeighborChangedForPart

      public static void onNeighborChangedForPart(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos partPos, net.minecraft.core.BlockPos changedPos)
      See Also:
    • rotateBack

      public static net.minecraft.core.BlockPos rotateBack(net.minecraft.core.BlockPos pos, net.minecraft.core.Direction facing)
      Обратное вращение для получения локального оффсета из мировой позиции
    • getLocalRenderBoundingBox

      public net.minecraft.world.phys.AABB getLocalRenderBoundingBox(net.minecraft.core.Direction facing)
      Returns the bounding AABB enclosing the entire multiblock structure in controller-local coordinates (i.e. with the controller treated as origin), with the given facing rotation pre-applied. Each entry is computed once per direction and reused for every BlockEntity that shares this helper - the result depends only on structureMap + controllerOffset + facing, none of which vary per-BE.

      Coords are inclusive on the lower edge and exclusive on the upper edge, matching AABB convention - a single 1×1×1 block at the controller with no other parts produces AABB(0, 0, 0, 1, 1, 1).

      Used by IForgeBlockEntity.getRenderBoundingBox() overrides so the vanilla / Forge frustum + occlusion culler only skips a multiblock when its FULL footprint is offscreen, instead of skipping based on the controller's 1×1×1 cell while the rest of the structure is still in view (which produced the "machine pops out when controller goes offscreen" symptom).

    • getRenderBoundingBox

      public net.minecraft.world.phys.AABB getRenderBoundingBox(net.minecraft.core.BlockPos controllerWorldPos, net.minecraft.core.Direction facing, double inflate)
      World-space convenience wrapper around getLocalRenderBoundingBox(net.minecraft.core.Direction): translates the cached local AABB onto the controller's actual world position and inflates it by inflate blocks on every axis - useful for renderers whose animated parts (rotating arms, sliding heads, particle plumes) reach beyond the static structure's footprint.
      Parameters:
      controllerWorldPos - the world position of the multiblock controller
      facing - the controller's FACING property
      inflate - extra padding in blocks on every face (0 to disable)
    • generateShapeFromParts

      public net.minecraft.world.phys.shapes.VoxelShape generateShapeFromParts(net.minecraft.core.Direction facing)
    • rotateShape

      public static net.minecraft.world.phys.shapes.VoxelShape rotateShape(net.minecraft.world.phys.shapes.VoxelShape shape, net.minecraft.core.Direction facing)
    • getRotatedPos

      public net.minecraft.core.BlockPos getRotatedPos(net.minecraft.core.BlockPos controllerWorldPos, net.minecraft.core.BlockPos partLocalPos, net.minecraft.core.Direction facing)
    • rotate

      public static net.minecraft.core.BlockPos rotate(net.minecraft.core.BlockPos pos, net.minecraft.core.Direction facing)
    • getAllPartPositions

      public List<net.minecraft.core.BlockPos> getAllPartPositions(net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing)