Skip to content

Commit 27b64e8

Browse files
authored
Merge pull request #26 from goaaats/lumina
WIP - Add support for Lumina saving to all write and copy operations
2 parents 3aa91df + 8eeb85c commit 27b64e8

File tree

22 files changed

+270
-139
lines changed

22 files changed

+270
-139
lines changed

xivModdingFramework/Cache/XivCache.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
using xivModdingFramework.Resources;
1919
using xivModdingFramework.SqPack.FileTypes;
2020

21+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
22+
2123
namespace xivModdingFramework.Cache
2224
{
2325

xivModdingFramework/Cache/XivDependencyGraph.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
using xivModdingFramework.Variants.FileTypes;
2727
using static xivModdingFramework.Cache.XivCache;
2828

29+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
30+
2931
namespace xivModdingFramework.Cache
3032
{
3133

xivModdingFramework/Exd/FileTypes/Ex.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
using xivModdingFramework.Helpers;
2424
using xivModdingFramework.SqPack.FileTypes;
2525

26+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
27+
2628
namespace xivModdingFramework.Exd.FileTypes
2729
{
2830
/// <summary>

xivModdingFramework/General/CMP.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,26 @@ public static class CMP
3535
/// <param name="index"></param>
3636
/// <param name="modlist"></param>
3737
/// <returns></returns>
38-
internal static async Task ApplyRgspFile(string filePath, IndexFile index = null, ModList modlist = null)
38+
internal static async Task ApplyRgspFile(string filePath, IndexFile index = null, ModList modlist = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
3939
{
4040
var _dat = new Dat(XivCache.GameInfo.GameDirectory);
4141
var rgspData = await _dat.GetType2Data(filePath, false, index, modlist);
4242

43-
var rgsp = new RacialGenderScalingParameter(rgspData);
43+
await ApplyRgspFile(rgspData, doLumina: doLumina, luminaOutDir: luminaOutDir);
44+
}
45+
46+
/// <summary>
47+
/// Applies a custom .rgsp file to the main Human.CMP file.
48+
/// </summary>
49+
/// <param name="data"></param>
50+
/// <param name="index"></param>
51+
/// <param name="modlist"></param>
52+
/// <returns></returns>
53+
internal static async Task ApplyRgspFile(byte[] data, IndexFile index = null, ModList modlist = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
54+
{
55+
var rgsp = new RacialGenderScalingParameter(data);
4456

45-
await SetScalingParameter(rgsp, index, modlist);
57+
await SetScalingParameter(rgsp, index, modlist, doLumina, luminaOutDir);
4658
}
4759

4860
/// <summary>
@@ -155,11 +167,11 @@ public static async Task<RacialGenderScalingParameter> GetScalingParameter(XivS
155167
/// <param name="index"></param>
156168
/// <param name="modlist"></param>
157169
/// <returns></returns>
158-
private static async Task SetScalingParameter(RacialGenderScalingParameter data, IndexFile index = null, ModList modlist = null)
170+
private static async Task SetScalingParameter(RacialGenderScalingParameter data, IndexFile index = null, ModList modlist = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
159171
{
160172
var cmp = await GetCharaMakeParameterSet(false, index, modlist);
161173
cmp.SetScalingParameter(data);
162-
await SaveCharaMakeParameterSet(cmp, index, modlist);
174+
await SaveCharaMakeParameterSet(cmp, index, modlist, doLumina, luminaOutDir);
163175
}
164176

165177
private static async Task<CharaMakeParameterSet> GetCharaMakeParameterSet(bool forceOriginal = false, IndexFile index = null, ModList modlist = null)
@@ -173,14 +185,14 @@ private static async Task<CharaMakeParameterSet> GetCharaMakeParameterSet(bool f
173185
return cmp;
174186
}
175187

176-
private static async Task SaveCharaMakeParameterSet(CharaMakeParameterSet cmp, IndexFile index = null, ModList modlist = null)
188+
private static async Task SaveCharaMakeParameterSet(CharaMakeParameterSet cmp, IndexFile index = null, ModList modlist = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
177189
{
178190
var _dat = new Dat(XivCache.GameInfo.GameDirectory);
179191
var dummyItem = new XivGenericItemModel();
180192
dummyItem.Name = "human.cmp";
181193
dummyItem.SecondaryCategory = Constants.InternalModSourceName;
182194

183-
await _dat.ImportType2Data(cmp.GetBytes(), HumanCmpPath, Constants.InternalModSourceName, dummyItem, index, modlist);
195+
await _dat.ImportType2Data(cmp.GetBytes(), HumanCmpPath, Constants.InternalModSourceName, dummyItem, index, modlist, doLumina, luminaOutDir);
184196
}
185197

186198
}

xivModdingFramework/HUD/FileTypes/Uld.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
using xivModdingFramework.Helpers;
2626
using xivModdingFramework.SqPack.FileTypes;
2727

28+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
29+
2830
namespace xivModdingFramework.HUD.FileTypes
2931
{
3032
/// <summary>

xivModdingFramework/Helpers/ProblemChecker.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
using xivModdingFramework.Resources;
2626
using xivModdingFramework.Cache;
2727

28+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
29+
2830
namespace xivModdingFramework.Helpers
2931
{
3032
public class ProblemChecker

xivModdingFramework/Items/Categories/Gear.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
using xivModdingFramework.Textures.Enums;
3737
using xivModdingFramework.Variants.FileTypes;
3838

39+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
40+
3941
namespace xivModdingFramework.Items.Categories
4042
{
4143
/// <summary>

xivModdingFramework/Items/Categories/Housing.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
using xivModdingFramework.Resources;
3434
using xivModdingFramework.SqPack.FileTypes;
3535

36+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
37+
3638
namespace xivModdingFramework.Items.Categories
3739
{
3840
public class Housing

xivModdingFramework/Materials/FileTypes/Mtrl.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
using xivModdingFramework.Textures.FileTypes;
3939
using xivModdingFramework.Variants.FileTypes;
4040

41+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
42+
4143
namespace xivModdingFramework.Materials.FileTypes
4244
{
4345
/// <summary>
@@ -687,15 +689,15 @@ public void SaveColorSetExtraData(IItem item, XivMtrl xivMtrl, DirectoryInfo sav
687689
/// <param name="item">The item whos mtrl is being imported</param>
688690
/// <param name="source">The source/application that is writing to the dat.</param>
689691
/// <returns>The new offset</returns>
690-
public async Task<long> ImportMtrl(XivMtrl xivMtrl, IItem item, string source, IndexFile cachedIndexFile = null, ModList cachedModList = null)
692+
public async Task<long> ImportMtrl(XivMtrl xivMtrl, IItem item, string source, IndexFile cachedIndexFile = null, ModList cachedModList = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
691693
{
692694
try
693695
{
694696
var mtrlBytes = CreateMtrlFile(xivMtrl, item);
695697
var dat = new Dat(_gameDirectory);
696698

697699
// Create the actual raw MTRL first. - Files should always be created top down.
698-
long offset = await dat.ImportType2Data(mtrlBytes.ToArray(), xivMtrl.MTRLPath, source, item, cachedIndexFile, cachedModList);
700+
long offset = await dat.ImportType2Data(mtrlBytes.ToArray(), xivMtrl.MTRLPath, source, item, cachedIndexFile, cachedModList, doLumina, luminaOutDir);
699701

700702
// The MTRL file is now ready to go, but we need to validate the texture paths and create them if needed.
701703
var mapInfoList = xivMtrl.GetAllMapInfos(false);
@@ -714,7 +716,7 @@ public async Task<long> ImportMtrl(XivMtrl xivMtrl, IItem item, string source, I
714716
exists = await _index.FileExists(mapInfo.Path, IOUtil.GetDataFileFromPath(path));
715717
}
716718

717-
if(exists)
719+
if(exists && !doLumina)
718720
{
719721
continue;
720722
}
@@ -730,7 +732,7 @@ public async Task<long> ImportMtrl(XivMtrl xivMtrl, IItem item, string source, I
730732

731733
var di = Tex.GetDefaultTexturePath(mapInfo.Usage);
732734

733-
var newOffset = await _tex.ImportTex(xivTex.TextureTypeAndPath.Path, di.FullName, item, source, cachedIndexFile, cachedModList);
735+
var newOffset = await _tex.ImportTex(xivTex.TextureTypeAndPath.Path, di.FullName, item, source, cachedIndexFile, cachedModList, doLumina, luminaOutDir);
734736

735737
}
736738

xivModdingFramework/Models/FileTypes/Eqp.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
using xivModdingFramework.SqPack.DataContainers;
1818
using xivModdingFramework.SqPack.FileTypes;
1919

20+
using Index = xivModdingFramework.SqPack.FileTypes.Index;
21+
2022
namespace xivModdingFramework.Models.FileTypes
2123
{
2224
public class Eqp
@@ -167,7 +169,7 @@ public async Task SaveGmpEntries(List<(uint PrimaryId, GimmickParameter GmpData)
167169

168170
}
169171

170-
public async Task SaveGimmickParameter(int equipmentId, GimmickParameter param, IItem referenceItem = null, IndexFile cachedIndexFile = null, ModList cachedModList = null)
172+
public async Task SaveGimmickParameter(int equipmentId, GimmickParameter param, IItem referenceItem = null, IndexFile cachedIndexFile = null, ModList cachedModList = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
171173
{
172174
if (equipmentId == 0)
173175
{
@@ -193,7 +195,7 @@ public async Task SaveGimmickParameter(int equipmentId, GimmickParameter param,
193195

194196
IOUtil.ReplaceBytesAt(data, param.GetBytes(), offset);
195197

196-
await SaveGimmickParameterFile(data, referenceItem, cachedIndexFile, cachedModList);
198+
await SaveGimmickParameterFile(data, referenceItem, cachedIndexFile, cachedModList, doLumina, luminaOutDir);
197199
}
198200

199201
public async Task<GimmickParameter> GetGimmickParameter(IItem item, bool forceDefault = false)
@@ -249,9 +251,9 @@ public async Task<GimmickParameter> GetGimmickParameter(int equipmentId, bool fo
249251
return param;
250252
}
251253

252-
private async Task SaveGimmickParameterFile(byte[] bytes, IItem referenceItem = null, IndexFile cachedIndexFile = null, ModList cachedModList = null)
254+
private async Task SaveGimmickParameterFile(byte[] bytes, IItem referenceItem = null, IndexFile cachedIndexFile = null, ModList cachedModList = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
253255
{
254-
await _dat.ImportType2Data(bytes, GimmickParameterFile, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList);
256+
await _dat.ImportType2Data(bytes, GimmickParameterFile, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList, doLumina, luminaOutDir);
255257
}
256258
private async Task<byte[]> LoadGimmickParameterFile(bool forceDefault = false)
257259
{
@@ -332,7 +334,7 @@ public async Task SaveEqpEntries(List<(uint PrimaryId, EquipmentParameter EqpDat
332334
/// <param name="equipmentId"></param>
333335
/// <param name="data"></param>
334336
/// <returns></returns>
335-
public async Task SaveEqpEntry(int equipmentId, EquipmentParameter data, IItem referenceItem = null, IndexFile cachedIndexFile = null, ModList cachedModList = null)
337+
public async Task SaveEqpEntry(int equipmentId, EquipmentParameter data, IItem referenceItem = null, IndexFile cachedIndexFile = null, ModList cachedModList = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
336338
{
337339
if (equipmentId < 0)
338340
{
@@ -369,7 +371,7 @@ public async Task SaveEqpEntry(int equipmentId, EquipmentParameter data, IItem r
369371

370372
IOUtil.ReplaceBytesAt(file, bytes, offset);
371373

372-
await _dat.ImportType2Data(file.ToArray(), EquipmentParameterFile, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList);
374+
await _dat.ImportType2Data(file.ToArray(), EquipmentParameterFile, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList, doLumina, luminaOutDir);
373375
}
374376

375377

@@ -676,7 +678,7 @@ private int ResolveEqpEntryOffset(byte[] file, int equipmentId)
676678
/// <param name="cachedIndexFile"></param>
677679
/// <param name="cachedModList"></param>
678680
/// <returns></returns>
679-
public async Task SaveEqdpEntries(Dictionary<XivRace, List<(uint PrimaryId, string Slot, EquipmentDeformationParameter Entry)>> entries, IItem referenceItem, IndexFile cachedIndexFile, ModList cachedModList)
681+
public async Task SaveEqdpEntries(Dictionary<XivRace, List<(uint PrimaryId, string Slot, EquipmentDeformationParameter Entry)>> entries, IItem referenceItem, IndexFile cachedIndexFile, ModList cachedModList, bool doLumina = false, DirectoryInfo luminaOutDir = null)
680682
{
681683
// Group entries into Accessories and Non-Accessories.
682684
var accessories = new Dictionary<XivRace, List<(uint PrimaryId, string Slot, EquipmentDeformationParameter Entry)>>();
@@ -790,7 +792,7 @@ public async Task SaveEqdpEntries(Dictionary<XivRace, List<(uint PrimaryId, stri
790792
data[offset + byteOffset] = byteToModify;
791793
}
792794

793-
await _dat.ImportType2Data(data, fileName, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList);
795+
await _dat.ImportType2Data(data, fileName, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList, doLumina, luminaOutDir);
794796
}
795797

796798
// Loop Accessories
@@ -863,14 +865,14 @@ public async Task SaveEqdpEntries(Dictionary<XivRace, List<(uint PrimaryId, stri
863865

864866
data[offset + byteOffset] = byteToModify;
865867
}
866-
await _dat.ImportType2Data(data, fileName, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList);
868+
await _dat.ImportType2Data(data, fileName, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList, doLumina, luminaOutDir);
867869

868870
}
869871

870872

871873
}
872874

873-
public async Task SaveEqdpEntries(uint primaryId, string slot, Dictionary<XivRace, EquipmentDeformationParameter> parameters, IItem referenceItem = null, IndexFile cachedIndexFile = null, ModList cachedModList = null)
875+
public async Task SaveEqdpEntries(uint primaryId, string slot, Dictionary<XivRace, EquipmentDeformationParameter> parameters, IItem referenceItem = null, IndexFile cachedIndexFile = null, ModList cachedModList = null, bool doLumina = false, DirectoryInfo luminaOutDir = null)
874876
{
875877
var isAccessory = EquipmentDeformationParameterSet.SlotsAsList(true).Contains(slot);
876878

@@ -948,7 +950,7 @@ public async Task SaveEqdpEntries(uint primaryId, string slot, Dictionary<XivRac
948950

949951
data[offset + byteOffset] = byteToModify;
950952

951-
await _dat.ImportType2Data(data, fileName, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList);
953+
await _dat.ImportType2Data(data, fileName, Constants.InternalModSourceName, referenceItem, cachedIndexFile, cachedModList, doLumina, luminaOutDir);
952954
}
953955
}
954956

0 commit comments

Comments
 (0)