Exemplo n.º 1
0
        // 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);
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 public RaceWrapper(Race row)
     : base(row)
 {
     this.race = (Appearance.Races)row.Key;
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }