예제 #1
0
        /// <summary>
        /// Add the MATD referenced by the passed MMAT
        /// </summary>
        /// <param name="mmat">A valid MMAT file</param>
        protected void AddMATD(SimPe.PackedFiles.Wrapper.Cpf mmat)
        {
            SimPe.Packages.File pkg  = SimPe.Packages.File.LoadFromFile(System.IO.Path.Combine(PathProvider.Global.GetExpansion(Expansions.BaseGame).InstallFolder, "TSData\\Res\\Sims3D\\Objects02.package"));
            ArrayList           list = new ArrayList();
            string flname            = Hashes.StripHashFromName(mmat.GetSaveItem("name").StringValue) + "_txmt";

            Interfaces.Files.IPackedFileDescriptor[] pfds = pkg.FindFile(flname, 0x49596978);

            foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
            {
                SimPe.Plugin.Rcol matd = new GenericRcol(null, false);
                matd.ProcessData(pfd, pkg);

                if (matd.FileName.Trim().ToLower() == flname.Trim().ToLower())
                {
                    matd.SynchronizeUserData();
                    if (package.FindFile(matd.FileDescriptor) == null)
                    {
                        package.Add(matd.FileDescriptor);
                    }
                }
            }

            //pkg.Reader.Close();
        }
예제 #2
0
        /// <summary>
        /// Loads Slave TXMTs by name Replacement
        /// </summary>
        /// <param name="pkg">the package File with the base TXMTs</param>
        /// <param name="slaves">The Hashtable holding als Slave Subsets</param>
        public static void AddSlaveTxmts(SimPe.Interfaces.Files.IPackageFile pkg, Hashtable slaves)
        {
            ArrayList files = new ArrayList();
            ArrayList items = new ArrayList();

            SimPe.Interfaces.Files.IPackedFileDescriptor[] pfds = pkg.FindFiles(Data.MetaData.TXMT);
            foreach (SimPe.Interfaces.Files.IPackedFileDescriptor pfd in pfds)
            {
                GenericRcol rcol = new GenericRcol(null, false);
                rcol.ProcessData(pfd, pkg);

                if (rcol.FileDescriptor.Type == Data.MetaData.TXMT)
                {
                    AddSlaveTxmts(new ArrayList(), new ArrayList(), files, items, rcol, slaves);
                }
            }

            foreach (GenericRcol rcol in files)
            {
                if (pkg.FindFile(rcol.FileDescriptor) == null)
                {
                    rcol.FileDescriptor = rcol.FileDescriptor.Clone();
                    rcol.SynchronizeUserData();
                    pkg.Add(rcol.FileDescriptor);
                }
            }
        }
예제 #3
0
        protected string AddTxtr(IPackageFile newpkg, GenericRcol txtr, string unique, GenericRcol txmt, MaterialDefinition md)
        {
            string name = AddTxtr(txtr, unique, txmt, md);

            txtr.SynchronizeUserData();
            if (newpkg.FindFile(txtr.FileDescriptor) == null)
            {
                newpkg.Add(txtr.FileDescriptor);
            }

            return(name);
        }
예제 #4
0
        /// <summary>
        /// Clone the Makeup of a Sim
        /// </summary>
        /// <returns>the new Package for the patient Sim</returns>
        /// <param name="eyecolor">true, if you want to alter the eyecolor</param>
        /// <param name="makeups">true, if you want to alter the makeup</param>
        public SimPe.Packages.GeneratableFile CloneMakeup(bool eyecolor, bool makeups)
        {
            SimPe.Packages.GeneratableFile ret = SimPe.Packages.GeneratableFile.LoadFromFile((string)null);

            ArrayList list = new ArrayList();

            list.Add((uint)0xE86B1EEF);             //make sure the compressed Directory won't be copied!
            foreach (Interfaces.Files.IPackedFileDescriptor pfd in patient.Index)
            {
                if (!list.Contains(pfd.Type))
                {
                    Interfaces.Files.IPackedFile fl = patient.Read(pfd);

                    Interfaces.Files.IPackedFileDescriptor newpfd = ret.NewDescriptor(pfd.Type, pfd.SubType, pfd.Group, pfd.Instance);
                    newpfd.UserData = fl.UncompressedData;
                    ret.Add(newpfd);
                }
            }

            //Update TXMT Files for the Face
            SimPe.Interfaces.Files.IPackedFileDescriptor[] pfds = ret.FindFiles(Data.MetaData.TXMT);
            foreach (SimPe.Interfaces.Files.IPackedFileDescriptor pfd in pfds)
            {
                SimPe.Plugin.Rcol rcol = new GenericRcol(null, false);
                rcol.ProcessData(pfd, ret);

                MaterialDefinition md = (MaterialDefinition)rcol.Blocks[0];
                this.UpdateMakeup(md, eyecolor, makeups);

                rcol.SynchronizeUserData();
            }

            if (eyecolor)
            {
                //Update DNA File
                Interfaces.Files.IPackedFileDescriptor dna  = ngbh.FindFile(0xEBFEE33F, 0, Data.MetaData.LOCAL_GROUP, spatient.Instance);
                Interfaces.Files.IPackedFileDescriptor adna = ngbh.FindFile(0xEBFEE33F, 0, Data.MetaData.LOCAL_GROUP, sarchetype.Instance);
                if ((dna != null) && (adna != null))
                {
                    SimPe.PackedFiles.Wrapper.Cpf cpf = new Cpf();
                    cpf.ProcessData(dna, ngbh);

                    SimPe.PackedFiles.Wrapper.Cpf acpf = new Cpf();
                    acpf.ProcessData(adna, ngbh);
                    cpf.GetSaveItem("3").StringValue = acpf.GetSaveItem("3").StringValue;

                    cpf.SynchronizeUserData();
                }
            }
            return(ret);
        }
