public void Write(AssetsWriter writer) { writer.WriteBEInt32(MetadataSize); writer.WriteBEInt32(FileSize); writer.WriteBEInt32(Version); writer.WriteBEInt32(ObjectDataOffset); writer.Write(IsBigEndian); writer.AlignTo(4); //writer.Write(new byte[3]); }
public void Write(AssetsWriter writer) { writer.WriteCString(Version); writer.Write(Platform); writer.Write(HasTypeTrees); writer.Write(Types.Count()); Types.ForEach(x => x.Write(writer)); writer.Write(ObjectInfos.Count()); ObjectInfos.ForEach(x => { writer.AlignTo(4); x.Write(writer); }); writer.Write(Adds.Count()); Adds.ForEach(x => { writer.AlignTo(4); x.Write(writer); }); writer.Write(ExternalFiles.Count()); ExternalFiles.ForEach(x => x.Write(writer)); writer.WriteCString(""); }
public void WritePtr(AssetsWriter writer) { if (isNull) { byte[] buf = new byte[12]; writer.Write(buf); return; } writer.Write(FileID); writer.AlignTo(4); writer.Write(Target.ObjectID); }
public void Write(AssetsWriter writer) { Texture.Write(writer); AlphaTexture.Write(writer); writer.WriteArrayOf(SubMeshes, (o, w) => o.Write(w)); writer.WriteArray(IndexBuffer); writer.AlignTo(4); VertexData.Write(writer); writer.WriteArrayOf(BindPose, (o, w) => w.Write(o)); TextureRect.Write(writer); TextureRectOffset.Write(writer); AtlasRectOffset.Write(writer); writer.Write(SettingsRaw); UVTransform.Write(writer); writer.Write(DownscaleMultiplier); }
protected override void WriteBase(AssetsWriter writer) { base.WriteBase(writer); writer.Write(Name); Rect.Write(writer); Offset.Write(writer); Border.Write(writer); writer.Write(PixelsToUnits); Pivot.Write(writer); writer.Write(Extrude); writer.Write(IsPolygon); writer.AlignTo(4); writer.Write(RenderDataKey.First); writer.Write(RenderDataKey.Second); writer.WriteArrayOf(AtlasTags, (o, w) => w.Write(o)); SpriteAtlas.Write(writer); RenderData.Write(writer); writer.WriteArrayOf(PhysicsShape, (o, w) => w.WriteArrayOf(o, (o2, w2) => o2.Write(w2))); writer.WriteArrayOf(Bones, (o, w) => o.Write(w)); }
public void Write(AssetsWriter writer) { writer.Write(FileID); writer.AlignTo(4); writer.Write(PathID); }
public void Write() { try { using (Stream objectsMS = GetTempStream()) { using (Stream metaMS = GetTempStream()) { using (AssetsWriter writer = new AssetsWriter(objectsMS)) { int ctr = 0; foreach (var obj in Metadata.ObjectInfos) { if (obj.IsNew) { // Object is new here Console.WriteLine("Writing New object!"); } ctr++; var offset = (int)objectsMS.Position; obj.GetObjectForWrite().Write(writer); writer.Flush(); obj.DataOffset = offset; var origSize = obj.DataSize; obj.DataSize = (int)(objectsMS.Position - obj.DataOffset); if (origSize != obj.DataSize) { // TEMPORARY! MUST REMOVE! Console.WriteLine("MISMATCH!"); } writer.AlignTo(8); } } using (AssetsWriter writer = new AssetsWriter(metaMS)) { // This is fine! Metadata.Write(writer); } // objectMS is 8 bytes smaller than it should be here Header.FileSize = Header.HeaderSize + (int)objectsMS.Length + (int)metaMS.Length; Header.ObjectDataOffset = Header.HeaderSize + (int)metaMS.Length; int diff; int alignment = 16; //or 32, I don't know which //data has to be at least 4096 inward from the start of the file if (Header.ObjectDataOffset < 4096) { diff = 4096 - Header.ObjectDataOffset; } else { diff = alignment - (Header.ObjectDataOffset % alignment); if (diff == alignment) { diff = 0; } } if (diff > 0) { Header.ObjectDataOffset += diff; Header.FileSize += diff; } // According to parse, MetadataSize shrunk by 4 Header.MetadataSize = (int)metaMS.Length; objectsMS.Seek(0, SeekOrigin.Begin); metaMS.Seek(0, SeekOrigin.Begin); lock (this) { try { CloseBaseStream(); FileProvider.DeleteFiles(AssetsRootPath.CombineFwdSlash(AssetsFilename + ".split*")); using (Stream outputStream = GetTempStream()) { using (AssetsWriter writer = new AssetsWriter(outputStream)) { Header.Write(writer); } metaMS.CopyTo(outputStream); metaMS.Close(); if (diff > 0) { outputStream.Write(new byte[diff], 0, diff); } objectsMS.CopyTo(outputStream); objectsMS.Close(); outputStream.Seek(0, SeekOrigin.Begin); if (FileWasSplit) { int splitCtr = 0; byte[] buffer = new byte[1024 * 1024]; do { Stream outFile = FileProvider.GetWriteStream($"{AssetsRootPath.CombineFwdSlash(AssetsFilename)}.split{splitCtr}"); var readLen = (int)(outputStream.Length - outputStream.Position); if (readLen < buffer.Length) { outputStream.Read(buffer, 0, readLen); outFile.Write(buffer, 0, readLen); break; } outputStream.Read(buffer, 0, buffer.Length); outFile.Write(buffer, 0, buffer.Length); outFile.Close(); splitCtr++; } while (true); } else { outputStream.Seek(0, SeekOrigin.Begin); var bts = outputStream.ReadBytes((int)outputStream.Length); FileProvider.Write(AssetsRootPath.CombineFwdSlash(AssetsFilename), bts); } } FileProvider.Save(); _hasChanges = false; foreach (var ptr in _knownPointers.Where(x => x.Owner.ObjectInfo.ParentFile == this && x.IsNew)) { ptr.IsNew = false; } OpenBaseStream(); } catch (Exception ex) { throw new Exception("CRITICAL: writing and reopening the file failed, the file is possibly destroyed and this object is in an unknown state.", ex); } } } } } finally { CleanupTempFiles(); } }