use of mekanism.generators.common.tile.turbine.TileEntityTurbineRotor in project Mekanism by mekanism.
the class TurbineValidator method postcheck.
@Override
public FormationResult postcheck(TurbineMultiblockData structure, Set<BlockPos> innerNodes, Long2ObjectMap<IChunk> chunkMap) {
if (structure.length() % 2 != 1 || structure.width() % 2 != 1) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_EVEN_LENGTH);
}
int centerX = structure.getMinPos().getX() + (structure.length() - 1) / 2;
int centerZ = structure.getMinPos().getZ() + (structure.width() - 1) / 2;
BlockPos complex = null;
Set<BlockPos> turbines = new ObjectOpenHashSet<>();
Set<BlockPos> dispersers = new ObjectOpenHashSet<>();
Set<BlockPos> coils = new ObjectOpenHashSet<>();
Set<BlockPos> condensers = new ObjectOpenHashSet<>();
// Scan for complex
for (BlockPos pos : innerNodes) {
TileEntity tile = WorldUtils.getTileEntity(world, chunkMap, pos);
if (tile instanceof TileEntityRotationalComplex) {
if (complex != null || pos.getX() != centerX || pos.getZ() != centerZ) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_BAD_COMPLEX, pos);
}
structure.internalLocations.add(pos);
complex = pos;
} else if (tile instanceof TileEntityTurbineRotor) {
if (pos.getX() != centerX || pos.getZ() != centerZ) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_BAD_ROTOR, pos);
}
turbines.add(pos);
} else if (tile instanceof TileEntityPressureDisperser) {
dispersers.add(pos);
} else if (tile instanceof TileEntityElectromagneticCoil) {
coils.add(pos);
} else if (tile instanceof TileEntitySaturatingCondenser) {
condensers.add(pos);
}
}
// Terminate if complex doesn't exist
if (complex == null) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_MISSING_COMPLEX);
}
int rotors = complex.getY() - structure.getMinPos().getY() + 1;
int innerRadius = (Math.min(structure.length(), structure.width()) - 3) / 2;
if (innerRadius < rotors / 4) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_TOO_NARROW);
}
// Terminate if coils don't exist
if (coils.isEmpty()) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_MISSING_COILS);
}
BlockPos.Mutable mutablePos = new BlockPos.Mutable();
// Make sure a flat, horizontal plane of dispersers exists within the multiblock around the complex
for (int x = complex.getX() - innerRadius; x <= complex.getX() + innerRadius; x++) {
for (int z = complex.getZ() - innerRadius; z <= complex.getZ() + innerRadius; z++) {
if (x != centerX || z != centerZ) {
mutablePos.set(x, complex.getY(), z);
TileEntityPressureDisperser tile = WorldUtils.getTileEntity(TileEntityPressureDisperser.class, world, chunkMap, mutablePos);
if (tile == null) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_MISSING_DISPERSER, mutablePos);
}
dispersers.remove(mutablePos);
}
}
}
// If any dispersers were not processed, they're in the wrong place
if (!dispersers.isEmpty()) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_MALFORMED_DISPERSERS);
}
// Make sure all condensers are in proper locations
for (BlockPos coord : condensers) {
if (coord.getY() <= complex.getY()) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_CONDENSER_BELOW_COMPLEX, coord);
}
}
structure.condensers = condensers.size();
int turbineHeight = 0;
int blades = 0;
// Starting from the complex, walk down and count the number of rotors/blades in the structure
for (int y = complex.getY() - 1; y > structure.getMinPos().getY(); y--) {
mutablePos.set(centerX, y, centerZ);
TileEntityTurbineRotor rotor = WorldUtils.getTileEntity(TileEntityTurbineRotor.class, world, chunkMap, mutablePos);
if (rotor == null) {
// Not a contiguous set of rotors
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_ROTORS_NOT_CONTIGUOUS);
}
turbineHeight++;
blades += rotor.getHousedBlades();
structure.internalLocations.add(rotor.getBlockPos());
turbines.remove(mutablePos);
}
// If there are any rotors left over, they are in the wrong place in the structure
if (!turbines.isEmpty()) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_BAD_ROTORS);
}
// Update the structure with number of blades found on rotors
structure.blades = blades;
BlockPos startCoord = complex.relative(Direction.UP);
if (WorldUtils.getTileEntity(TileEntityElectromagneticCoil.class, world, chunkMap, startCoord) != null) {
structure.coils = FormationProtocol.explore(startCoord, coord -> WorldUtils.getTileEntity(TileEntityElectromagneticCoil.class, world, chunkMap, coord) != null);
}
if (coils.size() > structure.coils) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_MALFORMED_COILS);
}
for (BlockPos coord : structure.locations) {
if (WorldUtils.getTileEntity(TileEntityTurbineVent.class, world, chunkMap, coord) != null) {
if (coord.getY() < complex.getY()) {
return FormationResult.fail(GeneratorsLang.TURBINE_INVALID_VENT_BELOW_COMPLEX, coord);
}
structure.vents++;
}
}
structure.lowerVolume = structure.length() * structure.width() * turbineHeight;
structure.complex = complex;
return FormationResult.SUCCESS;
}
use of mekanism.generators.common.tile.turbine.TileEntityTurbineRotor in project Mekanism by mekanism.
the class RenderIndustrialTurbine method render.
@Override
protected void render(TileEntityTurbineCasing tile, float partialTick, MatrixStack matrix, IRenderTypeBuffer renderer, int light, int overlayLight, IProfiler profiler) {
if (tile.isMaster()) {
TurbineMultiblockData multiblock = tile.getMultiblock();
if (multiblock.isFormed() && multiblock.complex != null && multiblock.renderLocation != null) {
BlockPos pos = tile.getBlockPos();
BlockPos complexPos = multiblock.complex;
IVertexBuilder buffer = RenderTurbineRotor.INSTANCE.model.getBuffer(renderer);
profiler.push(GeneratorsProfilerConstants.TURBINE_ROTOR);
while (true) {
complexPos = complexPos.below();
TileEntityTurbineRotor rotor = WorldUtils.getTileEntity(TileEntityTurbineRotor.class, tile.getLevel(), complexPos);
if (rotor == null) {
break;
}
matrix.pushPose();
matrix.translate(complexPos.getX() - pos.getX(), complexPos.getY() - pos.getY(), complexPos.getZ() - pos.getZ());
RenderTurbineRotor.INSTANCE.render(rotor, matrix, buffer, MekanismRenderer.FULL_SKY_LIGHT, overlayLight);
matrix.popPose();
}
profiler.pop();
if (!multiblock.gasTank.isEmpty() && multiblock.length() > 0) {
int height = multiblock.lowerVolume / (multiblock.length() * multiblock.width());
if (height >= 1) {
GasRenderData data = new GasRenderData(multiblock.gasTank.getStack());
data.location = multiblock.renderLocation;
data.height = height;
data.length = multiblock.length();
data.width = multiblock.width();
int glow = data.calculateGlowLight(MekanismRenderer.FULL_SKY_LIGHT);
matrix.pushPose();
matrix.translate(data.location.getX() - pos.getX(), data.location.getY() - pos.getY(), data.location.getZ() - pos.getZ());
Model3D gasModel = ModelRenderer.getModel(data, 1);
MekanismRenderer.renderObject(gasModel, matrix, renderer.getBuffer(Atlases.translucentCullBlockSheet()), data.getColorARGB(multiblock.prevSteamScale), glow, overlayLight, getFaceDisplay(data, gasModel));
matrix.popPose();
}
}
}
}
}
use of mekanism.generators.common.tile.turbine.TileEntityTurbineRotor in project Mekanism by mekanism.
the class BlockTurbineRotor method use.
@Nonnull
@Override
@Deprecated
public ActionResultType use(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull PlayerEntity player, @Nonnull Hand hand, @Nonnull BlockRayTraceResult hit) {
TileEntityTurbineRotor tile = WorldUtils.getTileEntity(TileEntityTurbineRotor.class, world, pos);
if (tile == null) {
return ActionResultType.PASS;
} else if (world.isClientSide) {
return genericClientActivated(player, hand);
} else if (tile.tryWrench(state, player, hand, hit) != WrenchResult.PASS) {
return ActionResultType.SUCCESS;
}
ItemStack stack = player.getItemInHand(hand);
if (!player.isShiftKeyDown()) {
if (!stack.isEmpty() && stack.getItem() instanceof ItemTurbineBlade) {
if (tile.addBlade(true)) {
if (!player.isCreative()) {
stack.shrink(1);
}
}
}
} else if (stack.isEmpty()) {
if (tile.removeBlade()) {
if (!player.isCreative()) {
player.setItemInHand(hand, GeneratorsItems.TURBINE_BLADE.getItemStack());
player.inventory.setChanged();
}
}
} else if (stack.getItem() instanceof ItemTurbineBlade) {
if (stack.getCount() < stack.getMaxStackSize()) {
if (tile.removeBlade()) {
if (!player.isCreative()) {
stack.grow(1);
player.inventory.setChanged();
}
}
}
}
return ActionResultType.PASS;
}
Aggregations