예제 #5
0
        /// <summary>
        /// Loads the ModelNames of the Objects referenced in all tsMaterialsMeshName Block
        /// </summary>
        /// <param name="pkg"></param>
        /// <param name="delete">true, if the tsMaterialsMeshName Blocks should get cleared</param>
        /// <returns>A List of Modelnames</returns>
        public static string[] LoadParentModelNames(SimPe.Interfaces.Files.IPackageFile pkg, bool delete)
        {
            if (WaitingScreen.Running)
            {
                WaitingScreen.UpdateMessage("Loading Parent Modelnames");
            }
            ArrayList list = new ArrayList();

            Interfaces.Files.IPackedFileDescriptor[] pfds = pkg.FindFiles(Data.MetaData.GMND);
            foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
            {
                Rcol rcol = new GenericRcol(null, false);
                rcol.ProcessData(pfd, pkg);

                foreach (IRcolBlock irb in rcol.Blocks)
                {
                    if (irb.BlockName.Trim().ToLower() == "cdatalistextension")
                    {
                        DataListExtension dle = (DataListExtension)irb;
                        if (dle.Extension.VarName.Trim().ToLower() == "tsmaterialsmeshname")
                        {
                            foreach (ExtensionItem ei in dle.Extension.Items)
                            {
                                string mname = ei.String.Trim().ToLower();
                                if (mname.EndsWith("_cres"))
                                {
                                    mname += "_cres";
                                }

                                if (!list.Contains(mname))
                                {
                                    list.Add(mname);
                                }
                            }

                            dle.Extension.Items = new ExtensionItem[0];
                            rcol.SynchronizeUserData();
                            break;
                        }
                    }
                }
            }

            string[] ret = new string[list.Count];
            list.CopyTo(ret);

            return(ret);
        }
예제 #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="map"></param>
        public void FixNames(Hashtable map)
        {
            foreach (uint type in Data.MetaData.RcolList)
            {
                Interfaces.Files.IPackedFileDescriptor[] pfds = package.FindFiles(type);
                foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
                {
                    Rcol rcol = new GenericRcol(null, false);
                    rcol.ProcessData(pfd, package);

                    string name = Hashes.StripHashFromName(FindReplacementName(map, rcol));
                    //if (rcol.FileDescriptor.Type==Data.MetaData.TXMT || rcol.FileDescriptor.Type==Data.MetaData.TXTR) name = "##0x"+Helper.HexString(Data.MetaData.CUSTOM_GROUP)+"!"+name;
                    rcol.FileName = name;

                    FixResource(map, rcol);
                    rcol.SynchronizeUserData();
                }
            }
        }
