Beispiel #1
0
        /// <summary>
        /// Load availabe lua resources from the FileSystem
        /// </summary>
        /// <param name="dir">The directory you want to scan</param>
        /// <param name="ext">The fiel extension to check</param>
        /// <param name="global">true, if this is a global LUA</param>
        /// <remarks>Instance of the loaded resources will be the hash over the FeleName</remarks>
        static void LoadFromFolder(string dir, string ext, bool global)
        {
            if (!System.IO.Directory.Exists(dir))
            {
                return;
            }

            string[] fls = System.IO.Directory.GetFiles(dir, "*." + ext);
            foreach (string fl in fls)
            {
                string name = System.IO.Path.GetFileName(fl);
                System.IO.BinaryWriter bw = new System.IO.BinaryWriter(new System.IO.MemoryStream());
                try
                {
                    bw.Write((int)0);
                    bw.Write((int)name.Length);
                    bw.Write(Helper.ToBytes(name, name.Length));

                    System.IO.FileStream   fs = System.IO.File.Open(fl, System.IO.FileMode.Open);
                    System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
                    try
                    {
                        bw.Write(br.ReadBytes((int)br.BaseStream.Length));
                    }
                    finally
                    {
                        br.Close();
                        br = null;
                        fs.Close();
                        fs.Dispose();
                        fs = null;
                    }

                    br = new System.IO.BinaryReader(bw.BaseStream);
                    br.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);

                    uint type = SimPe.Data.MetaData.OLUA;
                    if (global)
                    {
                        type = SimPe.Data.MetaData.GLUA;
                    }

                    SimPe.Interfaces.Files.IPackedFileDescriptor pfd = pkg.NewDescriptor(
                        type,
                        Hashes.SubTypeHash(name),
                        SimPe.Data.MetaData.LOCAL_GROUP,
                        Hashes.InstanceHash(name)
                        );

                    pfd.UserData = br.ReadBytes((int)br.BaseStream.Length);
                    pfd.Changed  = false;
                    pkg.Add(pfd);
                }
                finally
                {
                    bw.Close();
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Clone the Face of a Sim
        /// </summary>
        /// <returns>the new Package for the patient Sim</returns>
        public SimPe.Packages.GeneratableFile CloneFace()
        {
            SimPe.Packages.GeneratableFile ret = SimPe.Packages.GeneratableFile.LoadFromFile((string)null);



            ArrayList list = new ArrayList();

            list.Add((uint)0xCCCEF852);             //LxNR, Face

            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);
                }
            }

            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);
                }
            }

            UpdateFaceStructure(ret);
            return(ret);
        }
Beispiel #3
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);
        }
Beispiel #4
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);
        }
Beispiel #5
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);
        }