package com.thebrokenrail.energonrelics.structure.researchcomplex; import com.thebrokenrail.energonrelics.EnergonRelics; import com.thebrokenrail.energonrelics.config.HardcodedConfig; import com.thebrokenrail.energonrelics.structure.StructureContext; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.StairsBlock; import net.minecraft.block.enums.BlockHalf; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import java.util.ArrayList; import java.util.List; public class ResearchComplexHallwayPart extends BaseResearchComplexPart { private final boolean hasLight; private int rightRoomPadding; private int leftRoomPadding; private static final float ROOM_CHANCE = 0.45f; public ResearchComplexHallwayPart(ResearchComplexState state, List list, boolean hasLight, int rightRoomPadding, int leftRoomPadding) { super(state, list); this.hasLight = hasLight; this.rightRoomPadding = rightRoomPadding; this.leftRoomPadding = leftRoomPadding; } private static final int HEIGHT = 6; private static final int DEPTH = 3; @Override protected void build(StructureContext context) { BlockState bricks = Blocks.QUARTZ_BRICKS.getDefaultState(); if (!hasLight || getState().hasEnergy(HardcodedConfig.ENERGON_LIGHT_ENERGY_REQUIRED, getPosFromOrigin(new BlockPos(3, 5, 1)))) { BlockState air = Blocks.AIR.getDefaultState(); BlockState stairs = Blocks.QUARTZ_STAIRS.getDefaultState(); BlockState westStairs = stairs.with(StairsBlock.FACING, Direction.WEST); BlockState eastStairs = stairs.with(StairsBlock.FACING, Direction.EAST); for (int y = 0; y < HEIGHT; y++) { BlockState state = y == 0 || y == HEIGHT - 1 ? bricks : air; if (y > 1 && y < HEIGHT - 2) { rect(new BlockPos(1, y, 0), 5, 1, DEPTH, air); rect(new BlockPos(0, y, 0), 1, 1, DEPTH, bricks); rect(new BlockPos(6, y, 0), 1, 1, DEPTH, bricks); } else { rect(new BlockPos(2, y, 0), 3, 1, DEPTH, state); } if (y == 1 || y == HEIGHT - 2) { if (y == HEIGHT - 2) { eastStairs = eastStairs.with(StairsBlock.HALF, BlockHalf.TOP); westStairs = westStairs.with(StairsBlock.HALF, BlockHalf.TOP); } rect(new BlockPos(1, y, 0), 1, 1, DEPTH, westStairs); rect(new BlockPos(5, y, 0), 1, 1, DEPTH, eastStairs); } } if (hasLight) { set(new BlockPos(3, 5, 1), EnergonRelics.Blocks.ENERGON_LIGHT.getDefaultState()); } if (leftRoomPadding == 0) { if (getState().random.nextFloat() <= ROOM_CHANCE) { AbstractResearchComplexRoomPart room = AbstractResearchComplexRoomPart.get(getState(), getRoomTransformation(true)); part(context, new BlockPos(5, 1, 1), room); leftRoomPadding = room.getWidth(); } } else { leftRoomPadding = leftRoomPadding - 1; } if (rightRoomPadding == 0) { if (getState().random.nextFloat() <= ROOM_CHANCE) { AbstractResearchComplexRoomPart room = AbstractResearchComplexRoomPart.get(getState(), getRoomTransformation(false)); part(context, new BlockPos(1, 1, 1), room); rightRoomPadding = room.getWidth(); } } else { rightRoomPadding = rightRoomPadding - 1; } part(context, new BlockPos(0, 0, DEPTH), new ResearchComplexHallwayPart(getState(), getTransformations(), !hasLight, rightRoomPadding, leftRoomPadding)); } else { rect(new BlockPos(1, 1, 0), 5, 4, 1, bricks); } } private List getRoomTransformation(boolean mirror) { List list = new ArrayList<>(); if (mirror) { list.add(MIRROR_DEPTH); } list.addAll(getTransformations()); list.add(com.thebrokenrail.energonrelics.structure.StructurePart.CLOCKWISE_90); return list; } }