Example #1
0
        public static CubeInfo[] ParseCubes(string cubeData, string colourData)
        {
            BinaryBufferReader cubes   = new BinaryBufferReader(Convert.FromBase64String(cubeData), 0);
            BinaryBufferReader colours = new BinaryBufferReader(Convert.FromBase64String(colourData), 0);
            uint cubeCount             = cubes.ReadUint();
            uint colourCount           = colours.ReadUint();

            if (cubeCount != colourCount)
            {
                Logging.MetaLog("Something is f*****g broken");
                return(null);
            }
            Logging.MetaLog($"Detected {cubeCount} cubes");
            CubeInfo[] result = new CubeInfo[cubeCount];
            for (int cube = 0; cube < cubeCount; cube++)
            {
                result[cube] = TranslateSpacialEnumerations(
                    cubes.ReadUint(),
                    cubes.ReadByte(),
                    cubes.ReadByte(),
                    cubes.ReadByte(),
                    cubes.ReadByte(),
                    colours.ReadByte(),
                    colours.ReadByte(),
                    colours.ReadByte(),
                    colours.ReadByte()
                    );
            }
            return(result);
        }
Example #2
0
        public BlockJsonInfo[] Import(string name)
        {
            // download robot data
            RobotStruct robot;

            try
            {
                RobotBriefStruct[] botList = RoboAPIUtility.ListRobots(name);
                if (botList.Length == 0)
                {
                    throw new Exception("Failed to find robot");
                }
                robot = RoboAPIUtility.QueryRobotInfo(botList[0].itemId);
            }
            catch (Exception e)
            {
                Logging.CommandLogError($"Failed to download robot data. Reason: {e.Message}");
                Logging.MetaLog(e);
                return(new BlockJsonInfo[0]);
            }
            CubeInfo[] cubes = CubeUtility.ParseCubes(robot);
            // move bot closer to origin (since bots are rarely built at the garage bay origin of the bottom south-west corner)
            if (cubes.Length == 0)
            {
                Logging.CommandLogError($"Robot data contains no cubes");
                return(new BlockJsonInfo[0]);
            }
            float3 minPosition = cubes[0].position;

            for (int c = 0; c < cubes.Length; c++)
            {
                float3 cubePos = cubes[c].position;
                if (cubePos.x < minPosition.x)
                {
                    minPosition.x = cubePos.x;
                }
                if (cubePos.y < minPosition.y)
                {
                    minPosition.y = cubePos.y;
                }
                if (cubePos.z < minPosition.z)
                {
                    minPosition.z = cubePos.z;
                }
            }
            BlockJsonInfo[] blocks = new BlockJsonInfo[cubes.Length];
            for (int c = 0; c < cubes.Length; c++)
            {
                ref CubeInfo cube         = ref cubes[c];
                float3       realPosition = ((cube.position - minPosition) * CommandRoot.BLOCK_SIZE * CubeSize);
                if (cube.block == BlockIDs.TextBlock && !string.IsNullOrEmpty(cube.name))
                {
                    // TextBlock block ID means it's a placeholder
                    blocks[c] = new BlockJsonInfo
                    {
                        color    = ColorSpaceUtility.UnquantizeToArray(cube.color, cube.darkness),
                        name     = cube.cubeId.ToString(),
                        position = ConversionUtility.Float3ToFloatArray(realPosition),
                        rotation = ConversionUtility.Float3ToFloatArray(cube.rotation),
                        scale    = ConversionUtility.Float3ToFloatArray(cube.scale)
                    };
                }
                else
                {
                    blocks[c] = new BlockJsonInfo
                    {
                        color    = ColorSpaceUtility.UnquantizeToArray(cube.color, cube.darkness),
                        name     = cube.block.ToString(),
                        position = ConversionUtility.Float3ToFloatArray(realPosition),
                        rotation = ConversionUtility.Float3ToFloatArray(cube.rotation),
                        scale    = ConversionUtility.Float3ToFloatArray(cube.scale * CubeSize)
                    };
                }
            }