예제 #1
0
 public void Serialize(SerializingContainer con)
 {
     Magic = con + Magic;
     Version = con + Version;
     DataOffset = con + DataOffset;
     EntryOffset = con + EntryOffset;
     FileCount = con + FileCount;
     BlockTableOffset = con + BlockTableOffset;
     MaxBlockSize = con + MaxBlockSize;
     if (con.isLoading)
         CompressionScheme = new char[4];
     for (int i = 0; i < 4; i++)
         CompressionScheme[i] = con + CompressionScheme[i];
     if (Magic != 0x53464152 ||
         Version != 0x00010000 ||
         MaxBlockSize != 0x00010000)
     {
         DebugLog.PrintLn("DLCPACKAGE::HEADERSTRUCT::SERIALIZE ERROR: Not supported DLC file!");
         return;
     }
     DebugLog.PrintLn("Magic: \t0x" + Magic.ToString("X8"));
     DebugLog.PrintLn("Version: \t0x" + Version.ToString("X8"));
     DebugLog.PrintLn("DataOffset: \t0x" + DataOffset.ToString("X8"));
     DebugLog.PrintLn("EntryOffset: 0x" + EntryOffset.ToString("X8"));
     DebugLog.PrintLn("FileCount: \t0x" + FileCount.ToString("X8"));
     DebugLog.PrintLn("MaxBlockSize:0x" + MaxBlockSize.ToString("X8"));
 }
예제 #2
0
 public void Serialize(SerializingContainer con, HeaderStruct header)
 {
     Header = header;
     MyOffset = (uint)con.GetPos();
     if (con.isLoading)
         Hash = new byte[16];
     for (int i = 0; i < 16; i++)
         Hash[i] = con + Hash[i];
     BlockSizeIndex = con + BlockSizeIndex;
     UncompressedSize = con + UncompressedSize;
     UncompressedSizeAdder = con + UncompressedSizeAdder;
     RealUncompressedSize = UncompressedSize + UncompressedSizeAdder << 32;
     DataOffset = con + DataOffset;
     DataOffsetAdder = con + DataOffsetAdder;
     RealDataOffset = DataOffset + DataOffsetAdder << 32;
     if (BlockSizeIndex == 0xFFFFFFFF)
     {
         BlockOffsets = new long[1];
         BlockOffsets[0] = RealDataOffset;
         BlockSizes = new ushort[1];
         BlockSizes[0] = (ushort)UncompressedSize;
         BlockTableOffset = 0;
     }
     else
     {
         int numBlocks = (int)Math.Ceiling((double)UncompressedSize / (double)header.MaxBlockSize);
         if (con.isLoading)
         {
             BlockOffsets = new long[numBlocks];
             BlockSizes = new ushort[numBlocks];
         }
         BlockOffsets[0] = RealDataOffset;
         long pos = con.Memory.Position;
         con.Seek((int)getBlockOffset((int)BlockSizeIndex, header.EntryOffset, header.FileCount), SeekOrigin.Begin);
         BlockTableOffset = con.Memory.Position;
         BlockSizes[0] = con + BlockSizes[0];
         for (int i = 1; i < numBlocks; i++)
         {
             BlockSizes[i] = con + BlockSizes[i];
             BlockOffsets[i] = BlockOffsets[i - 1] + BlockSizes[i];
         }
         con.Seek((int)pos, 0);
     }
 }
예제 #3
0
 public void Serialize(SerializingContainer con)
 {
     if (con.isLoading)
     {
         Header = new HeaderStruct();
     }
     //DebugLog.PrintLn("Header...");
     Header.Serialize(con);
     con.Seek((int)Header.EntryOffset, SeekOrigin.Begin);
     if (con.isLoading)
     {
         Files = new FileEntryStruct[Header.FileCount];
     }
     //DebugLog.PrintLn("Files...");
     for (int i = 0; i < Header.FileCount; i++)
     {
         Files[i].Serialize(con, Header);
     }
     if (con.isLoading)
     {
         ReadFileNames(con);
     }
 }
예제 #4
0
 public void ReadFileNames(SerializingContainer con)
 {
     FileEntryStruct e;
     int f = -1;
     for (int i = 0; i < Header.FileCount; i++)
     {
         e = Files[i];
         e.FileName = "UNKNOWN";
         Files[i] = e;
         if (CompareByteArray(Files[i].Hash, TOCHash))
             f = i;
     }
     if (f == -1)
         return;
     MemoryStream m = DecompressEntry(f);
     m.Seek(0, 0);
     StreamReader r = new StreamReader(m);
     while (!r.EndOfStream)
     {
         string line = r.ReadLine();
         byte[] hash = ComputeHash(line);
         f = -1;
         for (int i = 0; i < Header.FileCount; i++)
             if (CompareByteArray(Files[i].Hash, hash))
                 f = i;
         if (f != -1)
         {
             e = Files[f];
             e.FileName = line;
             Files[f] = e;
         }
     }
 }
