diff --git a/Plugins/UniversalEditor.Plugins.FileSystem/Associations/Merscom/DPK.uexml b/Plugins/UniversalEditor.Plugins.FileSystem/Associations/Merscom/DPK.uexml
new file mode 100644
index 00000000..139a03da
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.FileSystem/Associations/Merscom/DPK.uexml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+ *.dpk
+
+
+
+ DPK4
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/Merscom/DPKDataFormat.cs b/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/Merscom/DPKDataFormat.cs
index c8da3b13..b1f7fab8 100644
--- a/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/Merscom/DPKDataFormat.cs
+++ b/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/Merscom/DPKDataFormat.cs
@@ -28,6 +28,7 @@ namespace UniversalEditor.DataFormats.FileSystem.Merscom
///
/// Provides a for manipulating archives in Merscom DPK format.
///
+ [ImplementationStatus(DataFormatImplementationStatus.Load)]
public class DPKDataFormat : DataFormat
{
private static DataFormatReference _dfr;
@@ -53,27 +54,43 @@ namespace UniversalEditor.DataFormats.FileSystem.Merscom
if (DPK4 != "DPK4")
throw new InvalidDataFormatException();
- uint u1 = br.ReadUInt32();
- uint u2 = br.ReadUInt32();
+ uint archiveLength = br.ReadUInt32();
+ uint tocLength = br.ReadUInt32();
uint u3 = br.ReadUInt32();
- uint u4 = br.ReadUInt32();
- uint uFileCount = br.ReadUInt32();
- for (int i = 0; i < uFileCount; i++)
+ for (int i = 0; i < u3; i++)
{
- br.SeekUntilFirstNonNull();
+ uint u4 = br.ReadUInt32();
+ uint decompressedLength = br.ReadUInt32();
+ uint compressedLength = br.ReadUInt32(); // 371 39325
+ uint offset = br.ReadUInt32(); // 292196 292567
- uint u6 = br.ReadUInt32();
- uint u7 = br.ReadUInt32();
+ string nam = br.ReadNullTerminatedString(); // action.accfg
+ br.Align(4);
- string nam = br.ReadNullTerminatedString();
File file = fsom.AddFile(nam);
- ushort u8 = br.ReadUInt16();
- uint u9 = br.ReadUInt32();
- uint u10 = br.ReadUInt32();
+ file.Properties["compressedLength"] = compressedLength;
+ file.Properties["offset"] = offset;
+
+ file.Size = decompressedLength;
+
+ file.DataRequest += File_DataRequest;
}
}
+ void File_DataRequest(object sender, DataRequestEventArgs e)
+ {
+ File file = (File)sender;
+ uint compressedLength = (uint)file.Properties["compressedLength"];
+ uint offset = (uint)file.Properties["offset"];
+
+ Accessor.Reader.Seek(offset, SeekOrigin.Begin);
+ byte[] compressedData = Accessor.Reader.ReadBytes(compressedLength);
+ byte[] decompressedData = Compression.CompressionModule.FromKnownCompressionMethod(Compression.CompressionMethod.Zlib).Decompress(compressedData);
+ e.Data = decompressedData;
+ }
+
+
protected override void SaveInternal(ObjectModel objectModel)
{
throw new NotImplementedException();
diff --git a/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj b/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
index d35edc4a..59091cee 100644
--- a/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
+++ b/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
@@ -306,6 +306,7 @@
+
@@ -396,6 +397,7 @@
+