From a1a37f56864ccf3d329526c66cfe5887498c533a Mon Sep 17 00:00:00 2001 From: Bayu Satiyo Date: Tue, 23 Jan 2024 20:30:53 +0700 Subject: [PATCH] Workaround for detecting selected file We come back using traditional file name to validate the required file. We use it because Unity asset file header are sometimes changing for every version. If anyone knows better way to do this, please make a PR! Signed-off-by: Bayu Satiyo --- USSR.cs | 339 ++++++++++++++++++++----------------------- Utils/BrotliUtils.cs | 54 ++++--- Utils/GZipUtils.cs | 18 ++- Utils/Utility.cs | 2 +- classdata.tpk | Bin 1225486 -> 1254671 bytes 5 files changed, 207 insertions(+), 206 deletions(-) diff --git a/USSR.cs b/USSR.cs index 7610dae..09767d1 100644 --- a/USSR.cs +++ b/USSR.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System; using AssetsTools.NET; using AssetsTools.NET.Extra; using Kiraio.UnityWebTools; @@ -12,113 +12,6 @@ public class USSR { const string VERSION = "1.1.6"; const string ASSET_CLASS_DB = "classdata.tpk"; - static readonly byte[] ggmMagic = - { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x16, - 0x00, - 0x00, - 0x00, - 0x00 - }; - - static readonly byte[] unity3dMagic = - { - 0x55, - 0x6E, - 0x69, - 0x74, - 0x79, - 0x46, - 0x53, - 0x00, - 0x00, - 0x00, - 0x00, - 0x08, - 0x35, - 0x2E, - 0x78, - 0x2E - }; - - static readonly byte[] unityWebDataMagic = - { - 0x55, - 0x6E, - 0x69, - 0x74, - 0x79, - 0x57, - 0x65, - 0x62, - 0x44, - 0x61, - 0x74, - 0x61, - 0x31, - 0x2E, - 0x30, - 0x00 - }; - - static readonly byte[] gzipMagic = { 0x1f, 0x8b }; - - // Ref: https://github.com/google/brotli/issues/867#issue-739852869 - // I have already test this magic bytes into an asset file, but - // it's turning out that it's not work. - static readonly byte[] unityBrotliMagic = - { - 0x6B, - 0x8D, - 0x00, - 0x55, - 0x6E, - 0x69, - 0x74, - 0x79, - 0x57, - 0x65, - 0x62, - 0x20, - 0x43, - 0x6F, - 0x6D, - 0x70, - 0x72, - 0x65, - 0x73, - 0x73, - 0x65, - 0x64, - 0x20, - 0x43, - 0x6F, - 0x6E, - 0x74, - 0x65, - 0x6E, - 0x74, - 0x20, - 0x28, - 0x62, - 0x72, - 0x6F, - 0x74, - 0x6C, - 0x69, - 0x29 - }; enum AssetTypes { @@ -126,8 +19,6 @@ enum AssetTypes Bundle } - static AssetTypes assetType; - enum WebGLCompressionType { None, @@ -135,6 +26,7 @@ enum WebGLCompressionType GZip } + static AssetTypes assetType; static WebGLCompressionType webGLCompressionType; static void Main(string[] args) @@ -143,20 +35,19 @@ static void Main(string[] args) PrintHelp(); Console.WriteLine(); - string? ussrExec = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string? ussrExec = Path.GetDirectoryName(AppContext.BaseDirectory); ChooseAction: string[] actionList = { "Remove Unity Splash Screen", "Remove Watermark", "Exit" }; string actionPrompt = AnsiConsole.Prompt( new SelectionPrompt() - .Title("What would you like to do?") + .Title("What would you like to do? (Press ENTER go, UP/DOWN to select)") .AddChoices(actionList) ); int choiceIndex = Array.FindIndex(actionList, item => item == actionPrompt); string? selectedFile = string.Empty, - originalFileName = string.Empty; - string? webDataFile = string.Empty, + webDataFile = string.Empty, unpackedWebDataDirectory = string.Empty; bool isWebGL = false; @@ -164,24 +55,33 @@ static void Main(string[] args) { case 0: case 1: - // Unfortunately, only one filter are supported. - // Instead of working around with this, we just need to manually validate by reading the file header later. + AnsiConsole.MarkupLine("Opening File Picker..."); + // Unfortunately, this File Picker library currently only support one filter :( + // So we pass all file types and manually checking them if it's a valid file that we want. DialogResult filePicker = Dialog.FileOpen( null, Path.GetDirectoryName(Utility.GetLastOpenedFile()) ); if (filePicker.IsCancelled) + { + AnsiConsole.MarkupLine("Cancelled. Oh, it\'s okay ^_^"); + Console.WriteLine(); goto ChooseAction; + } else if (filePicker.IsError) { AnsiConsole.MarkupLine( - "[red]( ERROR )[/]Unable to open File Picker dialog!" + "[red]( RAWR )[/] Unable to open File Picker! Try using a different Terminal?" ); + Console.WriteLine(); goto ChooseAction; } - selectedFile = originalFileName = filePicker.Path; + selectedFile = filePicker.Path; + AnsiConsole.MarkupLineInterpolated( + $"( INFO ) Selected file: [green]{selectedFile}[/]" + ); Utility.SaveLastOpenedFile(selectedFile); break; case 2: @@ -192,54 +92,75 @@ static void Main(string[] args) webDataFile = Path.Combine( Path.GetDirectoryName(selectedFile) ?? string.Empty, - Path.GetFileNameWithoutExtension(selectedFile) + Path.GetFileNameWithoutExtension(selectedFile) // Without .br / .gz extension ); + string selectedFileName = Path.GetFileName(selectedFile); - if (Utility.ValidateFile(selectedFile, ggmMagic)) - { - AnsiConsole.MarkupLine("( INFO ) [green]globalgamemanagers[/] file selected."); + if (selectedFileName.Contains("globalgamemanagers")) assetType = AssetTypes.Asset; - } - else if (Utility.ValidateFile(selectedFile, unity3dMagic)) - { - AnsiConsole.MarkupLine("( INFO ) [green]unity3d[/] file selected."); + else if (selectedFileName.EndsWith(".unity3d")) assetType = AssetTypes.Bundle; - } - else if (Utility.ValidateFile(selectedFile, unityWebDataMagic)) + else if (selectedFileName.EndsWith(".data")) { - AnsiConsole.MarkupLine("( INFO ) [green]UnityWebData[/] file selected."); isWebGL = true; webDataFile = selectedFile; webGLCompressionType = WebGLCompressionType.None; } - else if ( - Utility.ValidateFile(selectedFile, unityBrotliMagic) - || Path.GetExtension(selectedFile) == ".br" - ) + else if (selectedFileName.EndsWith("data.unityweb")) { - AnsiConsole.MarkupLine("( INFO ) [green]UnityWebData Brotli[/] file selected."); + string[] compressionList = { "Brotli", "GZip" }; + string compressionListPrompt = AnsiConsole.Prompt( + new SelectionPrompt() + .Title("What compression type did you use?") + .AddChoices(compressionList) + ); + int compressionChoiceIndex = Array.FindIndex( + compressionList, + item => item == compressionListPrompt + ); isWebGL = true; - webGLCompressionType = WebGLCompressionType.Brotli; - AnsiConsole.MarkupLineInterpolated( - $"( INFO ) Decompressing [green]{selectedFile}[/]..." - ); - BrotliUtils.DecompressFile(selectedFile, webDataFile); + switch (compressionChoiceIndex) + { + case 0: + webGLCompressionType = WebGLCompressionType.Brotli; + if ( + DecompressCompressedWebData( + webGLCompressionType, + selectedFile, + webDataFile + ) == 1 + ) + goto ChooseAction; + break; + case 1: + webGLCompressionType = WebGLCompressionType.GZip; + if ( + DecompressCompressedWebData( + webGLCompressionType, + selectedFile, + webDataFile + ) == 1 + ) + goto ChooseAction; + break; + } + } + else if (selectedFileName.EndsWith("data.br")) + { + isWebGL = true; + webGLCompressionType = WebGLCompressionType.Brotli; + DecompressCompressedWebData(webGLCompressionType, selectedFile, webDataFile); } - else if (Utility.ValidateFile(selectedFile, gzipMagic)) + else if (selectedFileName.EndsWith("data.gz")) { - AnsiConsole.MarkupLine("( INFO ) [green]UnityWebData GZip[/] file selected."); isWebGL = true; webGLCompressionType = WebGLCompressionType.GZip; - - AnsiConsole.MarkupLineInterpolated( - $"( INFO ) Decompressing [green]{selectedFile}[/]..." - ); - GZipUtils.DecompressFile(selectedFile, webDataFile); + DecompressCompressedWebData(webGLCompressionType, selectedFile, webDataFile); } else { - AnsiConsole.MarkupLine("[red]( ERROR )[/] Unknown/Unsupported file type!"); + AnsiConsole.MarkupLine("[red]( RAWR )[/] Unknown/Unsupported file type!"); Console.WriteLine(); goto ChooseAction; } @@ -263,7 +184,7 @@ static void Main(string[] args) // Determine the asset type if (inspectedFile.Contains("globalgamemanagers")) assetType = AssetTypes.Asset; - else if (inspectedFile.Contains("unity3d")) + else if (inspectedFile.EndsWith(".unity3d")) assetType = AssetTypes.Bundle; } @@ -305,7 +226,7 @@ static void Main(string[] args) catch (Exception ex) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Error when loading asset class types database! {ex.Message}" + $"[red]( RAWR )[/] Error when loading asset class types database! {ex.Message}" ); goto Cleanup; } @@ -350,6 +271,9 @@ static void Main(string[] args) { if (isWebGL && assetsReplacer != null) { + AnsiConsole.MarkupLineInterpolated( + $"( INFO ) Packing [green]{unpackedWebDataDirectory}[/]..." + ); switch (webGLCompressionType) { case WebGLCompressionType.Brotli: @@ -359,10 +283,6 @@ static void Main(string[] args) $"( INFO ) Compressing [green]{webDataFile}[/] using Brotli compression. Please be patient, it might take some time..." ); BrotliUtils.CompressFile(webDataFile, selectedFile); - // BrotliUtils.WriteUnityIdentifier(selectedFile, unityBrotliMagic); - - if (File.Exists(webDataFile)) - File.Delete(webDataFile); break; case WebGLCompressionType.GZip: UnityWebTool.Pack(unpackedWebDataDirectory, webDataFile); @@ -371,9 +291,6 @@ static void Main(string[] args) $"( INFO ) Compressing [green]{webDataFile}[/] using GZip compression. Please be patient, it might take some time..." ); GZipUtils.CompressFile(webDataFile, selectedFile); - - if (File.Exists(webDataFile)) - File.Delete(webDataFile); break; case WebGLCompressionType.None: default: @@ -385,13 +302,25 @@ static void Main(string[] args) catch (Exception ex) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Error when compressing Unity Web Data! {ex.Message}" + $"[red]( RAWR )[/] Error when compressing Unity Web Data! {ex.Message}" ); } finally { - if (Directory.Exists(unpackedWebDataDirectory)) - Directory.Delete(unpackedWebDataDirectory, true); + if (isWebGL) + { + try + { + if (Directory.Exists(unpackedWebDataDirectory)) + Directory.Delete(unpackedWebDataDirectory, true); + if ( + !webGLCompressionType.Equals(WebGLCompressionType.None) + && File.Exists(webDataFile) + ) + File.Delete(webDataFile); + } + catch { } + } } Console.WriteLine(); @@ -421,7 +350,7 @@ static void PrintHelp() "Select the Action, find and choose one of these files in you game data:" ); AnsiConsole.MarkupLine( - "[green]globalgamemanagers[/] | [green]data.unity3d[/] | [green].data[/] | [green].data.br[/] | [green].data.gz[/]" + "[green]globalgamemanagers[/] | [green]data.unity3d[/] | [green].data[/] | [green].data.br[/] | [green].data.gz[/] | [green].data.unityweb[/]" ); } @@ -439,13 +368,13 @@ static void LoadClassPackage(AssetsManager assetsManager, string tpkFile) catch (Exception ex) { AnsiConsole.MarkupLine( - $"[red]( ERROR )[/] Error when loading class types package! {ex.Message}" + $"[red]( RAWR )[/] Error when loading class types package! {ex.Message}" ); } } else AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] TPK file not found: [red]{tpkFile}[/]..." + $"[red]( RAWR )[/] TPK file not found: [red]{tpkFile}[/]..." ); } @@ -473,14 +402,14 @@ AssetsManager assetsManager catch (Exception ex) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Error when loading asset file! {ex.Message}" + $"[red]( RAWR )[/] Error when loading asset file! {ex.Message}" ); } } else { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Asset file not found: [red]{assetFile}[/]" + $"[red]( RAWR )[/] Asset file not found: [red]{assetFile}[/]" ); } @@ -518,14 +447,14 @@ AssetsManager assetsManager catch (Exception ex) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Error when loading asset file! {ex.Message}" + $"[red]( RAWR )[/] Error when loading asset file! {ex.Message}" ); } } else { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Asset file not found: [red]{assetFile}[/]" + $"[red]( RAWR )[/] Asset file not found: [red]{assetFile}[/]" ); } @@ -558,14 +487,14 @@ AssetsManager assetsManager catch (Exception ex) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Error when loading bundle file! {ex.Message}" + $"[red]( RAWR )[/] Error when loading bundle file! {ex.Message}" ); } } else { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Bundle file not found: [red]{bundleFile}[/]" + $"[red]( RAWR )[/] Bundle file not found: [red]{bundleFile}[/]" ); } @@ -602,10 +531,10 @@ AssetsManager assetsManager if (playerSettingsBase == null) { AnsiConsole.MarkupLine( - "[red]( ERROR )[/] Can\'t get Player Settings fields! It\'s possible that this current version of Unity are currently not supported yet." + "[red]( RAWR )[/] Can\'t get Player Settings fields! It\'s possible that this current version of Unity are currently not supported yet." ); AnsiConsole.MarkupLine( - "Try updating USSR [bold green]classdata.tpk[/] from there: [link green]https://nightly.link/AssetRipper/Tpk/workflows/type_tree_tpk/master/uncompressed_file.zip[/] and try again." + "Try updating USSR [bold green]classdata.tpk[/] manually from there: [link green]https://nightly.link/AssetRipper/Tpk/workflows/type_tree_tpk/master/uncompressed_file.zip[/] and try again." ); AnsiConsole.MarkupLine( "If the issue still persist, try switching to another Unity version." @@ -621,7 +550,7 @@ AssetsManager assetsManager if (hasProVersion && !showUnityLogo) { AnsiConsole.MarkupLine( - "[yellow]( WARN ) Unity splash screen have been removed![/]" + "[yellow]( WARN ) Unity splash screen already removed![/]" ); return null; } @@ -640,7 +569,7 @@ AssetsManager assetsManager { case 0: AnsiConsole.MarkupLine( - "[yellow]Did you set the splash screen [bold]Draw Mode[/] to [bold]Unity Logo Below[/]? That\'s useless..[/]" + "[yellow]( WARN ) Nothing to do. Finally, taking a rest :)[/]" ); return null; case 1: @@ -649,7 +578,7 @@ AssetsManager assetsManager } AnsiConsole.MarkupLine( - "What order are Unity splash screen logo in your Player Settings? (Start from 0)" + "What order are Unity splash screen logo in your Player Settings? (Start from 0 [upmost])" ); InputLogoIndex: @@ -663,14 +592,14 @@ out splashScreenIndex if (splashScreenIndex < 0 && splashScreenIndex >= totalSplashScreen) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] There's no splash screen at index [red]{splashScreenIndex}[/]! Try again." + $"[red]( RAWR )[/] There's no splash screen at index [red]{splashScreenIndex}[/]! Try again." ); goto InputLogoIndex; } RemoveSplashScreen: AnsiConsole.MarkupLineInterpolated( - $"( INFO ) Set [green]hasProVersion = {!hasProVersion}[/] | [green]m_ShowUnitySplashLogo = {!showUnityLogo}[/]" + $"( INFO ) Set [green]hasProVersion[/] = [green]{!hasProVersion}[/] | [green]m_ShowUnitySplashLogo[/] = [green]{!showUnityLogo}[/]" ); // Remove Unity splash screen by flipping these boolean fields @@ -678,7 +607,7 @@ out splashScreenIndex playerSettingsBase["m_ShowUnitySplashLogo"].AsBool = !showUnityLogo; // false AnsiConsole.MarkupLineInterpolated( - $"( INFO ) [green]Removed splash screen at index {splashScreenIndex}.[/]" + $"( INFO ) [green]Splash screen removed at index {splashScreenIndex}.[/]" ); splashScreenLogos?.Children.RemoveAt(splashScreenIndex); @@ -700,7 +629,7 @@ out splashScreenIndex catch (Exception ex) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Error when removing the splash screen! {ex.Message}" + $"[red]( RAWR )[/] Error when removing the splash screen! {ex.Message}" ); return null; } @@ -752,7 +681,7 @@ out splashScreenIndex catch (Exception ex) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Error when removing the watermark! {ex.Message}" + $"[red]( RAWR )[/] Error when removing the watermark! {ex.Message}" ); return null; } @@ -824,7 +753,7 @@ List assetsReplacer catch (Exception ex) { AnsiConsole.MarkupLineInterpolated( - $"[red]( ERROR )[/] Error when writing changes! {ex.Message}" + $"[red]( RAWR )[/] Error when writing changes! {ex.Message}" ); } finally @@ -833,5 +762,57 @@ List assetsReplacer File.Delete(uncompressedBundleFile); } } + + static int DecompressCompressedWebData( + WebGLCompressionType compressionType, + string inputPath, + string outputPath + ) + { + switch (compressionType) + { + case WebGLCompressionType.Brotli: + try + { + AnsiConsole.MarkupLineInterpolated( + $"( INFO ) Decompressing Brotli [green]{inputPath}[/]..." + ); + BrotliUtils.DecompressFile(inputPath, outputPath); + return 0; + } + catch (Exception ex) + { + AnsiConsole.MarkupLineInterpolated( + $"[red]( RAWR ) Failed to decompress {inputPath}![/] {ex.Message} Try choose different compression type." + ); + Console.WriteLine(); + if (File.Exists(outputPath)) + File.Delete(outputPath); + return 1; + } + case WebGLCompressionType.GZip: + try + { + AnsiConsole.MarkupLineInterpolated( + $"( INFO ) Decompressing GZip [green]{inputPath}[/]..." + ); + GZipUtils.DecompressFile(inputPath, outputPath); + return 0; + } + catch (Exception ex) + { + AnsiConsole.MarkupLineInterpolated( + $"[red]( RAWR ) Failed to decompress {inputPath}![/] {ex.Message} Try choose different compression type." + ); + Console.WriteLine(); + if (File.Exists(outputPath)) + File.Delete(outputPath); + return 1; + } + case WebGLCompressionType.None: + default: + return 1; + } + } } } diff --git a/Utils/BrotliUtils.cs b/Utils/BrotliUtils.cs index aceb716..abed1ac 100644 --- a/Utils/BrotliUtils.cs +++ b/Utils/BrotliUtils.cs @@ -49,11 +49,21 @@ internal static byte[] DecompressBytes(byte[] bytes) internal static string DecompressFile(string compressedFileName, string outputFileName) { - using FileStream compressedFileStream = File.Open(compressedFileName, FileMode.Open); - using FileStream outputFileStream = File.Create(outputFileName); - DecompressStream(compressedFileStream, outputFileStream); + try + { + using FileStream compressedFileStream = File.Open( + compressedFileName, + FileMode.Open + ); + using FileStream outputFileStream = File.Create(outputFileName); + DecompressStream(compressedFileStream, outputFileStream); - return outputFileName; + return outputFileName; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } } internal static void DecompressStream(Stream compressedStream, Stream outputStream) @@ -62,24 +72,24 @@ internal static void DecompressStream(Stream compressedStream, Stream outputStre decompressor.CopyTo(outputStream); } - internal static void WriteUnityIdentifier(string filePath, byte[] magicBytes) - { - try - { - using ( - FileStream fileStream = new FileStream( - filePath, - FileMode.Open, - FileAccess.ReadWrite - ) - ) - { - fileStream.Seek(0, SeekOrigin.Begin); - fileStream.Write(magicBytes, 0, magicBytes.Length); - } - } - catch (Exception) { } - } + // internal static void WriteUnityIdentifier(string filePath, byte[] magicBytes) + // { + // try + // { + // using ( + // FileStream fileStream = new FileStream( + // filePath, + // FileMode.Open, + // FileAccess.ReadWrite + // ) + // ) + // { + // fileStream.Seek(0, SeekOrigin.Begin); + // fileStream.Write(magicBytes, 0, magicBytes.Length); + // } + // } + // catch { } + // } } } diff --git a/Utils/GZipUtils.cs b/Utils/GZipUtils.cs index 02df605..7d28d53 100644 --- a/Utils/GZipUtils.cs +++ b/Utils/GZipUtils.cs @@ -49,11 +49,21 @@ internal static byte[] DecompressBytes(byte[] bytes) internal static string DecompressFile(string compressedFileName, string outputFileName) { - using FileStream compressedFileStream = File.Open(compressedFileName, FileMode.Open); - using FileStream outputFileStream = File.Create(outputFileName); - DecompressStream(compressedFileStream, outputFileStream); + try + { + using FileStream compressedFileStream = File.Open( + compressedFileName, + FileMode.Open + ); + using FileStream outputFileStream = File.Create(outputFileName); + DecompressStream(compressedFileStream, outputFileStream); - return outputFileName; + return outputFileName; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } } internal static void DecompressStream(Stream compressedStream, Stream outputStream) diff --git a/Utils/Utility.cs b/Utils/Utility.cs index 4c20635..cc478cd 100644 --- a/Utils/Utility.cs +++ b/Utils/Utility.cs @@ -69,7 +69,7 @@ internal static string CloneFile(string sourceFile, string outputFile) } /// - /// Backup a fileas ".bak". If it's already exist, skip. + /// Backup a file as ".bak". If it's already exist, skip. /// /// /// diff --git a/classdata.tpk b/classdata.tpk index fa9f9dec389debac93cfce9769b9b1183e2b9754..42a59112a8e9d47e7c7a75622dbd3112fca44b57 100644 GIT binary patch delta 57045 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 P*-!L4h-?vmbq#nRQ`w0&6Q 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