예제 #7
0
        /// <summary>
        /// Create a cloned Sim
        /// </summary>
        /// <returns>the new Package for the patient Sim</returns>
        public SimPe.Packages.GeneratableFile CloneSim()
        {
            SimPe.Packages.GeneratableFile ret = SimPe.Packages.GeneratableFile.LoadFromFile((string)null);



            ArrayList list = new ArrayList();

            list.Add((uint)0xAC506764);             //3IDR
            list.Add(Data.MetaData.GZPS);           //GZPS, Property Set
            list.Add((uint)0xAC598EAC);             //AGED
            list.Add((uint)0xCCCEF852);             //LxNR, Face
            list.Add((uint)0x856DDBAC);             //IMG
            list.Add((uint)0x534C4F54);             //SLOT
            list.AddRange(Data.MetaData.RcolList);

            uint hashgroup = this.GetPatientHash();


            foreach (Interfaces.Files.IPackedFileDescriptor pfd in archetype.Index)
            {
                if (list.Contains(pfd.Type))
                {
                    Interfaces.Files.IPackedFile fl = archetype.Read(pfd);

                    Interfaces.Files.IPackedFileDescriptor newpfd = ret.NewDescriptor(pfd.Type, pfd.SubType, pfd.Group, pfd.Instance);
                    newpfd.UserData = fl.UncompressedData;
                    ret.Add(newpfd);

                    ///This is a scenegraph Resource and needs a new Hash
                    if (Data.MetaData.RcolList.Contains(pfd.Type))
                    {
                        SimPe.Plugin.Rcol rcol = new GenericRcol(null, false);
                        rcol.ProcessData(newpfd, ret);

                        rcol.FileName = "#0x" + Helper.HexString(hashgroup) + "!" + Hashes.StripHashFromName(rcol.FileName);

                        switch (pfd.Type)
                        {
                        case Data.MetaData.SHPE:
                        {
                            Shape shp = (Shape)rcol.Blocks[0];
                            foreach (ShapeItem i in shp.Items)
                            {
                                i.FileName = "#0x" + Helper.HexString(hashgroup) + "!" + Hashes.StripHashFromName(i.FileName);
                            }
                            break;
                        }
                        }
                        rcol.SynchronizeUserData();
                    }
                }
            }

            list.Add((uint)0xE86B1EEF);             //make sure the compressed Directory won't be copied!
            foreach (Interfaces.Files.IPackedFileDescriptor pfd in patient.Index)
            {
                if (!list.Contains(pfd.Type))
                {
                    Interfaces.Files.IPackedFile fl = patient.Read(pfd);

                    Interfaces.Files.IPackedFileDescriptor newpfd = ret.NewDescriptor(pfd.Type, pfd.SubType, pfd.Group, pfd.Instance);
                    newpfd.UserData = fl.UncompressedData;
                    ret.Add(newpfd);
                }
            }

            //Copy DNA File
            Interfaces.Files.IPackedFileDescriptor dna = ngbh.FindFile(0xEBFEE33F, 0, Data.MetaData.LOCAL_GROUP, sarchetype.Instance);
            if (dna != null)
            {
                Interfaces.Files.IPackedFileDescriptor tna = ngbh.FindFile(0xEBFEE33F, 0, Data.MetaData.LOCAL_GROUP, spatient.Instance);
                if (tna == null)
                {
                    tna         = ngbh.NewDescriptor(0xEBFEE33F, 0, Data.MetaData.LOCAL_GROUP, spatient.Instance);
                    tna.Changed = true;
                    ngbh.Add(tna);
                }

                Interfaces.Files.IPackedFile fl = ngbh.Read(dna);

                tna.UserData = fl.UncompressedData;
            }

            UpdateFaceStructure(ret);
            return(ret);
        }
예제 #8
0
        /// <summary>
        /// Change the SkinTone of a Sim
        /// </summary>
        /// <param name="skin">the new skintone</param>
        /// param name="skinfiles">a Hashtable listing al Proerty Sets for each available skintone (key=skintone string, value= ArrayList of Cpf Objects)</param>
        /// <returns>the new Package for the patient Sim</returns>
        public SimPe.Packages.GeneratableFile CloneSkinTone(string skin, Hashtable skinfiles)
        {
            SimPe.Packages.GeneratableFile ret = SimPe.Packages.GeneratableFile.LoadFromFile((string)null);
            string pskin = GetSkintone(this.patient);

            ArrayList list = new ArrayList();

            list.Add((uint)0xE86B1EEF);             //make sure the compressed Directory won't be copied!
            foreach (Interfaces.Files.IPackedFileDescriptor pfd in patient.Index)
            {
                if (!list.Contains(pfd.Type))
                {
                    Interfaces.Files.IPackedFile fl = patient.Read(pfd);

                    Interfaces.Files.IPackedFileDescriptor newpfd = ret.NewDescriptor(pfd.Type, pfd.SubType, pfd.Group, pfd.Instance);
                    newpfd.UserData = fl.UncompressedData;
                    ret.Add(newpfd);

                    switch (newpfd.Type)
                    {
                    case (uint)0xAC598EAC:                             //AGED
                    {
                        SimPe.PackedFiles.Wrapper.Cpf cpf = new Cpf();
                        cpf.ProcessData(newpfd, ret);
                        cpf.GetSaveItem("skincolor").StringValue = skin;

                        cpf.SynchronizeUserData();
                        break;
                    }

                    case Data.MetaData.GZPS:
                    {
                        SimPe.PackedFiles.Wrapper.Cpf cpf = new Cpf();
                        cpf.ProcessData(newpfd, ret);
                        cpf.GetSaveItem("skintone").StringValue = skin;

                        cpf.SynchronizeUserData();
                        break;
                    }

                    case Data.MetaData.TXMT:
                    {
                        SimPe.Plugin.Rcol rcol = new GenericRcol(null, false);
                        rcol.ProcessData(newpfd, ret);
                        MaterialDefinition txmt = (MaterialDefinition)rcol.Blocks[0];
                        txmt.FindProperty("cafSkinTone").Value = skin;

                        rcol.SynchronizeUserData();
                        break;
                    }
                    }
                }
            }

            //Update DNA File
            Interfaces.Files.IPackedFileDescriptor dna = ngbh.FindFile(0xEBFEE33F, 0, Data.MetaData.LOCAL_GROUP, spatient.Instance);
            if (dna != null)
            {
                SimPe.PackedFiles.Wrapper.Cpf cpf = new Cpf();
                cpf.ProcessData(dna, ngbh);
                cpf.GetSaveItem("2").StringValue = skin;
                cpf.GetSaveItem("6").StringValue = skin;

                cpf.SynchronizeUserData();
            }

            //Update 3IDR Files
            SimPe.Interfaces.Files.IPackedFileDescriptor[] pfds = ret.FindFiles(0xAC506764);
            foreach (SimPe.Interfaces.Files.IPackedFileDescriptor pfd in pfds)
            {
                SimPe.Plugin.RefFile reffile = new RefFile();
                reffile.ProcessData(pfd, ret);

                UpdateSkintone(reffile, skin, skinfiles);
            }

            //Update TXMT Files for the Face
            pfds = ret.FindFiles(Data.MetaData.TXMT);
            foreach (SimPe.Interfaces.Files.IPackedFileDescriptor pfd in pfds)
            {
                SimPe.Plugin.Rcol rcol = new GenericRcol(null, false);
                rcol.ProcessData(pfd, ret);

                MaterialDefinition md = (MaterialDefinition)rcol.Blocks[0];
                this.UpdateSkintone(md, skin, skinfiles);

                rcol.SynchronizeUserData();
            }


            return(ret);
        }
