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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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();
        }
Пример #4
0
        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);
        }