Skip to content

Commit a4f0f7c

Browse files
committed
Introduction of shared items view.
1 parent e8a43bc commit a4f0f7c

File tree

3 files changed

+155
-82
lines changed

3 files changed

+155
-82
lines changed

xivModdingFramework/Items/Categories/Gear.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
using xivModdingFramework.Helpers;
2828
using xivModdingFramework.Items.DataContainers;
2929
using xivModdingFramework.Items.Enums;
30+
using xivModdingFramework.Items.Interfaces;
3031
using xivModdingFramework.Resources;
3132
using xivModdingFramework.SqPack.FileTypes;
3233
using xivModdingFramework.Textures.DataContainers;
@@ -663,6 +664,55 @@ public async Task<List<TexTypePath>> GetIconInfo(XivGear gearItem)
663664

664665
return ttpList;
665666
}
667+
public async Task<List<IItemModel>> GetSameVariantList(IItemModel item)
668+
{
669+
var sameModelItems = new List<IItemModel>();
670+
if (!item.PrimaryCategory.Equals(XivStrings.Gear))
671+
672+
{
673+
sameModelItems.Add((IItemModel)item.Clone());
674+
return sameModelItems;
675+
}
676+
sameModelItems = await GetSameModelList(item);
677+
678+
var imc = new Imc(_gameDirectory, XivDataFile._04_Chara);
679+
var originalInfo = await imc.GetImcInfo(item);
680+
681+
var sameMaterialItems = new List<IItemModel>();
682+
foreach (var i in sameModelItems)
683+
{
684+
var info = await imc.GetImcInfo(i);
685+
if (info.Variant == originalInfo.Variant)
686+
{
687+
sameMaterialItems.Add(i);
688+
}
689+
}
690+
691+
return sameMaterialItems;
692+
}
693+
694+
public async Task<List<IItemModel>> GetSameModelList(IItemModel item)
695+
{
696+
var sameModelItems = new List<IItemModel>();
697+
698+
//gear
699+
if (item.PrimaryCategory.Equals(XivStrings.Gear))
700+
{
701+
sameModelItems.AddRange(
702+
(await GetGearList())
703+
.Where(it =>
704+
it.ModelInfo.PrimaryID == item.ModelInfo.PrimaryID
705+
&& it.SecondaryCategory == item.SecondaryCategory).Select(it => it as IItemModel).ToList()
706+
);
707+
}
708+
else
709+
{
710+
//character
711+
sameModelItems.Add((IItemModel)item.Clone());
712+
}
713+
return sameModelItems;
714+
}
715+
666716

667717
// A dictionary containg <Slot ID, Gear Category>
668718
private readonly Dictionary<int, string> _slotNameDictionary = new Dictionary<int, string>