예제 #9
0
        public bool Parse(List <string> argv)
        {
            int i = ArgParser.Parse(argv, "-txtr");

            if (i < 0)
            {
                return(false);
            }

            //get Parameters
            string filename    = "";
            string output      = "";
            string texturename = "";
            string num         = "";
            int    levels      = 9;

            System.Drawing.Size sz = new System.Drawing.Size(512, 512);
            SimPe.Plugin.ImageLoader.TxtrFormats format = SimPe.Plugin.ImageLoader.TxtrFormats.DXT1Format;

            while (argv.Count > i)
            {
                if (ArgParser.Parse(argv, i, "-image", ref filename))
                {
                    continue;
                }
                if (ArgParser.Parse(argv, i, "-out", ref output))
                {
                    continue;
                }
                if (ArgParser.Parse(argv, i, "-name", ref texturename))
                {
                    continue;
                }
                if (ArgParser.Parse(argv, i, "-levels", ref num))
                {
                    levels = Convert.ToInt32(num); continue;
                }
                if (ArgParser.Parse(argv, i, "-width", ref num))
                {
                    sz.Width = Convert.ToInt32(num); continue;
                }
                if (ArgParser.Parse(argv, i, "-height", ref num))
                {
                    sz.Height = Convert.ToInt32(num); continue;
                }
                if (ArgParser.Parse(argv, i, "-format", ref num))
                {
                    switch (num)
                    {
                    case "dxt1": format = SimPe.Plugin.ImageLoader.TxtrFormats.DXT1Format; break;

                    case "dxt3": format = SimPe.Plugin.ImageLoader.TxtrFormats.DXT3Format; break;

                    case "dxt5": format = SimPe.Plugin.ImageLoader.TxtrFormats.DXT5Format; break;

                    case "raw24": format = SimPe.Plugin.ImageLoader.TxtrFormats.Raw24Bit; break;

                    case "raw32": format = SimPe.Plugin.ImageLoader.TxtrFormats.Raw32Bit; break;

                    case "raw8": format = SimPe.Plugin.ImageLoader.TxtrFormats.Raw8Bit; break;
                    }
                    continue;
                }
                SimPe.Message.Show(Help()[0]);
                return(true);
            }

            //check if the File exists
            if (!System.IO.File.Exists(filename))
            {
                SimPe.Message.Show(filename + " was not found.");
                return(true);
            }
            if (output.Trim() == "")
            {
                SimPe.Message.Show("Please specify an output file using -out");
                return(true);
            }

            //build TXTR File
            ImageData id = new SimPe.Plugin.ImageData(null);

            if ((System.IO.File.Exists(PathProvider.Global.NvidiaDDSTool)) && ((format == ImageLoader.TxtrFormats.DXT1Format) || (format == ImageLoader.TxtrFormats.DXT3Format) || (format == ImageLoader.TxtrFormats.DXT5Format)))
            {
                LoadDDS(id, DDSTool.BuildDDS(filename, levels, format, "-sharpenMethod Smoothen"));
            }
            else
            {
                LoadTXTR(id, filename, sz, levels, format);
            }

            Rcol rcol = new GenericRcol(null, false);

            rcol.FileName       = texturename;
            rcol.FileDescriptor = new SimPe.Packages.PackedFileDescriptor();
            rcol.Blocks         = new IRcolBlock[1];
            rcol.Blocks[0]      = id;

            rcol.SynchronizeUserData();
            System.IO.FileStream   fs = System.IO.File.Create(output);
            System.IO.BinaryWriter bw = new System.IO.BinaryWriter(fs);
            bw.Write(rcol.FileDescriptor.UserData);
            bw.Close();
            bw = null;
            fs.Close();
            fs.Dispose();
            fs = null;

            return(true);
        }
