package micdoodle8.mods.galacticraft.planets.venus.world.gen.dungeon; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; import java.lang.reflect.Constructor; import java.util.Random; public class CorridorVenus extends SizedPieceVenus { public CorridorVenus() { } public CorridorVenus(DungeonConfigurationVenus configuration, Random rand, int blockPosX, int blockPosZ, int sizeX, int sizeY, int sizeZ, EnumFacing direction) { super(configuration, sizeX, sizeY, sizeZ, direction); this.coordBaseMode = EnumFacing.SOUTH; this.boundingBox = new StructureBoundingBox(blockPosX, configuration.getYPosition(), blockPosZ, blockPosX + sizeX, configuration.getYPosition() + sizeY, blockPosZ + sizeZ); } @Override public boolean addComponentParts(World worldIn, Random randomIn, StructureBoundingBox structureBoundingBoxIn) { for (int i = 0; i < this.boundingBox.getXSize(); i++) { for (int j = 0; j < this.boundingBox.getYSize(); j++) { for (int k = 0; k < this.boundingBox.getZSize(); k++) { if (j == 2 && this.getDirection().getAxis() == EnumFacing.Axis.Z && (k + 1) % 4 == 0 && k != this.boundingBox.getZSize() - 1) { if (i == 0 || i == this.boundingBox.getXSize() - 1) { this.setBlockState(worldIn, Blocks.lava.getDefaultState(), i, j, k, this.boundingBox); } else if (i == 1 || i == this.boundingBox.getXSize() - 2) { this.setBlockState(worldIn, Blocks.iron_bars.getDefaultState(), i, j, k, this.boundingBox); } else { this.setBlockState(worldIn, Blocks.air.getDefaultState(), i, j, k, this.boundingBox); } } else if (j == 2 && this.getDirection().getAxis() == EnumFacing.Axis.X && (i + 1) % 4 == 0 && i != this.boundingBox.getXSize() - 1) { if (k == 0 || k == this.boundingBox.getZSize() - 1) { this.setBlockState(worldIn, Blocks.lava.getDefaultState(), i, j, k, this.boundingBox); } else if (k == 1 || k == this.boundingBox.getZSize() - 2) { this.setBlockState(worldIn, Blocks.iron_bars.getDefaultState(), i, j, k, this.boundingBox); } else { this.setBlockState(worldIn, Blocks.air.getDefaultState(), i, j, k, this.boundingBox); } } else if ((this.getDirection().getAxis() == EnumFacing.Axis.Z && (i == 1 || i == this.boundingBox.getXSize() - 2)) || j == 0 || j == this.boundingBox.getYSize() - 1 || (this.getDirection().getAxis() == EnumFacing.Axis.X && (k == 1 || k == this.boundingBox.getZSize() - 2))) { DungeonConfigurationVenus venusConfig = (DungeonConfigurationVenus) this.configuration; this.setBlockState(worldIn, j == 0 || j == this.boundingBox.getYSize() - 1 ? venusConfig.getBrickBlockFloor() : this.configuration.getBrickBlock(), i, j, k, this.boundingBox); } else if ((this.getDirection().getAxis() == EnumFacing.Axis.Z && (i == 0 || i == this.boundingBox.getXSize() - 1)) || (this.getDirection().getAxis() == EnumFacing.Axis.X && (k == 0 || k == this.boundingBox.getZSize() - 1))) { DungeonConfigurationVenus venusConfig = (DungeonConfigurationVenus) this.configuration; this.setBlockState(worldIn, j == 0 || j == this.boundingBox.getYSize() - 1 ? venusConfig.getBrickBlockFloor() : this.configuration.getBrickBlock(), i, j, k, this.boundingBox); } else { this.setBlockState(worldIn, Blocks.air.getDefaultState(), i, j, k, this.boundingBox); } } } } return true; } private <T extends SizedPieceVenus> T getRoom(Class<?> clazz, DungeonStartVenus startPiece, Random rand) { try { Constructor<?> c0 = clazz.getConstructor(DungeonConfigurationVenus.class, Random.class, Integer.TYPE, Integer.TYPE, EnumFacing.class); T dummy = (T) c0.newInstance(this.configuration, rand, 0, 0, this.getDirection().getOpposite()); StructureBoundingBox extension = getExtension(this.getDirection(), getDirection().getAxis() == EnumFacing.Axis.X ? dummy.getSizeX() : dummy.getSizeZ(), getDirection().getAxis() == EnumFacing.Axis.X ? dummy.getSizeZ() : dummy.getSizeX()); if (startPiece.checkIntersection(extension)) { return null; } int sizeX = extension.maxX - extension.minX; int sizeZ = extension.maxZ - extension.minZ; int sizeY = dummy.getSizeY(); int blockX = extension.minX; int blockZ = extension.minZ; Constructor<?> c1 = clazz.getConstructor(DungeonConfigurationVenus.class, Random.class, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, EnumFacing.class); return (T) c1.newInstance(this.configuration, rand, blockX, blockZ, sizeX, sizeY, sizeZ, this.getDirection().getOpposite()); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public PieceVenus getNextPiece(DungeonStartVenus startPiece, Random rand) { if (startPiece.attachedComponents.size() > 2 && startPiece.attachedComponents.get(startPiece.attachedComponents.size() - 2) instanceof RoomBossVenus) { try { return getRoom(this.configuration.getTreasureRoom(), startPiece, rand); } catch (Exception e) { e.printStackTrace(); } } else { int bossRoomChance = Math.max((int) (1.0 / Math.pow(startPiece.attachedComponents.size() / 55.0, 2)), 5); boolean bossRoom = rand.nextInt(bossRoomChance) == 0; if (bossRoom) { try { return getRoom(this.configuration.getBossRoom(), startPiece, rand); } catch (Exception e) { e.printStackTrace(); } } else { StructureBoundingBox extension = getExtension(this.getDirection(), rand.nextInt(4) + 6, rand.nextInt(4) + 6); if (startPiece.checkIntersection(extension)) { return null; } int sizeX = extension.maxX - extension.minX; int sizeZ = extension.maxZ - extension.minZ; int sizeY = configuration.getRoomHeight(); int blockX = extension.minX; int blockZ = extension.minZ; if (Math.abs(startPiece.getBoundingBox().maxZ - boundingBox.minZ) > 200) { return null; } if (Math.abs(startPiece.getBoundingBox().maxX - boundingBox.minX) > 200) { return null; } PieceVenus lastPiece = startPiece.attachedComponents.size() <= 2 ? null : (PieceVenus) startPiece.attachedComponents.get(startPiece.attachedComponents.size() - 2); if (!(lastPiece instanceof RoomSpawnerVenus)) { return new RoomSpawnerVenus(this.configuration, rand, blockX, blockZ, sizeX, sizeY, sizeZ, this.getDirection().getOpposite()); } else { if (rand.nextInt(2) == 0) { return new RoomEmptyVenus(this.configuration, rand, blockX, blockZ, sizeX, sizeY, sizeZ, this.getDirection().getOpposite()); } else { return new RoomChestVenus(this.configuration, rand, blockX, blockZ, sizeX, sizeY, sizeZ, this.getDirection().getOpposite()); } } } } return null; } }