public void Write(AssetsFileWriter writer) { header.Write(writer); writer.Write(classes.Count); for (int i = 0; i < classes.Count; i++) { classes[i].Write(writer, header.fileVersion, header.flags); } long stringTablePos = writer.Position; writer.Write(stringTable); long stringTableLen = writer.Position - stringTablePos; long fileSize = writer.Position; header.stringTablePos = (uint)stringTablePos; header.stringTableLen = (uint)stringTableLen; header.uncompressedSize = (uint)fileSize; writer.Position = 0; header.Write(writer); }
public ulong Write(AssetsFileWriter writer, ulong filePos, int optimizeStringTable, uint compress, bool writeStringTable = true) { header.Write(writer, writer.Position); writer.Write(classes.Count); for (int i = 0; i < classes.Count; i++) { classes[i].Write(writer, filePos, header.fileVersion); } ulong stringTablePos = writer.Position; writer.Write(stringTable); ulong stringTableLen = writer.Position - stringTablePos; ulong fileSize = writer.Position; header.stringTablePos = (uint)stringTablePos; header.stringTableLen = (uint)stringTableLen; header.uncompressedSize = (uint)fileSize; writer.Position = 0; header.Write(writer, writer.Position); return(0); }
public void Write(AssetsFileWriter writer, int optimizeStringTable = 1, int compress = 1, bool writeStringTable = true) { long filePos = writer.BaseStream.Position; byte[] newStrTable = stringTable; //"optimize string table (slow)" mode 2 not supported //ex: >AABB\0>localAABB\0 can be just >local>AABB\0 if (optimizeStringTable == 1) { StringBuilder strTableBuilder = new StringBuilder(); Dictionary <string, uint> strTableMap = new Dictionary <string, uint>(); for (int i = 0; i < classes.Count; i++) { ClassDatabaseType type = classes[i]; AddStringTableEntry(strTableBuilder, strTableMap, ref type.name); if (header.fileVersion == 4 && (header.flags & 1) != 0) { AddStringTableEntry(strTableBuilder, strTableMap, ref type.assemblyFileName); } List <ClassDatabaseTypeField> fields = type.fields; for (int j = 0; j < fields.Count; j++) { ClassDatabaseTypeField field = fields[j]; AddStringTableEntry(strTableBuilder, strTableMap, ref field.fieldName); AddStringTableEntry(strTableBuilder, strTableMap, ref field.typeName); fields[j] = field; } } } header.Write(writer); writer.Write(classes.Count); for (int i = 0; i < classes.Count; i++) { classes[i].Write(writer, header.fileVersion, header.flags); } long stringTablePos = writer.Position; //set false only for tpk packing, don't set false anytime else! if (writeStringTable) { writer.Write(newStrTable); } long fileEndPos = writer.Position; long stringTableLen = writer.Position - stringTablePos; long fileSize = writer.Position; header.stringTablePos = (uint)stringTablePos; header.stringTableLen = (uint)stringTableLen; header.uncompressedSize = (uint)fileSize; writer.Position = filePos; header.Write(writer); writer.Position = fileEndPos; }