// Load the skeleton file and its BasedOn values public async Task <Dictionary <string, Bone> > Load(Appearance.Races race) { if (this.precachedBones.ContainsKey(race)) { return(this.precachedBones[race]); } try { IFileService fileService = Services.Get <IFileService>(); Dictionary <string, Bone> bones = new Dictionary <string, Bone>(); string fileName = race.ToString(); while (!string.IsNullOrEmpty(fileName)) { SkeletonFile file = await fileService.Open <SkeletonFile>(SkeletonFile.File, SkeletonsDirectory + fileName); if (file == null) { throw new Exception("Failed to load skeleton file: " + fileName); } foreach ((string name, Bone bone) in file.Bones) { // If we already have this bone, then its being overwritten by a higher file. if (bones.ContainsKey(name)) { continue; } bone.Offsets.Name = name; bones[name] = bone; } // Get the based on value to load bones from. fileName = file.BasedOn; } return(bones); } catch (Exception ex) { throw new Exception("Failed to load skeleton for race: " + race, ex); } }
public static Appearance.Tribes[] GetTribes(this Appearance.Races race) { switch (race) { case Appearance.Races.Hyur: return(new[] { Appearance.Tribes.Midlander, Appearance.Tribes.Highlander }); case Appearance.Races.Elezen: return(new[] { Appearance.Tribes.Wildwood, Appearance.Tribes.Duskwight }); case Appearance.Races.Lalafel: return(new[] { Appearance.Tribes.Plainsfolk, Appearance.Tribes.Dunesfolk }); case Appearance.Races.Miqote: return(new[] { Appearance.Tribes.SeekerOfTheSun, Appearance.Tribes.KeeperOfTheMoon }); case Appearance.Races.Roegadyn: return(new[] { Appearance.Tribes.SeaWolf, Appearance.Tribes.Hellsguard }); case Appearance.Races.AuRa: return(new[] { Appearance.Tribes.Raen, Appearance.Tribes.Xaela }); case Appearance.Races.Hrothgar: return(new[] { Appearance.Tribes.Helions, Appearance.Tribes.TheLost }); case Appearance.Races.Viera: return(new[] { Appearance.Tribes.Rava, Appearance.Tribes.Veena }); } throw new Exception("Unrecognized race: " + race); }
public RaceWrapper(Race row) : base(row) { this.race = (Appearance.Races)row.Key; }
public PoseFile Upgrade(Appearance.Races race) { PoseFile file = new PoseFile(); file.IncludePositions = false; file.IncludeScale = false; Type legacyType = this.GetType(); Appearance.Races fileRace = (Appearance.Races) byte.Parse(this.Race); PropertyInfo[] props = this.GetType().GetProperties(); foreach (PropertyInfo propertyInfo in props) { string boneName = propertyInfo.Name; if (boneName == "Race") { continue; } if (boneName.EndsWith("Size")) { continue; } PropertyInfo rotProp = legacyType.GetProperty(boneName); PropertyInfo scaleProp = legacyType.GetProperty(boneName + "Size"); if (boneName.StartsWith(@"Hroth")) { if (fileRace == Appearance.Races.Hrothgar) { boneName = boneName.Replace(@"Hroth", string.Empty); } else { continue; } } if (boneName.StartsWith("Viera")) { if (fileRace == Appearance.Races.Viera) { boneName = boneName.Replace("Viera", string.Empty); } else { continue; } } if (boneName.StartsWith("ExHair")) { string letter = boneName.Replace("ExHair", string.Empty); byte index = this.StringToByte(letter); boneName = "ExHair" + index; } else if (boneName.StartsWith("ExMet")) { string letter = boneName.Replace("ExMet", string.Empty); byte index = this.StringToByte(letter); boneName = "ExMet" + index; } else if (boneName.StartsWith("ExTop")) { string letter = boneName.Replace("ExTop", string.Empty); byte index = this.StringToByte(letter); boneName = "ExTop" + index; } string rotString = null; string scaleString = null; if (rotProp != null) { rotString = (string)rotProp.GetValue(this); } if (scaleProp != null) { scaleString = (string)scaleProp.GetValue(this); } if (rotString == null && scaleString == null) { continue; } // Hroth and Viera bones should always be _after_ the base bones, // And we only reach this point if we want them, so always prefer newer bones. if (file.Bones.ContainsKey(boneName)) { file.Bones.Remove(boneName); } Transform bone = StringToBone(rotString, scaleString); file.Bones.Add(boneName, bone); } return(file); }
public PoseFile Upgrade(Appearance.Races race) { PoseFile file = new PoseFile(); Type legacyType = this.GetType(); if (this.Race == null) { throw new Exception("Legacy pose file has no race specified"); } Appearance.Races fileRace = (Appearance.Races) byte.Parse(this.Race); file.Bones = new Dictionary <string, PoseFile.Bone?>(); PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance); foreach (PropertyInfo propertyInfo in props) { string boneName = propertyInfo.Name; if (boneName == "Race") { continue; } if (boneName.EndsWith("Size")) { continue; } if (boneName == "Type") { continue; } PropertyInfo?rotProp = legacyType.GetProperty(boneName); PropertyInfo?scaleProp = legacyType.GetProperty(boneName + "Size"); if (boneName.StartsWith(@"Hroth") && fileRace != Appearance.Races.Hrothgar) { continue; } if (boneName.StartsWith("Viera") && fileRace != Appearance.Races.Viera) { continue; } boneName = boneName.Replace(@"Hroth", string.Empty); boneName = boneName.Replace(@"Viera", string.Empty); string?rotString = null; string?scaleString = null; if (rotProp != null) { rotString = (string?)rotProp.GetValue(this); } if (scaleProp != null) { scaleString = (string?)scaleProp.GetValue(this); } if (rotString == null && scaleString == null) { continue; } PoseFile.Bone bone = StringToBone(rotString, scaleString); if (file.Bones.ContainsKey(boneName)) { file.Bones.Remove(boneName); } file.Bones.Add(boneName, bone); } return(file); }
public PoseFile Upgrade(Appearance.Races race) { PoseFile file = new PoseFile(); file.Config.IncludeRotation = true; file.Config.IncludePosition = false; file.Config.IncludeScale = true; Type legacyType = this.GetType(); if (this.Race == null) { throw new Exception("Legacy pose file has no race specified"); } Appearance.Races fileRace = (Appearance.Races) byte.Parse(this.Race); PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance); foreach (PropertyInfo propertyInfo in props) { string boneName = propertyInfo.Name; if (boneName == "Race") { continue; } if (boneName.EndsWith("Size")) { continue; } if (boneName == "Type") { continue; } PropertyInfo?rotProp = legacyType.GetProperty(boneName); PropertyInfo?scaleProp = legacyType.GetProperty(boneName + "Size"); if (boneName.StartsWith(@"Hroth") && fileRace != Appearance.Races.Hrothgar) { continue; } if (boneName.StartsWith("Viera") && fileRace != Appearance.Races.Viera) { continue; } string?rotString = null; string?scaleString = null; if (rotProp != null) { rotString = (string?)rotProp.GetValue(this); } if (scaleProp != null) { scaleString = (string?)scaleProp.GetValue(this); } if (rotString == null && scaleString == null) { continue; } Transform transform = StringToBone(rotString, scaleString); int index; if (SkeletonUtility.BodyBoneIndexLookup.TryGetValue(boneName, out index)) { if (file.Body == null) { file.Body = new List <PoseFile.Bone?>(); } while (file.Body.Count <= index) { file.Body.Add(null); } file.Body[index] = new PoseFile.Bone(transform); } else if (SkeletonUtility.HeadBoneIndexLookup.TryGetValue(boneName, out index)) { if (file.Head == null) { file.Head = new List <PoseFile.Bone?>(); } while (file.Head.Count <= index) { file.Head.Add(null); } file.Head[index] = new PoseFile.Bone(transform); } else if (SkeletonUtility.HairBoneIndexLookup.TryGetValue(boneName, out index)) { if (file.Hair == null) { file.Hair = new List <PoseFile.Bone?>(); } while (file.Hair.Count <= index) { file.Hair.Add(null); } file.Hair[index] = new PoseFile.Bone(transform); } else if (SkeletonUtility.MetBoneIndexLookup.TryGetValue(boneName, out index)) { if (file.Met == null) { file.Met = new List <PoseFile.Bone?>(); } while (file.Met.Count <= index) { file.Met.Add(null); } file.Met[index] = new PoseFile.Bone(transform); } else if (SkeletonUtility.TopBoneIndexLookup.TryGetValue(boneName, out index)) { if (file.Top == null) { file.Top = new List <PoseFile.Bone?>(); } while (file.Top.Count <= index) { file.Top.Add(null); } file.Top[index] = new PoseFile.Bone(transform); } else { throw new Exception("Failed to find index for bone: " + boneName); } } return(file); }