예제 #5
0
 public void Serialize(SerializingContainer con)
 {
     if (con.isLoading)
         Header = new HeaderStruct();
     DebugLog.PrintLn("Header...");
     Header.Serialize(con);
     con.Seek((int)Header.EntryOffset, SeekOrigin.Begin);
     if (con.isLoading)
         Files = new FileEntryStruct[Header.FileCount];
     DebugLog.PrintLn("Files...");
     for (int i = 0; i < Header.FileCount; i++)
         Files[i].Serialize(con, Header);
     if (con.isLoading)
         ReadFileNames(con);
 }
예제 #6
0
 public void Load(string FileName)
 {
     MyFileName = FileName;
     DebugLog.PrintLn("Opening file : " + FileName);
     SerializingContainer con = new SerializingContainer(new FileStream(FileName, FileMode.Open, FileAccess.Read));
     Serialize(con);
     con.Memory.Close();
 }        
예제 #7
0
 private void button2_Click(object sender, EventArgs e)
 {
     int n = listBox5.SelectedIndex;
     if (n == -1)
         return;
     PCCPackage.ExportEntry ex = importpcc.Exports[n];
     PCCPackage.ExportEntry nex = new PCCPackage.ExportEntry();
     byte[] idata = importpcc.GetObjectData(n);
     List <PropertyReader.Property> Props = PropertyReader.getPropList(importpcc, idata);
     int start = PropertyReader.detectStart(importpcc, idata, (uint)importpcc.Exports[n].ObjectFlags);
     int end = start;
     if (Props.Count == 0)
     {
         DialogResult dialogResult = MessageBox.Show("This object contains no properties! Still import as binary data?", "No Properties", MessageBoxButtons.YesNo);
         if (dialogResult == System.Windows.Forms.DialogResult.No)
         {
             RefreshAll();
             return;
         }
     }
     else
     {
         end = Props[Props.Count - 1].offend;
         if (end < idata.Length)
         {
             int diff = idata.Length - end;
             DialogResult dialogResult = MessageBox.Show("This object contains " + diff + " bytes of binary data after the properties! Still continue to import binary data aswell?", "Binary data", MessageBoxButtons.YesNo);
             if (dialogResult == System.Windows.Forms.DialogResult.No)
             {
                 RefreshAll();
                 return;
             }
         }
     }
     MemoryStream res = new MemoryStream();
     if (((uint)importpcc.Exports[n].ObjectFlags & 0x02000000) != 0)
     {
         byte[] stackdummy = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //Lets hope for the best :D
                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,};
         res.Write(stackdummy, 0, stackdummy.Length);
     }
     else
     {
         res.Write(new byte[start], 0, start);
     }
     uint namecount = pcc.Header.NameCount;
     try
     {
         foreach (PropertyReader.Property p in Props)
         {
             PropertyReader.ImportProperty(pcc, importpcc, p, importpcc.getObjectName(ex.idxClass), res);
         }
     }
     catch (Exception exe) 
     {
         List<string> temp = new List<string>();
         for (int i = 0; i < namecount; i++)
             temp.Add(pcc.Names[i]);
         pcc.Names = temp;
         pcc.Header.NameCount = namecount;
         MessageBox.Show("Error occured while trying to importing : " + exe.Message);
     }
     if (importpcc.getObjectName(ex.idxClass) == "SkeletalMesh")
     {
         SkeletalMesh skl = new SkeletalMesh(importpcc, n);
         SkeletalMesh.BoneStruct bone;
         for (int i = 0; i < skl.Bones.Count; i++)
         {
             bone = skl.Bones[i];
             string s = importpcc.GetName(bone.Name);
             bone.Name = pcc.FindNameOrAdd(s);
             skl.Bones[i] = bone;
         }
         SkeletalMesh.TailNamesStruct tailName;
         for (int i = 0; i < skl.TailNames.Count; i++)
         {
             tailName = skl.TailNames[i];
             string s = importpcc.GetName(tailName.Name);
             tailName.Name = pcc.FindNameOrAdd(s);
             skl.TailNames[i] = tailName;
         }
         ME3LibWV.SerializingContainer container = new ME3LibWV.SerializingContainer(res);
         container.isLoading = false;
         skl.Serialize(container);
     }
     else
     {
         for (int i = end; i < idata.Length; i++)
             res.WriteByte(idata[i]);
     }
     nex.DataLoaded = true;
     nex.Data = res.ToArray();
     nex.Datasize = nex.Data.Length;
     nex.Unk1 = ex.Unk1;
     nex.Unk2 = ex.Unk2;
     nex.Unk3 = new int[ex.Unk3.Length];
     for (int i = 0; i < ex.Unk3.Length; i++)
         nex.Unk3[i] = ex.Unk3[i];
     nex.Unk4 = ex.Unk4;
     nex.Unk5 = ex.Unk5;
     nex.Unk6 = ex.Unk6;
     nex.Unk7 = ex.Unk7;
     nex.Unk8 = ex.Unk8;
     nex.ObjectFlags = ex.ObjectFlags;
     nex.Index = ex.Index;
     nex.idxName = pcc.FindNameOrAdd(importpcc.GetName(ex.idxName));
     nex.idxArchetype = nex.idxClass = nex.idxLink = nex.idxParent = 0;
     pcc.Exports.Add(nex);
     pcc.Header.ExportCount++;
     RefreshAll();
     MessageBox.Show("Done.");
 }