use of org.terasology.math.Side in project Terasology by MovingBlocks.
the class NeighbourBlockFamilyUpdateSystem method processUpdateForBlockLocation.
private void processUpdateForBlockLocation(Vector3i blockLocation) {
for (Side side : Side.values()) {
Vector3i neighborLocation = new Vector3i(blockLocation);
neighborLocation.add(side.getVector3i());
if (worldProvider.isBlockRelevant(neighborLocation)) {
Block neighborBlock = worldProvider.getBlock(neighborLocation);
final BlockFamily blockFamily = neighborBlock.getBlockFamily();
if (blockFamily instanceof UpdatesWithNeighboursFamily) {
UpdatesWithNeighboursFamily neighboursFamily = (UpdatesWithNeighboursFamily) blockFamily;
Block neighborBlockAfterUpdate = neighboursFamily.getBlockForNeighborUpdate(worldProvider, blockEntityRegistry, neighborLocation, neighborBlock);
if (neighborBlock != neighborBlockAfterUpdate) {
worldProvider.setBlock(neighborLocation, neighborBlockAfterUpdate);
}
}
}
}
}
use of org.terasology.math.Side in project Terasology by MovingBlocks.
the class HorizontalBlockFamilyFactory method createBlockFamily.
@Override
public BlockFamily createBlockFamily(BlockFamilyDefinition definition, BlockShape shape, BlockBuilderHelper blockBuilder) {
if (!definition.isFreeform()) {
throw new IllegalStateException("A shape cannot be provided when creating a family for a non-freeform block family definition");
}
Map<Side, Block> blockMap = Maps.newHashMap();
for (Rotation rot : Rotation.horizontalRotations()) {
Side side = rot.rotate(Side.FRONT);
blockMap.put(side, blockBuilder.constructTransformedBlock(definition, shape, side.toString().toLowerCase(Locale.ENGLISH), rot));
}
BlockUri uri;
if (CUBE_SHAPE_URN.equals(shape.getUrn())) {
uri = new BlockUri(definition.getUrn());
} else {
uri = new BlockUri(definition.getUrn(), shape.getUrn());
}
return new HorizontalBlockFamily(uri, getArchetypeSide(), blockMap, definition.getCategories());
}
use of org.terasology.math.Side in project Terasology by MovingBlocks.
the class UpdatesWithNeighboursFamilyFactory method getRotationToAchieve.
private Rotation getRotationToAchieve(byte source, byte target) {
Collection<Side> originalSides = SideBitFlag.getSides(source);
Iterable<Rotation> rotations = horizontalOnly ? Rotation.horizontalRotations() : Rotation.values();
for (Rotation rot : rotations) {
Set<Side> transformedSides = Sets.newHashSet();
transformedSides.addAll(originalSides.stream().map(rot::rotate).collect(Collectors.toList()));
byte transformedSide = SideBitFlag.getSides(transformedSides);
if (transformedSide == target) {
return rot;
}
}
return null;
}
use of org.terasology.math.Side in project Terasology by MovingBlocks.
the class BlockBuilder method applyLoweredShape.
private void applyLoweredShape(Block block, BlockShape shape, Map<BlockPart, BlockTile> tiles) {
for (Side side : Side.values()) {
BlockPart part = BlockPart.fromSide(side);
BlockTile blockTile = tiles.get(part);
if (blockTile != null) {
BlockMeshPart meshPart = shape.getMeshPart(part).rotate(Rotation.none().getQuat4f()).mapTexCoords(worldAtlas.getTexCoords(blockTile, true), worldAtlas.getRelativeTileSize());
block.setLoweredLiquidMesh(part.getSide(), meshPart);
}
}
}
use of org.terasology.math.Side in project Terasology by MovingBlocks.
the class BlockBuilder method setBlockFullSides.
private void setBlockFullSides(Block block, BlockShape shape, Rotation rot) {
for (Side side : Side.values()) {
BlockPart targetPart = BlockPart.fromSide(rot.rotate(side));
block.setFullSide(targetPart.getSide(), shape.isBlockingSide(side));
}
}
Aggregations