예제 #10
0
        void FixFence()
        {
            Hashtable   shpnamemap = new Hashtable();
            GenericRcol rcol       = new GenericRcol();

            uint[] types = new uint[] { Data.MetaData.SHPE, Data.MetaData.CRES };

            //now fix the texture References in those Resources
            foreach (uint t in types)
            {
                SimPe.Interfaces.Files.IPackedFileDescriptor[] pfds = package.FindFiles(t);

                foreach (SimPe.Interfaces.Files.IPackedFileDescriptor pfd in pfds)
                {
                    //fix the references to the SHPE Resources, to mirror the fact
                    //that they are in the Global Group now
                    if (t == Data.MetaData.CRES || t == Data.MetaData.GMND)
                    {
                        rcol.ProcessData(pfd, package);

                        string shpname = null;

                        if (t == Data.MetaData.CRES)
                        {
                            SimPe.Plugin.ResourceNode rn = (SimPe.Plugin.ResourceNode)rcol.Blocks[0];
                            rn.GraphNode.FileName = Hashes.StripHashFromName(rn.GraphNode.FileName);

                            //generate the name for the connected SHPE Resource
                            foreach (SimPe.Interfaces.Scenegraph.IRcolBlock irb in rcol.Blocks)
                            {
                                if (irb is SimPe.Plugin.ShapeRefNode)
                                {
                                    ShapeRefNode srn = (ShapeRefNode)irb;
                                    shpname = rcol.FileName.Trim().ToLower().Replace("_cres", "").Replace("_", "").Trim();
                                    srn.StoredTransformNode.ObjectGraphNode.FileName = shpname;
                                    shpname = rcol.FileName.Replace("_cres", "").Trim() + "_" + shpname + "_shpe";
                                }
                            }
                        }
                        else if (t == Data.MetaData.GMND)
                        {
                            SimPe.Plugin.GeometryNode gn = (SimPe.Plugin.GeometryNode)rcol.Blocks[0];
                            gn.ObjectGraphNode.FileName = Hashes.StripHashFromName(gn.ObjectGraphNode.FileName);
                        }

                        foreach (SimPe.Interfaces.Files.IPackedFileDescriptor rpfd in rcol.ReferencedFiles)
                        {
                            //SHPE Resources get a new Name, so fix the Instance of the reference at this point
                            if (rpfd.Type == Data.MetaData.SHPE)
                            {
                                shpnamemap[rpfd.LongInstance] = shpname;
                                rpfd.Instance = Hashes.InstanceHash(shpname);
                                rpfd.SubType  = Hashes.SubTypeHash(shpname);
                            }

                            rpfd.Group = Data.MetaData.GLOBAL_GROUP;
                        }

                        rcol.SynchronizeUserData();
                    }

                    pfd.Group = Data.MetaData.GLOBAL_GROUP;
                }
            }

            //we need some special Adjustments for SHPE Resources, as their name has to match a certain pattern
            SimPe.Interfaces.Files.IPackedFileDescriptor[] spfds = package.FindFiles(Data.MetaData.SHPE);
            foreach (SimPe.Interfaces.Files.IPackedFileDescriptor pfd in spfds)
            {
                if (shpnamemap[pfd.LongInstance] == null)
                {
                    continue;
                }
                rcol.ProcessData(pfd, package);
                rcol.FileName = (string)shpnamemap[pfd.LongInstance];
                rcol.FileDescriptor.Instance = Hashes.InstanceHash(rcol.FileName);
                rcol.FileDescriptor.SubType  = Hashes.SubTypeHash(rcol.FileName);

                rcol.SynchronizeUserData();
            }
        }
