Skip to content

Commit d3f617b

Browse files
committed
Update 2.0.12.2
2 parents c2b9afd + ba21cc1 commit d3f617b

File tree

31 files changed

+1137
-544
lines changed

31 files changed

+1137
-544
lines changed

xivModdingFramework/General/Enums/XivCategory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77

88
namespace xivModdingFramework.General.Enums
99
{
10-
public static class XivCategorys
10+
public static class XivCategories
1111
{
1212
static List<string> _keys = null;
13-
static XivCategorys()
13+
static XivCategories()
1414
{
1515
_keys = typeof(XivStrings).GetProperties(BindingFlags.Static|BindingFlags.NonPublic).Select(it => it.Name).ToList();
1616
}

xivModdingFramework/General/XivModelChara.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public static async Task<Dictionary<int, byte[]>> GetModelCharaData(DirectoryInf
5050
/// <returns>The XivModelInfo data</returns>
5151
public static async Task<XivModelInfo> GetModelInfo(DirectoryInfo gameDirectory, int index)
5252
{
53-
var xivModelInfo = new XivModelInfo();
53+
var xivModelInfo = new XivMonsterModelInfo();
5454

5555
// These are the offsets to relevant data
5656
// These will need to be changed if data gets added or removed with a patch
@@ -62,12 +62,12 @@ public static async Task<XivModelInfo> GetModelInfo(DirectoryInfo gameDirectory,
6262
// Big Endian Byte Order
6363
using (var br = new BinaryReaderBE(new MemoryStream(modelCharaEx[index])))
6464
{
65-
xivModelInfo.ModelID = br.ReadInt16();
65+
xivModelInfo.PrimaryID = br.ReadInt16();
6666

6767
br.BaseStream.Seek(modelDataOffset, SeekOrigin.Begin);
6868
var modelType = br.ReadByte();
69-
xivModelInfo.Body = br.ReadByte();
70-
xivModelInfo.Variant = br.ReadByte();
69+
xivModelInfo.SecondaryID = br.ReadByte();
70+
xivModelInfo.ImcSubsetID = br.ReadByte();
7171

7272
if (modelType == 2)
7373
{
@@ -94,7 +94,7 @@ public static async Task<XivModelInfo> GetModelInfo(DirectoryInfo gameDirectory,
9494
/// <returns>The XivModelInfo data</returns>
9595
public static XivModelInfo GetModelInfo(Dictionary<int, byte[]> modelCharaEx, int index)
9696
{
97-
var xivModelInfo = new XivModelInfo();
97+
var xivModelInfo = new XivMonsterModelInfo();
9898

9999
// These are the offsets to relevant data
100100
// These will need to be changed if data gets added or removed with a patch
@@ -103,12 +103,12 @@ public static XivModelInfo GetModelInfo(Dictionary<int, byte[]> modelCharaEx, in
103103
// Big Endian Byte Order
104104
using (var br = new BinaryReaderBE(new MemoryStream(modelCharaEx[index])))
105105
{
106-
xivModelInfo.ModelID = br.ReadInt16();
106+
xivModelInfo.PrimaryID = br.ReadInt16();
107107

108108
br.BaseStream.Seek(modelDataOffset, SeekOrigin.Begin);
109109
var modelType = br.ReadByte();
110-
xivModelInfo.Body = br.ReadByte();
111-
xivModelInfo.Variant = br.ReadByte();
110+
xivModelInfo.SecondaryID = br.ReadByte();
111+
xivModelInfo.ImcSubsetID = br.ReadByte();
112112

113113
if (modelType == 2)
114114
{
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace xivModdingFramework.Helpers
6+
{
7+
// I'm not sure why we didn't have a constants class to refer to before, but oh well.
8+
public static class Constants
9+
{
10+
/// <summary>
11+
/// The alphabet. Now in character array form.
12+
/// </summary>
13+
public static readonly char[] Alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
14+
}
15+
}

xivModdingFramework/Helpers/IOUtil.cs

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
// You should have received a copy of the GNU General Public License
1515
// along with this program. If not, see <http://www.gnu.org/licenses/>.
1616

17+
using System;
1718
using System.Collections.Generic;
1819
using System.IO;
1920
using System.IO.Compression;
2021
using System.Linq;
2122
using System.Runtime.InteropServices;
23+
using System.Text.RegularExpressions;
2224
using System.Threading.Tasks;
2325
using xivModdingFramework.General.Enums;
2426
using xivModdingFramework.Items.Interfaces;
@@ -92,36 +94,36 @@ public static string MakeItemSavePath(IItem item, DirectoryInfo saveDirectory, X
9294
validItemName = string.Join(":", item.Name.Split(Path.GetInvalidFileNameChars()));
9395
}
9496

95-
if (item.Category.Equals("UI"))
97+
if (item.PrimaryCategory.Equals("UI"))
9698
{
97-
if (item.ItemSubCategory != null && !item.ItemCategory.Equals(string.Empty))
99+
if (item.TertiaryCategory != null && !item.SecondaryCategory.Equals(string.Empty))
98100
{
99-
path = $"{saveDirectory.FullName}/{item.Category}/{item.ItemCategory}/{item.ItemSubCategory}/{validItemName}";
101+
path = $"{saveDirectory.FullName}/{item.PrimaryCategory}/{item.SecondaryCategory}/{item.TertiaryCategory}/{validItemName}";
100102
}
101103
else
102104
{
103-
path = $"{saveDirectory.FullName}/{item.Category}/{item.ItemCategory}/{validItemName}";
105+
path = $"{saveDirectory.FullName}/{item.PrimaryCategory}/{item.SecondaryCategory}/{validItemName}";
104106
}
105107

106108
if (path.Contains("???"))
107109
{
108110
path = path.Replace("???", "Unk");
109111
}
110112
}
111-
else if (item.Category.Equals(XivStrings.Character))
113+
else if (item.PrimaryCategory.Equals(XivStrings.Character))
112114
{
113115
if (item.Name.Equals(XivStrings.Equipment_Decals) || item.Name.Equals(XivStrings.Face_Paint))
114116
{
115-
path = $"{saveDirectory.FullName}/{item.Category}/{validItemName}";
117+
path = $"{saveDirectory.FullName}/{item.PrimaryCategory}/{validItemName}";
116118
}
117119
else
118120
{
119-
path = $"{saveDirectory.FullName}/{item.Category}/{validItemName}/{race}/{((IItemModel)item).ModelInfo.Body}";
121+
path = $"{saveDirectory.FullName}/{item.PrimaryCategory}/{validItemName}/{race}/{((IItemModel)item).ModelInfo.SecondaryID}";
120122
}
121123
}
122124
else
123125
{
124-
path = $"{saveDirectory.FullName}/{item.ItemCategory}/{validItemName}";
126+
path = $"{saveDirectory.FullName}/{item.SecondaryCategory}/{validItemName}";
125127
}
126128

127129
return path;
@@ -140,5 +142,30 @@ public static void ReplaceBytesAt(List<byte> original, byte[] toInject, int inde
140142
original[index + i] = toInject[i];
141143
};
142144
}
145+
146+
147+
148+
/// <summary>
149+
/// Resolves what XivDataFile a file lives in based upon its internal FFXIV directory path.
150+
/// </summary>
151+
/// <param name="path"></param>
152+
/// <returns></returns>
153+
public static XivDataFile GetDataFileFromPath(string path)
154+
{
155+
var files = Enum.GetValues(typeof(XivDataFile));
156+
foreach (var f in files)
157+
{
158+
var file = (XivDataFile)f;
159+
var prefix = file.GetFolderKey();
160+
161+
var match = Regex.Match(path, "^" + prefix);
162+
if (match.Success)
163+
{
164+
return file;
165+
}
166+
}
167+
168+
throw new Exception("Could not resolve data file - Invalid internal FFXIV path.");
169+
}
143170
}
144171
}

xivModdingFramework/Items/Categories/Character.cs

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,24 @@ public Task<List<XivCharacter>> GetCharacterList()
5353
var characterList = new List<XivCharacter>
5454
{
5555
new XivCharacter
56-
{Name = XivStrings.Body, Category = XivStrings.Character, ItemCategory = XivStrings.Body},
56+
{Name = XivStrings.Body, PrimaryCategory = XivStrings.Character, SecondaryCategory = XivStrings.Body},
5757
new XivCharacter
58-
{Name = XivStrings.Face, Category = XivStrings.Character, ItemCategory = XivStrings.Face},
58+
{Name = XivStrings.Face, PrimaryCategory = XivStrings.Character, SecondaryCategory = XivStrings.Face},
5959
new XivCharacter
60-
{Name = XivStrings.Hair, Category = XivStrings.Character, ItemCategory = XivStrings.Hair},
60+
{Name = XivStrings.Hair, PrimaryCategory = XivStrings.Character, SecondaryCategory = XivStrings.Hair},
6161
new XivCharacter
62-
{Name = XivStrings.Tail, Category = XivStrings.Character, ItemCategory = XivStrings.Tail},
62+
{Name = XivStrings.Tail, PrimaryCategory = XivStrings.Character, SecondaryCategory = XivStrings.Tail},
6363
new XivCharacter
64-
{Name = XivStrings.Ears, Category = XivStrings.Character, ItemCategory = XivStrings.Ears},
64+
{Name = XivStrings.Ears, PrimaryCategory = XivStrings.Character, SecondaryCategory = XivStrings.Ears},
6565
new XivCharacter
6666
{
67-
Name = XivStrings.Face_Paint, Category = XivStrings.Character,
68-
ItemCategory = XivStrings.Face_Paint
67+
Name = XivStrings.Face_Paint, PrimaryCategory = XivStrings.Character,
68+
SecondaryCategory = XivStrings.Face_Paint
6969
},
7070
new XivCharacter
7171
{
72-
Name = XivStrings.Equipment_Decals, Category = XivStrings.Character,
73-
ItemCategory = XivStrings.Equipment_Decals
72+
Name = XivStrings.Equipment_Decals, PrimaryCategory = XivStrings.Character,
73+
SecondaryCategory = XivStrings.Equipment_Decals
7474
}
7575
};
7676

@@ -96,15 +96,15 @@ public async Task<Dictionary<XivRace, int[]>> GetRacesAndNumbersForTextures(XivC
9696

9797
var folder = "";
9898

99-
if (charaItem.ItemCategory == XivStrings.Hair)
99+
if (charaItem.SecondaryCategory == XivStrings.Hair)
100100
{
101101
folder = XivStrings.HairMtrlFolder;
102102
}
103-
else if (charaItem.ItemCategory == XivStrings.Face)
103+
else if (charaItem.SecondaryCategory == XivStrings.Face)
104104
{
105105
folder = XivStrings.FaceMtrlFolder;
106106
}
107-
else if (charaItem.ItemCategory == XivStrings.Body)
107+
else if (charaItem.SecondaryCategory == XivStrings.Body)
108108
{
109109
if (_language != XivLanguage.Korean )
110110
{
@@ -116,7 +116,7 @@ public async Task<Dictionary<XivRace, int[]>> GetRacesAndNumbersForTextures(XivC
116116
}
117117

118118
}
119-
else if (charaItem.ItemCategory == XivStrings.Tail)
119+
else if (charaItem.SecondaryCategory == XivStrings.Tail)
120120
{
121121
if (_language != XivLanguage.Korean )
122122
{
@@ -127,7 +127,7 @@ public async Task<Dictionary<XivRace, int[]>> GetRacesAndNumbersForTextures(XivC
127127
folder = XivStrings.TailMtrlFolderOld;
128128
}
129129
}
130-
else if (charaItem.ItemCategory == XivStrings.Ears)
130+
else if (charaItem.SecondaryCategory == XivStrings.Ears)
131131
{
132132
folder = XivStrings.EarsMtrlFolder;
133133
}
@@ -173,23 +173,23 @@ public async Task<Dictionary<XivRace, int[]>> GetRacesAndNumbersForModels(XivCha
173173

174174
var folder = "";
175175

176-
if (charaItem.ItemCategory == XivStrings.Hair)
176+
if (charaItem.SecondaryCategory == XivStrings.Hair)
177177
{
178178
folder = XivStrings.HairMDLFolder;
179179
}
180-
else if (charaItem.ItemCategory == XivStrings.Face)
180+
else if (charaItem.SecondaryCategory == XivStrings.Face)
181181
{
182182
folder = XivStrings.FaceMDLFolder;
183183
}
184-
else if (charaItem.ItemCategory == XivStrings.Body)
184+
else if (charaItem.SecondaryCategory == XivStrings.Body)
185185
{
186186
folder = XivStrings.BodyMDLFolder;
187187
}
188-
else if (charaItem.ItemCategory == XivStrings.Tail)
188+
else if (charaItem.SecondaryCategory == XivStrings.Tail)
189189
{
190190
folder = XivStrings.TailMDLFolder;
191191
}
192-
else if (charaItem.ItemCategory == XivStrings.Ears)
192+
else if (charaItem.SecondaryCategory == XivStrings.Ears)
193193
{
194194
folder = XivStrings.EarsMDLFolder;
195195
}
@@ -234,22 +234,22 @@ public async Task<Dictionary<string, char[]>> GetTypePartForTextures(XivCharacte
234234
var file = "";
235235
var typeDict = HairSlotAbbreviationDictionary;
236236

237-
var parts = new[] { 'a', 'b', 'c', 'd', 'e', 'f' };
237+
var parts = Constants.Alphabet;
238238

239-
if (charaItem.ItemCategory == XivStrings.Hair)
239+
if (charaItem.SecondaryCategory == XivStrings.Hair)
240240
{
241241
folder = string.Format(XivStrings.HairMtrlFolder, race.GetRaceCode(),
242242
num.ToString().PadLeft(4, '0'));
243243
file = XivStrings.HairMtrlFile;
244244
}
245-
else if (charaItem.ItemCategory == XivStrings.Face)
245+
else if (charaItem.SecondaryCategory == XivStrings.Face)
246246
{
247247
folder = string.Format(XivStrings.FaceMtrlFolder, race.GetRaceCode(),
248248
num.ToString().PadLeft(4, '0'));
249249
typeDict = FaceSlotAbbreviationDictionary;
250250
file = XivStrings.FaceMtrlFile;
251251
}
252-
else if (charaItem.ItemCategory == XivStrings.Ears)
252+
else if (charaItem.SecondaryCategory == XivStrings.Ears)
253253
{
254254
folder = string.Format(XivStrings.EarsMtrlFolder, race.GetRaceCode(),
255255
num.ToString().PadLeft(4, '0'));
@@ -299,9 +299,9 @@ public async Task<char[]> GetPartForTextures(XivCharacter charaItem, XivRace rac
299299
var folder = "";
300300
var file = "";
301301

302-
var parts = new[] { 'a', 'b', 'c', 'd', 'e', 'f' };
302+
var parts = Constants.Alphabet;
303303

304-
if (charaItem.ItemCategory == XivStrings.Body)
304+
if (charaItem.SecondaryCategory == XivStrings.Body)
305305
{
306306
if (_language != XivLanguage.Korean )
307307
{
@@ -313,7 +313,7 @@ public async Task<char[]> GetPartForTextures(XivCharacter charaItem, XivRace rac
313313
}
314314
file = XivStrings.BodyMtrlFile;
315315
}
316-
else if (charaItem.ItemCategory == XivStrings.Tail)
316+
else if (charaItem.SecondaryCategory == XivStrings.Tail)
317317
{
318318
if (_language != XivLanguage.Korean )
319319
{
@@ -325,7 +325,7 @@ public async Task<char[]> GetPartForTextures(XivCharacter charaItem, XivRace rac
325325
}
326326
file = XivStrings.TailMtrlFile;
327327
}
328-
else if (charaItem.ItemCategory == XivStrings.Ears)
328+
else if (charaItem.SecondaryCategory == XivStrings.Ears)
329329
{
330330
folder = string.Format(XivStrings.EarsMtrlFolder, race.GetRaceCode(), num.ToString().PadLeft(4, '0'));
331331

@@ -344,7 +344,7 @@ public async Task<List<int>> GetVariantsForTextures(XivCharacter charaItem, XivR
344344
{
345345
var variantList = new List<int>();
346346

347-
if (charaItem.ItemCategory == XivStrings.Body)
347+
if (charaItem.SecondaryCategory == XivStrings.Body)
348348
{
349349
if (_language != XivLanguage.Korean )
350350
{
@@ -365,7 +365,7 @@ public async Task<List<int>> GetVariantsForTextures(XivCharacter charaItem, XivR
365365
}
366366
}
367367

368-
if (charaItem.ItemCategory == XivStrings.Tail)
368+
if (charaItem.SecondaryCategory == XivStrings.Tail)
369369
{
370370
if (_language != XivLanguage.Korean )
371371
{
@@ -402,35 +402,35 @@ public async Task<List<string>> GetTypeForModels(XivCharacter charaItem, XivRace
402402
var file = "";
403403
var typeDict = HairSlotAbbreviationDictionary;
404404

405-
if (charaItem.ItemCategory == XivStrings.Body)
405+
if (charaItem.SecondaryCategory == XivStrings.Body)
406406
{
407407
folder = string.Format(XivStrings.BodyMDLFolder, race.GetRaceCode(),
408408
num.ToString().PadLeft(4, '0'));
409409
typeDict = BodySlotAbbreviationDictionary;
410410
file = XivStrings.BodyMDLFile;
411411
}
412-
else if (charaItem.ItemCategory == XivStrings.Hair)
412+
else if (charaItem.SecondaryCategory == XivStrings.Hair)
413413
{
414414
folder = string.Format(XivStrings.HairMDLFolder, race.GetRaceCode(),
415415
num.ToString().PadLeft(4, '0'));
416416
typeDict = HairSlotAbbreviationDictionary;
417417
file = XivStrings.HairMDLFile;
418418
}
419-
else if (charaItem.ItemCategory == XivStrings.Face)
419+
else if (charaItem.SecondaryCategory == XivStrings.Face)
420420
{
421421
folder = string.Format(XivStrings.FaceMDLFolder, race.GetRaceCode(),
422422
num.ToString().PadLeft(4, '0'));
423423
typeDict = FaceSlotAbbreviationDictionary;
424424
file = XivStrings.FaceMDLFile;
425425
}
426-
else if (charaItem.ItemCategory == XivStrings.Tail)
426+
else if (charaItem.SecondaryCategory == XivStrings.Tail)
427427
{
428428
folder = string.Format(XivStrings.TailMDLFolder, race.GetRaceCode(),
429429
num.ToString().PadLeft(4, '0'));
430430
typeDict = TailSlotAbbreviationDictionary;
431431
file = XivStrings.TailMDLFile;
432432
}
433-
else if (charaItem.ItemCategory == XivStrings.Ears)
433+
else if (charaItem.SecondaryCategory == XivStrings.Ears)
434434
{
435435
folder = string.Format(XivStrings.EarsMDLFolder, race.GetRaceCode(),
436436
num.ToString().PadLeft(4, '0'));
@@ -460,7 +460,7 @@ public async Task<int[]> GetDecalNums(IItem item)
460460
var decalList = new List<int>();
461461
List<int> fileList;
462462

463-
if (item.ItemCategory.Equals(XivStrings.Face_Paint))
463+
if (item.SecondaryCategory.Equals(XivStrings.Face_Paint))
464464
{
465465
fileList = await _index.GetAllHashedFilesInFolder(HashGenerator.GetHash(XivStrings.FacePaintFolder),
466466
XivDataFile._04_Chara);

0 commit comments

Comments
 (0)