Skip to content

Commit 59d1c9d

Browse files
authored
Merge pull request #33 from Lunaretic/master
IMC Fixes
2 parents 7f0bb93 + 6b2a1f4 commit 59d1c9d

File tree

2 files changed

+53
-26
lines changed

2 files changed

+53
-26
lines changed

xivModdingFramework/Variants/DataContainers/XivImc.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using System.Collections.Generic;
2020
using System.Linq;
2121
using xivModdingFramework.Helpers;
22+
using xivModdingFramework.Variants.FileTypes;
2223

2324
namespace xivModdingFramework.Variants.DataContainers
2425
{
@@ -30,7 +31,12 @@ public class XivImc
3031
/// <summary>
3132
/// The Material Set / Variant #
3233
/// </summary>
33-
public ushort Variant { get; set; }
34+
public byte Variant { get; set; }
35+
36+
/// <summary>
37+
/// Unknown byte next to the Variant
38+
/// </summary>
39+
public byte Unknown { get; set; }
3440

3541
/// <summary>
3642
/// The IMC mask data
@@ -54,12 +60,22 @@ public class XivImc
5460
/// Returns the raw bytes that make up this IMC entry.
5561
/// </summary>
5662
/// <returns></returns>
57-
public byte[] GetBytes()
63+
public byte[] GetBytes(ImcType type)
5864
{
5965
var bytes = new List<byte>();
6066
bytes.AddRange(BitConverter.GetBytes(Variant));
6167
bytes.AddRange(BitConverter.GetBytes(Mask));
62-
bytes.AddRange(BitConverter.GetBytes(Vfx));
68+
if (type == ImcType.NonSet)
69+
{
70+
// Always 0 for non-set entries, their VFX number is the
71+
// same as their Material Variant #.
72+
bytes.AddRange(BitConverter.GetBytes(((ushort)0)));
73+
}
74+
else
75+
{
76+
// Actual VFX number.
77+
bytes.AddRange(BitConverter.GetBytes(Vfx));
78+
}
6379
return bytes.ToArray();
6480
}
6581

xivModdingFramework/Variants/FileTypes/Imc.cs

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,15 @@
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 HelixToolkit.SharpDX.Core;
1817
using System;
1918
using System.Collections.Generic;
2019
using System.IO;
2120
using System.Threading.Tasks;
2221
using xivModdingFramework.General.Enums;
23-
using xivModdingFramework.Helpers;
2422
using xivModdingFramework.Items;
2523
using xivModdingFramework.Items.DataContainers;
2624
using xivModdingFramework.Items.Enums;
2725
using xivModdingFramework.Items.Interfaces;
28-
using xivModdingFramework.Models.FileTypes;
29-
using xivModdingFramework.Resources;
3026
using xivModdingFramework.SqPack.FileTypes;
3127
using xivModdingFramework.Variants.DataContainers;
3228

@@ -130,19 +126,35 @@ public async Task<FullImcInfo> GetFullImcInfo(string path)
130126
//weapons and monsters do not have variant sets
131127
if (imcData.TypeIdentifier == ImcType.NonSet)
132128
{
133-
// Identifier used by weapons and monsters.
129+
// This type uses the first short for both Variant and VFX.
130+
byte variant = br.ReadByte();
131+
byte unknown = br.ReadByte();
132+
ushort mask = br.ReadUInt16();
133+
ushort alwaysZero = br.ReadUInt16();
134+
134135
imcData.DefaultSubset.Add(new XivImc
135136
{
136-
Variant = br.ReadUInt16(),
137-
Mask = br.ReadUInt16(),
138-
Vfx = br.ReadUInt16()
137+
Variant = variant,
138+
Unknown = unknown,
139+
Mask = mask,
140+
Vfx = variant
139141
});
140142

141143
for (var i = 0; i < subsetCount; i++)
142144
{
143-
var subset = new List<XivImc>() {
144-
new XivImc {Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()}
145+
variant = br.ReadByte();
146+
unknown = br.ReadByte();
147+
mask = br.ReadUInt16();
148+
alwaysZero = br.ReadUInt16();
149+
150+
var newEntry = new XivImc
151+
{
152+
Variant = variant,
153+
Unknown = unknown,
154+
Mask = mask,
155+
Vfx = variant
145156
};
157+
var subset = new List<XivImc>() { newEntry };
146158
}
147159
}
148160
else if(imcData.TypeIdentifier == ImcType.Set)
@@ -151,15 +163,15 @@ public async Task<FullImcInfo> GetFullImcInfo(string path)
151163
imcData.DefaultSubset = new List<XivImc>()
152164
{
153165
new XivImc
154-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
166+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
155167
new XivImc
156-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
168+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
157169
new XivImc
158-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
170+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
159171
new XivImc
160-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
172+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
161173
new XivImc
162-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
174+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
163175
};
164176

165177
for (var i = 0; i < subsetCount; i++)
@@ -168,17 +180,16 @@ public async Task<FullImcInfo> GetFullImcInfo(string path)
168180
var imcGear = new List<XivImc>()
169181
{
170182
new XivImc
171-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
183+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
172184
new XivImc
173-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
185+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
174186
new XivImc
175-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
187+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
176188
new XivImc
177-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
189+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
178190
new XivImc
179-
{Variant = br.ReadUInt16(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
191+
{Variant = br.ReadByte(), Unknown = br.ReadByte(), Mask = br.ReadUInt16(), Vfx = br.ReadUInt16()},
180192
};
181-
182193
imcData.SubsetList.Add(imcGear);
183194
}
184195
} else
@@ -252,14 +263,14 @@ public async Task SaveFullImcInfo(FullImcInfo info, string path, string itemName
252263
// The rest of this is easy, it's literally just post all the sets in order.
253264
foreach(var entry in info.DefaultSubset)
254265
{
255-
data.AddRange(entry.GetBytes());
266+
data.AddRange(entry.GetBytes(info.TypeIdentifier));
256267
}
257268

258269
foreach(var set in info.SubsetList)
259270
{
260271
foreach (var entry in set)
261272
{
262-
data.AddRange(entry.GetBytes());
273+
data.AddRange(entry.GetBytes(info.TypeIdentifier));
263274
}
264275
}
265276

0 commit comments

Comments
 (0)