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
    attemptAutoRepair(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos currentCtrlPos, net.minecraft.world.level.block.state.BlockState state, IMultiblockController controller)
    Пытается обновить структуру до новой версии.
    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
    checkPlacementFromFacade(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos facadePos, net.minecraft.core.Direction facing, net.minecraft.world.entity.player.Player player)
    Проверка от клетки клика (facade): сама вычисляет позицию ядра.
    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>
     
    int
     
    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)
    Проверяет, является ли коллизия блока в этой позиции полным кубом.
    static boolean
     
    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)
     
    withPlacementOffset(int offset)
     

    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()
    • isRepairing

      public static boolean isRepairing()
    • 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
    • withPlacementOffset

      public MultiblockStructureHelper withPlacementOffset(int offset)
    • attemptAutoRepair

      public boolean attemptAutoRepair(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos currentCtrlPos, net.minecraft.world.level.block.state.BlockState state, IMultiblockController controller)
      Пытается обновить структуру до новой версии. Сдвигает контроллер, если это старый сейв, перестраивает фантомы при изменении размеров или свойств, а также обновляет рамку выделения.
    • 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 позиции контроллера относительно центра структуры
    • getPlacementOffset

      public int getPlacementOffset()
    • 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)
      Проверяет, свободны ли все клетки структуры.
      Parameters:
      controllerPos - мировая позиция ядра (контроллера), не клетки клика; для facade используйте checkPlacementFromFacade(net.minecraft.world.level.Level, net.minecraft.core.BlockPos, net.minecraft.core.Direction, net.minecraft.world.entity.player.Player).
    • checkPlacementFromFacade

      public boolean checkPlacementFromFacade(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos facadePos, net.minecraft.core.Direction facing, net.minecraft.world.entity.player.Player player)
      Проверка от клетки клика (facade): сама вычисляет позицию ядра.
    • 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)