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); }
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) }; } }