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")); }
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); } }
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); } }
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; } } }
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); }
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(); }
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."); }