public void ReadBinary(ArkArchive archive, ReadingOptions options) { readBinaryHeader(archive); if (SaveVersion > 5) { // Name table is located after the objects block, but will be needed to read the objects block readBinaryNameTable(archive); } readBinaryDataFiles(archive, options); readBinaryEmbeddedData(archive, options); readBinaryDataFilesObjectMap(archive, options); readBinaryObjects(archive, options); readBinaryObjectProperties(archive, options); if (SaveVersion > 6) { readBinaryHibernation(archive, options); } extractBinaryObjectCryopods(options); OldNameList = archive.HasUnknownNames ? archive.NameTable : null; HasUnknownData = archive.HasUnknownData; }
public void ReadBinary(ArkArchive archive, ReadingOptions options) { TribeVersion = archive.ReadInt(); if (TribeVersion != 1) { throw new NotSupportedException("Unknown Tribe Version " + TribeVersion); } int tribesCount = archive.ReadInt(); Objects.Clear(); ObjectMap.Clear(); for (int i = 0; i < tribesCount; i++) { addObject(new GameObject(archive), options.BuildComponentTree); } for (int i = 0; i < tribesCount; i++) { GameObject gameObject = Objects[i]; if (gameObject.ClassString == "PrimalTribeData") { Tribe = gameObject; } gameObject.LoadProperties(archive, i < tribesCount - 1 ? Objects[i + 1] : null, 0); } }
private MemoryStream toBuffer() { int size = sizeof(int); NameSizeCalculator nameSizer = ArkArchive.GetNameSizer(false); size += Objects.Sum(o => o.Size(nameSizer)); int propertiesBlockOffset = size; size += Objects.Sum(o => o.PropertiesSize(nameSizer)); MemoryStream buffer = new MemoryStream(new byte[size], true); ArkArchive archive = new ArkArchive(buffer); archive.WriteInt(Objects.Count); foreach (GameObject gameObject in Objects) { propertiesBlockOffset = gameObject.WriteBinary(archive, propertiesBlockOffset); } foreach (GameObject gameObject in Objects) { gameObject.WriteProperties(archive, 0); } return(buffer); }
public ArkContainer(ArkArrayInt8 source) { MemoryStream buffer = new MemoryStream(source.ToArray()); ArkArchive archive = new ArkArchive(buffer); ReadBinary(archive, new ReadingOptions()); }
public void WriteBinary(ArkArchive archive, WritingOptions options) { archive.WriteString(className); Properties?.ForEach(p => p.WriteBinary(archive)); archive.WriteName(ArkName.NameNone); archive.WriteInt(0); }
public void ReadBinary(ArkArchive archive, ReadingOptions options) { readBinaryHeader(archive); if (SaveVersion > 5) { // Name table is located after the objects block, but will be needed to read the objects block readBinaryNameTable(archive); } readBinaryDataFiles(archive, options); readBinaryEmbeddedData(archive, options); readBinaryDataFilesObjectMap(archive, options); readBinaryObjects(archive, options); readBinaryObjectProperties(archive, options); if (SaveVersion > 6) { readBinaryHibernation(archive, options); } // Now parse cryo creature data foreach (GameObject cryo in Objects.Where(x => x.ClassName.ToString().Contains("Cryop")).ToList()) { StructPropertyList customData = cryo.GetPropertyValue <IArkArray, ArkArrayStruct>("CustomItemDatas")?.FirstOrDefault() as StructPropertyList; PropertyStruct customDataBytes = customData?.Properties.FirstOrDefault(p => p.NameString == "CustomDataBytes") as PropertyStruct; PropertyArray byteArrays = (customDataBytes?.Value as StructPropertyList)?.Properties.FirstOrDefault(property => property.NameString == "ByteArrays") as PropertyArray; ArkArrayStruct byteArraysValue = byteArrays?.Value as ArkArrayStruct; ArkArrayUInt8 creatureBytes = ((byteArraysValue?[0] as StructPropertyList)?.Properties.FirstOrDefault(p => p.NameString == "Bytes") as PropertyArray)?.Value as ArkArrayUInt8; if (creatureBytes == null) { continue; } MemoryStream cryoStream = new MemoryStream(creatureBytes.ToArray <byte>()); using (ArkArchive cryoArchive = new ArkArchive(cryoStream)) { cryoArchive.ReadBytes(4); GameObject dino = new GameObject(cryoArchive); GameObject statusObject = new GameObject(cryoArchive); dino.LoadProperties(cryoArchive, new GameObject(), 0); statusObject.LoadProperties(cryoArchive, new GameObject(), 0); dino.IsCryo = true; addObject(dino, true); addObject(statusObject, true); //hack the id's so that the dino points to the appropriate dino status component PropertyObject statusComponentRef = dino.GetTypedProperty <PropertyObject>("MyCharacterStatusComponent"); statusComponentRef.Value.ObjectId = statusObject.Id; } } OldNameList = archive.HasUnknownNames ? archive.NameTable : null; HasUnknownData = archive.HasUnknownData; }
public int CalculateSize() { int size = sizeof(int) + ArkArchive.GetStringLength(className); NameSizeCalculator nameSizer = ArkArchive.GetNameSizer(false); size += nameSizer(ArkName.NameNone); size += Properties.Sum(p => p.CalculateSize(nameSizer)); return(size); }
public int CalculateSize() { int size = sizeof(int); NameSizeCalculator nameSizer = ArkArchive.GetNameSizer(false); size += Objects.Sum(o => o.Size(nameSizer)); propertiesBlockOffset = size; size += Objects.Sum(o => o.PropertiesSize(nameSizer)); return(size); }
public void WriteBinary(ArkArchive archive, WritingOptions options) { archive.WriteInt(Objects.Count); foreach (GameObject gameObject in Objects) { propertiesBlockOffset = gameObject.WriteBinary(archive, propertiesBlockOffset); } foreach (GameObject gameObject in Objects) { gameObject.WriteProperties(archive, 0); } }
public void ReadBinary(ArkArchive archive, ReadingOptions options) { int objectCount = archive.ReadInt(); Objects.Clear(); ObjectMap.Clear(); for (int i = 0; i < objectCount; i++) { addObject(new GameObject(archive), options.BuildComponentTree); } for (int i = 0; i < objectCount; i++) { Objects[i].LoadProperties(archive, i < objectCount - 1 ? Objects[i + 1] : null, 0); } }
private void readBinaryObjects(ArkArchive archive, ReadingOptions options) { if (options.GameObjects) { int count = archive.ReadInt(); Objects.Clear(); ObjectMap.Clear(); for (int n = 0; n < count; n++) { addObject(new GameObject(archive), options.BuildComponentTree); } } else { archive.HasUnknownData = true; archive.HasUnknownNames = true; } }
public void ReadBinary(ArkArchive archive, ReadingOptions options) { className = archive.ReadString(); Properties.Clear(); try { IProperty property = PropertyRegistry.ReadBinary(archive); while (property != null) { Properties.Add(property); property = PropertyRegistry.ReadBinary(archive); } } catch (UnreadablePropertyException upe) { Debug.WriteLine(upe.Message); Debug.WriteLine(upe.StackTrace); } // TODO: verify 0 int at end }