public static void AddFileBackToRPF(RpfDirectoryEntry RPFDirectory, string filename, byte[] newData) { if (Regex.Matches(filename, ".rpf").Count > 1) { string topRPF = StringFunctions.TopMostRPF(filename); RpfFile CurrentRpf = new RpfFile(topRPF, topRPF); CurrentRpf.ScanStructure(null, null); DefragmentChildren(CurrentRpf, filename, newData, RPFDirectory); } else { RpfFile.CreateFile(RPFDirectory, Path.GetFileName(filename), newData, true); RpfFile CurrentRpf = new RpfFile(Path.GetDirectoryName(filename), Path.GetDirectoryName(filename)); RpfFile.Defragment(CurrentRpf); } }
private void SelectFile(RpfEntry entry, int offset, int length) { RpfSelectedEntry = entry; RpfSelectedOffset = offset; RpfSelectedLength = length; RpfFileEntry rfe = entry as RpfFileEntry; if (rfe == null) { RpfDirectoryEntry rde = entry as RpfDirectoryEntry; if (rde != null) { FileInfoLabel.Text = rde.Path + " (Directory)"; DataTextBox.Text = "[Please select a data file]"; } else { FileInfoLabel.Text = "[Nothing selected]"; DataTextBox.Text = "[Please select a search result]"; } return; } Cursor = Cursors.WaitCursor; string typestr = "Resource"; if (rfe is RpfBinaryFileEntry) { typestr = "Binary"; } byte[] data = rfe.File.ExtractFile(rfe); int datalen = (data != null) ? data.Length : 0; FileInfoLabel.Text = rfe.Path + " (" + typestr + " file) - " + TextUtil.GetBytesReadable(datalen); if (ShowLargeFileContentsCheckBox.Checked || (datalen < 524287)) //512K { DisplayFileContentsText(rfe, data, length, offset); } else { DataTextBox.Text = "[Filesize >512KB. Select the Show large files option to view its contents]"; } //bool istexdict = false; //if (rfe.NameLower.EndsWith(".ymap")) //{ // YmapFile ymap = new YmapFile(rfe); // ymap.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ymap; //} //else if (rfe.NameLower.EndsWith(".ytyp")) //{ // YtypFile ytyp = new YtypFile(); // ytyp.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ytyp; //} //else if (rfe.NameLower.EndsWith(".ymf")) //{ // YmfFile ymf = new YmfFile(); // ymf.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ymf; //} //else if (rfe.NameLower.EndsWith(".ymt")) //{ // YmtFile ymt = new YmtFile(); // ymt.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ymt; //} //else if (rfe.NameLower.EndsWith(".ybn")) //{ // YbnFile ybn = new YbnFile(); // ybn.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ybn; //} //else if (rfe.NameLower.EndsWith(".fxc")) //{ // FxcFile fxc = new FxcFile(); // fxc.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = fxc; //} //else if (rfe.NameLower.EndsWith(".yft")) //{ // YftFile yft = new YftFile(); // yft.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = yft; // if ((yft.Fragment != null) && (yft.Fragment.Drawable != null) && (yft.Fragment.Drawable.ShaderGroup != null) && (yft.Fragment.Drawable.ShaderGroup.TextureDictionary != null)) // { // ShowTextures(yft.Fragment.Drawable.ShaderGroup.TextureDictionary); // istexdict = true; // } //} //else if (rfe.NameLower.EndsWith(".ydr")) //{ // YdrFile ydr = new YdrFile(); // ydr.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ydr; // if ((ydr.Drawable != null) && (ydr.Drawable.ShaderGroup != null) && (ydr.Drawable.ShaderGroup.TextureDictionary != null)) // { // ShowTextures(ydr.Drawable.ShaderGroup.TextureDictionary); // istexdict = true; // } //} //else if (rfe.NameLower.EndsWith(".ydd")) //{ // YddFile ydd = new YddFile(); // ydd.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ydd; // //todo: show embedded texdicts in ydd's? is this possible? //} //else if (rfe.NameLower.EndsWith(".ytd")) //{ // YtdFile ytd = new YtdFile(); // ytd.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ytd; // ShowTextures(ytd.TextureDict); // istexdict = true; //} //else if (rfe.NameLower.EndsWith(".ycd")) //{ // YcdFile ycd = new YcdFile(); // ycd.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ycd; //} //else if (rfe.NameLower.EndsWith(".ynd")) //{ // YndFile ynd = new YndFile(); // ynd.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ynd; //} //else if (rfe.NameLower.EndsWith(".ynv")) //{ // YnvFile ynv = new YnvFile(); // ynv.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = ynv; //} //else if (rfe.NameLower.EndsWith("_cache_y.dat")) //{ // CacheDatFile cdf = new CacheDatFile(); // cdf.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = cdf; //} //else if (rfe.NameLower.EndsWith(".rel")) //{ // RelFile rel = new RelFile(rfe); // rel.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = rel; //} //else if (rfe.NameLower.EndsWith(".gxt2")) //{ // Gxt2File gxt2 = new Gxt2File(); // gxt2.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = gxt2; //} //else if (rfe.NameLower.EndsWith(".pso")) //{ // JPsoFile pso = new JPsoFile(); // pso.Load(data, rfe); // DetailsPropertyGrid.SelectedObject = pso; //} //else //{ // DetailsPropertyGrid.SelectedObject = null; //} //if (!istexdict) //{ // ShowTextures(null); //} Cursor = Cursors.Default; }
private void Find() { if (InProgress) { return; } if (ScannedFiles.Count == 0) { MessageBox.Show("Please scan the GTAV folder first."); return; } string find = FindTextBox.Text.ToLowerInvariant(); Cursor = Cursors.WaitCursor; if (string.IsNullOrEmpty(find)) { ClearFiles(); foreach (RpfFile file in RootFiles) { AddScannedFile(file, null); //reset the file tree... slow :( } } else { ClearFiles(); int count = 0; int max = 500; foreach (RpfFile file in ScannedFiles) { if (file.Name.ToLowerInvariant().Contains(find)) { AddFileNode(file, null); count++; } foreach (RpfEntry entry in file.AllEntries) { if (entry.NameLower.Contains(find)) { if (entry is RpfDirectoryEntry) { RpfDirectoryEntry direntry = entry as RpfDirectoryEntry; TreeNode node = AddEntryNode(entry, null); foreach (RpfFileEntry cfentry in direntry.Files) { //if (cfentry.Name.EndsWith(".rpf", StringComparison.InvariantCultureIgnoreCase)) continue; AddEntryNode(cfentry, node); } count++; } else if (entry is RpfBinaryFileEntry) { if (entry.NameLower.EndsWith(".rpf", StringComparison.InvariantCultureIgnoreCase)) { continue; } AddEntryNode(entry, null); count++; } else if (entry is RpfResourceFileEntry) { AddEntryNode(entry, null); count++; } } if (count >= max) { MessageBox.Show("Search results limited to " + max.ToString() + " entries."); break; } } if (count >= max) { break; } } } Cursor = Cursors.Default; }
public static void DefragmentChildren(RpfFile CurrentRpf, string file, byte[] newData, RpfDirectoryEntry RPFDirectory) { foreach (RpfEntry RPFFile in CurrentRpf.AllEntries) { if (RPFFile.Name == Path.GetFileName(file)) { RpfFile.CreateFile(RPFDirectory, Path.GetFileName(file), newData, true); RpfFile.Defragment(CurrentRpf); break; } } foreach (RpfFile RPFs in CurrentRpf.Children) { DefragmentChildren(RPFs, file, newData, RPFDirectory); } }