예제 #1
0
        public void WriteBinary(ArkArchive archive, WritingOptions options)
        {
            if (nameTableForWriteBinary != null)
            {
                archive.SetNameTable(OldNameList != null ? ((ListAppendingSet <string>)nameTableForWriteBinary).List : new List <string>(nameTableForWriteBinary));
            }

            writeBinaryHeader(archive);
            writeBinaryDataFiles(archive);
            writeBinaryEmbeddedData(archive);
            writeBinaryDataFilesObjectMap(archive);
            writeBinaryObjects(archive);

            if (SaveVersion > 6)
            {
                writeBinaryHibernation(archive);
            }

            if (SaveVersion > 5)
            {
                writeNameTable(archive);
            }

            writeBinaryProperties(archive, options);
        }
예제 #2
0
        private void readBinaryNameTable(ArkArchive archive)
        {
            long position = archive.Position;

            archive.Position = nameTableOffset;

            int           nameCount = archive.ReadInt();
            List <string> nameTable = new List <string>(nameCount);

            for (int n = 0; n < nameCount; n++)
            {
                nameTable.Add(archive.ReadString());
            }

            archive.SetNameTable(nameTable);

            archive.Position = position;
        }
        public void WriteBinary(ArkArchive archive)
        {
            archive.WriteFloat(X);
            archive.WriteFloat(Y);
            archive.WriteFloat(Z);
            archive.WriteByte(UnkByte);
            archive.WriteFloat(UnkFloat);

            archive.WriteInt(nameTableSize);
            ArkArchive nameArchive = archive.Slice(nameTableSize);

            nameArchive.WriteInt(3);

            nameArchive.WriteInt(nameTable.Count);
            nameTable.ForEach(nameArchive.WriteString);

            nameArchive.WriteInt(ZoneVolumes.Count);
            ZoneVolumes.ForEach(nameArchive.WriteName);

            archive.WriteInt(objectsSize);
            ArkArchive objectArchive = archive.Slice(objectsSize);

            objectArchive.WriteInt(Objects.Count);

            int currentOffset = propertiesStart;

            foreach (GameObject gameObject in Objects)
            {
                currentOffset = gameObject.WriteBinary(objectArchive, currentOffset);
            }

            objectArchive.SetNameTable(nameTable, 0, true);
            foreach (GameObject gameObject in Objects)
            {
                gameObject.WriteProperties(objectArchive, 0);
            }

            archive.WriteInt(UnkInt1);
            archive.WriteInt(ClassIndex);
        }
        private void readBinaryObjects(ArkArchive archive, ReadingOptions options)
        {
            int count = archive.ReadInt();

            Objects.Clear();
            Objects.Capacity = count;
            ObjectMap.Clear();
            for (int index = 0; index < count; index++)
            {
                addObject(new GameObject(archive), options.BuildComponentTree);
            }

            if (nameTable == null)
            {
                return;
            }
            archive.SetNameTable(nameTable, 0, true);

            for (int index = 0; index < count; index++)
            {
                Objects[index].LoadProperties(archive, index + 1 < count ? Objects[index + 1] : null, 0);
            }
        }