private string FindTextures(List <FoundTexture> textures, string packagePath, CachePackageMgr cachePackageMgr, ref string log) { string errors = ""; Package package = null; try { if (cachePackageMgr != null) { package = cachePackageMgr.OpenPackage(packagePath); } else { package = new Package(packagePath); } } catch (Exception e) { string err = ""; err += "---- Start --------------------------------------------" + Environment.NewLine; err += "Issue with open package file: " + packagePath + Environment.NewLine; err += e.Message + Environment.NewLine + Environment.NewLine; err += e.StackTrace + Environment.NewLine + Environment.NewLine; err += "---- End ----------------------------------------------" + Environment.NewLine + Environment.NewLine; errors += err; log += err; return(errors); } for (int i = 0; i < package.exportsTable.Count; i++) { int id = package.getClassNameId(package.exportsTable[i].classId); if (id == package.nameIdTexture2D || id == package.nameIdLightMapTexture2D || id == package.nameIdShadowMapTexture2D || id == package.nameIdTextureFlipBook) { Texture texture = new Texture(package, i, package.getExportData(i)); if (!texture.hasImageData()) { continue; } Texture.MipMap mipmap = texture.getTopMipmap(); string name = package.exportsTable[i].objectName; MatchedTexture matchTexture = new MatchedTexture(); bool slave = false; matchTexture.exportID = i; matchTexture.path = GameData.RelativeGameData(packagePath); if (GameData.gameType != MeType.ME1_TYPE) { slave = true; } else if (texture.packageName.ToLowerInvariant() != Path.GetFileNameWithoutExtension(package.packageFile.Name).ToLowerInvariant()) { slave = true; } uint crc = texture.getCrcTopMipmap(); if (crc == 0) { errors += "Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..." + Environment.NewLine; log += "Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..." + Environment.NewLine; continue; } FoundTexture foundTexName = textures.Find(s => s.crc == crc); if (foundTexName.crc != 0) { if (slave) { foundTexName.list.Add(matchTexture); } else { foundTexName.list.Insert(0, matchTexture); } } else { FoundTexture foundTex = new FoundTexture(); foundTex.list = new List <MatchedTexture>(); foundTex.list.Add(matchTexture); foundTex.name = name; foundTex.crc = crc; foundTex.packageName = texture.packageName; textures.Add(foundTex); } } } if (cachePackageMgr == null) { package.Dispose(); } else { package.DisposeCache(); } return(errors); }
static public bool checkGameDataModded(CachePackageMgr cachePackageMgr) { EmptyMipMaps[] entries = new EmptyMipMaps[] { new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanMale\BIOG_HMM_HED_PROMorph.upk", exportId = 304, crc = 0x80B2CBCF, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanFemale\BIOG_HMF_HED_PROMorph_R.upk", exportId = 279, crc = 0x422AAA0D, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\BIOG_ASA_ARM_MRC_R.upk", exportId = 71, crc = 0x077202BD, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanFemale\BIOG_HMF_HED_PROMorph_R.upk", exportId = 259, crc = 0x8F331825, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanFemale\BIOG_HMF_HED_PROMorph_R.upk", exportId = 262, crc = 0x2CC6F67C, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\Turian\BIOG_TUR_HED_PROMorph_R.upk", exportId = 115, crc = 0x39A26907, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanMale\BIOG_HMM_HED_PROMorph.upk", exportId = 356, crc = 0xCD4AD3A5, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanMale\BIOG_HMM_HED_PROMorph.upk", exportId = 360, crc = 0x0898E4C4, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanFemale\BIOG_HMF_ARM_CTH_R.upk", exportId = 243, crc = 0x8D20F3EB, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\Turian\BIOG_TUR_HED_SAR.upk", exportId = 51, crc = 0x4F24BAAF, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanMale\BIOG_HMM_HED_PROMorph.upk", exportId = 394, crc = 0x947A74A8, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\HumanMale\BIOG_HMM_HED_PROMorph.upk", exportId = 341, crc = 0x72D6575F, }, new EmptyMipMaps { gameType = MeType.ME1_TYPE, packagePath = @"\BioGame\CookedPC\Packages\GameObjects\Characters\Humanoids\Krogan\BIOG_KRO_HED_PROMorph.upk", exportId = 61, crc = 0x822EEFB1, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioA_N7Spdr2_100.pcc", exportId = 13796, crc = 0x80B2CBCF, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_JunCvL_100Landing.pcc", exportId = 6105, crc = 0x72D6575F, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_EndGm2_440Normandy.pcc", exportId = 2569, crc = 0xCD4AD3A5, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_HorCr1_303AshKaidan.pcc", exportId = 3781, crc = 0x0898E4C4, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BIOG_HMM_HED_PROMorph.pcc", exportId = 2495, crc = 0x947A74A8, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_JnkKgA_300Labs.pcc", exportId = 5785, crc = 0xECA7DA8F, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_CitAsL_210FirstStop.pcc", exportId = 4117, crc = 0x822EEFB1, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_EndGm1_110ROMGarrus.pcc", exportId = 5076, crc = 0x6E3C2E30, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_OmgGrA_113AlamoAssault.pcc", exportId = 4864, crc = 0x6CD2B8F2, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioH_END_Professor_00.pcc", exportId = 5894, crc = 0x9A987362, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_EndGm1_110ROMMirranda.pcc", exportId = 8808, crc = 0xB389BFE6, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BIOG_HMF_HED_PROMorph_R.pcc", exportId = 3073, crc = 0x5674B1E3, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_HorCr1_303AshKaidan.pcc", exportId = 3757, crc = 0x422AAA0D, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_BchLmL_102BeachFight.pcc", exportId = 5869, crc = 0x9CA124E8, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioA_N7Mmnt7.pcc", exportId = 10440, crc = 0x2A01319D, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_ProNor.pcc", exportId = 21224, crc = 0x40197218, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_Nor_231Morinth.pcc", exportId = 1922, crc = 0x27539E1B, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_CitAsL.pcc", exportId = 8798, crc = 0x42EE7CBF, }, new EmptyMipMaps { gameType = MeType.ME2_TYPE, packagePath = @"\BioGame\CookedPC\BioD_Nor_110DebriefLeadVixen.pcc", exportId = 4433, crc = 0xD30672BD, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioA_CitSam_000LevelTrans.pcc", exportId = 4607, crc = 0x0F4E701E, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_CitHub_EmbassyP3.pcc", exportId = 8182, crc = 0x27539E1B, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_Cat003_380DesksConvos.pcc", exportId = 9460, crc = 0x42EE7CBF, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioA_GthLeg_000LevelTrans.pcc", exportId = 3500, crc = 0xD30672BD, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioA_CitHub_000Docking.pcc", exportId = 3625, crc = 0xF51672AC, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_CerJcb_150MainDoor.pcc", exportId = 7722, crc = 0xEDC5BFE7, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_CitHub_WardsFluxP3.pcc", exportId = 11443, crc = 0xF95D3472, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_CitHub_Dock.pcc", exportId = 11485, crc = 0xE8271883, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_CerMir_375Lab_vid.pcc", exportId = 4630, crc = 0x4D73F4F6, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BIOG_HMF_HED_PROMorph_R.pcc", exportId = 7552, crc = 0xF6BFD7B5, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioA_MPCer_000Translevel.pcc", exportId = 6294, crc = 0x3451A823, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioA_Cat002_050Shuttle.pcc", exportId = 2995, crc = 0xF394E97A, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_CitHub_000ProCit.pcc", exportId = 6451, crc = 0x2DCFDEA9, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BIOG_HMM_HED_PROMorph.pcc", exportId = 8818, crc = 0xB2900BF5, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_Cat003_780FinalConvos.pcc", exportId = 9938, crc = 0x6574CE07, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_Gth001_560Gethries.pcc", exportId = 7227, crc = 0x36DACF3F, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioA_Kro001_000LevelTrans.pcc", exportId = 7156, crc = 0x1198BA9D, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_End001_436CRGrunt.pcc", exportId = 1568, crc = 0xECA7DA8F, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioD_End001_436CRMordin.pcc", exportId = 1456, crc = 0x9A987362, }, new EmptyMipMaps { gameType = MeType.ME3_TYPE, packagePath = @"\BioGame\CookedPCConsole\BioA_CitHub_Council.pcc", exportId = 6653, crc = 0x8645A85C, }, }; for (int i = 0; i < entries.Count(); i++) { if (GameData.gameType == entries[i].gameType) { Package package = null; try { if (cachePackageMgr != null) { package = cachePackageMgr.OpenPackage(GameData.GamePath + entries[i].packagePath); } else { package = new Package(GameData.GamePath + entries[i].packagePath); } } catch { return(false); } Texture texture = new Texture(package, entries[i].exportId, package.getExportData(entries[i].exportId)); if (texture.getCrcTopMipmap() != entries[i].crc) { return(true); } } } return(false); }
private void FindTextures(MeType gameId, List <FoundTexture> textures, string packagePath, bool modified, bool ipc) { Package package = null; try { package = new Package(GameData.GamePath + packagePath); } catch (Exception e) { if (e.Message.Contains("Problem with PCC file header:")) { return; } if (ipc) { Console.WriteLine("[IPC]ERROR Issue opening package file: " + packagePath); Console.Out.Flush(); } else { string err = ""; err += "---- Start --------------------------------------------" + Environment.NewLine; err += "Issue opening package file: " + packagePath + Environment.NewLine; err += e.Message + Environment.NewLine + Environment.NewLine; err += e.StackTrace + Environment.NewLine + Environment.NewLine; err += "---- End ----------------------------------------------" + Environment.NewLine + Environment.NewLine; Console.WriteLine(err); } return; } for (int i = 0; i < package.exportsTable.Count; i++) { int id = package.getClassNameId(package.exportsTable[i].classId); if (id == package.nameIdTexture2D || id == package.nameIdLightMapTexture2D || id == package.nameIdShadowMapTexture2D || id == package.nameIdTextureFlipBook) { Texture texture = new Texture(package, i, package.getExportData(i)); if (!texture.hasImageData()) { continue; } Texture.MipMap mipmap = texture.getTopMipmap(); string name = package.exportsTable[i].objectName; MatchedTexture matchTexture = new MatchedTexture(); matchTexture.exportID = i; matchTexture.path = packagePath; matchTexture.packageName = texture.packageName; matchTexture.removeEmptyMips = texture.mipMapsList.Exists(s => s.storageType == Texture.StorageTypes.empty); matchTexture.numMips = texture.mipMapsList.FindAll(s => s.storageType != Texture.StorageTypes.empty).Count; if (gameId == MeType.ME1_TYPE) { matchTexture.basePackageName = texture.basePackageName; matchTexture.slave = texture.slave; matchTexture.weakSlave = texture.weakSlave; matchTexture.linkToMaster = -1; if (matchTexture.slave) { matchTexture.mipmapOffset = mipmap.dataOffset; } else { matchTexture.mipmapOffset = package.exportsTable[i].dataOffset + (uint)texture.properties.propertyEndOffset + mipmap.internalOffset; } } uint crc = 0; try { crc = texture.getCrcTopMipmap(); } catch (Exception e) { if (ipc) { Console.WriteLine("[IPC]ERROR Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..."); Console.Out.Flush(); } else { Console.WriteLine(">>>>>>>>>"); Console.WriteLine("Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + Environment.NewLine + packagePath); Console.WriteLine(e.Message); Console.WriteLine("Export Id: " + (i + 1)); Console.WriteLine("skipping..."); Console.WriteLine("<<<<<<<<<" + Environment.NewLine); } continue; } FoundTexture foundTexName = textures.Find(s => s.crc == crc); if (foundTexName.crc != 0) { if (modified && foundTexName.list.Exists(s => (s.exportID == i && s.path.ToLowerInvariant() == packagePath.ToLowerInvariant()))) { continue; } if (matchTexture.slave || gameId != MeType.ME1_TYPE) { foundTexName.list.Add(matchTexture); } else { foundTexName.list.Insert(0, matchTexture); } } else { if (modified) { for (int k = 0; k < textures.Count; k++) { bool found = false; for (int t = 0; t < textures[k].list.Count; t++) { if (textures[k].list[t].exportID == i && textures[k].list[t].path.ToLowerInvariant() == packagePath.ToLowerInvariant()) { MatchedTexture f = textures[k].list[t]; f.path = ""; textures[k].list[t] = f; found = true; break; } } if (found) { break; } } } FoundTexture foundTex = new FoundTexture(); foundTex.list = new List <MatchedTexture>(); foundTex.list.Add(matchTexture); foundTex.name = name; foundTex.crc = crc; if (generateBuiltinMapFiles) { foundTex.width = texture.getTopMipmap().width; foundTex.height = texture.getTopMipmap().height; foundTex.pixfmt = Image.getPixelFormatType(texture.properties.getProperty("Format").valueName); if (texture.properties.exists("CompressionSettings")) { string cmp = texture.properties.getProperty("CompressionSettings").valueName; if (cmp == "TC_OneBitAlpha") { foundTex.flags = TexProperty.TextureTypes.OneBitAlpha; } else if (cmp == "TC_Displacementmap") { foundTex.flags = TexProperty.TextureTypes.Displacementmap; } else if (cmp == "TC_Grayscale") { foundTex.flags = TexProperty.TextureTypes.GreyScale; } else if (cmp == "TC_Normalmap" || cmp == "TC_NormalmapHQ" || cmp == "TC_NormalmapAlpha" || cmp == "TC_NormalmapUncompressed") { foundTex.flags = TexProperty.TextureTypes.Normalmap; } else { throw new Exception(); } } else { foundTex.flags = TexProperty.TextureTypes.Normal; } } textures.Add(foundTex); } } } package.Dispose(); }
private string FindTextures(List <FoundTexture> textures, string packagePath, CachePackageMgr cachePackageMgr, ref string log) { string errors = ""; Package package = null; try { if (cachePackageMgr != null) { package = cachePackageMgr.OpenPackage(packagePath); } else { package = new Package(packagePath); } } catch (Exception e) { string err = ""; err += "---- Start --------------------------------------------" + Environment.NewLine; err += "Issue with open package file: " + packagePath + Environment.NewLine; err += e.Message + Environment.NewLine + Environment.NewLine; err += e.StackTrace + Environment.NewLine + Environment.NewLine; err += "---- End ----------------------------------------------" + Environment.NewLine + Environment.NewLine; errors += err; log += err; return(errors); } for (int i = 0; i < package.exportsTable.Count; i++) { int id = package.getClassNameId(package.exportsTable[i].classId); if (id == package.nameIdTexture2D || id == package.nameIdLightMapTexture2D || id == package.nameIdShadowMapTexture2D || id == package.nameIdTextureFlipBook) { Texture texture = new Texture(package, i, package.getExportData(i)); if (!texture.hasImageData()) { continue; } Texture.MipMap mipmap = texture.getTopMipmap(); string name = package.exportsTable[i].objectName; MatchedTexture matchTexture = new MatchedTexture(); matchTexture.exportID = i; matchTexture.path = GameData.RelativeGameData(packagePath); matchTexture.packageName = texture.packageName; if (GameData.gameType == MeType.ME1_TYPE) { matchTexture.basePackageName = texture.basePackageName; matchTexture.slave = texture.slave; matchTexture.weakSlave = texture.weakSlave; matchTexture.linkToMaster = -1; if (matchTexture.slave) { matchTexture.mipmapOffset = mipmap.dataOffset; } else { matchTexture.mipmapOffset = package.exportsTable[i].dataOffset + (uint)texture.properties.propertyEndOffset + mipmap.internalOffset; } } uint crc = 0; try { crc = texture.getCrcTopMipmap(); } catch { } if (crc == 0) { errors += "Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..." + Environment.NewLine; log += "Error: Texture " + package.exportsTable[i].objectName + " is broken in package: " + packagePath + ", skipping..." + Environment.NewLine; continue; } FoundTexture foundTexName = textures.Find(s => s.crc == crc); if (foundTexName.crc != 0) { if (matchTexture.slave || GameData.gameType != MeType.ME1_TYPE) { foundTexName.list.Add(matchTexture); } else { foundTexName.list.Insert(0, matchTexture); } } else { FoundTexture foundTex = new FoundTexture(); foundTex.list = new List <MatchedTexture>(); foundTex.list.Add(matchTexture); foundTex.name = name; foundTex.crc = crc; if (generateBuiltinMapFiles) { foundTex.width = texture.getTopMipmap().width; foundTex.height = texture.getTopMipmap().height; foundTex.pixfmt = Image.getEngineFormatType(texture.properties.getProperty("Format").valueName); if (foundTex.pixfmt == PixelFormat.DXT1 && texture.properties.exists("CompressionSettings") && texture.properties.getProperty("CompressionSettings").valueName == "TC_OneBitAlpha") { foundTex.alphadxt1 = true; } } textures.Add(foundTex); } } } if (cachePackageMgr == null) { package.Dispose(); } else { package.DisposeCache(); } return(errors); }