protected void LoadAllUnityArchives(ZipFile arc) { foreach (ZipEntry entry in arc) { if (entry.Name.EndsWith(".unity3d", StringComparison.OrdinalIgnoreCase)) { string assetBundlePath = entry.Name; if (assetBundlePath.Contains('/')) { assetBundlePath = assetBundlePath.Remove(0, assetBundlePath.IndexOf('/') + 1); } Func <AssetBundle> getBundleFunc = () => { var stream = arc.GetInputStream(entry); byte[] buffer = new byte[entry.Size]; stream.Read(buffer, 0, (int)entry.Size); BundleManager.RandomizeCAB(buffer); return(AssetBundle.LoadFromMemory(buffer)); }; BundleManager.AddBundleLoader(getBundleFunc, assetBundlePath, out string warning); if (!string.IsNullOrEmpty(warning)) { Logger.Log(LogLevel.Warning, $"[SIDELOADER] WARNING! {warning}"); } } } }
private void RedirectHook(IAssetLoadingContext context) { if (context.Parameters.Name == null || context.Bundle.name == null) { return; } if (typeof(Texture).IsAssignableFrom(context.Parameters.Type)) { string zipPath = $"abdata/{context.Bundle.name.Replace(".unity3d", "", StringComparison.OrdinalIgnoreCase)}/{context.Parameters.Name}.png"; var tex = GetPng(zipPath); if (tex != null) { context.Asset = tex; context.Complete(); return; } } if (context.Parameters.Type == typeof(ExcelData)) { if (TryGetExcelData(context.Bundle.name, context.Parameters.Name, out var excelData)) { context.Asset = excelData; context.Complete(); return; } } if (BundleManager.TryGetObjectFromName(context.Parameters.Name, context.Bundle.name, context.Parameters.Type, out UnityEngine.Object obj)) { context.Asset = obj; context.Complete(); } }
protected bool RedirectHook(string assetBundleName, string assetName, Type type, string manifestAssetBundleName, out AssetBundleLoadAssetOperation result) { string zipPath = $"{manifestAssetBundleName ?? "abdata"}/{assetBundleName.Replace(".unity3d", "")}/{assetName}"; if (type == typeof(Texture2D)) { zipPath = $"{zipPath}.png"; foreach (var archive in Archives) { var entry = archive.GetEntry(zipPath); if (entry != null) { var stream = archive.GetInputStream(entry); result = new AssetBundleLoadAssetOperationSimulation(ResourceRedirector.AssetLoader.LoadTexture(stream, (int)entry.Size)); return(true); } } } if (BundleManager.TryGetObjectFromName(assetName, assetBundleName, type, out UnityEngine.Object obj)) { result = new AssetBundleLoadAssetOperationSimulation(obj); return(true); } result = null; return(false); }
protected void LoadAllUnityArchives(ZipFile arc) { foreach (ZipEntry entry in arc) { if (entry.Name.EndsWith(".unity3d")) { string assetBundlePath = entry.Name; if (assetBundlePath.Contains('/')) { assetBundlePath = assetBundlePath.Remove(0, assetBundlePath.IndexOf('/') + 1); } Func <AssetBundle> getBundleFunc = () => { var stream = arc.GetInputStream(entry); byte[] buffer = new byte[entry.Size]; stream.Read(buffer, 0, (int)entry.Size); BundleManager.RandomizeCAB(buffer); return(AssetBundle.LoadFromMemory(buffer)); }; BundleManager.AddBundleLoader(getBundleFunc, assetBundlePath); } } }
protected bool RedirectHook(string assetBundleName, string assetName, Type type, string manifestAssetBundleName, out AssetBundleLoadAssetOperation result) { string zipPath = $"{manifestAssetBundleName ?? "abdata"}/{assetBundleName.Replace(".unity3d", "", StringComparison.OrdinalIgnoreCase)}/{assetName}"; if (type == typeof(Texture2D)) { zipPath = $"{zipPath}.png"; var tex = GetPng(zipPath); if (tex != null) { result = new AssetBundleLoadAssetOperationSimulation(tex); return(true); } } if (BundleManager.TryGetObjectFromName(assetName, assetBundleName, type, out UnityEngine.Object obj)) { result = new AssetBundleLoadAssetOperationSimulation(obj); return(true); } result = null; return(false); }
private void LoadAllUnityArchives(ZipFile arc, string archiveFilename) { foreach (ZipEntry entry in arc) { if (entry.Name.EndsWith(".unity3d", StringComparison.OrdinalIgnoreCase)) { string assetBundlePath = entry.Name; if (assetBundlePath.Contains('/')) { assetBundlePath = assetBundlePath.Remove(0, assetBundlePath.IndexOf('/') + 1); } AssetBundle getBundleFunc() { AssetBundle bundle; if (entry.CompressionMethod == CompressionMethod.Stored) { long index = (long)locateZipEntryMethodInfo.Invoke(arc, new object[] { entry }); if (DebugLogging.Value) { Logger.LogDebug($"Streaming \"{entry.Name}\" ({GetRelativeArchiveDir(archiveFilename)}) unity3d file from disk, offset {index}"); } bundle = AssetBundle.LoadFromFile(archiveFilename, 0, (ulong)index); } else { Logger.LogDebug($"Cannot stream \"{entry.Name}\" ({GetRelativeArchiveDir(archiveFilename)}) unity3d file from disk, loading to RAM instead"); var stream = arc.GetInputStream(entry); byte[] buffer = new byte[entry.Size]; stream.Read(buffer, 0, (int)entry.Size); BundleManager.RandomizeCAB(buffer); bundle = AssetBundle.LoadFromMemory(buffer); } if (bundle == null) { Logger.LogError($"Asset bundle \"{entry.Name}\" ({GetRelativeArchiveDir(archiveFilename)}) failed to load. It might have a conflicting CAB string."); } return(bundle); } BundleManager.AddBundleLoader(getBundleFunc, assetBundlePath, out string warning); if (!string.IsNullOrEmpty(warning) && ModLoadingLogging.Value) { Logger.LogWarning($"{warning} in \"{GetRelativeArchiveDir(archiveFilename)}\""); } } } }
protected void LoadAllUnityArchives(ZipFile arc, string archiveFilename) { foreach (ZipEntry entry in arc) { if (entry.Name.EndsWith(".unity3d", StringComparison.OrdinalIgnoreCase)) { string assetBundlePath = entry.Name; if (assetBundlePath.Contains('/')) { assetBundlePath = assetBundlePath.Remove(0, assetBundlePath.IndexOf('/') + 1); } Func <AssetBundle> getBundleFunc = () => { AssetBundle bundle; if (entry.CompressionMethod == CompressionMethod.Stored) { long index = (long)locateZipEntryMethodInfo.Invoke(arc, new object[] { entry }); Logger.Log(LogLevel.Info, $"Streaming {entry.Name} ({archiveFilename}) unity3d file from disk, offset {index}"); bundle = AssetBundle.LoadFromFile(archiveFilename, 0, (ulong)index); } else { var stream = arc.GetInputStream(entry); byte[] buffer = new byte[entry.Size]; stream.Read(buffer, 0, (int)entry.Size); //BundleManager.RandomizeCAB(buffer); bundle = AssetBundle.LoadFromMemory(buffer); } if (bundle == null) { Logger.Log(LogLevel.Error, $"Asset bundle \"{entry.Name}\" ({Path.GetFileName(archiveFilename)}) failed to load! Does it have a conflicting CAB string?"); } return(bundle); }; BundleManager.AddBundleLoader(getBundleFunc, assetBundlePath, out string warning); if (!string.IsNullOrEmpty(warning)) { Logger.Log(LogLevel.Warning, $"[SIDELOADER] WARNING! {warning}"); } } } }
protected bool RedirectHook(string assetBundleName, string assetName, Type type, string manifestAssetBundleName, out AssetBundleLoadAssetOperation result) { string zipPath = $"{manifestAssetBundleName ?? "abdata"}/{assetBundleName.Replace(".unity3d", "", StringComparison.OrdinalIgnoreCase)}/{assetName}"; if (type == typeof(Texture2D)) { zipPath = $"{zipPath}.png"; //Only search the archives for a .png that can actually be found if (PngList.TryGetValue(zipPath, out ZipFile archive)) { var entry = archive.GetEntry(zipPath); if (entry != null) { var stream = archive.GetInputStream(entry); var tex = ResourceRedirector.AssetLoader.LoadTexture(stream, (int)entry.Size); if (zipPath.Contains("clamp")) { tex.wrapMode = TextureWrapMode.Clamp; } else if (zipPath.Contains("repeat")) { tex.wrapMode = TextureWrapMode.Repeat; } result = new AssetBundleLoadAssetOperationSimulation(tex); return(true); } } } if (BundleManager.TryGetObjectFromName(assetName, assetBundleName, type, out UnityEngine.Object obj)) { result = new AssetBundleLoadAssetOperationSimulation(obj); return(true); } result = null; return(false); }
private void LoadAllUnityArchives(ZipFile arc, string archiveFilename) { foreach (ZipEntry entry in arc) { if (entry.Name.EndsWith(".unity3d", StringComparison.OrdinalIgnoreCase)) { string assetBundlePath = entry.Name; if (assetBundlePath.Contains('/')) { assetBundlePath = assetBundlePath.Remove(0, assetBundlePath.IndexOf('/') + 1); } AssetBundle getBundleFunc() { AssetBundle bundle; if (entry.CompressionMethod == CompressionMethod.Stored) { long index = (long)locateZipEntryMethodInfo.Invoke(arc, new object[] { entry }); if (DebugLogging.Value) { Logger.LogDebug($"Streaming \"{entry.Name}\" ({GetRelativeArchiveDir(archiveFilename)}) unity3d file from disk, offset {index}"); } bundle = AssetBundle.LoadFromFile(archiveFilename, 0, (ulong)index); } else { Logger.LogDebug($"Cannot stream \"{entry.Name}\" ({GetRelativeArchiveDir(archiveFilename)}) unity3d file from disk, loading to RAM instead"); var stream = arc.GetInputStream(entry); byte[] buffer = new byte[entry.Size]; stream.Read(buffer, 0, (int)entry.Size); // The line below can either be commented in or out - it doesn't really matter. // - If in: It will generate successive unique CAB-strings for these asset bundles // - If out: The CAB of the actual asset bundle will be used if possible, otherwise a random CAB is generated by the Resource Redirector due to the call to 'ResourceRedirection.EnableRandomizeCabIfConflict(-2000, false)' //BundleManager.RandomizeCAB(buffer); bundle = AssetBundleHelper.LoadFromMemory($"\"{entry.Name}\" ({GetRelativeArchiveDir(archiveFilename)})", buffer, 0); } if (bundle == null) { Logger.LogError($"Asset bundle \"{entry.Name}\" ({GetRelativeArchiveDir(archiveFilename)}) failed to load. It might have a conflicting CAB string."); } return(bundle); } BundleManager.AddBundleLoader(getBundleFunc, assetBundlePath, out string warning); if (!string.IsNullOrEmpty(warning) && DebugLoggingModLoading.Value) { Logger.LogWarning($"{warning} in \"{GetRelativeArchiveDir(archiveFilename)}\""); } } } }