#pragma once #include "SkyPortalFigure.h" uint32 GetFigureID(const FigureDataBlock& DataBlock) { int16_t OutFigureID; // Figure ID is stored in Block 0, bytes 0 to 3 (32-bit integer, little-endian) OutFigureID = DataBlock.blockdata[0][0] | (DataBlock.blockdata[0][1] << 8) | (DataBlock.blockdata[0][2] << 16) | (DataBlock.blockdata[0][3] << 24); /* // Variant ID is stored in Block 0, bytes 4 to 5 (16-bit integer, little-endian) OutVariantID = (DataBlock.blockdata[0][5] << 8) | DataBlock.blockdata[0][4]; */ return OutFigureID; }; /* void FigureData::ReadData(uint8 index) { ClearData(); for (uint8 i = 0; i < 64; i++) { GEngine->GetEngineSubsystem(); TArray output = SkySubsystem->QueryBlock(index, i); uint8[] blockData = new uint8[0x10]; Array.Copy(output, 3, blockData, 0, 16); // block 1 is sometimes a duplicate of block 0 if (i == 1) { if (blockData.SequenceEqual(data[0])) { i -= 1; continue; } } Array.Copy(blockData, 0, data[i], 0, 16); if (((i + 1) % 4 == 0) || i < 8) { Array.Copy(data[i], 0, decryptedData[i], 0, 16); } else { uint8[] hashIn = new byte[0x56]; data[0].CopyTo(hashIn, 0); data[1].CopyTo(hashIn, 0x10); hashIn[0x20] = i; HASH_CONST.CopyTo(hashIn, 0x21); uint8[] key = MD5.Create().ComputeHash(hashIn); uint8[] decrypted = new byte[0x10]; using (Aes aesAlg = Aes.Create()) { aesAlg.Key = key; aesAlg.Mode = CipherMode.ECB; aesAlg.Padding = PaddingMode.Zeros; ICryptoTransform decryptor = aesAlg.CreateDecryptor(); decrypted = decryptor.TransformFinalBlock(data[i], 0, data[i].Length); } Array.Copy(decrypted, 0, decryptedData[i], 0, 16); } } } */ void FigureData::ClearData() { }