예제 #11
0
        /// <summary>
        /// Runs the Fix Operation
        /// </summary>
        /// <param name="map">the map we have to use for name Replacements</param>
        /// <param name="uniquefamily">change the family values in the MMAT Files</param>
        public void Fix(Hashtable map, bool uniquefamily)
        {
            string grouphash = "##0x" + Helper.HexString(Data.MetaData.CUSTOM_GROUP) + "!";        //"#0x"+Helper.HexString(package.FileGroupHash)+"!";


            Hashtable refmap         = new Hashtable();
            Hashtable completerefmap = new Hashtable();

            if (WaitingScreen.Running)
            {
                WaitingScreen.UpdateMessage("Fixing Names");
            }
            FixNames(map);

            foreach (uint type in Data.MetaData.RcolList)
            {
                Interfaces.Files.IPackedFileDescriptor[] pfds = package.FindFiles(type);

                //build a List of RefItems
                foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
                {
                    SimPe.Plugin.Rcol rcol = new GenericRcol(null, false);
                    rcol.ProcessData(pfd, package);

                    //rcol.FileName = Hashes.StripHashFromName(rcol.);

                    /*if (types.Contains(pfd.Type)) rcol. = Hashes.StripHashFromName(rcol.);
                     * else rcol.FileName = grouphash + Hashes.StripHashFromName(rcol.FileName);*/

                    foreach (Interfaces.Files.IPackedFileDescriptor rpfd in rcol.ReferencedFiles)
                    {
                        string refstr = BuildRefString(rpfd);
                        if (!refmap.Contains(refstr))
                        {
                            refmap.Add(refstr, null);
                        }
                    }
                    //rcol.SynchronizeUserData();
                }
            }

            //Updated TGI Values and update the refmap
            if (WaitingScreen.Running)
            {
                WaitingScreen.UpdateMessage("Updating TGI Values");
            }
            foreach (uint type in Data.MetaData.RcolList)
            {
                Interfaces.Files.IPackedFileDescriptor[] pfds = package.FindFiles(type);

                foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
                {
                    string            refstr = BuildRefString(pfd);
                    SimPe.Plugin.Rcol rcol   = new GenericRcol(null, false);
                    rcol.ProcessData(pfd, package);

                    //rcol.FileName = grouphash + Hashes.StripHashFromName(rcol.);
                    rcol.FileDescriptor.Instance = Hashes.InstanceHash(Hashes.StripHashFromName(rcol.FileName));
                    rcol.FileDescriptor.SubType  = Hashes.SubTypeHash(Hashes.StripHashFromName(rcol.FileName));

                    if (refmap.Contains(refstr))
                    {
                        refmap[refstr] = rcol.FileDescriptor;
                    }
                    completerefmap[refstr] = rcol.FileDescriptor;
                }
            }

            //Update the References
            if (WaitingScreen.Running)
            {
                WaitingScreen.UpdateMessage("Updating TGI References");
            }
            foreach (uint type in Data.MetaData.RcolList)
            {
                Interfaces.Files.IPackedFileDescriptor[] pfds = package.FindFiles(type);

                foreach (Interfaces.Files.IPackedFileDescriptor pfd in pfds)
                {
                    SimPe.Plugin.Rcol rcol = new GenericRcol(null, false);
                    rcol.ProcessData(pfd, package);

                    foreach (Interfaces.Files.IPackedFileDescriptor rpfd in rcol.ReferencedFiles)
                    {
                        string refstr = Helper.HexString(rpfd.Group) + Helper.HexString(rpfd.Type) + Helper.HexString(rpfd.Instance) + Helper.HexString(rpfd.SubType);

                        if (ver == FixVersion.UniversityReady2)
                        {
                            if (types.Contains(rpfd.Type))
                            {
                                rpfd.Group = Data.MetaData.CUSTOM_GROUP;
                            }
                            else
                            {
                                rpfd.Group = Data.MetaData.LOCAL_GROUP;
                            }
                        }
                        else
                        {
                            if (rpfd.Type != Data.MetaData.ANIM)
                            {
                                rpfd.Group = Data.MetaData.CUSTOM_GROUP;
                            }
                            else
                            {
                                rpfd.Group = Data.MetaData.GLOBAL_GROUP;
                            }
                        }

                        if (refmap.Contains(refstr))
                        {
                            Interfaces.Files.IPackedFileDescriptor npfd = (Interfaces.Files.IPackedFileDescriptor)refmap[refstr];
                            if (npfd != null)
                            {
                                rpfd.Instance = npfd.Instance;
                                rpfd.SubType  = npfd.SubType;
                            }
                        }
                    }                     //foreach

                    rcol.SynchronizeUserData();
                }
            }

            //Make sure XObjects and Skins get Fixed Too
            FixXObject(map, completerefmap, grouphash);
            FixSkin(map, completerefmap, grouphash);

            //Make sure MMATs get fixed
            FixMMAT(map, uniquefamily, grouphash);

            //Make sure OBJd's get fixed too
            FixOBJd();

            //And finally the Root String
            if (WaitingScreen.Running)
            {
                WaitingScreen.UpdateMessage("Updating Root");
            }
            SimPe.Interfaces.Files.IPackedFileDescriptor[] mpfds = package.FindFiles(Data.MetaData.STRING_FILE);
            string modelname = null;

            foreach (Interfaces.Files.IPackedFileDescriptor pfd in mpfds)
            {
                SimPe.PackedFiles.Wrapper.Str str = new SimPe.PackedFiles.Wrapper.Str();
                str.ProcessData(pfd, package);

                foreach (SimPe.PackedFiles.Wrapper.StrToken i in str.Items)
                {
                    string name = Hashes.StripHashFromName(i.Title.Trim().ToLower());

                    if (name == "")
                    {
                        continue;
                    }
                    if (pfd.Instance == 0x88)
                    {
                        if (!name.EndsWith("_txmt"))
                        {
                            name += "_txmt";
                        }
                    }
                    else if (pfd.Instance == 0x85)
                    {
                        if (!name.EndsWith("_cres"))
                        {
                            name += "_cres";
                        }
                    }
                    else if ((pfd.Instance == 0x81) || (pfd.Instance == 0x82) || (pfd.Instance == 0x86) || (pfd.Instance == 0x192))
                    {
                        if (!name.EndsWith("_anim"))
                        {
                            name += "_anim";
                        }
                    }
                    else
                    {
                        continue;
                    }


                    string newref = (string)map[name];
                    if (newref != null)
                    {
                        i.Title = Hashes.StripHashFromName(newref.Substring(0, newref.Length - 5));
                    }
                    else
                    {
                        i.Title = Hashes.StripHashFromName(i.Title);
                    }

                    if (((ver == FixVersion.UniversityReady) || (pfd.Instance == 0x88)) && (newref != null))
                    {
                        i.Title = Hashes.StripHashFromName(i.Title);

                        if (!((pfd.Instance == 0x81) || (pfd.Instance == 0x82) || (pfd.Instance == 0x86) || (pfd.Instance == 0x192)))
                        {
                            i.Title = "##0x" + Helper.HexString(Data.MetaData.CUSTOM_GROUP) + "!" + i.Title;
                        }
                    }
                    else
                    {
                        uint tp = Data.MetaData.ANIM;
                        if (pfd.Instance == 0x88)
                        {
                            tp = Data.MetaData.TXMT;
                        }
                        else if (pfd.Instance == 0x85)
                        {
                            tp = Data.MetaData.CRES;
                        }

                        SimPe.Interfaces.Scenegraph.IScenegraphFileIndexItem fii = FileTable.FileIndex.FindFileByName(i.Title, tp, Data.MetaData.LOCAL_GROUP, true);
                        if (fii != null)
                        {
                            if (fii.FileDescriptor.Group == Data.MetaData.CUSTOM_GROUP)
                            {
                                i.Title = "##0x" + Helper.HexString(Data.MetaData.CUSTOM_GROUP) + "!" + Hashes.StripHashFromName(i.Title);
                            }
                        }
                    }

                    if ((modelname == null) && (i.Language.Id == 1) && (pfd.Instance == 0x85))
                    {
                        modelname = name.ToUpper().Replace("-", "_");
                    }
                }

                if (RemoveNonDefaultTextReferences)
                {
                    if (pfd.Instance == 0x88 || pfd.Instance == 0x85 || (pfd.Instance == 0x81) || (pfd.Instance == 0x82) || (pfd.Instance == 0x86) || (pfd.Instance == 0x192))
                    {
                        str.ClearNonDefault();
                    }
                }


                str.SynchronizeUserData();
            }

            //Now change the NREF

            if (modelname != null)
            {
                mpfds = package.FindFiles(0x4E524546);
                foreach (Interfaces.Files.IPackedFileDescriptor pfd in mpfds)
                {
                    SimPe.PackedFiles.Wrapper.Nref nref = new SimPe.PackedFiles.Wrapper.Nref();
                    nref.ProcessData(pfd, package);
                    if (ver == FixVersion.UniversityReady)
                    {
                        nref.FileName = "SIMPE_" + modelname;
                    }
                    else
                    {
                        nref.FileName = "SIMPE_v2_" + modelname;
                    }

                    nref.SynchronizeUserData();
                }
            }
        }
