/// <summary> /// Gets the positions of all parts in the multi blocks relative to the specified origin. /// Both the positions are and the connection points are rotated. /// Returns false if any of these positions is out of bounds. /// </summary> // ReSharper disable once AnnotateCanBeNullParameter public bool GetRotatedPositions(BlockPosition origin, byte rotation, out KeyValuePair <BlockPosition, BlockSides>[] output) { output = new KeyValuePair <BlockPosition, BlockSides> [_partConnectSides.Count]; Quaternion rotationQuaternion = Rotation.GetQuaternion(rotation); for (int index = 0; index < _partConnectSides.Count; index++) { KeyValuePair <Vector3Int, BlockSides> pair = _partConnectSides[index]; Vector3Int offset = Vector3Int.RoundToInt(rotationQuaternion * pair.Key); if (!origin.GetOffset(offset.x, offset.y, offset.z, out BlockPosition position)) { output = null; return(false); } output[index] = new KeyValuePair <BlockPosition, BlockSides>(position, Rotation.RotateSides(pair.Value, rotation)); } return(true); }
/// <summary> /// Determines whether a block at the specified position with the specified /// connection sides can connect to any other block. /// </summary> private bool CanConnect(BlockPosition position, BlockSides rotatedConnectSides) { for (int bit = 0; bit < 6; bit++) { BlockSides side = rotatedConnectSides & (BlockSides)(1 << bit); if (side == BlockSides.None || !position.GetOffset(side, out BlockPosition offset) || !_blocks.TryGetValue(offset, out IPlacedBlock block)) { continue; } int inverseBit = bit % 2 == 0 ? bit + 1 : bit - 1; if ((block.ConnectSides & (BlockSides)(1 << inverseBit)) != BlockSides.None) { return(true); } } return(false); }