diff --git a/CodeWalker.Core/CodeWalker.Core.csproj b/CodeWalker.Core/CodeWalker.Core.csproj
index 440993b..1061806 100644
--- a/CodeWalker.Core/CodeWalker.Core.csproj
+++ b/CodeWalker.Core/CodeWalker.Core.csproj
@@ -61,6 +61,7 @@
+
diff --git a/CodeWalker.Core/GameFiles/FileTypes/PedFile.cs b/CodeWalker.Core/GameFiles/FileTypes/PedFile.cs
new file mode 100644
index 0000000..5fb180a
--- /dev/null
+++ b/CodeWalker.Core/GameFiles/FileTypes/PedFile.cs
@@ -0,0 +1,124 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.IO;
+using System.Xml;
+
+using TC = System.ComponentModel.TypeConverterAttribute;
+using EXP = System.ComponentModel.ExpandableObjectConverter;
+
+namespace CodeWalker.GameFiles
+{
+ [TC(typeof(EXP))] public class PedFile : GameFile, PackedFile
+ {
+ public Meta Meta { get; set; }
+ public PsoFile Pso { get; set; }
+ public RbfFile Rbf { get; set; }
+ public string Xml { get; set; }
+
+ public MCPedVariationInfo VariationInfo { get; set; }
+
+
+
+ public string[] Strings { get; set; }
+
+
+
+
+ public PedFile() : base(null, GameFileType.Ped)
+ { }
+ public PedFile(RpfFileEntry entry) : base(entry, GameFileType.Ped)
+ { }
+
+ public void Load(byte[] data, RpfFileEntry entry)
+ {
+ RpfFileEntry = entry;
+ Name = entry.Name;
+ FilePath = Name;
+
+
+ RpfResourceFileEntry resentry = entry as RpfResourceFileEntry;
+ if (resentry == null)
+ {
+ NonMetaLoad(data);
+ Loaded = true;
+ return;
+ }
+
+
+ ResourceDataReader rd = new ResourceDataReader(resentry, data);
+
+ Meta = rd.ReadBlock();
+
+
+ LoadMeta();
+
+
+
+ Loaded = true;
+ }
+
+
+
+ private void LoadMeta()
+ {
+ var vVariationInfo = MetaTypes.GetTypedData(Meta, MetaName.CPedVariationInfo);
+ VariationInfo = new MCPedVariationInfo();
+ VariationInfo.Load(Meta, vVariationInfo);
+
+ Strings = MetaTypes.GetStrings(Meta);
+ if (Strings != null)
+ {
+ foreach (string str in Strings)
+ {
+ JenkIndex.Ensure(str); //just shove them in there
+ }
+ }
+ }
+ private void LoadPso()
+ {
+
+ var vVariationInfo = PsoTypes.GetRootItem(Pso);
+ VariationInfo = new MCPedVariationInfo();
+ VariationInfo.Load(Pso, vVariationInfo);
+
+ }
+
+
+
+ private void NonMetaLoad(byte[] data)
+ {
+ //non meta not supported yet! but see what's in there...
+ MemoryStream ms = new MemoryStream(data);
+ if (RbfFile.IsRBF(ms))
+ {
+ Rbf = new RbfFile();
+ Rbf.Load(ms);
+ }
+ else if (PsoFile.IsPSO(ms))
+ {
+ Pso = new PsoFile();
+ Pso.Load(ms);
+ LoadPso();
+ }
+ else
+ {
+ }
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+}
diff --git a/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs b/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs
index 439134f..c11583b 100644
--- a/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs
+++ b/CodeWalker.Core/GameFiles/FileTypes/PedsFile.cs
@@ -23,8 +23,7 @@ namespace CodeWalker.GameFiles
public PedsFile() : base(null, GameFileType.Peds)
{ }
public PedsFile(RpfFileEntry entry) : base(entry, GameFileType.Peds)
- {
- }
+ { }
public void Load(byte[] data, RpfFileEntry entry)
{
diff --git a/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs
index 5515f72..3ff74d0 100644
--- a/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs
+++ b/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs
@@ -89,12 +89,13 @@ namespace CodeWalker.GameFiles
if (resentry == null)
{
NonMetaLoad(data);
+ Loaded = true;
return;
}
ResourceDataReader rd = new ResourceDataReader(resentry, data);
- Meta = rd.ReadBlock();
+ Meta = rd.ReadBlock();//maybe null this after load to reduce memory consumption?
@@ -232,12 +233,12 @@ namespace CodeWalker.GameFiles
MemoryStream ms = new MemoryStream(data);
if (RbfFile.IsRBF(ms))
{
- var Rbf = new RbfFile();
+ Rbf = new RbfFile();
Rbf.Load(ms);
}
else if (PsoFile.IsPSO(ms))
{
- var Pso = new PsoFile();
+ Pso = new PsoFile();
Pso.Load(ms);
//PsoTypes.EnsurePsoTypes(Pso);
}
diff --git a/CodeWalker.Core/GameFiles/GameFile.cs b/CodeWalker.Core/GameFiles/GameFile.cs
index 025f192..631cc83 100644
--- a/CodeWalker.Core/GameFiles/GameFile.cs
+++ b/CodeWalker.Core/GameFiles/GameFile.cs
@@ -76,6 +76,7 @@ namespace CodeWalker.GameFiles
CarVariations = 20,
VehicleLayouts = 21,
Peds = 22,
+ Ped = 23,
}
diff --git a/CodeWalker.Core/GameFiles/GameFileCache.cs b/CodeWalker.Core/GameFiles/GameFileCache.cs
index c286025..ee8aef6 100644
--- a/CodeWalker.Core/GameFiles/GameFileCache.cs
+++ b/CodeWalker.Core/GameFiles/GameFileCache.cs
@@ -80,6 +80,9 @@ namespace CodeWalker.GameFiles
public Dictionary VehiclesInitDict { get; set; }
public Dictionary PedsInitDict { get; set; }
+ public Dictionary PedVariationsDict { get; set; }
+ public Dictionary> PedDrawableDicts { get; set; }
+ public Dictionary> PedTextureDicts { get; set; }
public List BaseRpfs { get; private set; }
public List AllRpfs { get; private set; }
@@ -1602,9 +1605,72 @@ namespace CodeWalker.GameFiles
if (!LoadPeds) return;
IEnumerable rpfs = PreloadedMode ? AllRpfs : (IEnumerable)ActiveMapRpfFiles.Values;
+ List dlcrpfs = new List();
+ if (EnableDlc)
+ {
+ foreach (var rpf in DlcActiveRpfs)
+ {
+ dlcrpfs.Add(rpf);
+ if (rpf.Children == null) continue;
+ foreach (var crpf in rpf.Children)
+ {
+ dlcrpfs.Add(crpf);
+ if (crpf.Children?.Count > 0)
+ { }
+ }
+ }
+ }
+
+
var allPeds = new Dictionary();
var allPedsFiles = new List();
+ var allPedYmts = new Dictionary();
+ var allPedDrwDicts = new Dictionary>();
+ var allPedTexDicts = new Dictionary>();
+
+
+ var addPedDicts = new Action((namel, hash, dir)=>
+ {
+ if (dir?.Directories != null)
+ {
+ foreach (var cdir in dir.Directories)
+ {
+ if (cdir.NameLower == namel)
+ {
+ dir = cdir;
+ break;
+ }
+ }
+ var files = dir?.Files;
+ if (files != null)
+ {
+ Dictionary dict = null;
+ foreach (var file in files)
+ {
+ if (file?.NameLower == null) continue;
+ if (file.NameLower.EndsWith(".ydd"))
+ {
+ if (!allPedDrwDicts.TryGetValue(hash, out dict))
+ {
+ dict = new Dictionary();
+ allPedDrwDicts[hash] = dict;
+ }
+ dict[file.ShortNameHash] = file;
+ }
+ else if (file.NameLower.EndsWith(".ytd"))
+ {
+ if (!allPedTexDicts.TryGetValue(hash, out dict))
+ {
+ dict = new Dictionary();
+ allPedTexDicts[hash] = dict;
+ }
+ dict[file.ShortNameHash] = file;
+ }
+ }
+ }
+ }
+ });
var addPedsFiles = new Action>((from) =>
{
@@ -1643,19 +1709,66 @@ namespace CodeWalker.GameFiles
#endif
}
}
+ });
+ var addPedFiles = new Action>((from) =>
+ {
+ foreach (RpfFile file in from)
+ {
+ if (file.AllEntries == null) continue;
+ foreach (RpfEntry entry in file.AllEntries)
+ {
+#if !DEBUG
+ try
+#endif
+ {
+ if (entry.NameLower.EndsWith(".ymt"))
+ {
+ var testname = entry.GetShortNameLower();
+ var testhash = JenkHash.GenHash(testname);
+ if (allPeds.ContainsKey(testhash))
+ {
+ var pf = RpfMan.GetFile(entry);
+ if (pf != null)
+ {
+ allPedYmts[testhash] = pf;
+ addPedDicts(testname, testhash, entry.Parent);
+ }
+ }
+ }
+ }
+#if !DEBUG
+ catch (Exception ex)
+ {
+ string errstr = entry.Path + "\n" + ex.ToString();
+ ErrorLog(errstr);
+ }
+#endif
+ }
+ }
});
- addPedsFiles(rpfs);
- if (EnableDlc)
- {
- addPedsFiles(DlcActiveRpfs);
- }
+ addPedsFiles(rpfs);
+ addPedsFiles(dlcrpfs);
+
+ addPedFiles(rpfs);
+ addPedFiles(dlcrpfs);
+
PedsInitDict = allPeds;
+ PedVariationsDict = allPedYmts;
+ PedDrawableDicts = allPedDrwDicts;
+ PedTextureDicts = allPedTexDicts;
+
+
+ foreach (var kvp in PedsInitDict)
+ {
+ if (!PedVariationsDict.ContainsKey(kvp.Key))
+ { }//checking we found them all!
+ }
}
@@ -1726,7 +1839,7 @@ namespace CodeWalker.GameFiles
- private void TryLoadEnqueue(GameFile gf)
+ public void TryLoadEnqueue(GameFile gf)
{
if (((!gf.Loaded)) && (requestQueue.Count < 10))// && (!gf.LoadQueued)
{
@@ -2099,6 +2212,13 @@ namespace CodeWalker.GameFiles
}
+ public T GetFileUncached(RpfFileEntry e) where T : GameFile, new()
+ {
+ var f = new T();
+ f.RpfFileEntry = e;
+ TryLoadEnqueue(f);
+ return f;
+ }
diff --git a/CodeWalker.Core/GameFiles/MetaTypes/Meta.cs b/CodeWalker.Core/GameFiles/MetaTypes/Meta.cs
index 5c7cf49..0d4d34b 100644
--- a/CodeWalker.Core/GameFiles/MetaTypes/Meta.cs
+++ b/CodeWalker.Core/GameFiles/MetaTypes/Meta.cs
@@ -653,13 +653,14 @@ namespace CodeWalker.GameFiles
Unk1 = 0;
}
- public void SwapEnd()
+ public Array_Structure SwapEnd()
{
Pointer = MetaTypes.SwapBytes(Pointer);
Unk0 = MetaTypes.SwapBytes(Unk0);
Count1 = MetaTypes.SwapBytes(Count1);
Count2 = MetaTypes.SwapBytes(Count2);
Unk1 = MetaTypes.SwapBytes(Unk1);
+ return this;
}
public override string ToString()
{
@@ -963,6 +964,10 @@ namespace CodeWalker.GameFiles
[TC(typeof(EXP))] public struct ArrayOfBytes3 //array of 3 bytes
{
public byte b0, b1, b2;
+ public byte[] GetArray()
+ {
+ return new[] { b0, b1, b2 };
+ }
public override string ToString()
{
return b0.ToString() + ", " + b1.ToString() + ", " + b2.ToString();
@@ -971,6 +976,10 @@ namespace CodeWalker.GameFiles
[TC(typeof(EXP))] public struct ArrayOfBytes4 //array of 4 bytes
{
public byte b0, b1, b2, b3;
+ public byte[] GetArray()
+ {
+ return new[] { b0, b1, b2, b3 };
+ }
public override string ToString()
{
return b0.ToString() + ", " + b1.ToString() + ", " + b2.ToString() + ", " + b3.ToString();
@@ -979,14 +988,26 @@ namespace CodeWalker.GameFiles
[TC(typeof(EXP))] public struct ArrayOfBytes5 //array of 5 bytes
{
public byte b0, b1, b2, b3, b4;
+ public byte[] GetArray()
+ {
+ return new[] { b0, b1, b2, b3, b4 };
+ }
}
[TC(typeof(EXP))] public struct ArrayOfBytes6 //array of 6 bytes
{
public byte b0, b1, b2, b3, b4, b5;
+ public byte[] GetArray()
+ {
+ return new[] { b0, b1, b2, b3, b4, b5 };
+ }
}
[TC(typeof(EXP))] public struct ArrayOfBytes12 //array of 12 bytes
{
public byte b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11;
+ public byte[] GetArray()
+ {
+ return new[] { b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11 };
+ }
}
[TC(typeof(EXP))] public struct ArrayOfChars64 //array of 64 chars (bytes)
{
diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs
index 8dc8524..e844e13 100644
--- a/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs
+++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaNames.cs
@@ -3489,16 +3489,23 @@ namespace CodeWalker.GameFiles
ePedRadioGenre = 2942646938,
eSexinessFlags = 374769227,
eExternallyDrivenDOFs = 637184392,
+ eAnchorPoints = 2834549053,
SpecialAbilityType = 2011786168,
DefaultSpawnPreference = 888587604,
+ numAlternatives = 2806194106,
CScenarioChainingEdge__eAction = 3609807418,
CScenarioChainingEdge__eNavMode = 3971773454,
CScenarioChainingEdge__eNavSpeed = 941086046,
+ CStreamingRequestCommonSet = 1358189812,
+ animal = 974042365, //in peds.ymt
standard_ped = 2703423328, //in peds.ymt
- standard_male = 1860494962, //in peds.ymt PedCapsuleName
+ standard_male = 1860494962, //in peds.ymt PedCapsuleName - from pedbounds.xml
standard_female = 3778684510, //in peds.ymt PedCapsuleName
+ standard_player_male = 190297546, //in peds.ymt PedCapsuleName
+ standard_player_female = 3813733509, //in peds.ymt PedCapsuleName
+ large_male = 2182606047, //in peds.ymt PedCapsuleName
facial_clipset_group_gen_male = 2968316036, //in peds.ymt FacialClipsetGroupName
facial_clipset_group_gen_female = 984918963, //in peds.ymt FacialClipsetGroupName
facial_clipset_group_p_m_zero = 3839850645, //in peds.ymt FacialClipsetGroupName
@@ -3542,6 +3549,17 @@ namespace CodeWalker.GameFiles
+ //ped ymt's hashes from Siprus
+ numAvailProps = 2598445407,
+ numAvailTex = 3371516811,
+ ownsCloth = 2828247905,
+ aComponentData3 = 3796409423, //is this a collision? it's good enough for now!
+ bHasTexVariations = 1235281004,
+
+
+
+
+
//GranularSound dat54.rel FileName hashes from NotGigo
engine_accel = 3748922026,
exhaust_accel = 598446449,
diff --git a/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs b/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs
index 9c1c3f4..3023cdd 100644
--- a/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs
+++ b/CodeWalker.Core/GameFiles/MetaTypes/MetaTypes.cs
@@ -436,7 +436,7 @@ namespace CodeWalker.GameFiles
return new MetaStructureInfo(MetaName.CStreamingRequestRecord, 3825587854, 768, 40,
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CStreamingRequestFrame),
new MetaStructureEntryInfo_s(MetaName.Frames, 0, MetaStructureEntryDataType.Array, 0, 0, 0),
- new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)1358189812),
+ new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CStreamingRequestCommonSet),
new MetaStructureEntryInfo_s(MetaName.CommonSets, 16, MetaStructureEntryDataType.Array, 0, 2, 0),
new MetaStructureEntryInfo_s(MetaName.NewStyle, 32, MetaStructureEntryDataType.Boolean, 0, 0, 0)
);
@@ -466,8 +466,8 @@ namespace CodeWalker.GameFiles
// new MetaStructureEntryInfo_s((MetaName)1762439591, 64, MetaStructureEntryDataType.Array, 0, 6, 0),
// new MetaStructureEntryInfo_s(MetaName.Flags, 80, MetaStructureEntryDataType.UnsignedInt, 0, 0, 0)
// );
- case (MetaName)1358189812:
- return new MetaStructureInfo((MetaName)1358189812, 3710200606, 768, 16,
+ case MetaName.CStreamingRequestCommonSet:
+ return new MetaStructureInfo(MetaName.CStreamingRequestCommonSet, 3710200606, 768, 16,
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Hash, 0, 0, 0),
new MetaStructureEntryInfo_s(MetaName.Requests, 0, MetaStructureEntryDataType.Array, 0, 0, 0)
);
@@ -1009,7 +1009,7 @@ namespace CodeWalker.GameFiles
);
case MetaName.CPedPropInfo:
return new MetaStructureInfo(MetaName.CPedPropInfo, 1792487819, 768, 40,
- new MetaStructureEntryInfo_s((MetaName)2598445407, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
+ new MetaStructureEntryInfo_s(MetaName.numAvailProps, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedPropMetaData),
new MetaStructureEntryInfo_s(MetaName.aPropMetaData, 8, MetaStructureEntryDataType.Array, 0, 1, 0),
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CAnchorProps),
@@ -1017,14 +1017,14 @@ namespace CodeWalker.GameFiles
);
case MetaName.CPedVariationInfo:
return new MetaStructureInfo(MetaName.CPedVariationInfo, 4030871161, 768, 112,
- new MetaStructureEntryInfo_s((MetaName)1235281004, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0),
+ new MetaStructureEntryInfo_s(MetaName.bHasTexVariations, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0),
new MetaStructureEntryInfo_s((MetaName)4086467184, 1, MetaStructureEntryDataType.Boolean, 0, 0, 0),
new MetaStructureEntryInfo_s((MetaName)911147899, 2, MetaStructureEntryDataType.Boolean, 0, 0, 0),
new MetaStructureEntryInfo_s((MetaName)315291935, 3, MetaStructureEntryDataType.Boolean, 0, 0, 0),
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
new MetaStructureEntryInfo_s((MetaName)2996560424, 4, MetaStructureEntryDataType.ArrayOfBytes, 0, 4, (MetaName)MetaTypeName.PsoPOINTER),
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)3538495220),
- new MetaStructureEntryInfo_s((MetaName)3796409423, 16, MetaStructureEntryDataType.Array, 0, 6, 0),
+ new MetaStructureEntryInfo_s(MetaName.aComponentData3, 16, MetaStructureEntryDataType.Array, 0, 6, 0),
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CPedSelectionSet),
new MetaStructureEntryInfo_s(MetaName.aSelectionSets, 32, MetaStructureEntryDataType.Array, 0, 8, 0),
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, MetaName.CComponentInfo),
@@ -1034,18 +1034,18 @@ namespace CodeWalker.GameFiles
);
case (MetaName)3538495220:
return new MetaStructureInfo((MetaName)3538495220, 2024084511, 768, 24,
- new MetaStructureEntryInfo_s((MetaName)3371516811, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
+ new MetaStructureEntryInfo_s(MetaName.numAvailTex, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)1535046754),
new MetaStructureEntryInfo_s((MetaName)1756136273, 8, MetaStructureEntryDataType.Array, 0, 1, 0)
);
case (MetaName)2236980467:
return new MetaStructureInfo((MetaName)2236980467, 508935687, 0, 24,
- new MetaStructureEntryInfo_s((MetaName)2828247905, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0)
+ new MetaStructureEntryInfo_s(MetaName.ownsCloth, 0, MetaStructureEntryDataType.Boolean, 0, 0, 0)
);
case (MetaName)1535046754:
return new MetaStructureInfo((MetaName)1535046754, 124073662, 768, 48,
new MetaStructureEntryInfo_s(MetaName.propMask, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
- new MetaStructureEntryInfo_s((MetaName)2806194106, 1, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
+ new MetaStructureEntryInfo_s(MetaName.numAlternatives, 1, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)1036962405),
new MetaStructureEntryInfo_s(MetaName.aTexData, 8, MetaStructureEntryDataType.Array, 0, 2, 0),
new MetaStructureEntryInfo_s(MetaName.clothData, 24, MetaStructureEntryDataType.Structure, 0, 0, (MetaName)2236980467)
@@ -1096,7 +1096,7 @@ namespace CodeWalker.GameFiles
return new MetaStructureInfo(MetaName.CAnchorProps, 403574180, 768, 24,
new MetaStructureEntryInfo_s((MetaName)MetaTypeName.ARRAYINFO, 0, MetaStructureEntryDataType.UnsignedByte, 0, 0, 0),
new MetaStructureEntryInfo_s(MetaName.props, 0, MetaStructureEntryDataType.Array, 0, 0, 0),
- new MetaStructureEntryInfo_s(MetaName.anchor, 16, MetaStructureEntryDataType.IntEnum, 0, 0, (MetaName)2834549053)
+ new MetaStructureEntryInfo_s(MetaName.anchor, 16, MetaStructureEntryDataType.IntEnum, 0, 0, MetaName.eAnchorPoints)
);
case MetaName.CPedSelectionSet:
return new MetaStructureInfo(MetaName.CPedSelectionSet, 3120284999, 512, 48,
@@ -1386,8 +1386,8 @@ namespace CodeWalker.GameFiles
new MetaEnumEntryInfo_s((MetaName)3735238938, 1),
new MetaEnumEntryInfo_s((MetaName)3395845123, 2)
);
- case (MetaName)2834549053:
- return new MetaEnumInfo((MetaName)2834549053, 1309372691,
+ case MetaName.eAnchorPoints:
+ return new MetaEnumInfo(MetaName.eAnchorPoints, 1309372691,
new MetaEnumEntryInfo_s(MetaName.ANCHOR_HEAD, 0),
new MetaEnumEntryInfo_s(MetaName.ANCHOR_EYES, 1),
new MetaEnumEntryInfo_s(MetaName.ANCHOR_EARS, 2),
@@ -2264,7 +2264,7 @@ namespace CodeWalker.GameFiles
Unk_3395845123 = 2,
}
- public enum Unk_2834549053 //component peds CAnchorProps anchor
+ public enum eAnchorPoints //component peds CAnchorProps eAnchorPoints
: int //Key:1309372691
{
ANCHOR_HEAD = 0,
@@ -5880,9 +5880,9 @@ namespace CodeWalker.GameFiles
public struct CStreamingRequestRecord //40 bytes, Key:3825587854 //SRL YMT ROOT - in /streaming/ folder
{
- public Array_Structure Frames { get; set; } //0 0: Array: 0: Frames//419044527 {0: Structure: CStreamingRequestFrame//999226379: 256}
- public Array_Structure CommonSets { get; set; } //16 16: Array: 0: CommonSets//4248405899 {0: Structure: 1358189812: 256}
- public byte NewStyle { get; set; } //32 32: Boolean: 0: 2333392588
+ public Array_Structure Frames { get; set; } //0 0: Array: 0: Frames {0: Structure: CStreamingRequestFrame: 256}
+ public Array_Structure CommonSets { get; set; } //16 16: Array: 0: CommonSets {0: Structure: CStreamingRequestCommonSet: 256}
+ public byte NewStyle { get; set; } //32 32: Boolean: 0: NewStyle
public byte Unused0 { get; set; }//33
public ushort Unused1 { get; set; }//34
public uint Unused2 { get; set; }//36
@@ -5919,9 +5919,9 @@ namespace CodeWalker.GameFiles
public uint Unused4 { get; set; }//92
}
- public struct Unk_1358189812 //16 bytes, Key:3710200606 //SRL hashes list?
+ public struct CStreamingRequestCommonSet //16 bytes, Key:3710200606 //SRL common set
{
- public Array_uint Requests { get; set; } //0 0: Array: 0: Requests//2743119154 {0: Hash: 0: 256}
+ public Array_uint Requests { get; set; } //0 0: Array: 0: Requests {0: Hash: 0: 256}
}
@@ -5990,41 +5990,290 @@ namespace CodeWalker.GameFiles
- public struct CPedVariationInfo //112 bytes, Key:4030871161 //COMPONENT PEDS YMT ROOT - in componentpeds .rpf's
+ public struct CPedVariationInfo : IPsoSwapEnd //112 bytes, Key:4030871161 //COMPONENT PEDS YMT ROOT - in componentpeds .rpf's
{
- public byte Unk_1235281004 { get; set; } //0 0: Boolean: 0: 1235281004
+ public byte bHasTexVariations { get; set; } //0 0: Boolean: 0: bHasTexVariations
public byte Unk_4086467184 { get; set; } //1 1: Boolean: 0: 4086467184
public byte Unk_911147899 { get; set; } //2 2: Boolean: 0: 911147899
public byte Unk_315291935 { get; set; } //3 3: Boolean: 0: 315291935
public ArrayOfBytes12 Unk_2996560424 { get; set; } //4 4: ArrayOfBytes: 12: 2996560424
- public Array_Structure Unk_3796409423 { get; set; } //16 16: Array: 0: 3796409423 {0: Structure: 3538495220: 256}
- public Array_Structure aSelectionSets { get; set; } //32 32: Array: 0: aSelectionSets {0: Structure: 253191135: 256}
- public Array_Structure compInfos { get; set; } //48 48: Array: 0: compInfos//592652859 {0: Structure: CComponentInfo//1866571721: 256}
- public CPedPropInfo propInfo { get; set; } //64 64: Structure: 2858946626: propInfo//2240851416
+ public Array_Structure aComponentData3 { get; set; } //16 16: Array: 0: aComponentData3 {0: Structure: 3538495220: 256}
+ public Array_Structure aSelectionSets { get; set; } //32 32: Array: 0: aSelectionSets {0: Structure: CPedSelectionSet: 256}
+ public Array_Structure compInfos { get; set; } //48 48: Array: 0: compInfos {0: Structure: CComponentInfo: 256}
+ public CPedPropInfo propInfo { get; set; } //64 64: Structure: CPedPropInfo: propInfo
public MetaHash dlcName { get; set; } //104 104: Hash: 0: dlcName
public uint Unused0 { get; set; }//108
+
+ public void SwapEnd()
+ {
+ aComponentData3 = aComponentData3.SwapEnd();
+ aSelectionSets = aSelectionSets.SwapEnd();
+ compInfos = compInfos.SwapEnd();
+ propInfo = propInfo.SwapEnd();
+ dlcName = MetaTypes.SwapBytes(dlcName);
+ }
+ }
+ public class MCPedVariationInfo : MetaWrapper
+ {
+ public CPedVariationInfo _Data;
+ public CPedVariationInfo Data { get { return _Data; } }
+
+ public byte[] ComponentIndices { get; set; }
+ public MUnk_3538495220[] ComponentVariations { get; set; }
+ public MCPedSelectionSet[] SelectionSets { get; set; }
+ public MCComponentInfo[] CompInfos { get; set; }
+ public MCPedPropInfo PropInfo { get; set; }
+
+
+ public override void Load(Meta meta, MetaPOINTER ptr)
+ {
+ var data = MetaTypes.GetData(meta, ptr);
+ Load(meta, data);
+ }
+ public void Load(Meta meta, CPedVariationInfo data)
+ {
+ //maybe see https://github.com/emcifuntik/altv-cloth-tool/blob/master/AltTool/ResourceBuilder.cs
+
+
+ _Data = data;
+
+ ComponentIndices = data.Unk_2996560424.GetArray();
+
+
+ var vComponentVariations = MetaTypes.ConvertDataArray(meta, (MetaName)3538495220, _Data.aComponentData3);
+ if (vComponentVariations != null)
+ {
+ ComponentVariations = new MUnk_3538495220[vComponentVariations.Length];
+ for (int i = 0; i < vComponentVariations.Length; i++)
+ {
+ ComponentVariations[i] = new MUnk_3538495220(meta, vComponentVariations[i], this);
+ }
+ }
+
+ var vSelectionSets = MetaTypes.ConvertDataArray(meta, MetaName.CPedSelectionSet, _Data.aSelectionSets);
+ if (vSelectionSets != null)
+ {
+ SelectionSets = new MCPedSelectionSet[vSelectionSets.Length];
+ for (int i = 0; i < vSelectionSets.Length; i++)
+ {
+ SelectionSets[i] = new MCPedSelectionSet(meta, vSelectionSets[i], this);
+ }
+ }
+
+ var vCompInfos = MetaTypes.ConvertDataArray(meta, MetaName.CComponentInfo, _Data.compInfos);
+ if (vCompInfos != null)
+ {
+ CompInfos = new MCComponentInfo[vCompInfos.Length];
+ for (int i = 0; i < vCompInfos.Length; i++)
+ {
+ CompInfos[i] = new MCComponentInfo(meta, vCompInfos[i], this);
+ }
+ }
+
+ PropInfo = new MCPedPropInfo(meta, data.propInfo, this);
+
+
+
+ for (int i = 0; i < 12; i++) //set the component type indices on all the component variants, for them to use
+ {
+ var compInd = ComponentIndices[i];
+ if ((compInd > 0) && (compInd < ComponentVariations?.Length))
+ {
+ var compvar = ComponentVariations[compInd];
+ compvar.ComponentType = i;
+
+ if (compvar.Variations != null)
+ {
+ foreach (var cvp in compvar.Variations)
+ {
+ cvp.ComponentType = i;
+ //cvp.GetDrawableName();//testing
+ }
+ }
+ }
+ }
+
+
+
+
+ }
+ public void Load(PsoFile pso, CPedVariationInfo data)
+ {
+ //TODO!
+ }
+
+ public override MetaPOINTER Save(MetaBuilder mb)
+ {
+ throw new NotImplementedException();
+ }
+
+
+ public MUnk_3538495220 GetVariations(int componentType)
+ {
+ if ((componentType < 0) || (componentType > 11)) return null;
+ if (ComponentIndices == null) return null;
+ var index = ComponentIndices[componentType];
+ if (index > ComponentVariations?.Length) return null;
+ return ComponentVariations[index];
+ }
+
}
- public struct Unk_3538495220 //24 bytes, Key:2024084511 //COMPONENT PEDS unknown
+ public struct Unk_3538495220 //24 bytes, Key:2024084511 //COMPONENT PEDS component variations item
{
- public byte Unk_3371516811 { get; set; } //0 0: UnsignedByte: 0: 3371516811
+ public byte numAvailTex { get; set; } //0 0: UnsignedByte: 0: numAvailTex
public byte Unused0 { get; set; }//1
public ushort Unused1 { get; set; }//2
public uint Unused2 { get; set; }//4
public Array_Structure Unk_1756136273 { get; set; } //8 8: Array: 0: 1756136273 {0: Structure: 1535046754: 256}
}
-
- public struct Unk_1535046754 //48 bytes, Key:124073662 //COMPONENT PEDS unknown /cloth?
+ public class MUnk_3538495220 : MetaWrapper
{
- public byte propMask { get; set; } //0 0: UnsignedByte: 0: propMask//2932859459
- public byte Unk_2806194106 { get; set; } //1 1: UnsignedByte: 0: 2806194106
- public ushort Unused0 { get; set; }//2
- public uint Unused1 { get; set; }//4
- public Array_Structure aTexData { get; set; } //8 8: Array: 0: aTexData//1251090986 {0: Structure: 1036962405: 256}
- public Unk_2236980467 clothData { get; set; } //24 24: Structure: 2236980467: clothData//2464583091
+ public MCPedVariationInfo Owner { get; set; }
+
+ public Unk_3538495220 _Data;
+ public Unk_3538495220 Data { get { return _Data; } }
+
+
+ public MUnk_1535046754[] Variations { get; set; }
+
+ public int ComponentType { get; set; } = 0;
+ public static string[] ComponentTypeNames { get; } =
+ {
+ "head",//0
+ "berd",//1
+ "hair",//2
+ "uppr",//3
+ "lowr",//4
+ "hand",//5
+ "feet",//6
+ "teef",//7
+ "accs",//8
+ "task",//9
+ "decl",//10
+ "jbib",//11
+ };
+
+
+ public MUnk_3538495220() { }
+ public MUnk_3538495220(Meta meta, Unk_3538495220 data, MCPedVariationInfo owner)
+ {
+ _Data = data;
+ Owner = owner;
+ Init(meta);
+ }
+
+
+ private void Init(Meta meta)
+ {
+ var vVariations = MetaTypes.ConvertDataArray(meta, (MetaName)1535046754, _Data.Unk_1756136273);
+ if (vVariations != null)
+ {
+ Variations = new MUnk_1535046754[vVariations.Length];
+ for (int i = 0; i < vVariations.Length; i++)
+ {
+ Variations[i] = new MUnk_1535046754(meta, vVariations[i], this, i);
+ }
+ }
+ }
+
+
+ public override void Load(Meta meta, MetaPOINTER ptr)
+ {
+ _Data = MetaTypes.GetData(meta, ptr);
+ Init(meta);
+ }
+
+ public override MetaPOINTER Save(MetaBuilder mb)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override string ToString()
+ {
+ string r = (ComponentType < 12) ? ComponentTypeNames[ComponentType] : "error";
+ return r + " : " + Variations?.Length.ToString() ?? base.ToString();
+ }
}
- public struct Unk_1036962405 //3 bytes, Key:4272717794 //COMPONENT PEDS (cloth?) TexData
+ public struct Unk_1535046754 //48 bytes, Key:124073662 //COMPONENT PEDS drawable info
+ {
+ public byte propMask { get; set; } //0 0: UnsignedByte: 0: propMask
+ public byte numAlternatives { get; set; } //1 1: UnsignedByte: 0: 2806194106
+ public ushort Unused0 { get; set; }//2
+ public uint Unused1 { get; set; }//4
+ public Array_Structure aTexData { get; set; } //8 8: Array: 0: aTexData {0: Structure: 1036962405: 256}
+ public Unk_2236980467 clothData { get; set; } //24 24: Structure: 2236980467: clothData
+ }
+ public class MUnk_1535046754 : MetaWrapper
+ {
+ public MUnk_3538495220 Owner { get; set; }
+
+ public Unk_1535046754 _Data;
+ public Unk_1535046754 Data { get { return _Data; } }
+
+ public Unk_1036962405[] TexData { get; set; }
+
+ public int ComponentType { get; set; } = 0;
+ public int DrawableIndex { get; set; } = 0;
+ public int PropMask { get { return _Data.propMask; } }
+ public int NumAlternatives { get { return _Data.numAlternatives; } }
+
+ public int PropType { get { return (PropMask >> 4) & 3; } }
+
+ public string GetDrawableName(int altnum = 0)
+ {
+ string r = (ComponentType < 12) ? MUnk_3538495220.ComponentTypeNames[ComponentType] : "error";
+ r += "_";
+ r += DrawableIndex.ToString("000");
+ r += "_";
+ switch (PropType)
+ {
+ case 0: r += "u"; break;//what do these mean?
+ case 1: r += "r"; break;
+ case 2: r += "m"; break;
+ case 3: r += "m"; break;
+ default:
+ break;
+ }
+ if (altnum > 0)
+ {
+ r += "_";
+ r += altnum.ToString();
+ }
+ return r;
+ }
+
+
+
+ public MUnk_1535046754() { }
+ public MUnk_1535046754(Meta meta, Unk_1535046754 data, MUnk_3538495220 owner, int index)
+ {
+ _Data = data;
+ Owner = owner;
+ DrawableIndex = index;
+
+ TexData = MetaTypes.ConvertDataArray(meta, (MetaName)1036962405, _Data.aTexData);
+ }
+
+
+ public override void Load(Meta meta, MetaPOINTER ptr)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override MetaPOINTER Save(MetaBuilder mb)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override string ToString()
+ {
+ return GetDrawableName();
+ }
+ }
+
+ public struct Unk_1036962405 //3 bytes, Key:4272717794 //COMPONENT PEDS (cloth?) aTexData
{
public byte texId { get; set; } //0 0: UnsignedByte: 0: texId
public byte distribution { get; set; } //1 1: UnsignedByte: 0: distribution//914976023
@@ -6033,7 +6282,7 @@ namespace CodeWalker.GameFiles
public struct Unk_2236980467 //24 bytes, Key:508935687 //COMPONENT PEDS clothData
{
- public byte Unk_2828247905 { get; set; } //0 0: Boolean: 0: 2828247905
+ public byte ownsCloth { get; set; } //0 0: Boolean: 0: ownsCloth
public byte Unused0 { get; set; }//1
public ushort Unused1 { get; set; }//2
public uint Unused2 { get; set; }//4
@@ -6043,7 +6292,7 @@ namespace CodeWalker.GameFiles
public uint Unused6 { get; set; }//20
}
- public struct CPedSelectionSet //48 bytes, Key:3120284999 //COMPONENT PEDS unknown
+ public struct CPedSelectionSet //48 bytes, Key:3120284999 //COMPONENT PEDS
{
public MetaHash name { get; set; } //0 0: Hash: 0: name
public ArrayOfBytes12 Unk_173599222 { get; set; } //4 4: ArrayOfBytes: 12: 173599222
@@ -6053,8 +6302,32 @@ namespace CodeWalker.GameFiles
public ArrayOfBytes6 Unk_672172037 { get; set; } //40 40: ArrayOfBytes: 6: 672172037
public ushort Unused0 { get; set; }//46
}
+ public class MCPedSelectionSet : MetaWrapper
+ {
+ public MCPedVariationInfo Owner { get; set; }
- public struct CComponentInfo //48 bytes, Key:3693847250 //COMPONENT PEDS CComponentInfo
+ public CPedSelectionSet _Data;
+ public CPedSelectionSet Data { get { return _Data; } }
+
+ public MCPedSelectionSet() { }
+ public MCPedSelectionSet(Meta meta, CPedSelectionSet data, MCPedVariationInfo owner)
+ {
+ _Data = data;
+ Owner = owner;
+ }
+
+ public override void Load(Meta meta, MetaPOINTER ptr)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override MetaPOINTER Save(MetaBuilder mb)
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public struct CComponentInfo //48 bytes, Key:3693847250 //COMPONENT PEDS
{
public MetaHash Unk_802196719 { get; set; } //0 0: Hash: 0: 802196719
public MetaHash Unk_4233133352 { get; set; } //4 4: Hash: 0: 4233133352
@@ -6073,18 +6346,108 @@ namespace CodeWalker.GameFiles
public byte Unk_4196345791 { get; set; } //45 45: UnsignedByte: 0: 4196345791
public ushort Unused5 { get; set; }//46
}
-
- public struct CPedPropInfo //40 bytes, Key:1792487819 //COMPONENT PEDS unknown
+ public class MCComponentInfo : MetaWrapper
{
- public byte Unk_2598445407 { get; set; } //0 0: UnsignedByte: 0: 2598445407
+ public MCPedVariationInfo Owner { get; set; }
+
+ public CComponentInfo _Data;
+ public CComponentInfo Data { get { return _Data; } }
+
+
+ public int ComponentType { get { return _Data.Unk_3509540765; } }
+ public int ComponentIndex { get { return _Data.Unk_4196345791; } }
+
+ public MCComponentInfo() { }
+ public MCComponentInfo(Meta meta, CComponentInfo data, MCPedVariationInfo owner)
+ {
+ _Data = data;
+ Owner = owner;
+ }
+
+
+ public override void Load(Meta meta, MetaPOINTER ptr)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override MetaPOINTER Save(MetaBuilder mb)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override string ToString()
+ {
+ return (ComponentType < 12) ? MUnk_3538495220.ComponentTypeNames[ComponentType] + "_" + ComponentIndex.ToString("000") : base.ToString();
+ }
+ }
+
+ public struct CPedPropInfo //40 bytes, Key:1792487819 //COMPONENT PEDS
+ {
+ public byte numAvailProps { get; set; } //0 0: UnsignedByte: 0: numAvailProps
public byte Unused0 { get; set; }//1
public ushort Unused1 { get; set; }//2
public uint Unused2 { get; set; }//4
public Array_Structure aPropMetaData { get; set; } //8 8: Array: 0: aPropMetaData {0: Structure: CPedPropMetaData: 256}
public Array_Structure aAnchors { get; set; } //24 24: Array: 0: aAnchors {0: Structure: CAnchorProps: 256}
+ public CPedPropInfo SwapEnd()
+ {
+ aPropMetaData = aPropMetaData.SwapEnd();
+ aAnchors = aAnchors.SwapEnd();
+ return this;
+ }
+ }
+ public class MCPedPropInfo : MetaWrapper
+ {
+ public MCPedVariationInfo Owner { get; set; }
+
+ public CPedPropInfo _Data;
+ public CPedPropInfo Data { get { return _Data; } }
+
+ public MCPedPropMetaData[] PropMetaData { get; set; }
+ public MCAnchorProps[] Anchors { get; set; }
+
+ public MCPedPropInfo() { }
+ public MCPedPropInfo(Meta meta, CPedPropInfo data, MCPedVariationInfo owner)
+ {
+ _Data = data;
+ Owner = owner;
+
+ var vPropMetaData = MetaTypes.ConvertDataArray(meta, MetaName.CPedPropMetaData, _Data.aPropMetaData);
+ if (vPropMetaData != null)
+ {
+ PropMetaData = new MCPedPropMetaData[vPropMetaData.Length];
+ for (int i = 0; i < vPropMetaData.Length; i++)
+ {
+ PropMetaData[i] = new MCPedPropMetaData(meta, vPropMetaData[i], this);
+ }
+ }
+
+ var vAnchors = MetaTypes.ConvertDataArray(meta, MetaName.CAnchorProps, _Data.aAnchors);
+ if (vAnchors != null)
+ {
+ Anchors = new MCAnchorProps[vAnchors.Length];
+ for (int i = 0; i < vAnchors.Length; i++)
+ {
+ Anchors[i] = new MCAnchorProps(meta, vAnchors[i], this);
+ }
+ }
+
+ }
+
+
+
+ public override void Load(Meta meta, MetaPOINTER ptr)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override MetaPOINTER Save(MetaBuilder mb)
+ {
+ throw new NotImplementedException();
+ }
}
- public struct CPedPropMetaData //56 bytes, Key:2029738350 //COMPONENT PEDS prop metadata
+ public struct CPedPropMetaData //56 bytes, Key:2029738350 //COMPONENT PEDS
{
public MetaHash audioId { get; set; } //0 0: Hash: 0: audioId
public ArrayOfBytes5 expressionMods { get; set; } //4 4: ArrayOfBytes: 5: expressionMods//942761829
@@ -6103,8 +6466,35 @@ namespace CodeWalker.GameFiles
public byte Unused5 { get; set; }//53
public ushort Unused6 { get; set; }//54
}
+ public class MCPedPropMetaData : MetaWrapper
+ {
+ public MCPedPropInfo Owner { get; set; }
- public struct CPedPropTexData //12 bytes, Key:2767296137 //COMPONENT PEDS prop texData
+ public CPedPropMetaData _Data;
+ public CPedPropMetaData Data { get { return _Data; } }
+
+ public CPedPropTexData[] TexData { get; set; }
+
+ public MCPedPropMetaData(Meta meta, CPedPropMetaData data, MCPedPropInfo owner)
+ {
+ _Data = data;
+ Owner = owner;
+
+ TexData = MetaTypes.ConvertDataArray(meta, MetaName.CPedPropTexData, _Data.texData);
+ }
+
+ public override void Load(Meta meta, MetaPOINTER ptr)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override MetaPOINTER Save(MetaBuilder mb)
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public struct CPedPropTexData //12 bytes, Key:2767296137 //COMPONENT PEDS
{
public int inclusions { get; set; } //0 0: IntFlags2: 0: inclusions
public int exclusions { get; set; } //4 4: IntFlags2: 0: exclusions
@@ -6117,9 +6507,37 @@ namespace CodeWalker.GameFiles
public struct CAnchorProps //24 bytes, Key:403574180 //COMPONENT PEDS CAnchorProps
{
public Array_byte props { get; set; } //0 0: Array: 0: props {0: UnsignedByte: 0: 256}
- public Unk_2834549053 anchor { get; set; } //16 16: IntEnum: 2834549053: anchor
+ public eAnchorPoints anchor { get; set; } //16 16: IntEnum: eAnchorPoints: anchor
public uint Unused0 { get; set; }//20
}
+ public class MCAnchorProps : MetaWrapper
+ {
+ public MCPedPropInfo Owner { get; set; }
+
+ public CAnchorProps _Data;
+ public CAnchorProps Data { get { return _Data; } }
+
+ public byte[] Props { get; set; }
+
+ public MCAnchorProps(Meta meta, CAnchorProps data, MCPedPropInfo owner)
+ {
+ _Data = data;
+ Owner = owner;
+
+ Props = MetaTypes.GetByteArray(meta, _Data.props);
+ }
+
+
+ public override void Load(Meta meta, MetaPOINTER ptr)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override MetaPOINTER Save(MetaBuilder mb)
+ {
+ throw new NotImplementedException();
+ }
+ }
@@ -6129,5 +6547,4 @@ namespace CodeWalker.GameFiles
-
}
diff --git a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs
index 419e2cf..fd99cc9 100644
--- a/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs
+++ b/CodeWalker.Core/GameFiles/MetaTypes/PsoTypes.cs
@@ -13212,14 +13212,14 @@ namespace CodeWalker.GameFiles
);
case MetaName.CPedVariationInfo:
return new PsoStructureInfo(MetaName.CPedVariationInfo, 0, 0, 112,
- new PsoStructureEntryInfo((MetaName)1235281004, PsoDataType.Bool, 0, 0, 0),
+ new PsoStructureEntryInfo(MetaName.bHasTexVariations, PsoDataType.Bool, 0, 0, 0),
new PsoStructureEntryInfo((MetaName)4086467184, PsoDataType.Bool, 1, 0, 0),
new PsoStructureEntryInfo((MetaName)911147899, PsoDataType.Bool, 2, 0, 0),
new PsoStructureEntryInfo((MetaName)315291935, PsoDataType.Bool, 3, 0, 0),
new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.UByte, 0, 0, 0),
new PsoStructureEntryInfo((MetaName)2996560424, PsoDataType.Array, 4, 4, (MetaName)786436),
new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)3538495220),
- new PsoStructureEntryInfo((MetaName)3796409423, PsoDataType.Array, 16, 0, (MetaName)6),
+ new PsoStructureEntryInfo(MetaName.aComponentData3, PsoDataType.Array, 16, 0, (MetaName)6),
new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedSelectionSet),
new PsoStructureEntryInfo(MetaName.aSelectionSets, PsoDataType.Array, 32, 0, (MetaName)8),
new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CComponentInfo),
@@ -13229,7 +13229,7 @@ namespace CodeWalker.GameFiles
);
case MetaName.CPedPropInfo:
return new PsoStructureInfo(MetaName.CPedPropInfo, 0, 0, 40,
- new PsoStructureEntryInfo((MetaName)2598445407, PsoDataType.UByte, 0, 0, 0),
+ new PsoStructureEntryInfo(MetaName.numAvailProps, PsoDataType.UByte, 0, 0, 0),
new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CPedPropMetaData),
new PsoStructureEntryInfo(MetaName.aPropMetaData, PsoDataType.Array, 8, 0, (MetaName)1),
new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, MetaName.CAnchorProps),
@@ -13237,21 +13237,21 @@ namespace CodeWalker.GameFiles
);
case (MetaName)3538495220:
return new PsoStructureInfo((MetaName)3538495220, 0, 0, 24,
- new PsoStructureEntryInfo((MetaName)3371516811, PsoDataType.UByte, 0, 0, 0),
+ new PsoStructureEntryInfo(MetaName.numAvailTex, PsoDataType.UByte, 0, 0, 0),
new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1535046754),
new PsoStructureEntryInfo((MetaName)1756136273, PsoDataType.Array, 8, 0, (MetaName)1)
);
case (MetaName)1535046754:
return new PsoStructureInfo((MetaName)1535046754, 0, 0, 48,
new PsoStructureEntryInfo(MetaName.propMask, PsoDataType.UByte, 0, 0, 0),
- new PsoStructureEntryInfo((MetaName)2806194106, PsoDataType.UByte, 1, 0, 0),
+ new PsoStructureEntryInfo(MetaName.numAlternatives, PsoDataType.UByte, 1, 0, 0),
new PsoStructureEntryInfo((MetaName)MetaTypeName.ARRAYINFO, PsoDataType.Structure, 0, 0, (MetaName)1036962405),
new PsoStructureEntryInfo(MetaName.aTexData, PsoDataType.Array, 8, 0, (MetaName)2),
new PsoStructureEntryInfo(MetaName.clothData, PsoDataType.Structure, 24, 0, (MetaName)2236980467)
);
case (MetaName)2236980467:
return new PsoStructureInfo((MetaName)2236980467, 0, 0, 24,
- new PsoStructureEntryInfo((MetaName)2828247905, PsoDataType.Bool, 0, 0, 0)
+ new PsoStructureEntryInfo(MetaName.ownsCloth, PsoDataType.Bool, 0, 0, 0)
);
case (MetaName)1036962405:
return new PsoStructureInfo((MetaName)1036962405, 0, 0, 3,
diff --git a/Peds/PedsForm.Designer.cs b/Peds/PedsForm.Designer.cs
index a82d4f5..e7a0ea4 100644
--- a/Peds/PedsForm.Designer.cs
+++ b/Peds/PedsForm.Designer.cs
@@ -78,6 +78,31 @@
this.ToolsPedTabPage = new System.Windows.Forms.TabPage();
this.ToolsTabControl = new System.Windows.Forms.TabControl();
this.ToolsPanel = new System.Windows.Forms.Panel();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.CompHeadComboBox = new System.Windows.Forms.ComboBox();
+ this.label6 = new System.Windows.Forms.Label();
+ this.CompBerdComboBox = new System.Windows.Forms.ComboBox();
+ this.label7 = new System.Windows.Forms.Label();
+ this.CompHairComboBox = new System.Windows.Forms.ComboBox();
+ this.label8 = new System.Windows.Forms.Label();
+ this.CompUpprComboBox = new System.Windows.Forms.ComboBox();
+ this.label9 = new System.Windows.Forms.Label();
+ this.CompLowrComboBox = new System.Windows.Forms.ComboBox();
+ this.label12 = new System.Windows.Forms.Label();
+ this.CompHandComboBox = new System.Windows.Forms.ComboBox();
+ this.label13 = new System.Windows.Forms.Label();
+ this.CompFeetComboBox = new System.Windows.Forms.ComboBox();
+ this.label15 = new System.Windows.Forms.Label();
+ this.CompTeefComboBox = new System.Windows.Forms.ComboBox();
+ this.label16 = new System.Windows.Forms.Label();
+ this.CompAccsComboBox = new System.Windows.Forms.ComboBox();
+ this.label17 = new System.Windows.Forms.Label();
+ this.CompTaskComboBox = new System.Windows.Forms.ComboBox();
+ this.label18 = new System.Windows.Forms.Label();
+ this.CompDeclComboBox = new System.Windows.Forms.ComboBox();
+ this.label20 = new System.Windows.Forms.Label();
+ this.CompJbibComboBox = new System.Windows.Forms.ComboBox();
this.ConsolePanel.SuspendLayout();
this.ToolsOptionsTabPage.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.TimeOfDayTrackBar)).BeginInit();
@@ -601,9 +626,9 @@
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(3, 11);
this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(38, 13);
+ this.label3.Size = new System.Drawing.Size(29, 13);
this.label3.TabIndex = 1;
- this.label3.Text = "Name:";
+ this.label3.Text = "Ped:";
//
// PedNameComboBox
//
@@ -616,6 +641,7 @@
this.PedNameComboBox.Name = "PedNameComboBox";
this.PedNameComboBox.Size = new System.Drawing.Size(182, 21);
this.PedNameComboBox.TabIndex = 0;
+ this.PedNameComboBox.SelectedIndexChanged += new System.EventHandler(this.PedNameComboBox_SelectedIndexChanged);
//
// StatsUpdateTimer
//
@@ -625,6 +651,31 @@
//
// ToolsPedTabPage
//
+ this.ToolsPedTabPage.Controls.Add(this.label20);
+ this.ToolsPedTabPage.Controls.Add(this.CompJbibComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label18);
+ this.ToolsPedTabPage.Controls.Add(this.CompDeclComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label17);
+ this.ToolsPedTabPage.Controls.Add(this.CompTaskComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label16);
+ this.ToolsPedTabPage.Controls.Add(this.CompAccsComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label15);
+ this.ToolsPedTabPage.Controls.Add(this.CompTeefComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label13);
+ this.ToolsPedTabPage.Controls.Add(this.CompFeetComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label12);
+ this.ToolsPedTabPage.Controls.Add(this.CompHandComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label9);
+ this.ToolsPedTabPage.Controls.Add(this.CompLowrComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label8);
+ this.ToolsPedTabPage.Controls.Add(this.CompUpprComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label7);
+ this.ToolsPedTabPage.Controls.Add(this.CompHairComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label6);
+ this.ToolsPedTabPage.Controls.Add(this.CompBerdComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label5);
+ this.ToolsPedTabPage.Controls.Add(this.CompHeadComboBox);
+ this.ToolsPedTabPage.Controls.Add(this.label4);
this.ToolsPedTabPage.Controls.Add(this.label3);
this.ToolsPedTabPage.Controls.Add(this.PedNameComboBox);
this.ToolsPedTabPage.Location = new System.Drawing.Point(4, 22);
@@ -664,6 +715,279 @@
this.ToolsPanel.TabIndex = 7;
this.ToolsPanel.Visible = false;
//
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(3, 53);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(69, 13);
+ this.label4.TabIndex = 2;
+ this.label4.Text = "Components:";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(12, 76);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(36, 13);
+ this.label5.TabIndex = 4;
+ this.label5.Text = "Head:";
+ //
+ // CompHeadComboBox
+ //
+ this.CompHeadComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompHeadComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompHeadComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompHeadComboBox.FormattingEnabled = true;
+ this.CompHeadComboBox.Location = new System.Drawing.Point(54, 73);
+ this.CompHeadComboBox.Name = "CompHeadComboBox";
+ this.CompHeadComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompHeadComboBox.TabIndex = 3;
+ this.CompHeadComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHeadComboBox_SelectedIndexChanged);
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(16, 103);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(32, 13);
+ this.label6.TabIndex = 6;
+ this.label6.Text = "Berd:";
+ //
+ // CompBerdComboBox
+ //
+ this.CompBerdComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompBerdComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompBerdComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompBerdComboBox.FormattingEnabled = true;
+ this.CompBerdComboBox.Location = new System.Drawing.Point(54, 100);
+ this.CompBerdComboBox.Name = "CompBerdComboBox";
+ this.CompBerdComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompBerdComboBox.TabIndex = 5;
+ this.CompBerdComboBox.SelectedIndexChanged += new System.EventHandler(this.CompBerdComboBox_SelectedIndexChanged);
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(19, 130);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(29, 13);
+ this.label7.TabIndex = 8;
+ this.label7.Text = "Hair:";
+ //
+ // CompHairComboBox
+ //
+ this.CompHairComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompHairComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompHairComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompHairComboBox.FormattingEnabled = true;
+ this.CompHairComboBox.Location = new System.Drawing.Point(54, 127);
+ this.CompHairComboBox.Name = "CompHairComboBox";
+ this.CompHairComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompHairComboBox.TabIndex = 7;
+ this.CompHairComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHairComboBox_SelectedIndexChanged);
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(15, 157);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(33, 13);
+ this.label8.TabIndex = 10;
+ this.label8.Text = "Uppr:";
+ //
+ // CompUpprComboBox
+ //
+ this.CompUpprComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompUpprComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompUpprComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompUpprComboBox.FormattingEnabled = true;
+ this.CompUpprComboBox.Location = new System.Drawing.Point(54, 154);
+ this.CompUpprComboBox.Name = "CompUpprComboBox";
+ this.CompUpprComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompUpprComboBox.TabIndex = 9;
+ this.CompUpprComboBox.SelectedIndexChanged += new System.EventHandler(this.CompUpprComboBox_SelectedIndexChanged);
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(15, 184);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(33, 13);
+ this.label9.TabIndex = 12;
+ this.label9.Text = "Lowr:";
+ //
+ // CompLowrComboBox
+ //
+ this.CompLowrComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompLowrComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompLowrComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompLowrComboBox.FormattingEnabled = true;
+ this.CompLowrComboBox.Location = new System.Drawing.Point(54, 181);
+ this.CompLowrComboBox.Name = "CompLowrComboBox";
+ this.CompLowrComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompLowrComboBox.TabIndex = 11;
+ this.CompLowrComboBox.SelectedIndexChanged += new System.EventHandler(this.CompLowrComboBox_SelectedIndexChanged);
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Location = new System.Drawing.Point(12, 211);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(36, 13);
+ this.label12.TabIndex = 14;
+ this.label12.Text = "Hand:";
+ //
+ // CompHandComboBox
+ //
+ this.CompHandComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompHandComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompHandComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompHandComboBox.FormattingEnabled = true;
+ this.CompHandComboBox.Location = new System.Drawing.Point(54, 208);
+ this.CompHandComboBox.Name = "CompHandComboBox";
+ this.CompHandComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompHandComboBox.TabIndex = 13;
+ this.CompHandComboBox.SelectedIndexChanged += new System.EventHandler(this.CompHandComboBox_SelectedIndexChanged);
+ //
+ // label13
+ //
+ this.label13.AutoSize = true;
+ this.label13.Location = new System.Drawing.Point(17, 238);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(31, 13);
+ this.label13.TabIndex = 16;
+ this.label13.Text = "Feet:";
+ //
+ // CompFeetComboBox
+ //
+ this.CompFeetComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompFeetComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompFeetComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompFeetComboBox.FormattingEnabled = true;
+ this.CompFeetComboBox.Location = new System.Drawing.Point(54, 235);
+ this.CompFeetComboBox.Name = "CompFeetComboBox";
+ this.CompFeetComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompFeetComboBox.TabIndex = 15;
+ this.CompFeetComboBox.SelectedIndexChanged += new System.EventHandler(this.CompFeetComboBox_SelectedIndexChanged);
+ //
+ // label15
+ //
+ this.label15.AutoSize = true;
+ this.label15.Location = new System.Drawing.Point(16, 265);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(32, 13);
+ this.label15.TabIndex = 18;
+ this.label15.Text = "Teef:";
+ //
+ // CompTeefComboBox
+ //
+ this.CompTeefComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompTeefComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompTeefComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompTeefComboBox.FormattingEnabled = true;
+ this.CompTeefComboBox.Location = new System.Drawing.Point(54, 262);
+ this.CompTeefComboBox.Name = "CompTeefComboBox";
+ this.CompTeefComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompTeefComboBox.TabIndex = 17;
+ this.CompTeefComboBox.SelectedIndexChanged += new System.EventHandler(this.CompTeefComboBox_SelectedIndexChanged);
+ //
+ // label16
+ //
+ this.label16.AutoSize = true;
+ this.label16.Location = new System.Drawing.Point(14, 292);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(34, 13);
+ this.label16.TabIndex = 20;
+ this.label16.Text = "Accs:";
+ //
+ // CompAccsComboBox
+ //
+ this.CompAccsComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompAccsComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompAccsComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompAccsComboBox.FormattingEnabled = true;
+ this.CompAccsComboBox.Location = new System.Drawing.Point(54, 289);
+ this.CompAccsComboBox.Name = "CompAccsComboBox";
+ this.CompAccsComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompAccsComboBox.TabIndex = 19;
+ this.CompAccsComboBox.SelectedIndexChanged += new System.EventHandler(this.CompAccsComboBox_SelectedIndexChanged);
+ //
+ // label17
+ //
+ this.label17.AutoSize = true;
+ this.label17.Location = new System.Drawing.Point(14, 319);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(34, 13);
+ this.label17.TabIndex = 22;
+ this.label17.Text = "Task:";
+ //
+ // CompTaskComboBox
+ //
+ this.CompTaskComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompTaskComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompTaskComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompTaskComboBox.FormattingEnabled = true;
+ this.CompTaskComboBox.Location = new System.Drawing.Point(54, 316);
+ this.CompTaskComboBox.Name = "CompTaskComboBox";
+ this.CompTaskComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompTaskComboBox.TabIndex = 21;
+ this.CompTaskComboBox.SelectedIndexChanged += new System.EventHandler(this.CompTaskComboBox_SelectedIndexChanged);
+ //
+ // label18
+ //
+ this.label18.AutoSize = true;
+ this.label18.Location = new System.Drawing.Point(16, 346);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(32, 13);
+ this.label18.TabIndex = 24;
+ this.label18.Text = "Decl:";
+ //
+ // CompDeclComboBox
+ //
+ this.CompDeclComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompDeclComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompDeclComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompDeclComboBox.FormattingEnabled = true;
+ this.CompDeclComboBox.Location = new System.Drawing.Point(54, 343);
+ this.CompDeclComboBox.Name = "CompDeclComboBox";
+ this.CompDeclComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompDeclComboBox.TabIndex = 23;
+ this.CompDeclComboBox.SelectedIndexChanged += new System.EventHandler(this.CompDeclComboBox_SelectedIndexChanged);
+ //
+ // label20
+ //
+ this.label20.AutoSize = true;
+ this.label20.Location = new System.Drawing.Point(19, 373);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(29, 13);
+ this.label20.TabIndex = 26;
+ this.label20.Text = "Jbib:";
+ //
+ // CompJbibComboBox
+ //
+ this.CompJbibComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.CompJbibComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.CompJbibComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+ this.CompJbibComboBox.FormattingEnabled = true;
+ this.CompJbibComboBox.Location = new System.Drawing.Point(54, 370);
+ this.CompJbibComboBox.Name = "CompJbibComboBox";
+ this.CompJbibComboBox.Size = new System.Drawing.Size(182, 21);
+ this.CompJbibComboBox.TabIndex = 25;
+ this.CompJbibComboBox.SelectedIndexChanged += new System.EventHandler(this.CompJbibComboBox_SelectedIndexChanged);
+ //
// PedsForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -754,5 +1078,30 @@
private System.Windows.Forms.TabPage ToolsPedTabPage;
private System.Windows.Forms.TabControl ToolsTabControl;
private System.Windows.Forms.Panel ToolsPanel;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.ComboBox CompHeadComboBox;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.ComboBox CompHairComboBox;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.ComboBox CompBerdComboBox;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.ComboBox CompUpprComboBox;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.ComboBox CompHandComboBox;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.ComboBox CompLowrComboBox;
+ private System.Windows.Forms.Label label13;
+ private System.Windows.Forms.ComboBox CompFeetComboBox;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.ComboBox CompTeefComboBox;
+ private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.ComboBox CompTaskComboBox;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.ComboBox CompAccsComboBox;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.ComboBox CompJbibComboBox;
+ private System.Windows.Forms.Label label18;
+ private System.Windows.Forms.ComboBox CompDeclComboBox;
}
}
\ No newline at end of file
diff --git a/Peds/PedsForm.cs b/Peds/PedsForm.cs
index 34af71f..4487869 100644
--- a/Peds/PedsForm.cs
+++ b/Peds/PedsForm.cs
@@ -74,6 +74,32 @@ namespace CodeWalker.Peds
+ string SelectedPedName = string.Empty;
+ MetaHash SelectedPedHash = 0;//ped name hash
+ CPedModelInfo__InitData SelectedPedInit = null; //ped init data
+ YddFile SelectedPedYdd = null; //ped drawables
+ YftFile SelectedPedYft = null; //ped skeleton YFT
+ PedFile SelectedPedYmt = null; //ped variation info
+
+ Drawable SelectedHead = null;
+ Drawable SelectedBerd = null;
+ Drawable SelectedHair = null;
+ Drawable SelectedUppr = null;
+ Drawable SelectedLowr = null;
+ Drawable SelectedHand = null;
+ Drawable SelectedFeet = null;
+ Drawable SelectedTeef = null;
+ Drawable SelectedAccs = null;
+ Drawable SelectedTask = null;
+ Drawable SelectedDecl = null;
+ Drawable SelectedJbib = null;
+
+
+
+
+
+
+
public PedsForm()
{
InitializeComponent();
@@ -92,7 +118,7 @@ namespace CodeWalker.Peds
//Renderer.renderclouds = true;
//Renderer.individualcloudfrag = "Contrails";
Renderer.rendermoon = false;
- Renderer.renderskeletons = false;
+ Renderer.renderskeletons = true;
Renderer.SelectionFlagsTestAll = true;
}
@@ -425,7 +451,7 @@ namespace CodeWalker.Peds
{
//move the camera to a default place where the given sphere is fully visible.
- rad = Math.Max(0.01f, rad);
+ rad = Math.Max(0.01f, rad*0.1f);
camera.FollowEntity.Position = pos;
camera.TargetDistance = rad * 1.6f;
@@ -662,36 +688,70 @@ namespace CodeWalker.Peds
var pednamel = pedname.ToLowerInvariant();
MetaHash pedhash = JenkHash.GenHash(pednamel);
+ SelectedPedName = string.Empty;
+ SelectedPedHash = 0;
+ SelectedPedInit = null;
+ SelectedPedYdd = null;
+ SelectedPedYft = null;
+ SelectedPedYmt = null;
+ ClearCombo(CompHeadComboBox); SelectedHead = null;
+ ClearCombo(CompBerdComboBox); SelectedBerd = null;
+ ClearCombo(CompHairComboBox); SelectedHair = null;
+ ClearCombo(CompUpprComboBox); SelectedUppr = null;
+ ClearCombo(CompLowrComboBox); SelectedLowr = null;
+ ClearCombo(CompHandComboBox); SelectedHand = null;
+ ClearCombo(CompFeetComboBox); SelectedFeet = null;
+ ClearCombo(CompTeefComboBox); SelectedTeef = null;
+ ClearCombo(CompAccsComboBox); SelectedAccs = null;
+ ClearCombo(CompTaskComboBox); SelectedTask = null;
+ ClearCombo(CompDeclComboBox); SelectedDecl = null;
+ ClearCombo(CompJbibComboBox); SelectedJbib = null;
+
+ CPedModelInfo__InitData initdata = null;
+ if (!GameFileCache.PedsInitDict.TryGetValue(pedhash, out initdata)) return;
+
+
+ bool pedchange = SelectedPedHash != pedhash;
+ SelectedPedName = pedname;
+ SelectedPedHash = pedhash;
+ SelectedPedInit = initdata;
+ SelectedPedYdd = GameFileCache.GetYdd(pedhash);
+ SelectedPedYft = GameFileCache.GetYft(pedhash);
+ GameFileCache.PedVariationsDict?.TryGetValue(pedhash, out SelectedPedYmt);
+
+ while ((SelectedPedYdd != null) && (!SelectedPedYdd.Loaded))
+ {
+ Thread.Sleep(20);//kinda hacky
+ SelectedPedYdd = GameFileCache.GetYdd(SelectedPedHash);
+ }
+ while ((SelectedPedYft != null) && (!SelectedPedYft.Loaded))
+ {
+ Thread.Sleep(20);//kinda hacky
+ SelectedPedYft = GameFileCache.GetYft(SelectedPedHash);
+ }
+
+ LoadModel(SelectedPedYft, pedchange);
+
+
+ var vi = SelectedPedYmt?.VariationInfo;
+ if (vi != null)
+ {
+ PopulateCompCombo(CompHeadComboBox, vi.GetVariations(0));
+ PopulateCompCombo(CompBerdComboBox, vi.GetVariations(1));
+ PopulateCompCombo(CompHairComboBox, vi.GetVariations(2));
+ PopulateCompCombo(CompUpprComboBox, vi.GetVariations(3));
+ PopulateCompCombo(CompLowrComboBox, vi.GetVariations(4));
+ PopulateCompCombo(CompHandComboBox, vi.GetVariations(5));
+ PopulateCompCombo(CompFeetComboBox, vi.GetVariations(6));
+ PopulateCompCombo(CompTeefComboBox, vi.GetVariations(7));
+ PopulateCompCombo(CompAccsComboBox, vi.GetVariations(8));
+ PopulateCompCombo(CompTaskComboBox, vi.GetVariations(9));
+ PopulateCompCombo(CompDeclComboBox, vi.GetVariations(10));
+ PopulateCompCombo(CompJbibComboBox, vi.GetVariations(11));
+ }
+
+
- //MetaHash modelhashhi = JenkHash.GenHash(pednamel + "_hi");
- //bool hidet = VehicleHighDetailCheckBox.Checked;
- //var yfthash = hidet ? modelhashhi : pedhash;
- //VehicleInitData vid = null;
- //if (GameFileCache.VehiclesInitDict.TryGetValue(pedhash, out vid))
- //{
- // bool vehiclechange = SelectedVehicleHash != pedhash;
- // SelectedModelHash = yfthash;
- // SelectedVehicleHash = pedhash;
- // SelectedVehicleInit = vid;
- // SelectedVehicleYft = GameFileCache.GetYft(SelectedModelHash);
- // while (!SelectedVehicleYft.Loaded)
- // {
- // Thread.Sleep(20);//kinda hacky
- // SelectedVehicleYft = GameFileCache.GetYft(SelectedModelHash);
- // }
- // LoadModel(SelectedVehicleYft, vehiclechange);
- // VehicleMakeLabel.Text = GlobalText.TryGetString(JenkHash.GenHash(vid.vehicleMakeName.ToLower()));
- // VehicleNameLabel.Text = GlobalText.TryGetString(JenkHash.GenHash(vid.gameName.ToLower()));
- //}
- //else
- //{
- // SelectedModelHash = 0;
- // SelectedVehicleHash = 0;
- // SelectedVehicleInit = null;
- // SelectedVehicleYft = null;
- // VehicleMakeLabel.Text = "-";
- // VehicleNameLabel.Text = "-";
- //}
}
public void LoadModel(YftFile yft, bool movecamera = true)
@@ -712,6 +772,68 @@ namespace CodeWalker.Peds
+ private void ClearCombo(ComboBox c)
+ {
+ c.Items.Clear();
+ c.Text = string.Empty;
+ }
+ private void PopulateCompCombo(ComboBox c, MUnk_3538495220 vars)
+ {
+ if (vars?.Variations == null) return;
+ foreach (var item in vars.Variations)
+ {
+ c.Items.Add(item.GetDrawableName());
+ }
+ if (vars.Variations.Length > 0)
+ {
+ c.SelectedIndex = 0;
+ }
+ }
+
+
+
+ private Drawable GetComponentDrawable(string name)
+ {
+ var namel = name.ToLowerInvariant();
+ MetaHash hash = JenkHash.GenHash(namel);
+ Drawable d;
+
+ if (SelectedPedYdd?.Dict != null)
+ {
+ if (SelectedPedYdd.Dict.TryGetValue(hash, out d)) return d;
+ }
+
+ Dictionary peddict = null;
+ if (GameFileCache.PedDrawableDicts.TryGetValue(SelectedPedHash, out peddict))
+ {
+ RpfFileEntry file = null;
+ if (peddict.TryGetValue(hash, out file))
+ {
+ var ydd = GameFileCache.GetFileUncached(file);
+ while ((ydd != null) && (!ydd.Loaded))
+ {
+ Thread.Sleep(20);//kinda hacky
+ GameFileCache.TryLoadEnqueue(ydd);
+ }
+ if (ydd?.Drawables?.Length > 0)
+ {
+ return ydd.Drawables[0];//should only be one in this dict
+ }
+ }
+ }
+
+ return null;
+ }
+
+
+
+
+
+
+
+
+
+
private void UpdateTimeOfDayLabel()
{
int v = TimeOfDayTrackBar.Value;
@@ -889,31 +1011,26 @@ namespace CodeWalker.Peds
private void RenderPed()
{
- //YftFile yft = GameFileCache.GetYft(SelectedModelHash);
- //if (yft != null)
- //{
- // if (yft.Loaded)
- // {
- // if (yft.Fragment != null)
- // {
- // var f = yft.Fragment;
+ YftFile yft = SelectedPedYft;// GameFileCache.GetYft(SelectedModelHash);
+ if (yft != null)
+ {
+ if (yft.Loaded)
+ {
+ if (yft.Fragment != null)
+ {
+ var f = yft.Fragment;
- // var txdhash = SelectedVehicleHash;// yft.RpfFileEntry?.ShortNameHash ?? 0;
+ var txdhash = 0u;// SelectedVehicleHash;// yft.RpfFileEntry?.ShortNameHash ?? 0;
+ //var namelower = yft.RpfFileEntry?.GetShortNameLower();
- // var namelower = yft.RpfFileEntry?.GetShortNameLower();
- // if (namelower?.EndsWith("_hi") ?? false)
- // {
- // txdhash = JenkHash.GenHash(namelower.Substring(0, namelower.Length - 3));
- // }
+ Archetype arch = null;// TryGetArchetype(hash);
- // Archetype arch = null;// TryGetArchetype(hash);
+ Renderer.RenderFragment(arch, null, f, txdhash);
- // Renderer.RenderFragment(arch, null, f, txdhash);
-
- // //seldrwbl = f.Drawable;
- // }
- // }
- //}
+ //seldrwbl = f.Drawable;
+ }
+ }
+ }
}
@@ -1413,5 +1530,75 @@ namespace CodeWalker.Peds
+
+ private void PedNameComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if (!GameFileCache.IsInited) return;
+
+ LoadPed();
+ }
+
+ private void CompHeadComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedHead = GetComponentDrawable(CompHeadComboBox.Text);
+ }
+
+ private void CompBerdComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedBerd = GetComponentDrawable(CompBerdComboBox.Text);
+ }
+
+ private void CompHairComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedHair = GetComponentDrawable(CompHairComboBox.Text);
+ }
+
+ private void CompUpprComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedUppr = GetComponentDrawable(CompUpprComboBox.Text);
+ }
+
+ private void CompLowrComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedLowr = GetComponentDrawable(CompLowrComboBox.Text);
+ }
+
+ private void CompHandComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedHand = GetComponentDrawable(CompHandComboBox.Text);
+ }
+
+ private void CompFeetComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedFeet = GetComponentDrawable(CompFeetComboBox.Text);
+ }
+
+ private void CompTeefComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedTeef = GetComponentDrawable(CompTeefComboBox.Text);
+ }
+
+ private void CompAccsComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedAccs = GetComponentDrawable(CompAccsComboBox.Text);
+ }
+
+ private void CompTaskComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedTask = GetComponentDrawable(CompTaskComboBox.Text);
+ }
+
+ private void CompDeclComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedDecl = GetComponentDrawable(CompDeclComboBox.Text);
+ }
+
+ private void CompJbibComboBox_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ SelectedJbib = GetComponentDrawable(CompJbibComboBox.Text);
+ }
+
+
+
}
}
diff --git a/Rendering/Utils/GpuBuffers.cs b/Rendering/Utils/GpuBuffers.cs
index 871199b..eb1b211 100644
--- a/Rendering/Utils/GpuBuffers.cs
+++ b/Rendering/Utils/GpuBuffers.cs
@@ -78,7 +78,7 @@ namespace CodeWalker.Rendering
public void Update(DeviceContext context, T[] data)
{
var dataBox = context.MapSubresource(Buffer, 0, MapMode.WriteDiscard, MapFlags.None);
- Utilities.Write(dataBox.DataPointer, data, 0, data.Length);
+ Utilities.Write(dataBox.DataPointer, data, 0, Math.Min(data.Length, StructCount));
context.UnmapSubresource(Buffer, 0);
}
diff --git a/Vehicles/VehicleForm.cs b/Vehicles/VehicleForm.cs
index e5550bb..6ec9ce5 100644
--- a/Vehicles/VehicleForm.cs
+++ b/Vehicles/VehicleForm.cs
@@ -680,7 +680,7 @@ namespace CodeWalker.Vehicles
SelectedVehicleHash = modelhash;
SelectedVehicleInit = vid;
SelectedVehicleYft = GameFileCache.GetYft(SelectedModelHash);
- while (!SelectedVehicleYft.Loaded)
+ while ((SelectedVehicleYft != null) && (!SelectedVehicleYft.Loaded))
{
Thread.Sleep(20);//kinda hacky
SelectedVehicleYft = GameFileCache.GetYft(SelectedModelHash);