예제 #12
0
        /// <summary>
        /// Fixes the Global Group
        /// </summary>
        public void FixGroup()
        {
            uint[] RCOLs =
            {
                0xFB00791E,                                                 //ANIM
                0x4D51F042,                                                 //CINE
                0xE519C933,                                                 //CRES
                0xAC4F8687,                                                 //GMDC
                0x7BA3838C,                                                 //GMND
                0xC9C81B9B,                                                 //LGHT
                0xC9C81BA3,                                                 //LGHT
                0xC9C81BA9,                                                 //LGHT
                0xC9C81BAD,                                                 //LGHT
                0xED534136,                                                 //LIFO
                0xFC6EB1F7,                                                 //SHPE
                0x49596978,                                                 //TXMT, MATD
                0x1C4A276C                                                  //TXTR
            };

            if (WaitingScreen.Running)
            {
                WaitingScreen.UpdateMessage("Fixing Groups");
            }
            foreach (Interfaces.Files.IPackedFileDescriptor pfd in package.Index)
            {
                bool RCOLcheck = types.Contains(pfd.Type);
                if (ver == FixVersion.UniversityReady)
                {
                    RCOLcheck = Data.MetaData.RcolList.Contains(pfd.Type);
                }
                //foreach (uint tp in RCOLs) if (tp==pfd.Type) { RCOLcheck=true; break; }

                if (Data.MetaData.RcolList.Contains(pfd.Type))
                {
                    SimPe.Plugin.GenericRcol rcol = new GenericRcol(null, false);
                    rcol.ProcessData(pfd, package);

                    foreach (Interfaces.Files.IPackedFileDescriptor p in rcol.ReferencedFiles)
                    {
                        if (ver == FixVersion.UniversityReady2)
                        {
                            if (types.Contains(p.Type))
                            {
                                p.Group = Data.MetaData.CUSTOM_GROUP;
                            }
                            else
                            {
                                p.Group = Data.MetaData.LOCAL_GROUP;
                            }
                        }
                        else
                        {
                            if (Data.MetaData.RcolList.Contains(p.Type))
                            {
                                if (p.Type != Data.MetaData.ANIM)
                                {
                                    p.Group = Data.MetaData.CUSTOM_GROUP;
                                }
                                else
                                {
                                    p.Group = Data.MetaData.GLOBAL_GROUP;
                                }
                            }
                            else
                            {
                                p.Group = Data.MetaData.LOCAL_GROUP;
                            }
                        }
                    }
                    rcol.SynchronizeUserData();
                }

                if (RCOLcheck)
                {
                    if (pfd.Type != Data.MetaData.ANIM)
                    {
                        pfd.Group = Data.MetaData.CUSTOM_GROUP;
                    }
                    else
                    {
                        pfd.Group = Data.MetaData.GLOBAL_GROUP;
                    }
                }
                else
                {
                    pfd.Group = Data.MetaData.LOCAL_GROUP;
                }
            }

            //is this a Fence package? If so, do special FenceFixes
            if (package.FindFiles(Data.MetaData.XFNC).Length > 0 /*|| package.FindFiles(Data.MetaData.XNGB).Length>0*/)
            {
                this.FixFence();
            }
        }
