private static async Task <string> GetExtraSkelbPath(XivDependencyRootInfo root, XivRace race = XivRace.All_Races) { var type = Est.GetEstType(root); // Type doesn't use extra skels. if (type == Est.EstType.Invalid) { return(null); } var id = (ushort)root.PrimaryId; if (type == Est.EstType.Face || type == Est.EstType.Hair) { id = (ushort)root.SecondaryId; } // Hair and face types have a race defined at root level. if ((type == Est.EstType.Face || type == Est.EstType.Hair) && race == XivRace.All_Races) { var ret = new Dictionary <XivRace, ExtraSkeletonEntry>(); race = XivRaces.GetXivRace(root.PrimaryId); } var entry = await Est.GetExtraSkeletonEntry(type, race, id); var skelId = entry.SkelId; if (skelId == 0) { if (race == XivRace.Hyur_Midlander_Male) { return(null); } // Okay, this model, *as defined* has no EX Skeleton. _HOWEVER_ its parent skeleton could. // So we need to re-call and check up the chain until we hit Hyur M. var parent = XivRaceTree.GetNode(race).Parent; if (parent == null) { return(null); } // It's worth noting in these cases, the Skeletal bones themselves will still be using the matrices appropriate // for their parent race in this method, but that should be sufficient for now. return(await GetExtraSkelbPath(root, parent.Race)); } var prefix = Est.GetSystemPrefix(type); var slot = Est.GetSystemSlot(type); var raceCode = XivRaces.GetRaceCode(race); var skelCode = skelId.ToString().PadLeft(4, '0'); var path = $"chara/human/c{raceCode}/skeleton/{slot}/{prefix}{skelCode}/skl_c{raceCode}{prefix}{skelCode}.sklb"; return(path); }
public static void Write(byte[] data, ExtraSkeletonEntry entry, int count, int index) { int offset = (int)(4 + (index * 4)); short raceId = Int16.Parse(XivRaces.GetRaceCode(entry.Race)); IOUtil.ReplaceBytesAt(data, BitConverter.GetBytes(entry.SetId), offset); IOUtil.ReplaceBytesAt(data, BitConverter.GetBytes(raceId), offset + 2); var baseOffset = 4 + (count * 4); offset = (int)(baseOffset + (index * 2)); IOUtil.ReplaceBytesAt(data, BitConverter.GetBytes(entry.SkelId), offset); }