xivModdingFramework/Items/ItemType.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,13 @@ public static XivItemType GetPrimaryItemType(this IItem item)
8080
}
8181
else if (item.PrimaryCategory.Equals(XivStrings.Housing))
8282
{
83-
itemType = XivItemType.furniture;
83+
if(item.SecondaryCategory.Equals(XivStrings.Paintings))
84+
{
85+
itemType = XivItemType.ui;
86+
} else
87+
{
88+
itemType = XivItemType.furniture;
89+
}
8490
} else if(item.SecondaryCategory.Equals(XivStrings.Equipment_Decals) || item.SecondaryCategory.Equals(XivStrings.Face_Paint))
8591
{
8692
itemType = XivItemType.decal;
@@ -116,6 +122,10 @@ public static XivItemType GetSecondaryItemType(this IItem item)
116122
{
117123
itemType = XivItemType.tail;
118124
}
125+
else if (item.SecondaryCategory.Equals(XivStrings.Hair))
126+
{
127+
itemType = XivItemType.hair;
128+
}
119129
else if (item.PrimaryCategory.Equals(XivStrings.Character) && item.SecondaryCategory.Equals( XivStrings.Ears ))
120130
{
121131
itemType = XivItemType.ear;

xivModdingFramework/Variants/FileTypes/Imc.cs

Lines changed: 94 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,17 @@ await Task.Run(() =>
167167
/// <param name="item"></param>
168168
/// <param name="modelInfo"></param>
169169
/// <returns>The ImcData data</returns>
170-
public async Task<ImcData> GetFullImcInfo(IItemModel item, XivModelInfo modelInfo)
170+
public async Task<FullImcInfo> GetFullImcInfo(IItemModel item, XivModelInfo modelInfo = null)
171171
{
172+
if(modelInfo == null)
173+
{
174+
modelInfo = item.ModelInfo;
175+
}
176+
if(modelInfo == null)
177+
{
178+
throw new NotSupportedException("Attempted to get IMC info for invalid item.");
179+
}
180+
172181
var index = new Index(_gameDirectory);
173182
var dat = new Dat(_gameDirectory);
174183

@@ -188,67 +197,66 @@ public async Task<ImcData> GetFullImcInfo(IItemModel item, XivModelInfo modelInf
188197
{
189198
using (var br = new BinaryReader(new MemoryStream(imcByteData)))
190199
{
191-
var imcData = new ImcData()
200+
var subsetCount = br.ReadInt16();
201+
var imcData = new FullImcInfo()
192202
{
193-
VariantCount = br.ReadInt16(),
194203
Unknown = br.ReadInt16(),
195-
GearVariantList = new List<VariantSet>()
204+
DefaultSubset = new List<XivImc>(),
205+
SubsetList = new List<List<XivImc>>(subsetCount)
196206
};
197207

198208
//weapons and monsters do not have variant sets
199209
if (itemType == XivItemType.weapon || itemType == XivItemType.monster)
200210
{
201-
imcData.OtherVariantList = new List<XivImc>();
202211

203-
imcData.DefaultVariant = new XivImc
212+
imcData.DefaultSubset.Add(new XivImc
204213
{
205214
Variant = br.ReadUInt16(),
206215
Mask = br.ReadUInt16(),
207216
Vfx = br.ReadUInt16()
208-
};
217+
});
209218

210-
for (var i = 0; i < imcData.VariantCount; i++)
219+
for (var i = 0; i < subsetCount; i++)
211220
{
212-
imcData.OtherVariantList.Add(new XivImc
213-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()});
221+
var subset = new List<XivImc>() {
222+
new XivImc {Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()}
223+
};
214224
}
215225
}
216226
else
217227
{
218-
imcData.GearVariantList = new List<VariantSet>();
219-
220-
imcData.DefaultVariantSet = new VariantSet
228+
imcData.DefaultSubset = new List<XivImc>()
221229
{
222-
Slot1 = new XivImc
230+
new XivImc
223231
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
224-
Slot2 = new XivImc
232+
new XivImc
225233
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
226-
Slot3 = new XivImc
234+
new XivImc
227235
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
228-
Slot4 = new XivImc
236+
new XivImc
229237
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
230-
Slot5 = new XivImc
238+
new XivImc
231239
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
232240
};
233241

234-
for (var i = 0; i < imcData.VariantCount; i++)
242+
for (var i = 0; i < subsetCount; i++)
235243
{
236244
// gets the data for each slot in the current variant set
237-
var imcGear = new VariantSet
245+
var imcGear = new List<XivImc>()
238246
{
239-
Slot1 = new XivImc
247+
new XivImc
240248
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
241-
Slot2 = new XivImc
249+
new XivImc
242250
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
243-
Slot3 = new XivImc
251+
new XivImc
244252
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
245-
Slot4 = new XivImc
253+
new XivImc
246254
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
247-
Slot5 = new XivImc
255+
new XivImc
248256
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
249257
};
250258

251-
imcData.GearVariantList.Add(imcGear);
259+
imcData.SubsetList.Add(imcGear);
252260
}
253261
}
254262

@@ -305,7 +313,7 @@ private static (string Folder, string File) GetImcPath(XivModelInfo modelInfo, X
305313
/// <summary>
306314
/// A dictionary containing slot offset data in format [Slot Name, Offset within variant set]
307315
/// </summary>
308-
private readonly Dictionary<string, int> _slotOffsetDictionary = new Dictionary<string, int>
316+
private static readonly Dictionary<string, int> _slotOffsetDictionary = new Dictionary<string, int>
309317
{
310318
{XivStrings.Main_Hand, 0},
311319
{XivStrings.Off_Hand, 0},
@@ -338,83 +346,88 @@ private static (string Folder, string File) GetImcPath(XivModelInfo modelInfo, X
338346
/// <summary>
339347
/// Class containing the information for and IMC file
340348
/// </summary>
341-
public class ImcData
349+
public class FullImcInfo
342350
{
343351
/// <summary>
344-
/// The amount of Variants contained in the IMC file
352+
/// Get the number of subsets.
353+
/// -NOT- the same as number of material variants.
345354
/// </summary>
346-
public int VariantCount { get; set; }
347-
348-
/// <summary>
349-
/// Unknown Value
350-
/// </summary>
351-
public int Unknown { get; set; }
355+
public int SubsetCount { get
356+
{
357+
return SubsetList.Count;
358+
}
359+
set {
360+
throw new NotSupportedException("Attempted to directly set SubsetCount.");
361+
}
362+
}
352363

353364
/// <summary>
354-
/// Variant List for Gear which contains variant sets
365+
/// Get the size of each subset (Either 1 or 5)
355366
/// </summary>
356-
public List<VariantSet> GearVariantList { get; set; }
367+
public int SubsetSize
368+
{
369+
get
370+
{
371+
return DefaultSubset.Count;
372+
}
373+
set
374+
{
375+
throw new NotSupportedException("Attempted to directly set SubsetSize.");
376+
}
377+
}
357378

358379
/// <summary>
359-
/// Variant List for other items that do not contain varian sets
380+
/// Unknown Value
360381
/// </summary>
361-
public List<XivImc> OtherVariantList { get; set; }
382+
public int Unknown { get; set; }
362383

363384
/// <summary>
364-
/// The default variant for the item, always the variant immediatly following the header
385+
/// Total # of Gear Subsets.
386+
/// NOT the same as number of material variants.
387+
/// IItemModel->ImcSubsetID can be used as an index accessory in this list.
365388
/// </summary>
366-
public XivImc DefaultVariant { get; set; }
389+
public List<List<XivImc>> SubsetList { get; set; }
367390

368391
/// <summary>
369392
/// The default variant set for the item, always the variant immediatly following the header
370393
/// </summary>
371-
public VariantSet DefaultVariantSet { get; set; }
372-
}
394+
public List<XivImc> DefaultSubset { get; set; }
373395

374-
/// <summary>
375-
/// A class that contains the information for a variant set
376-
/// </summary>
377-
public class VariantSet
378-
{
379-
/// <summary>
380-
/// Slot 1 of the variant set
381-
/// </summary>
382-
/// <remarks>
383-
/// Head for Gear, Ears for Accessories
384-
/// </remarks>
385-
public XivImc Slot1 { get; set; }
386396

387397
/// <summary>
388-
/// Slot 2 of the variant set
398+
/// Retrieve a given IMC info. Negative values retrieve the default set.
389399
/// </summary>
390-
/// <remarks>
391-
/// Body for Gear, Neck for Accessories
392-
/// </remarks>
393-
public XivImc Slot2 { get; set; }
400+
/// <param name="index"></param>
401+
/// <param name="slot"></param>
402+
/// <returns></returns>
403+
public XivImc GetImcInfo(int subsetID = -1, string fullSlotName = "")
404+
{
405+
// Variant IDs are 1 based, not 0 based.
406+
var index = subsetID - 1;
394407

395-
/// <summary>
396-
/// Slot 3 of the variant set
397-
/// </summary>
398-
/// <remarks>
399-
/// Hands for Gear, Wrists for Accessories
400-
/// </remarks>
401-
public XivImc Slot3 { get; set; }
408+
// Invalid Index, return default.
409+
if (index >= SubsetCount)
410+
{
411+
index = -1;
412+
}
402413

403-
/// <summary>
404-
/// Slot 4 of the variant set
405-
/// </summary>
406-
/// <remarks>
407-
/// Legs for Gear, Left Ring for Accessories
408-
/// </remarks>
409-
public XivImc Slot4 { get; set; }
414+
// Test for getting default set.
415+
var subset = DefaultSubset;
416+
if(index > 0)
417+
{
418+
subset = SubsetList[index];
419+
}
410420

411-
/// <summary>
412-
/// Slot 5 of the variant set
413-
/// </summary>
414-
/// <remarks>
415-
/// Feet for Gear, Right Ring for Accessories
416-
/// </remarks>
417-
public XivImc Slot5 { get; set; }
421+
// Get which offset the slot uses.
422+
var idx = 0;
423+
if(_slotOffsetDictionary.ContainsKey(fullSlotName))
424+
{
425+
idx = _slotOffsetDictionary[fullSlotName];
426+
}
427+
428+
return subset[idx];
429+
}
418430
}
431+
419432
}
420433
}

0 commit comments

Comments
 (0)