예제 #13
0
        /// <summary>
        /// Add a small Scenegraph Chain
        /// </summary>
        /// <param name="mmat">the MAterial override File for this Subset</param>
        /// <param name="txmt">The Material Definition File for this Subset</param>
        /// <param name="txtr">The Txtr File for this Subset (can be null)</param>
        /// <param name="unique">A unique String for the Filenames</param>
        /// <param name="slavemap">The Slavemap as generated by Scenegraph.GetSlaveSubsets() (if null, no slave txmts are loaded)</param>
        void AddTxmt(IPackageFile newpkg, SimPe.Plugin.MmatWrapper mmat, GenericRcol txmt, GenericRcol txtr, string unique, Hashtable slavemap)
        {
            //Get/Update Material Definition
            if (txmt != null)
            {
                string name = Hashes.StripHashFromName(txmt.FileName.Trim());

                //load Slave TXMTs
                if (slavemap != null)
                {
                    LoadSlaveTxmt(newpkg, mmat, name, unique, slavemap);
                }

                if (name.ToLower().EndsWith("_txmt"))
                {
                    name = name.Substring(0, name.Length - 5);
                }
                txmt.FileName       = FixObject.GetUniqueTxmtName(name, unique, mmat.SubsetName, true);          ///*"##0x"+Helper.HexString(Data.MetaData.CUSTOM_GROUP)+"!"+*/name+"_"+unique+"_txmt";
                txmt.FileDescriptor = ScenegraphHelper.BuildPfd(txmt.FileName, Data.MetaData.TXMT, Data.MetaData.CUSTOM_GROUP);

                mmat.Name = "##0x" + Helper.HexString(txmt.FileDescriptor.Group) + "!" + FixObject.GetUniqueTxmtName(name, unique, mmat.SubsetName, false);

                MaterialDefinition md = (MaterialDefinition)txmt.Blocks[0];
                if (txtr == null)
                {
                    txtr = mmat.GetTxtr(txmt);
                    if (txtr != null)
                    {
                        txtr.FileDescriptor = (Interfaces.Files.IPackedFileDescriptor)txtr.FileDescriptor.Clone();
                    }
                }

                //Get/Update Texture
                if (txtr != null)
                {
                    name = AddTxtr(txtr, unique, txmt, md);

                    md.FileDescription = Hashes.StripHashFromName(txmt.FileName).Trim();
                    if (md.FileDescription.ToLower().EndsWith("_txmt"))
                    {
                        md.FileDescription = md.FileDescription.Substring(0, md.FileDescription.Length - 5);
                    }
                }

                if (txtr != null)
                {
                    txtr.SynchronizeUserData();
                    if (newpkg.FindFile(txtr.FileDescriptor) == null)
                    {
                        newpkg.Add(txtr.FileDescriptor);
                    }
                }

                AddReferencedTxtr(newpkg, txmt, md, unique);

                if (txmt != null)
                {
                    txmt.SynchronizeUserData();
                    if (newpkg.FindFile(txmt.FileDescriptor) == null)
                    {
                        newpkg.Add(txmt.FileDescriptor);
                    }
                }
            }
        }