private static string UpdateFileName(XivDependencyRoot Source, XivDependencyRoot Destination, string path) { var file = Path.GetFileName(path); if (Destination.Info.PrimaryType == XivItemType.human && Destination.Info.SecondaryType == XivItemType.hair && Path.GetExtension(path) == ".mtrl") { var hairRoot = Mtrl.GetHairMaterialRoot(Destination.Info); // Force replace the root information to the correct one for this target hair. var raceReplace = new Regex("^mt_c[0-9]{4}h[0-9]{4}"); file = raceReplace.Replace(file, "mt_c" + hairRoot.PrimaryId.ToString().PadLeft(4, '0') + "h" + hairRoot.SecondaryId.ToString().PadLeft(4, '0')); // Jam in a suffix into the MTRL to make it unique/non-colliding. var initialPartRex = new Regex("^(mt_c[0-9]{4}h[0-9]{4})(?:_c[0-9]{4})?(.+)$"); var m = initialPartRex.Match(file); // ??? if (!m.Success) { return(file); } file = m.Groups[1].Value + "_c" + Destination.Info.PrimaryId.ToString().PadLeft(4, '0') + m.Groups[2].Value; return(file); } var rex = new Regex("[a-z][0-9]{4}([a-z][0-9]{4})"); var match = rex.Match(file); if (!match.Success) { return(file); } if (Source.Info.SecondaryType == null) { // Equipment/Accessory items. Only replace the back half of the file names. var srcString = match.Groups[1].Value; var dstString = Destination.Info.GetBaseFileName(false); file = file.Replace(srcString, dstString); } else { // Replace the entire root chunk for roots that have two identifiers. var srcString = match.Groups[0].Value; var dstString = Destination.Info.GetBaseFileName(false); file = file.Replace(srcString, dstString); } return(file); }
private static string UpdateFolder(XivDependencyRoot Source, XivDependencyRoot Destination, string path) { if (Destination.Info.PrimaryType == XivItemType.human && Destination.Info.SecondaryType == XivItemType.hair && Path.GetExtension(path) == ".mtrl") { var hairRoot = Mtrl.GetHairMaterialRoot(Destination.Info); // Force the race code to the appropriate one. var raceReplace = new Regex("/c[0-9]{4}"); path = raceReplace.Replace(path, "/c" + hairRoot.PrimaryId.ToString().PadLeft(4, '0')); var hairReplace = new Regex("/h[0-9]{4}"); path = hairReplace.Replace(path, "/h" + hairRoot.SecondaryId.ToString().PadLeft(4, '0')); // Hairs between 115 and 200 have forced material path sharing enabled. path = Path.GetDirectoryName(path); path = path.Replace('\\', '/'); return(path); } // So first off, just copy anything from the old root folder to the new one. var match = RemoveRootPathRegex.Match(path); if (match.Success) { // The item existed in an old root path, so we can just clone the same post-root path into the new root folder. var afterRootPath = match.Groups[1].Value; path = Destination.Info.GetRootFolder() + afterRootPath; path = Path.GetDirectoryName(path); path = path.Replace('\\', '/'); return(path); } // Okay, stuff at this point didn't actually exist in any root path, and didn't exist in the common path either. // Just copy this crap into our root folder. // The only way we can really get here is if some mod author created textures in a totally arbitrary path. path = Path.GetDirectoryName(Destination.Info.GetRootFolder()); path = path.Replace('\\', '/'); return(path); }