Package com.hbm_m.multiblock
Class MultiblockStructureHelper
java.lang.Object
com.hbm_m.multiblock.MultiblockStructureHelper
-
Constructor Summary
ConstructorsConstructorDescriptionMultiblockStructureHelper(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 TypeMethodDescriptionbooleancheckPlacement(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing, net.minecraft.world.entity.player.Player player) booleancomputeFrameVisible(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing) static MultiblockStructureHelpercreateFromLayersWithRoles(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) static MultiblockStructureHelpercreateFromLayersWithRoles(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) static MultiblockStructureHelpercreateFromLayersWithRoles(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 из слоёв с картой ролей.static MultiblockStructureHelpercreateFromLayersWithRolesAndSides(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).static MultiblockStructureHelpercreateFromLayersWithRolesAndSides(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 и (опционально) для самого контроллера (если добавить символ контроллера в карту).voiddestroyStructure(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing) net.minecraft.world.phys.shapes.VoxelShapegenerateShapeFromParts(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.AABBgetLocalRenderBoundingBox(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.AABBgetRenderBoundingBox(net.minecraft.core.BlockPos controllerWorldPos, net.minecraft.core.Direction facing, double inflate) World-space convenience wrapper aroundgetLocalRenderBoundingBox(net.minecraft.core.Direction): translates the cached local AABB onto the controller's actual world position and inflates it byinflateblocks 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.BlockPosgetRotatedPos(net.minecraft.core.BlockPos controllerWorldPos, net.minecraft.core.BlockPos partLocalPos, net.minecraft.core.Direction facing) net.minecraft.world.phys.shapes.VoxelShapegetSpecificCollisionShape(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing) net.minecraft.world.phys.shapes.VoxelShapegetSpecificPartShape(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing) Возвращает форму конкретной части в мировом пространстве (но без смещения к позиции).List<net.minecraft.core.BlockPos>getTopRingWorldPositions(net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing) static booleanbooleanisFullBlock(net.minecraft.core.BlockPos gridPos, net.minecraft.core.Direction facing) Проверяет, является ли коллизия блока в этой позиции полным кубом.booleanisTopRingPart(net.minecraft.core.BlockPos localOffset) static voidonNeighborChangedForPart(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos partPos, net.minecraft.core.BlockPos changedPos) voidplaceStructure(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.BlockPosrotate(net.minecraft.core.BlockPos pos, net.minecraft.core.Direction facing) static net.minecraft.core.BlockPosrotateBack(net.minecraft.core.BlockPos pos, net.minecraft.core.Direction facing) Обратное вращение для получения локального оффсета из мировой позицииstatic net.minecraft.world.phys.shapes.VoxelShaperotateShape(net.minecraft.world.phys.shapes.VoxelShape shape, net.minecraft.core.Direction facing) static voidupdateFrameForController(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos)
-
Constructor Details
-
MultiblockStructureHelper
-
MultiblockStructureHelper
-
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- Карта символов на SupplierphantomBlockState- Состояние фантомного блока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>vsMap<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
-
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
- 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
-
isTopRingPart
public boolean isTopRingPart(net.minecraft.core.BlockPos localOffset) -
getTopRingWorldPositions
public List<net.minecraft.core.BlockPos> getTopRingWorldPositions(net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing) -
computeFrameVisible
public boolean computeFrameVisible(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos, net.minecraft.core.Direction facing) -
updateFrameForController
public static void updateFrameForController(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos controllerPos) -
onNeighborChangedForPart
public static void onNeighborChangedForPart(net.minecraft.world.level.Level level, net.minecraft.core.BlockPos partPos, net.minecraft.core.BlockPos changedPos) -
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 onstructureMap+controllerOffset+ facing, none of which vary per-BE.Coords are inclusive on the lower edge and exclusive on the upper edge, matching
AABBconvention - a single 1×1×1 block at the controller with no other parts producesAABB(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 aroundgetLocalRenderBoundingBox(net.minecraft.core.Direction): translates the cached local AABB onto the controller's actual world position and inflates it byinflateblocks 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 controllerfacing- the controller's FACING propertyinflate- 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)
-