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