public void Save(string filePath = null)
{
try
{
DebugLog.PrintLn("Writing Header...", true);
MemoryStream m = new MemoryStream();
m.Write(BitConverter.GetBytes(Header.magic), 0, 4);
m.Write(BitConverter.GetBytes(Header.ver1), 0, 2);
m.Write(BitConverter.GetBytes(Header.ver2), 0, 2);
m.Write(BitConverter.GetBytes(Header.HeaderLength), 0, 4);
WriteUString(Header.Group, m);
if (GeneralInfo.compressed)
m.Write(BitConverter.GetBytes(Header.Flags ^ 0x02000000), 0, 4);
else
m.Write(BitConverter.GetBytes(Header.Flags), 0, 4);
m.Write(BitConverter.GetBytes(Header.unk1), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(Header.unk2), 0, 4);
m.Write(BitConverter.GetBytes(Header.unk3), 0, 4);
m.Write(BitConverter.GetBytes(Header.unk4), 0, 4);
m.Write(Header.GUID, 0, 16);
m.Write(BitConverter.GetBytes(Header.Generations.Count), 0, 4);
foreach (Generation g in Header.Generations)
{
m.Write(BitConverter.GetBytes(g.ExportCount), 0, 4);
m.Write(BitConverter.GetBytes(g.ImportCount), 0, 4);
m.Write(BitConverter.GetBytes(g.NetObjCount), 0, 4);
}
m.Write(BitConverter.GetBytes(Header.EngineVersion), 0, 4);
m.Write(BitConverter.GetBytes(Header.CookerVersion), 0, 4);
m.Write(BitConverter.GetBytes(Header.unk5), 0, 4);
m.Write(BitConverter.GetBytes(Header.unk6), 0, 4);
m.Write(BitConverter.GetBytes(Header.CompressionFlag), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(Header.unk7), 0, 4);
m.Write(BitConverter.GetBytes(Header.unk8), 0, 4);
DebugLog.PrintLn("Writing Name Table...", true);
Header.NameOffset = (uint)m.Position;
Header.NameCount = (uint)Names.Count;
foreach (string s in Names)
WriteUString(s, m);
DebugLog.PrintLn("Writing Import Table...", true);
Header.ImportOffset = (uint)m.Position;
Header.ImportCount = (uint)Imports.Count;
foreach (ImportEntry e in Imports)
{
m.Write(BitConverter.GetBytes(e.idxPackage), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk1), 0, 4);
m.Write(BitConverter.GetBytes(e.idxClass), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk2), 0, 4);
m.Write(BitConverter.GetBytes(e.idxLink), 0, 4);
m.Write(BitConverter.GetBytes(e.idxName), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk3), 0, 4);
}
DebugLog.PrintLn("Writing Export Table...", true);
Header.ExportOffset = (uint)m.Position;
Header.ExportCount = (uint)Exports.Count;
for (int i = 0; i < Exports.Count; i++)
{
ExportEntry e = Exports[i];
e._infooffset = (uint)m.Position;
Exports[i] = e;
m.Write(BitConverter.GetBytes(e.idxClass), 0, 4);
m.Write(BitConverter.GetBytes(e.idxParent), 0, 4);
m.Write(BitConverter.GetBytes(e.idxLink), 0, 4);
m.Write(BitConverter.GetBytes(e.idxName), 0, 4);
m.Write(BitConverter.GetBytes(e.Index), 0, 4);
m.Write(BitConverter.GetBytes(e.idxArchetype), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk1), 0, 4);
m.Write(BitConverter.GetBytes(e.ObjectFlags), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(0), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk2), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk3.Length), 0, 4);
foreach (int j in e.Unk3)
m.Write(BitConverter.GetBytes(j), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk4), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk5), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk6), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk7), 0, 4);
m.Write(BitConverter.GetBytes(e.Unk8), 0, 4);
}
DebugLog.PrintLn("Writing Free Zone...", true);
int FreeZoneSize = (int)Header.FreeZoneEnd - (int)Header.FreeZoneStart;
Header.FreeZoneStart = (uint)m.Position;
m.Write(new byte[FreeZoneSize], 0, FreeZoneSize);
Header.FreeZoneEnd = Header.HeaderLength = (uint)m.Position;
DebugLog.PrintLn("Writing Export Data...", true);
for (int i = 0; i < Exports.Count; i++)
{
ExportEntry e = Exports[i];
byte[] buff = GetObjectData(i);
e.Dataoffset = (int)m.Position;
e.Datasize = buff.Length;
m.Write(buff, 0, buff.Length);
long pos = m.Position;
m.Seek(e._infooffset + 32, 0);
m.Write(BitConverter.GetBytes(e.Datasize), 0, 4);
m.Write(BitConverter.GetBytes(e.Dataoffset), 0, 4);
m.Seek(pos, 0);
}
DebugLog.PrintLn("Updating Header...", true);
m.Seek(8, 0);
m.Write(BitConverter.GetBytes(Header.HeaderLength), 0, 4);
m.Seek(24 + (Header.Group.Length + 1) * 2, 0);
m.Write(BitConverter.GetBytes(Header.NameCount), 0, 4);
m.Write(BitConverter.GetBytes(Header.NameOffset), 0, 4);
m.Write(BitConverter.GetBytes(Header.ExportCount), 0, 4);
m.Write(BitConverter.GetBytes(Header.ExportOffset), 0, 4);
m.Write(BitConverter.GetBytes(Header.ImportCount), 0, 4);
m.Write(BitConverter.GetBytes(Header.ImportOffset), 0, 4);
m.Write(BitConverter.GetBytes(Header.FreeZoneStart), 0, 4);
m.Write(BitConverter.GetBytes(Header.FreeZoneEnd), 0, 4);
DebugLog.PrintLn("Done generating.", true);
if (Source != null)
Source.Close();
if (filePath == null)
{
File.WriteAllBytes(GeneralInfo.filepath, m.ToArray());
}
else
{
File.WriteAllBytes(filePath, m.ToArray());
}
DebugLog.PrintLn("Done.", true);
}
catch (Exception ex)
{
DebugLog.PrintLn("PCCPACKAGE::SAVE ERROR:\n" + ex.Message);
}
}
public void CloneEntry(int uIndex)